On Tue, 27 Aug 2024 01:41:08 +0000, Hongbo Li wrote: > Many mainstream file systems already support the GETVERSION ioctl, > and their implementations are completely the same, essentially > just obtain the value of i_generation. We think this ioctl can be > implemented at the VFS layer, so the file systems do not need to > implement it individually. > > Signed-off-by: Hongbo Li <lihongbo22@xxxxxxxxxx> > --- > fs/ioctl.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/fs/ioctl.c b/fs/ioctl.c > index 64776891120c..dff887ec52c4 100644 > --- a/fs/ioctl.c > +++ b/fs/ioctl.c > @@ -878,6 +878,9 @@ static int do_vfs_ioctl(struct file *filp, unsigned int fd, > case FS_IOC_GETFSUUID: > return ioctl_getfsuuid(filp, argp); > > + case FS_IOC_GETVERSION: > + return put_user(inode->i_generation, (int __user *)argp); > + > case FS_IOC_GETFSSYSFSPATH: > return ioctl_get_fs_sysfs_path(filp, argp); > > @@ -992,6 +995,9 @@ COMPAT_SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, > cmd = (cmd == FS_IOC32_GETFLAGS) ? > FS_IOC_GETFLAGS : FS_IOC_SETFLAGS; > fallthrough; The above case falls through... > + case FS_IOC32_GETVERSION: > + cmd = FS_IOC_GETVERSION; ... to this new case, which clobbers cmd, breaking FS_IOC32_[GS]ETFLAGS. > + fallthrough; > /* > * everything else in do_vfs_ioctl() takes either a compatible > * pointer argument or no argument -- call it with a modified