|
@@ -5028,6 +5028,20 @@ static int ext4_quota_on_mount(struct super_block *sb, int type)
|
|
|
EXT4_SB(sb)->s_jquota_fmt, type);
|
|
|
}
|
|
|
|
|
|
+static void lockdep_set_quota_inode(struct inode *inode, int subclass)
|
|
|
+{
|
|
|
+ struct ext4_inode_info *ei = EXT4_I(inode);
|
|
|
+
|
|
|
+ /* The first argument of lockdep_set_subclass has to be
|
|
|
+ * *exactly* the same as the argument to init_rwsem() --- in
|
|
|
+ * this case, in init_once() --- or lockdep gets unhappy
|
|
|
+ * because the name of the lock is set using the
|
|
|
+ * stringification of the argument to init_rwsem().
|
|
|
+ */
|
|
|
+ (void) ei; /* shut up clang warning if !CONFIG_LOCKDEP */
|
|
|
+ lockdep_set_subclass(&ei->i_data_sem, subclass);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Standard function to be called on quota_on
|
|
|
*/
|
|
@@ -5067,8 +5081,12 @@ static int ext4_quota_on(struct super_block *sb, int type, int format_id,
|
|
|
if (err)
|
|
|
return err;
|
|
|
}
|
|
|
-
|
|
|
- return dquot_quota_on(sb, type, format_id, path);
|
|
|
+ lockdep_set_quota_inode(path->dentry->d_inode, I_DATA_SEM_QUOTA);
|
|
|
+ err = dquot_quota_on(sb, type, format_id, path);
|
|
|
+ if (err)
|
|
|
+ lockdep_set_quota_inode(path->dentry->d_inode,
|
|
|
+ I_DATA_SEM_NORMAL);
|
|
|
+ return err;
|
|
|
}
|
|
|
|
|
|
static int ext4_quota_enable(struct super_block *sb, int type, int format_id,
|
|
@@ -5095,8 +5113,11 @@ static int ext4_quota_enable(struct super_block *sb, int type, int format_id,
|
|
|
|
|
|
/* Don't account quota for quota files to avoid recursion */
|
|
|
qf_inode->i_flags |= S_NOQUOTA;
|
|
|
+ lockdep_set_quota_inode(qf_inode, I_DATA_SEM_QUOTA);
|
|
|
err = dquot_enable(qf_inode, type, format_id, flags);
|
|
|
iput(qf_inode);
|
|
|
+ if (err)
|
|
|
+ lockdep_set_quota_inode(qf_inode, I_DATA_SEM_NORMAL);
|
|
|
|
|
|
return err;
|
|
|
}
|