From: Chao Yu <yuch...@huawei.com>

f2fs_super_block.encrypt_pw_salt can be udpated and persisted
concurrently, result in getting different pwsalt in separated
threads, so let's introduce sb_lock to exclude concurrent
accessers.

Signed-off-by: Chao Yu <yuch...@huawei.com>
---
 fs/f2fs/f2fs.h  |  1 +
 fs/f2fs/file.c  | 19 +++++++++++--------
 fs/f2fs/super.c |  2 ++
 3 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index 7ed17cd657b5..0332c44a1d93 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -1048,6 +1048,7 @@ struct f2fs_sb_info {
        struct super_block *sb;                 /* pointer to VFS super block */
        struct proc_dir_entry *s_proc;          /* proc entry */
        struct f2fs_super_block *raw_super;     /* raw super block pointer */
+       struct mutex sb_lock;                   /* lock for raw super block */
        int valid_super_block;                  /* valid super block no */
        unsigned long s_flag;                           /* flags for sbi */
 
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index ef362899df4e..f26a0bd17469 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -1965,13 +1965,15 @@ static int f2fs_ioc_get_encryption_pwsalt(struct file 
*filp, unsigned long arg)
        if (!f2fs_sb_has_encrypt(inode->i_sb))
                return -EOPNOTSUPP;
 
-       if (uuid_is_nonzero(sbi->raw_super->encrypt_pw_salt))
-               goto got_it;
-
        err = mnt_want_write_file(filp);
        if (err)
                return err;
 
+       mutex_lock(&sbi->sb_lock);
+
+       if (uuid_is_nonzero(sbi->raw_super->encrypt_pw_salt))
+               goto got_it;
+
        /* update superblock with uuid */
        generate_random_uuid(sbi->raw_super->encrypt_pw_salt);
 
@@ -1979,15 +1981,16 @@ static int f2fs_ioc_get_encryption_pwsalt(struct file 
*filp, unsigned long arg)
        if (err) {
                /* undo new data */
                memset(sbi->raw_super->encrypt_pw_salt, 0, 16);
-               mnt_drop_write_file(filp);
-               return err;
+               goto out_err;
        }
-       mnt_drop_write_file(filp);
 got_it:
        if (copy_to_user((__u8 __user *)arg, sbi->raw_super->encrypt_pw_salt,
                                                                        16))
-               return -EFAULT;
-       return 0;
+               err = -EFAULT;
+out_err:
+       mutex_unlock(&sbi->sb_lock);
+       mnt_drop_write_file(filp);
+       return err;
 }
 
 static int f2fs_ioc_gc(struct file *filp, unsigned long arg)
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
index 52986c9cc677..1b49ad477dd9 100644
--- a/fs/f2fs/super.c
+++ b/fs/f2fs/super.c
@@ -2232,6 +2232,8 @@ static void init_sb_info(struct f2fs_sb_info *sbi)
 
        sbi->dirty_device = 0;
        spin_lock_init(&sbi->dev_lock);
+
+       mutex_init(&sbi->sb_lock);
 }
 
 static int init_percpu_info(struct f2fs_sb_info *sbi)
-- 
2.14.1.145.gb3622a4ee


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to