fuse: get rid of ff->readdir.lock
authorMiklos Szeredi <mszeredi@redhat.com>
Wed, 6 Mar 2024 15:20:58 +0000 (16:20 +0100)
committerMiklos Szeredi <mszeredi@redhat.com>
Wed, 6 Mar 2024 15:20:58 +0000 (16:20 +0100)
The same protection is provided by file->f_pos_lock.

Note, this relies on the fact that file->f_mode has FMODE_ATOMIC_POS.
This flag is cleared by stream_open(), which would prevent locking of
f_pos_lock.

Prior to commit 7de64d521bf9 ("fuse: break up fuse_open_common()")
FOPEN_STREAM on a directory would cause stream_open() to be called.
After this commit this is not done anymore, so f_pos_lock will always
be locked.

Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
fs/fuse/file.c
fs/fuse/fuse_i.h
fs/fuse/readdir.c

index 8b9c5ab..1b0b9f2 100644 (file)
@@ -69,7 +69,6 @@ struct fuse_file *fuse_file_alloc(struct fuse_mount *fm, bool release)
        }
 
        INIT_LIST_HEAD(&ff->write_entry);
-       mutex_init(&ff->readdir.lock);
        refcount_set(&ff->count, 1);
        RB_CLEAR_NODE(&ff->polled_node);
        init_waitqueue_head(&ff->poll_wait);
@@ -82,7 +81,6 @@ struct fuse_file *fuse_file_alloc(struct fuse_mount *fm, bool release)
 void fuse_file_free(struct fuse_file *ff)
 {
        kfree(ff->args);
-       mutex_destroy(&ff->readdir.lock);
        kfree(ff);
 }
 
index 0f35214..3658a70 100644 (file)
@@ -243,12 +243,6 @@ struct fuse_file {
 
        /* Readdir related */
        struct {
-               /*
-                * Protects below fields against (crazy) parallel readdir on
-                * same open file.  Uncontended in the normal case.
-                */
-               struct mutex lock;
-
                /* Dir stream position */
                loff_t pos;
 
index c66a54d..0377b6d 100644 (file)
@@ -592,15 +592,11 @@ int fuse_readdir(struct file *file, struct dir_context *ctx)
        if (fuse_is_bad(inode))
                return -EIO;
 
-       mutex_lock(&ff->readdir.lock);
-
        err = UNCACHED;
        if (ff->open_flags & FOPEN_CACHE_DIR)
                err = fuse_readdir_cached(file, ctx);
        if (err == UNCACHED)
                err = fuse_readdir_uncached(file, ctx);
 
-       mutex_unlock(&ff->readdir.lock);
-
        return err;
 }