X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fmount_image.c;h=ac993e17b2f7f54cc366780832c84b30ee5a865a;hp=30ee82d235c3c0ad3de339b451e0235870cd4be4;hb=ad8c3f70361e25b7c1bbc46d4429749c7215fa12;hpb=91ba045392c18b7e12add95158cd2ab67c1505ae diff --git a/src/mount_image.c b/src/mount_image.c index 30ee82d2..ac993e17 100644 --- a/src/mount_image.c +++ b/src/mount_image.c @@ -8,7 +8,7 @@ */ /* - * Copyright (C) 2012, 2013 Eric Biggers + * Copyright (C) 2012, 2013, 2014 Eric Biggers * * This file is part of wimlib, a library for working with WIM files. * @@ -1105,7 +1105,7 @@ send_unmount_request_msg(mqd_t mq, int unmount_flags, u8 want_progress_messages) struct msg_unmount_request msg = { .hdr = { .min_version = ((unmount_flags & WIMLIB_UNMOUNT_FLAG_NEW_IMAGE) ? - WIMLIB_MAKEVERSION(1, 6, 1) : + WIMLIB_MAKEVERSION(1, 6, 2) : WIMLIB_MAKEVERSION(1, 2, 1)), .cur_version = WIMLIB_VERSION_CODE, .msg_type = MSG_TYPE_UNMOUNT_REQUEST, @@ -1193,9 +1193,11 @@ release_extra_refcnts(struct wimfs_context *ctx) struct wim_lookup_table *lookup_table = ctx->wim->lookup_table; struct wim_lookup_table_entry *lte, *tmp; - list_for_each_entry_safe(lte, tmp, list, orig_stream_list) - while (lte->out_refcnt--) + list_for_each_entry_safe(lte, tmp, list, orig_stream_list) { + u32 n = lte->out_refcnt; + while (n--) lte_decrement_refcnt(lte, lookup_table); + } } /* Moves the currently selected image, which may have been modified, to a new @@ -2045,32 +2047,6 @@ wimfs_read(const char *path, char *buf, size_t size, return ret; } -struct fill_params { - void *buf; - fuse_fill_dir_t filler; -}; - -static int -dentry_fuse_fill(struct wim_dentry *dentry, void *arg) -{ - struct fill_params *fill_params = arg; - - char *file_name_mbs; - size_t file_name_mbs_nbytes; - int ret; - - ret = utf16le_to_tstr(dentry->file_name, - dentry->file_name_nbytes, - &file_name_mbs, - &file_name_mbs_nbytes); - if (ret) - return -errno; - - ret = fill_params->filler(fill_params->buf, file_name_mbs, NULL, 0); - FREE(file_name_mbs); - return ret; -} - /* Fills in the entries of the directory specified by @path using the * FUSE-provided function @filler. */ static int @@ -2079,22 +2055,38 @@ wimfs_readdir(const char *path, void *buf, fuse_fill_dir_t filler, { struct wimfs_fd *fd = (struct wimfs_fd*)(uintptr_t)fi->fh; struct wim_inode *inode; + struct wim_dentry *child; + int ret; if (!fd) return -EBADF; inode = fd->f_inode; - struct fill_params fill_params = { - .buf = buf, - .filler = filler, - }; + ret = filler(buf, ".", NULL, 0); + if (ret) + return ret; + ret = filler(buf, "..", NULL, 0); + if (ret) + return ret; - filler(buf, ".", NULL, 0); - filler(buf, "..", NULL, 0); + for_inode_child(child, inode) { + char *file_name_mbs; + size_t file_name_mbs_nbytes; - return for_dentry_in_rbtree(inode->i_children.rb_node, - dentry_fuse_fill, &fill_params); + ret = utf16le_to_tstr(child->file_name, + child->file_name_nbytes, + &file_name_mbs, + &file_name_mbs_nbytes); + if (ret) + return -errno; + + ret = filler(buf, file_name_mbs, NULL, 0); + FREE(file_name_mbs); + if (ret) + return ret; + } + return 0; } @@ -2345,14 +2337,12 @@ wimfs_unlink(const char *path) static int wimfs_utimens(const char *path, const struct timespec tv[2]) { - struct wim_dentry *dentry; struct wim_inode *inode; WIMStruct *wim = wimfs_get_WIMStruct(); - dentry = get_dentry(wim, path, WIMLIB_CASE_SENSITIVE); - if (!dentry) + inode = wim_pathname_to_inode(wim, path); + if (!inode) return -errno; - inode = dentry->d_inode; if (tv[0].tv_nsec != UTIME_OMIT) { if (tv[0].tv_nsec == UTIME_NOW) @@ -2372,14 +2362,12 @@ wimfs_utimens(const char *path, const struct timespec tv[2]) static int wimfs_utime(const char *path, struct utimbuf *times) { - struct wim_dentry *dentry; struct wim_inode *inode; WIMStruct *wim = wimfs_get_WIMStruct(); - dentry = get_dentry(wim, path, WIMLIB_CASE_SENSITIVE); - if (!dentry) + inode = wim_pathname_to_inode(wim, path); + if (!inode) return -errno; - inode = dentry->d_inode; inode->i_last_write_time = unix_timestamp_to_wim(times->modtime); inode->i_last_access_time = unix_timestamp_to_wim(times->actime); @@ -2615,7 +2603,7 @@ wimlib_mount_image(WIMStruct *wim, int image, const char *dir, #endif /* Assign inode numbers. Also, if a read-write mount was requested, - * mark the dentry tree as modified, and add each streams referenced by + * mark the dentry tree as modified, and add each stream referenced by * files in the image to a list and preemptively double the number of * references to each. The latter is done to allow implementing the * WIMLIB_UNMOUNT_FLAG_NEW_IMAGE semantics. */ @@ -2629,10 +2617,8 @@ wimlib_mount_image(WIMStruct *wim, int image, const char *dir, struct wim_lookup_table_entry *lte; lte = inode_stream_lte(inode, i, wim->lookup_table); - if (lte) { - lte->orig_stream_list = (struct list_head){NULL, NULL}; + if (lte) lte->out_refcnt = 0; - } } } image_for_each_inode(inode, imd) {