xfs: bump XFS_IOC_FSGEOMETRY to v5 structures
Unfortunately, the V4 XFS_IOC_FSGEOMETRY structure is out of space so we can't just add a new field to it. Hence we need to bump the definition to V5 and and treat the V4 ioctl and structure similar to v1 to v3. While doing this, clean up all the definitions associated with the XFS_IOC_FSGEOMETRY ioctl. Signed-Off-By: Dave Chinner <dchinner@redhat.com> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> [darrick: forward port to 5.1, expand structure size to 256 bytes] Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Brian Foster <bfoster@redhat.com>
This commit is contained in:

committed by
Darrick J. Wong

parent
519841c207
commit
1b6d968de2
@@ -778,41 +778,28 @@ xfs_ioc_bulkstat(
|
||||
return 0;
|
||||
}
|
||||
|
||||
STATIC int
|
||||
xfs_ioc_fsgeometry_v1(
|
||||
xfs_mount_t *mp,
|
||||
void __user *arg)
|
||||
{
|
||||
xfs_fsop_geom_t fsgeo;
|
||||
int error;
|
||||
|
||||
error = xfs_fs_geometry(&mp->m_sb, &fsgeo, 3);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
/*
|
||||
* Caller should have passed an argument of type
|
||||
* xfs_fsop_geom_v1_t. This is a proper subset of the
|
||||
* xfs_fsop_geom_t that xfs_fs_geometry() fills in.
|
||||
*/
|
||||
if (copy_to_user(arg, &fsgeo, sizeof(xfs_fsop_geom_v1_t)))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
STATIC int
|
||||
xfs_ioc_fsgeometry(
|
||||
xfs_mount_t *mp,
|
||||
void __user *arg)
|
||||
struct xfs_mount *mp,
|
||||
void __user *arg,
|
||||
int struct_version)
|
||||
{
|
||||
xfs_fsop_geom_t fsgeo;
|
||||
struct xfs_fsop_geom fsgeo;
|
||||
size_t len;
|
||||
int error;
|
||||
|
||||
error = xfs_fs_geometry(&mp->m_sb, &fsgeo, 4);
|
||||
error = xfs_fs_geometry(&mp->m_sb, &fsgeo, struct_version);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
if (copy_to_user(arg, &fsgeo, sizeof(fsgeo)))
|
||||
if (struct_version <= 3)
|
||||
len = sizeof(struct xfs_fsop_geom_v1);
|
||||
else if (struct_version == 4)
|
||||
len = sizeof(struct xfs_fsop_geom_v4);
|
||||
else
|
||||
len = sizeof(fsgeo);
|
||||
|
||||
if (copy_to_user(arg, &fsgeo, len))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
@@ -1937,10 +1924,11 @@ xfs_file_ioctl(
|
||||
return xfs_ioc_bulkstat(mp, cmd, arg);
|
||||
|
||||
case XFS_IOC_FSGEOMETRY_V1:
|
||||
return xfs_ioc_fsgeometry_v1(mp, arg);
|
||||
|
||||
return xfs_ioc_fsgeometry(mp, arg, 3);
|
||||
case XFS_IOC_FSGEOMETRY_V4:
|
||||
return xfs_ioc_fsgeometry(mp, arg, 4);
|
||||
case XFS_IOC_FSGEOMETRY:
|
||||
return xfs_ioc_fsgeometry(mp, arg);
|
||||
return xfs_ioc_fsgeometry(mp, arg, 5);
|
||||
|
||||
case XFS_IOC_GETVERSION:
|
||||
return put_user(inode->i_generation, (int __user *)arg);
|
||||
|
Reference in New Issue
Block a user