def mknod(self, parent, name, mode, mtime):
assertion(self.is_dir(parent), "mknod: parent is not a directory")
assertion(name[0] != 0, "mknod: name is null")
self._inode.begin_tx()
parent_block, parent_bid, off, valid = self.locate_empty_dentry_slot_err_ino(parent)
if Not(valid):
self._inode.commit_tx()
return 0, errno.ENOSPC
ino = self.ialloc()
attr = Stat(size=0, mtime=mtime, mode=mode, nlink=2)
self._inode.set_iattr(ino, attr)
attr = self._inode.get_iattr(parent)
assertion(ULE(attr.bsize, 522), "mknod: bsize is larger than 522")
attr.size = Concat32(BitVecVal(522, 32), BitVecVal(4096 * 522, 32))
assertion(ULT(attr.nlink, attr.nlink + 1), "mknod: nlink overflow")
attr.nlink += 1
self._inode.set_iattr(parent, attr)
self.write_dentry(parent_block, off, ino, name)
parent_block[off] = ino
self._inode.write(parent_bid, parent_block)
self._inode.commit_tx()
return ino, 0
评论列表
文章目录