]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
hostfs: hostfs_file_open: Switch to data locking model
authorRichard Weinberger <richard@nod.at>
Fri, 27 Feb 2015 21:55:20 +0000 (22:55 +0100)
committerRichard Weinberger <richard@nod.at>
Thu, 26 Mar 2015 22:27:47 +0000 (23:27 +0100)
Instead of serializing hostfs_file_open() we can use
a per inode mutex to protect ->mode.

Signed-off-by: Richard Weinberger <richard@nod.at>
fs/hostfs/hostfs_kern.c

index fd62cae0fdcb66db03712d419c25014312112546..104d58d2c78c7c57482fe24e2637afd6106319bd 100644 (file)
@@ -24,6 +24,7 @@ struct hostfs_inode_info {
        int fd;
        fmode_t mode;
        struct inode vfs_inode;
+       struct mutex open_mutex;
 };
 
 static inline struct hostfs_inode_info *HOSTFS_I(struct inode *inode)
@@ -225,6 +226,7 @@ static struct inode *hostfs_alloc_inode(struct super_block *sb)
        hi->fd = -1;
        hi->mode = 0;
        inode_init_once(&hi->vfs_inode);
+       mutex_init(&hi->open_mutex);
        return &hi->vfs_inode;
 }
 
@@ -295,7 +297,6 @@ static int hostfs_readdir(struct file *file, struct dir_context *ctx)
 
 static int hostfs_file_open(struct inode *ino, struct file *file)
 {
-       static DEFINE_MUTEX(open_mutex);
        char *name;
        fmode_t mode = 0;
        int err;
@@ -324,15 +325,15 @@ retry:
        if (fd < 0)
                return fd;
 
-       mutex_lock(&open_mutex);
+       mutex_lock(&HOSTFS_I(ino)->open_mutex);
        /* somebody else had handled it first? */
        if ((mode & HOSTFS_I(ino)->mode) == mode) {
-               mutex_unlock(&open_mutex);
+               mutex_unlock(&HOSTFS_I(ino)->open_mutex);
                return 0;
        }
        if ((mode | HOSTFS_I(ino)->mode) != mode) {
                mode |= HOSTFS_I(ino)->mode;
-               mutex_unlock(&open_mutex);
+               mutex_unlock(&HOSTFS_I(ino)->open_mutex);
                close_file(&fd);
                goto retry;
        }
@@ -342,12 +343,12 @@ retry:
                err = replace_file(fd, HOSTFS_I(ino)->fd);
                close_file(&fd);
                if (err < 0) {
-                       mutex_unlock(&open_mutex);
+                       mutex_unlock(&HOSTFS_I(ino)->open_mutex);
                        return err;
                }
        }
        HOSTFS_I(ino)->mode = mode;
-       mutex_unlock(&open_mutex);
+       mutex_unlock(&HOSTFS_I(ino)->open_mutex);
 
        return 0;
 }