X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fmount.c;h=8b9cab93cc47514c6d4d8e8348fdc051452a94ad;hp=3c0b9290e1a209c12e79942a3dd5a659787df373;hb=b61e9afca45dacd9baefbcfa17dbea2af75259b8;hpb=c3ef484d402e49ae76c562ce77b81a5d6dcd8029 diff --git a/src/mount.c b/src/mount.c index 3c0b9290..8b9cab93 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; @@ -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 };