diff mbox series

[1/2] fs: introduce a wrapper uuid_to_fsid()

Message ID 20210322173944.449469-2-amir73il@gmail.com (mailing list archive)
State New, archived
Headers show
Series Better fanotify support for tmpfs | expand

Commit Message

Amir Goldstein March 22, 2021, 5:39 p.m. UTC
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@gmail.com>
---
 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(-)

Comments

Damien Le Moal March 23, 2021, 5:19 a.m. UTC | #1
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@gmail.com>
> ---
>  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@wdc.com>
Christian Brauner March 23, 2021, 2:09 p.m. UTC | #2
On Mon, Mar 22, 2021 at 07:39:43PM +0200, 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@gmail.com>
> ---

Seen that as part of your other series yesterday. Looks like a good
improvement and removes a bunch of open-coding.
Reviewed-by: Christian Brauner <christian.brauner@ubuntu.com>
diff mbox series

Patch

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