]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
quota: Properly annotate i_dquot arrays with __rcu
authorJan Kara <jack@suse.cz>
Tue, 6 Feb 2024 14:08:19 +0000 (15:08 +0100)
committerSasha Levin <sashal@kernel.org>
Tue, 26 Mar 2024 22:19:46 +0000 (18:19 -0400)
[ Upstream commit ccb49011bb2ebfd66164dbf68c5bff48917bb5ef ]

Dquots pointed to from i_dquot arrays in inodes are protected by
dquot_srcu. Annotate them as such and change .get_dquots callback to
return properly annotated pointer to make sparse happy.

Fixes: b9ba6f94b238 ("quota: remove dqptr_sem")
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 files changed:
fs/ext2/ext2.h
fs/ext2/super.c
fs/ext4/ext4.h
fs/ext4/super.c
fs/f2fs/f2fs.h
fs/f2fs/super.c
fs/jfs/jfs_incore.h
fs/jfs/super.c
fs/ocfs2/inode.h
fs/ocfs2/super.c
fs/quota/dquot.c
fs/reiserfs/reiserfs.h
fs/reiserfs/super.c
include/linux/fs.h
include/linux/shmem_fs.h
mm/shmem.c

index 7fdd685c384d6ad59d936c54a113d22486b15d98..02255185d68efed49555007adb90ae9385e97902 100644 (file)
@@ -674,7 +674,7 @@ struct ext2_inode_info {
        struct inode    vfs_inode;
        struct list_head i_orphan;      /* unlinked but open inodes */
 #ifdef CONFIG_QUOTA
-       struct dquot *i_dquot[MAXQUOTAS];
+       struct dquot __rcu *i_dquot[MAXQUOTAS];
 #endif
 };
 
index aaf3e3e88cb218a55297b4968dfc325eceb0ed00..5bcf5623b46cce2d61a8a64671bc1a2f4d4ce76f 100644 (file)
@@ -320,7 +320,7 @@ static ssize_t ext2_quota_read(struct super_block *sb, int type, char *data, siz
 static ssize_t ext2_quota_write(struct super_block *sb, int type, const char *data, size_t len, loff_t off);
 static int ext2_quota_on(struct super_block *sb, int type, int format_id,
                         const struct path *path);
-static struct dquot **ext2_get_dquots(struct inode *inode)
+static struct dquot __rcu **ext2_get_dquots(struct inode *inode)
 {
        return EXT2_I(inode)->i_dquot;
 }
index cd4ccae1e28a1957d57f59618519616ae97fcff7..7bbf0b9bdff23971e2ec53c0594fbd196c424040 100644 (file)
@@ -1146,7 +1146,7 @@ struct ext4_inode_info {
        tid_t i_datasync_tid;
 
 #ifdef CONFIG_QUOTA
-       struct dquot *i_dquot[MAXQUOTAS];
+       struct dquot __rcu *i_dquot[MAXQUOTAS];
 #endif
 
        /* Precomputed uuid+inum+igen checksum for seeding inode checksums */
index d062383ea50ef4f8a4962bc139d0337d76d9c4b3..3ea4d8f11e7bbff3c88c85700809a0d6fe849f1f 100644 (file)
@@ -1593,7 +1593,7 @@ static ssize_t ext4_quota_write(struct super_block *sb, int type,
 static int ext4_quota_enable(struct super_block *sb, int type, int format_id,
                             unsigned int flags);
 
-static struct dquot **ext4_get_dquots(struct inode *inode)
+static struct dquot __rcu **ext4_get_dquots(struct inode *inode)
 {
        return EXT4_I(inode)->i_dquot;
 }
index 6d688e42d89c59a84e4d17f681d304cb7c015431..ac924c8226e3cd6177d5d4a7dfd6f8288646b035 100644 (file)
@@ -824,7 +824,7 @@ struct f2fs_inode_info {
        spinlock_t i_size_lock;         /* protect last_disk_size */
 
 #ifdef CONFIG_QUOTA
-       struct dquot *i_dquot[MAXQUOTAS];
+       struct dquot __rcu *i_dquot[MAXQUOTAS];
 
        /* quota space reservation, managed internally by quota code */
        qsize_t i_reserved_quota;
index bc303a0522155b70c6d2f9898e3bd3e077df0e00..d0a659b90665627220950a8ff08b5c803cca2e5d 100644 (file)
@@ -2756,7 +2756,7 @@ int f2fs_dquot_initialize(struct inode *inode)
        return dquot_initialize(inode);
 }
 
-static struct dquot **f2fs_get_dquots(struct inode *inode)
+static struct dquot __rcu **f2fs_get_dquots(struct inode *inode)
 {
        return F2FS_I(inode)->i_dquot;
 }
index 721def69e732e444c18bdde9ae271da98260ca02..d3c35068cb761fae9cdb15062ab03542ffe24a14 100644 (file)
@@ -92,7 +92,7 @@ struct jfs_inode_info {
                } link;
        } u;
 #ifdef CONFIG_QUOTA
-       struct dquot *i_dquot[MAXQUOTAS];
+       struct dquot __rcu *i_dquot[MAXQUOTAS];
 #endif
        u32 dev;        /* will die when we get wide dev_t */
        struct inode    vfs_inode;
index 2e2f7f6d36a09dd907ca2542c93f0ffe48723f01..c4f565770d3166c637775d7a8eb35f06b8fcfdbf 100644 (file)
@@ -824,7 +824,7 @@ out:
        return len - towrite;
 }
 
-static struct dquot **jfs_get_dquots(struct inode *inode)
+static struct dquot __rcu **jfs_get_dquots(struct inode *inode)
 {
        return JFS_IP(inode)->i_dquot;
 }
index 82b28fdacc7e96a6d71027e3c9af8546853ecb44..accf03d4765ed9739fb93451f7edae9f647b6d23 100644 (file)
@@ -65,7 +65,7 @@ struct ocfs2_inode_info
        tid_t i_sync_tid;
        tid_t i_datasync_tid;
 
-       struct dquot *i_dquot[MAXQUOTAS];
+       struct dquot __rcu *i_dquot[MAXQUOTAS];
 };
 
 /*
index 6b906424902b46b9b17e1fb2102e916fcb89d1fc..1259fe02cd53b3756e7b6dc0d6a328c03da02f8d 100644 (file)
@@ -122,7 +122,7 @@ static int ocfs2_susp_quotas(struct ocfs2_super *osb, int unsuspend);
 static int ocfs2_enable_quotas(struct ocfs2_super *osb);
 static void ocfs2_disable_quotas(struct ocfs2_super *osb);
 
-static struct dquot **ocfs2_get_dquots(struct inode *inode)
+static struct dquot __rcu **ocfs2_get_dquots(struct inode *inode)
 {
        return OCFS2_I(inode)->i_dquot;
 }
index c6bd7ee20f0097ca6683af5bc0b9f5aac5428e54..7a2c9b153be6ef487135104b0f9494cf7fbb13e6 100644 (file)
@@ -1008,8 +1008,7 @@ EXPORT_SYMBOL(dqget);
 
 static inline struct dquot __rcu **i_dquot(struct inode *inode)
 {
-       /* Force __rcu for now until filesystems are fixed */
-       return (struct dquot __rcu **)inode->i_sb->s_op->get_dquots(inode);
+       return inode->i_sb->s_op->get_dquots(inode);
 }
 
 static int dqinit_needed(struct inode *inode, int type)
