Add a new ioctl to retrieve the UUID of a mounted xfs filesystem. This is a precursor to adding the SETFSUUID ioctl. Signed-off-by: Catherine Hoang <catherine.hoang@xxxxxxxxxx> Reviewed-by: Allison Henderson <allison.henderson@xxxxxxxxxx> --- fs/xfs/xfs_ioctl.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 1f783e979629..cf77715afe9e 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -1865,6 +1865,39 @@ xfs_fs_eofblocks_from_user( return 0; } +static int +xfs_ioctl_getuuid( + struct xfs_mount *mp, + struct fsuuid __user *ufsuuid) +{ + struct fsuuid fsuuid; + __u8 uuid[UUID_SIZE]; + + if (copy_from_user(&fsuuid, ufsuuid, sizeof(fsuuid))) + return -EFAULT; + + if (fsuuid.fsu_len == 0) { + fsuuid.fsu_len = UUID_SIZE; + if (copy_to_user(&ufsuuid->fsu_len, &fsuuid.fsu_len, + sizeof(fsuuid.fsu_len))) + return -EFAULT; + return 0; + } + + if (fsuuid.fsu_len < UUID_SIZE || fsuuid.fsu_flags != 0) + return -EINVAL; + + spin_lock(&mp->m_sb_lock); + memcpy(uuid, &mp->m_sb.sb_uuid, UUID_SIZE); + spin_unlock(&mp->m_sb_lock); + + fsuuid.fsu_len = UUID_SIZE; + if (copy_to_user(ufsuuid, &fsuuid, sizeof(fsuuid)) || + copy_to_user(&ufsuuid->fsu_uuid[0], uuid, UUID_SIZE)) + return -EFAULT; + return 0; +} + /* * These long-unused ioctls were removed from the official ioctl API in 5.17, * but retain these definitions so that we can log warnings about them. @@ -2153,6 +2186,9 @@ xfs_file_ioctl( return error; } + case FS_IOC_GETFSUUID: + return xfs_ioctl_getuuid(mp, arg); + default: return -ENOTTY; } -- 2.25.1