lkml.org 
[lkml]   [2012]   [Mar]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 03/19] fat: Push mnt_want_write() outside of i_mutex
    Date
    When mnt_want_write() starts to handle freezing it will get a full lock
    semantics requiring proper lock ordering. So push mnt_want_write() call
    outside of i_mutex as in other places.

    CC: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
    Signed-off-by: Jan Kara <jack@suse.cz>
    ---
    fs/fat/file.c | 15 +++++++--------
    1 files changed, 7 insertions(+), 8 deletions(-)

    diff --git a/fs/fat/file.c b/fs/fat/file.c
    index a71fe37..e007b8b 100644
    --- a/fs/fat/file.c
    +++ b/fs/fat/file.c
    @@ -43,10 +43,10 @@ static int fat_ioctl_set_attributes(struct file *file, u32 __user *user_attr)
    if (err)
    goto out;

    - mutex_lock(&inode->i_mutex);
    err = mnt_want_write_file(file);
    if (err)
    - goto out_unlock_inode;
    + goto out;
    + mutex_lock(&inode->i_mutex);

    /*
    * ATTR_VOLUME and ATTR_DIR cannot be changed; this also
    @@ -73,14 +73,14 @@ static int fat_ioctl_set_attributes(struct file *file, u32 __user *user_attr)
    /* The root directory has no attributes */
    if (inode->i_ino == MSDOS_ROOT_INO && attr != ATTR_DIR) {
    err = -EINVAL;
    - goto out_drop_write;
    + goto out_unlock_inode;
    }

    if (sbi->options.sys_immutable &&
    ((attr | oldattr) & ATTR_SYS) &&
    !capable(CAP_LINUX_IMMUTABLE)) {
    err = -EPERM;
    - goto out_drop_write;
    + goto out_unlock_inode;
    }

    /*
    @@ -90,12 +90,12 @@ static int fat_ioctl_set_attributes(struct file *file, u32 __user *user_attr)
    */
    err = security_inode_setattr(file->f_path.dentry, &ia);
    if (err)
    - goto out_drop_write;
    + goto out_unlock_inode;

    /* This MUST be done before doing anything irreversible... */
    err = fat_setattr(file->f_path.dentry, &ia);
    if (err)
    - goto out_drop_write;
    + goto out_unlock_inode;

    fsnotify_change(file->f_path.dentry, ia.ia_valid);
    if (sbi->options.sys_immutable) {
    @@ -107,10 +107,9 @@ static int fat_ioctl_set_attributes(struct file *file, u32 __user *user_attr)

    fat_save_attrs(inode, attr);
    mark_inode_dirty(inode);
    -out_drop_write:
    - mnt_drop_write_file(file);
    out_unlock_inode:
    mutex_unlock(&inode->i_mutex);
    + mnt_drop_write_file(file);
    out:
    return err;
    }
    --
    1.7.1


    \
     
     \ /
      Last update: 2012-03-05 17:05    [W:0.022 / U:0.944 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site