X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/40941f94f7c8522f65f9ebc425a300d40412bc16..6f6da1abb22dff69dbb710bd2fd9d95f083f2b43:/lunaix-os/kernel/fs/iso9660/inode.c?ds=inline diff --git a/lunaix-os/kernel/fs/iso9660/inode.c b/lunaix-os/kernel/fs/iso9660/inode.c index e564910..ac151b3 100644 --- a/lunaix-os/kernel/fs/iso9660/inode.c +++ b/lunaix-os/kernel/fs/iso9660/inode.c @@ -1,9 +1,12 @@ #include #include #include +#include #include #include +extern struct cake_pile* drec_cache_pile; + static struct v_inode_ops iso_inode_ops = { .dir_lookup = iso9660_dir_lookup, .open = iso9660_open, @@ -17,10 +20,27 @@ static struct v_file_ops iso_file_ops = { .close = iso9660_close, .seek = iso9660_seek, .readdir = iso9660_readdir }; +void +iso9660_inode_destruct(struct v_inode* inode) +{ + struct iso_inode* isoino = inode->data; + + struct iso_drecache *pos, *n; + llist_for_each(pos, n, &isoino->drecaches, caches) + { + cake_release(drec_cache_pile, pos); + } + + vfree(isoino); +} + void iso9660_init_inode(struct v_superblock* vsb, struct v_inode* inode) { - inode->data = vzalloc(sizeof(struct iso_inode)); + struct iso_inode* isoino = vzalloc(sizeof(struct iso_inode)); + llist_init_head(&isoino->drecaches); + inode->data = isoino; + inode->destruct = iso9660_inode_destruct; } int @@ -41,6 +61,7 @@ iso9660_fill_inode(struct v_inode* inode, struct iso_drecache* dir, int ino) inode->id = ino; inode->lb_addr = dir->extent_addr; + inode->lb_usage = ICEIL(dir->data_size, fu_len); inode->ops = &iso_inode_ops; inode->default_fops = &iso_file_ops; @@ -56,8 +77,8 @@ iso9660_fill_inode(struct v_inode* inode, struct iso_drecache* dir, int ino) if (dir->xattr_len) { struct iso_xattr* xattr = (struct iso_xattr*)valloc(ISO9660_BLKSZ); // Only bring in single FU, as we only care about the attributes. - errno = - dev->read(dev, xattr, ISO9660_BLKSZ * inode->lb_addr, ISO9660_BLKSZ); + errno = dev->ops.read( + dev, xattr, ISO9660_BLKSZ * inode->lb_addr, ISO9660_BLKSZ); if (errno < 0) { return EIO; }