X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/c6de44b989e9d7286337e4cbf4d82d919f9120e6..8ee36f112e021d03e4bbbd95c4d561ee112f3887:/lunaix-os/kernel/fs/iso9660/inode.c?ds=sidebyside diff --git a/lunaix-os/kernel/fs/iso9660/inode.c b/lunaix-os/kernel/fs/iso9660/inode.c index 31f85ce..fa3337b 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, @@ -11,14 +14,33 @@ static struct v_inode_ops iso_inode_ops = { static struct v_file_ops iso_file_ops = { .close = iso9660_close, .read = iso9660_read, + .read_page = iso9660_read, .write = iso9660_write, + .write_page = iso9660_write, .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 @@ -60,13 +82,18 @@ iso9660_fill_inode(struct v_inode* inode, struct iso_drecache* dir, int ino) return EIO; } isoino->record_fmt = xattr->record_fmt; - isoino->ctime = iso9660_dt2unix(&xattr->ctime); - isoino->mtime = iso9660_dt2unix(&xattr->mtime); + + inode->ctime = iso9660_dt2unix(&xattr->ctime); + inode->mtime = iso9660_dt2unix(&xattr->mtime); inode->lb_addr += dir->xattr_len * dir->fu_size; vfree(xattr); } + inode->ctime = dir->ctime ? dir->ctime : inode->ctime; + inode->mtime = dir->mtime ? dir->mtime : inode->mtime; + inode->atime = dir->atime ? dir->atime : inode->atime; + return 0; } \ No newline at end of file