mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
fs: FS_IOC_GETUUID
Add a new generic ioctls for querying the filesystem UUID. These are lifted versions of the ext4 ioctls, with one change: we're not using a flexible array member, because UUIDs will never be more than 16 bytes. This patch adds a generic implementation of FS_IOC_GETFSUUID, which reads from super_block->s_uuid. We're not lifting SETFSUUID from ext4 - that can be done on offline filesystems by the people who need it, trying to do it online is just asking for too much trouble. Cc: Christian Brauner <brauner@kernel.org> Cc: Jan Kara <jack@suse.cz> Cc: Dave Chinner <dchinner@redhat.com> Cc: Darrick J. Wong <djwong@kernel.org> Cc: Theodore Ts'o <tytso@mit.edu> Cc: linux-fsdevel@vger.kernel.org Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev> Link: https://lore.kernel.org/r/20240207025624.1019754-4-kent.overstreet@linux.dev Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
parent
dd9019604c
commit
41bcbe59c3
@ -82,8 +82,9 @@ Code Seq# Include File Comments
|
||||
0x10 00-0F drivers/char/s390/vmcp.h
|
||||
0x10 10-1F arch/s390/include/uapi/sclp_ctl.h
|
||||
0x10 20-2F arch/s390/include/uapi/asm/hypfs.h
|
||||
0x12 all linux/fs.h
|
||||
0x12 all linux/fs.h BLK* ioctls
|
||||
linux/blkpg.h
|
||||
0x15 all linux/fs.h FS_IOC_* ioctls
|
||||
0x1b all InfiniBand Subsystem
|
||||
<http://infiniband.sourceforge.net/>
|
||||
0x20 all drivers/cdrom/cm206.h
|
||||
|
16
fs/ioctl.c
16
fs/ioctl.c
@ -763,6 +763,19 @@ static int ioctl_fssetxattr(struct file *file, void __user *argp)
|
||||
return err;
|
||||
}
|
||||
|
||||
static int ioctl_getfsuuid(struct file *file, void __user *argp)
|
||||
{
|
||||
struct super_block *sb = file_inode(file)->i_sb;
|
||||
struct fsuuid2 u = { .len = sb->s_uuid_len, };
|
||||
|
||||
if (!sb->s_uuid_len)
|
||||
return -ENOIOCTLCMD;
|
||||
|
||||
memcpy(&u.uuid[0], &sb->s_uuid, sb->s_uuid_len);
|
||||
|
||||
return copy_to_user(argp, &u, sizeof(u)) ? -EFAULT : 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* do_vfs_ioctl() is not for drivers and not intended to be EXPORT_SYMBOL()'d.
|
||||
* It's just a simple helper for sys_ioctl and compat_sys_ioctl.
|
||||
@ -845,6 +858,9 @@ static int do_vfs_ioctl(struct file *filp, unsigned int fd,
|
||||
case FS_IOC_FSSETXATTR:
|
||||
return ioctl_fssetxattr(filp, argp);
|
||||
|
||||
case FS_IOC_GETFSUUID:
|
||||
return ioctl_getfsuuid(filp, argp);
|
||||
|
||||
default:
|
||||
if (S_ISREG(inode->i_mode))
|
||||
return file_ioctl(filp, cmd, argp);
|
||||
|
@ -64,6 +64,19 @@ struct fstrim_range {
|
||||
__u64 minlen;
|
||||
};
|
||||
|
||||
/*
|
||||
* We include a length field because some filesystems (vfat) have an identifier
|
||||
* that we do want to expose as a UUID, but doesn't have the standard length.
|
||||
*
|
||||
* We use a fixed size buffer beacuse this interface will, by fiat, never
|
||||
* support "UUIDs" longer than 16 bytes; we don't want to force all downstream
|
||||
* users to have to deal with that.
|
||||
*/
|
||||
struct fsuuid2 {
|
||||
__u8 len;
|
||||
__u8 uuid[16];
|
||||
};
|
||||
|
||||
/* extent-same (dedupe) ioctls; these MUST match the btrfs ioctl definitions */
|
||||
#define FILE_DEDUPE_RANGE_SAME 0
|
||||
#define FILE_DEDUPE_RANGE_DIFFERS 1
|
||||
@ -215,6 +228,8 @@ struct fsxattr {
|
||||
#define FS_IOC_FSSETXATTR _IOW('X', 32, struct fsxattr)
|
||||
#define FS_IOC_GETFSLABEL _IOR(0x94, 49, char[FSLABEL_MAX])
|
||||
#define FS_IOC_SETFSLABEL _IOW(0x94, 50, char[FSLABEL_MAX])
|
||||
/* Returns the external filesystem UUID, the same one blkid returns */
|
||||
#define FS_IOC_GETFSUUID _IOR(0x15, 0, struct fsuuid2)
|
||||
|
||||
/*
|
||||
* Inode flags (FS_IOC_GETFLAGS / FS_IOC_SETFLAGS)
|
||||
|
Loading…
Reference in New Issue
Block a user