X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fmount.c;h=15d7444ed3036dc182712bed85fde61feaefc77e;hp=83615c1db2204bd304549da6fb094e7e542d02ad;hb=5cdd60306facd14cc9dcc24471386451294ca73c;hpb=558fbdac286438e57df64cf9c72e372bc2f3149c diff --git a/src/mount.c b/src/mount.c index 83615c1d..15d7444e 100644 --- a/src/mount.c +++ b/src/mount.c @@ -115,6 +115,11 @@ static inline WIMStruct *wimfs_get_WIMStruct() return wimfs_get_context()->wim; } +static inline bool wimfs_ctx_readonly(const struct wimfs_context *ctx) +{ + return (ctx->mount_flags & WIMLIB_MOUNT_FLAG_READWRITE) == 0; +} + static inline int get_lookup_flags(const struct wimfs_context *ctx) { if (ctx->mount_flags & WIMLIB_MOUNT_FLAG_STREAM_INTERFACE_WINDOWS) @@ -136,13 +141,15 @@ static inline int flags_writable(int open_flags) * @stream_id: ID of the stream we're opening * @lte: Lookup table entry for the stream (may be NULL) * @fd_ret: Return the allocated file descriptor if successful. + * @readonly: True if this is a read-only mount. * * Return 0 iff successful or error code if unsuccessful. */ static int alloc_wimlib_fd(struct inode *inode, u32 stream_id, struct lookup_table_entry *lte, - struct wimlib_fd **fd_ret) + struct wimlib_fd **fd_ret, + bool readonly) { static const u16 fds_per_alloc = 8; static const u16 max_fds = 0xffff; @@ -192,8 +199,8 @@ static int alloc_wimlib_fd(struct inode *inode, *fd_ret = fd; inode->fds[i] = fd; inode->num_opened_fds++; - if (lte) - atomic_inc(<e->num_opened_fds); + if (lte && !readonly) + lte->num_opened_fds++; DEBUG("Allocated fd (idx = %u)", fd->idx); ret = 0; break; @@ -889,7 +896,7 @@ static int rebuild_wim(struct wimfs_context *ctx, bool check_integrity) xml_update_image_info(w, w->current_image); - ret = wimlib_overwrite(w, check_integrity); + ret = wimlib_overwrite(w, check_integrity, 0); if (ret != 0) { ERROR("Failed to commit changes"); return ret; @@ -1269,7 +1276,8 @@ static int wimfs_open(const char *path, struct fuse_file_info *fi) return ret; } - ret = alloc_wimlib_fd(inode, stream_id, lte, &fd); + ret = alloc_wimlib_fd(inode, stream_id, lte, &fd, + wimfs_ctx_readonly(ctx)); if (ret != 0) return ret; @@ -1290,14 +1298,15 @@ static int wimfs_opendir(const char *path, struct fuse_file_info *fi) struct inode *inode; int ret; struct wimlib_fd *fd = NULL; - WIMStruct *w = wimfs_get_WIMStruct(); + struct wimfs_context *ctx = wimfs_get_context(); + WIMStruct *w = ctx->wim; inode = wim_pathname_to_inode(w, path); if (!inode) return -ENOENT; if (!inode_is_directory(inode)) return -ENOTDIR; - ret = alloc_wimlib_fd(inode, 0, NULL, &fd); + ret = alloc_wimlib_fd(inode, 0, NULL, &fd, wimfs_ctx_readonly(ctx)); fi->fh = (uintptr_t)fd; return ret; } @@ -1834,9 +1843,13 @@ static struct fuse_operations wimfs_operations = { #endif .write = wimfs_write, +#if FUSE_MAJOR_VERSION > 2 || (FUSE_MAJOR_VERSION == 2 && FUSE_MINOR_VERSION >= 8) .flag_nullpath_ok = 1, +#endif +#if FUSE_MAJOR_VERSION > 2 || (FUSE_MAJOR_VERSION == 2 && FUSE_MINOR_VERSION >= 9) .flag_nopath = 1, .flag_utime_omit_ok = 1, +#endif }; @@ -1974,8 +1987,10 @@ WIMLIBAPI int wimlib_mount(WIMStruct *wim, int image, const char *dir, #endif /* Mark dentry tree as modified if read-write mount. */ - if (flags & WIMLIB_MOUNT_FLAG_READWRITE) + if (flags & WIMLIB_MOUNT_FLAG_READWRITE) { imd->modified = true; + imd->has_been_mounted_rw = true; + } /* Resolve all the lookup table entries of the dentry tree */ DEBUG("Resolving lookup table entries");