dirinode.py 文件源码

python
阅读 26 收藏 0 点赞 0 评论 0

项目:yggdrasil 作者: locore 项目源码 文件源码
def rmdir(self, parent, name):
        assertion(self.is_dir(parent), "rmdir: parent is not a directory")
        assertion(name[0] != 0, "rmdir: name is null")

        self._inode.begin_tx()
        parent_block, parent_bid, off, valid = self.locate_dentry_ino(parent, name)
        if Not(valid):
            self._inode.commit_tx()
            return 0, errno.ENOENT

        assertion(valid, "rmdir: dentry off not valid")

        ino = Extract(31, 0, parent_block[off])
        if Not(self.is_dir(ino)):
            self._inode.commit_tx()
            return 0, errno.ENOTDIR

        assertion(self.is_dir(ino), "rmdir: ino is not dir")

        attr = self._inode.get_iattr(ino)
        if UGT(attr.nlink, 2):
            self._inode.commit_tx()
            return BitVecVal(0, 32), errno.ENOTEMPTY

        attr = self._inode.get_iattr(parent)
        assertion(UGE(attr.nlink, 2), "rmdir: nlink is not greater than 1: " + str(attr.nlink))
        attr.nlink -= 1
        self._inode.set_iattr(parent, attr)

        self.clear_dentry(parent_block, off)
        self._inode.write(parent_bid, parent_block)

        attr = self._inode.get_iattr(ino)
        attr.nlink = 1
        self._inode.set_iattr(ino, attr)

        # append the inode to the orphan list
        self._orphans.append(Extend(ino, 64))

        self._inode.commit_tx()

        return ino, 0
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号