On 2021/03/23 2:39, Amir Goldstein wrote: > Some filesystem's use a digest of their uuid for f_fsid. > Create a simple wrapper for this open coded folding. > > Filesystems that have a non null uuid but use the block device > number for f_fsid may also consider using this helper. > > Signed-off-by: Amir Goldstein <amir73il@xxxxxxxxx> > --- > fs/ext2/super.c | 5 +---- > fs/ext4/super.c | 5 +---- > fs/zonefs/super.c | 5 +---- > include/linux/statfs.h | 7 +++++++ > 4 files changed, 10 insertions(+), 12 deletions(-) > > diff --git a/fs/ext2/super.c b/fs/ext2/super.c > index 6c4753277916..0d679451657c 100644 > --- a/fs/ext2/super.c > +++ b/fs/ext2/super.c > @@ -1399,7 +1399,6 @@ static int ext2_statfs (struct dentry * dentry, struct kstatfs * buf) > struct super_block *sb = dentry->d_sb; > struct ext2_sb_info *sbi = EXT2_SB(sb); > struct ext2_super_block *es = sbi->s_es; > - u64 fsid; > > spin_lock(&sbi->s_lock); > > @@ -1453,9 +1452,7 @@ static int ext2_statfs (struct dentry * dentry, struct kstatfs * buf) > buf->f_ffree = ext2_count_free_inodes(sb); > es->s_free_inodes_count = cpu_to_le32(buf->f_ffree); > buf->f_namelen = EXT2_NAME_LEN; > - fsid = le64_to_cpup((void *)es->s_uuid) ^ > - le64_to_cpup((void *)es->s_uuid + sizeof(u64)); > - buf->f_fsid = u64_to_fsid(fsid); > + buf->f_fsid = uuid_to_fsid(es->s_uuid); > spin_unlock(&sbi->s_lock); > return 0; > } > diff --git a/fs/ext4/super.c b/fs/ext4/super.c > index ad34a37278cd..3581c1cdc19e 100644 > --- a/fs/ext4/super.c > +++ b/fs/ext4/super.c > @@ -6148,7 +6148,6 @@ static int ext4_statfs(struct dentry *dentry, struct kstatfs *buf) > struct ext4_sb_info *sbi = EXT4_SB(sb); > struct ext4_super_block *es = sbi->s_es; > ext4_fsblk_t overhead = 0, resv_blocks; > - u64 fsid; > s64 bfree; > resv_blocks = EXT4_C2B(sbi, atomic64_read(&sbi->s_resv_clusters)); > > @@ -6169,9 +6168,7 @@ static int ext4_statfs(struct dentry *dentry, struct kstatfs *buf) > buf->f_files = le32_to_cpu(es->s_inodes_count); > buf->f_ffree = percpu_counter_sum_positive(&sbi->s_freeinodes_counter); > buf->f_namelen = EXT4_NAME_LEN; > - fsid = le64_to_cpup((void *)es->s_uuid) ^ > - le64_to_cpup((void *)es->s_uuid + sizeof(u64)); > - buf->f_fsid = u64_to_fsid(fsid); > + buf->f_fsid = uuid_to_fsid(es->s_uuid); > > #ifdef CONFIG_QUOTA > if (ext4_test_inode_flag(dentry->d_inode, EXT4_INODE_PROJINHERIT) && > diff --git a/fs/zonefs/super.c b/fs/zonefs/super.c > index 0fe76f376dee..e09810311162 100644 > --- a/fs/zonefs/super.c > +++ b/fs/zonefs/super.c > @@ -1104,7 +1104,6 @@ static int zonefs_statfs(struct dentry *dentry, struct kstatfs *buf) > struct super_block *sb = dentry->d_sb; > struct zonefs_sb_info *sbi = ZONEFS_SB(sb); > enum zonefs_ztype t; > - u64 fsid; > > buf->f_type = ZONEFS_MAGIC; > buf->f_bsize = sb->s_blocksize; > @@ -1127,9 +1126,7 @@ static int zonefs_statfs(struct dentry *dentry, struct kstatfs *buf) > > spin_unlock(&sbi->s_lock); > > - fsid = le64_to_cpup((void *)sbi->s_uuid.b) ^ > - le64_to_cpup((void *)sbi->s_uuid.b + sizeof(u64)); > - buf->f_fsid = u64_to_fsid(fsid); > + buf->f_fsid = uuid_to_fsid(sbi->s_uuid.b); > > return 0; > } > diff --git a/include/linux/statfs.h b/include/linux/statfs.h > index 20f695b90aab..ed86ac090a1b 100644 > --- a/include/linux/statfs.h > +++ b/include/linux/statfs.h > @@ -50,4 +50,11 @@ static inline __kernel_fsid_t u64_to_fsid(u64 v) > return (__kernel_fsid_t){.val = {(u32)v, (u32)(v>>32)}}; > } > > +/* Fold 16 bytes uuid to 64 bit fsid */ > +static inline __kernel_fsid_t uuid_to_fsid(__u8 *uuid) > +{ > + return u64_to_fsid(le64_to_cpup((void *)uuid) ^ > + le64_to_cpup((void *)(uuid + sizeof(u64)))); > +} > + > #endif > For the zonefs bits, looks good to me. Acked-by: Damien Le Moal <damien.lemoal@xxxxxxx> -- Damien Le Moal Western Digital Research