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
评论列表
文章目录