X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/40941f94f7c8522f65f9ebc425a300d40412bc16..2a49908006b177c4d6354309333d06b1b96e4887:/lunaix-os/kernel/fs/iso9660/directory.c diff --git a/lunaix-os/kernel/fs/iso9660/directory.c b/lunaix-os/kernel/fs/iso9660/directory.c index e1b3789..5a06fc8 100644 --- a/lunaix-os/kernel/fs/iso9660/directory.c +++ b/lunaix-os/kernel/fs/iso9660/directory.c @@ -1,4 +1,3 @@ -#include #include #include #include @@ -7,6 +6,8 @@ #include +#include + extern struct cake_pile* drec_cache_pile; void @@ -51,10 +52,12 @@ done: u32_t l = drec->name.len; while (l < (u32_t)-1 && drec->name.content[l--] != ';') ; + l = (l + 1) ? l : drec->name.len; l = MIN(l, ISO9660_IDLEN - 1); - strncpy(cache->name_val, drec->name.content, l); + strncpy(cache->name_val, (const char*)drec->name.content, l); + cache->name = HSTR(cache->name_val, l); hstr_rehash(&cache->name, HSTR_FULL_HASH); } @@ -68,16 +71,19 @@ iso9660_setup_dnode(struct v_dnode* dnode, struct v_inode* inode) return 0; } + struct iso_inode* isoino = inode->data; + if (!llist_empty(&isoino->drecaches)) { + dnode->data = &isoino->drecaches; + vfs_assign_inode(dnode, inode); + return 0; + } + int errno = 0; struct device* dev = dnode->super_block->dev; - struct iso_inode* isoino = inode->data; - struct llist_header* lead = valloc(sizeof(*lead)); void* records = valloc(ISO9660_BLKSZ); u32_t current_pos = -ISO9660_BLKSZ, max_pos = inode->fsize, blk = inode->lb_addr * ISO9660_BLKSZ, blk_offset = (u32_t)-1; - llist_init_head(lead); - // As per 6.8.1, Directory structure shall NOT recorded in interleave mode. do { if (blk_offset >= ISO9660_BLKSZ - sizeof(struct iso_drecord)) { @@ -105,13 +111,12 @@ iso9660_setup_dnode(struct v_dnode* dnode, struct v_inode* inode) struct iso_drecache* cache = cake_grab(drec_cache_pile); iso9660_fill_drecache(cache, drec, mdu->len); - llist_append(lead, &cache->caches); + llist_append(&isoino->drecaches, &cache->caches); cont: blk_offset += mdu->len; } while (current_pos + blk_offset < max_pos); - dnode->data = lead; - isoino->drecaches = lead; + dnode->data = &isoino->drecaches; vfs_assign_inode(dnode, inode); @@ -126,10 +131,9 @@ int iso9660_dir_lookup(struct v_inode* this, struct v_dnode* dnode) { struct iso_inode* isoino = this->data; - struct llist_header* lead = isoino->drecaches; struct iso_drecache *pos, *n; - llist_for_each(pos, n, lead, caches) + llist_for_each(pos, n, &isoino->drecaches, caches) { if (HSTR_EQ(&dnode->name, &pos->name)) { goto found;