index 7d12b8c5b2fa8c73929f7c9bd79d5085e7b1835f..e594ad8d759e2cfa6cc1ae9d221e98455c6baa04 100644 (file)
@@ -97,7 +97,7 @@ struct reiserfs_inode_info {
        struct rw_semaphore i_xattr_sem;
 #endif
 #ifdef CONFIG_QUOTA
-       struct dquot *i_dquot[MAXQUOTAS];
+       struct dquot __rcu *i_dquot[MAXQUOTAS];
 #endif
 
        struct inode vfs_inode;
index 7eaf36b3de12b4a277cfd1dc12f4087bafb74147..309f9d39ba724416568c2c8513f5d903ea768420 100644 (file)
@@ -802,7 +802,7 @@ static ssize_t reiserfs_quota_write(struct super_block *, int, const char *,
 static ssize_t reiserfs_quota_read(struct super_block *, int, char *, size_t,
                                   loff_t);
 
-static struct dquot **reiserfs_get_dquots(struct inode *inode)
+static struct dquot __rcu **reiserfs_get_dquots(struct inode *inode)
 {
        return REISERFS_I(inode)->i_dquot;
 }
index 62102f8697946b2632e8db116d03ba7bc756370e..ee5efad0d78011de23fd9510dad69847c67ffe47 100644 (file)
@@ -2079,7 +2079,7 @@ struct super_operations {
 #ifdef CONFIG_QUOTA
        ssize_t (*quota_read)(struct super_block *, int, char *, size_t, loff_t);
        ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t);
-       struct dquot **(*get_dquots)(struct inode *);
+       struct dquot __rcu **(*get_dquots)(struct inode *);
 #endif
        long (*nr_cached_objects)(struct super_block *,
                                  struct shrink_control *);
index 6b0c626620f5c8e3fc4604dc8d1bb91cb149289f..fa99e68e5e776010c9fdda030830889161194d25 100644 (file)
@@ -32,7 +32,7 @@ struct shmem_inode_info {
        struct timespec64       i_crtime;       /* file creation time */
        unsigned int            fsflags;        /* flags for FS_IOC_[SG]ETFLAGS */
 #ifdef CONFIG_TMPFS_QUOTA
-       struct dquot            *i_dquot[MAXQUOTAS];
+       struct dquot __rcu      *i_dquot[MAXQUOTAS];
 #endif
        struct offset_ctx       dir_offsets;    /* stable entry offsets */
        struct inode            vfs_inode;
index e826be732b9bbd38c545ec2ce80bae5bc24b547d..80c2666114b3e1b80dd980bbfe3c042e211f5c3e 100644 (file)
@@ -311,7 +311,7 @@ static void shmem_disable_quotas(struct super_block *sb)
                dquot_quota_off(sb, type);
 }
 
-static struct dquot **shmem_get_dquots(struct inode *inode)
+static struct dquot __rcu **shmem_get_dquots(struct inode *inode)
 {
        return SHMEM_I(inode)->i_dquot;
 }