diff options
| author | Jan Kara <jack@suse.cz> | 2009-07-22 12:12:17 -0400 |
|---|---|---|
| committer | Jan Kara <jack@suse.cz> | 2009-07-30 11:31:23 -0400 |
| commit | dee865656f2d8b866f8ac22c60d6363b914e9f12 (patch) | |
| tree | 1fd24f795884c2cfd2b9d06fee104f08236011c7 | |
| parent | 658874f05d040ca96eb5ba9b1c30ce0ff287d762 (diff) | |
quota: Silence lockdep on quota_on
Commit d01730d74d2b0155da50d44555001706294014f7 didn't completely fix
the problem since we still take dqio_mutex and i_mutex in the wrong
order. Move taking of i_mutex further down (luckily it's needed only
for updating inode flags) below where dqio_mutex is taken.
Tested-by: Valdis Kletnieks <valdis.kletnieks@vt.edu>
Signed-off-by: Jan Kara <jack@suse.cz>
| -rw-r--r-- | fs/quota/dquot.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 70f36c043d62..38f7bd559f35 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c | |||
| @@ -2043,7 +2043,6 @@ static int vfs_load_quota_inode(struct inode *inode, int type, int format_id, | |||
| 2043 | invalidate_bdev(sb->s_bdev); | 2043 | invalidate_bdev(sb->s_bdev); |
| 2044 | } | 2044 | } |
| 2045 | mutex_lock(&dqopt->dqonoff_mutex); | 2045 | mutex_lock(&dqopt->dqonoff_mutex); |
| 2046 | mutex_lock_nested(&inode->i_mutex, I_MUTEX_QUOTA); | ||
| 2047 | if (sb_has_quota_loaded(sb, type)) { | 2046 | if (sb_has_quota_loaded(sb, type)) { |
| 2048 | error = -EBUSY; | 2047 | error = -EBUSY; |
| 2049 | goto out_lock; | 2048 | goto out_lock; |
| @@ -2054,9 +2053,11 @@ static int vfs_load_quota_inode(struct inode *inode, int type, int format_id, | |||
| 2054 | * possible) Also nobody should write to the file - we use | 2053 | * possible) Also nobody should write to the file - we use |
| 2055 | * special IO operations which ignore the immutable bit. */ | 2054 | * special IO operations which ignore the immutable bit. */ |
| 2056 | down_write(&dqopt->dqptr_sem); | 2055 | down_write(&dqopt->dqptr_sem); |
| 2056 | mutex_lock_nested(&inode->i_mutex, I_MUTEX_QUOTA); | ||
| 2057 | oldflags = inode->i_flags & (S_NOATIME | S_IMMUTABLE | | 2057 | oldflags = inode->i_flags & (S_NOATIME | S_IMMUTABLE | |
| 2058 | S_NOQUOTA); | 2058 | S_NOQUOTA); |
| 2059 | inode->i_flags |= S_NOQUOTA | S_NOATIME | S_IMMUTABLE; | 2059 | inode->i_flags |= S_NOQUOTA | S_NOATIME | S_IMMUTABLE; |
| 2060 | mutex_unlock(&inode->i_mutex); | ||
| 2060 | up_write(&dqopt->dqptr_sem); | 2061 | up_write(&dqopt->dqptr_sem); |
| 2061 | sb->dq_op->drop(inode); | 2062 | sb->dq_op->drop(inode); |
| 2062 | } | 2063 | } |
| @@ -2080,7 +2081,6 @@ static int vfs_load_quota_inode(struct inode *inode, int type, int format_id, | |||
| 2080 | goto out_file_init; | 2081 | goto out_file_init; |
| 2081 | } | 2082 | } |
| 2082 | mutex_unlock(&dqopt->dqio_mutex); | 2083 | mutex_unlock(&dqopt->dqio_mutex); |
| 2083 | mutex_unlock(&inode->i_mutex); | ||
| 2084 | spin_lock(&dq_state_lock); | 2084 | spin_lock(&dq_state_lock); |
| 2085 | dqopt->flags |= dquot_state_flag(flags, type); | 2085 | dqopt->flags |= dquot_state_flag(flags, type); |
| 2086 | spin_unlock(&dq_state_lock); | 2086 | spin_unlock(&dq_state_lock); |
| @@ -2096,13 +2096,14 @@ out_file_init: | |||
| 2096 | out_lock: | 2096 | out_lock: |
| 2097 | if (oldflags != -1) { | 2097 | if (oldflags != -1) { |
| 2098 | down_write(&dqopt->dqptr_sem); | 2098 | down_write(&dqopt->dqptr_sem); |
| 2099 | mutex_lock_nested(&inode->i_mutex, I_MUTEX_QUOTA); | ||
| 2099 | /* Set the flags back (in the case of accidental quotaon() | 2100 | /* Set the flags back (in the case of accidental quotaon() |
| 2100 | * on a wrong file we don't want to mess up the flags) */ | 2101 | * on a wrong file we don't want to mess up the flags) */ |
| 2101 | inode->i_flags &= ~(S_NOATIME | S_NOQUOTA | S_IMMUTABLE); | 2102 | inode->i_flags &= ~(S_NOATIME | S_NOQUOTA | S_IMMUTABLE); |
| 2102 | inode->i_flags |= oldflags; | 2103 | inode->i_flags |= oldflags; |
| 2104 | mutex_unlock(&inode->i_mutex); | ||
| 2103 | up_write(&dqopt->dqptr_sem); | 2105 | up_write(&dqopt->dqptr_sem); |
| 2104 | } | 2106 | } |
| 2105 | mutex_unlock(&inode->i_mutex); | ||
| 2106 | mutex_unlock(&dqopt->dqonoff_mutex); | 2107 | mutex_unlock(&dqopt->dqonoff_mutex); |
| 2107 | out_fmt: | 2108 | out_fmt: |
| 2108 | put_quota_format(fmt); | 2109 | put_quota_format(fmt); |
