Commit 23bd0735 authored by Dave Chinner's avatar Dave Chinner

xfs: factor projid hint checking out of xfs_ioctl_setattr

The project ID change checking is one of the few remaining open
coded checks in xfs_ioctl_setattr(). Factor it into a helper
function so that the setattr code mostly becomes a flow of check
and action helpers, making it easier to read and follow.
Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
parent d4388d3c
...@@ -1142,24 +1142,12 @@ xfs_ioctl_setattr_check_extsize( ...@@ -1142,24 +1142,12 @@ xfs_ioctl_setattr_check_extsize(
return 0; return 0;
} }
int
STATIC int xfs_ioctl_setattr_check_projid(
xfs_ioctl_setattr( struct xfs_inode *ip,
xfs_inode_t *ip,
struct fsxattr *fa) struct fsxattr *fa)
{ {
struct xfs_mount *mp = ip->i_mount; /* Disallow 32bit project ids if projid32bit feature is not enabled. */
struct xfs_trans *tp;
struct xfs_dquot *udqp = NULL;
struct xfs_dquot *pdqp = NULL;
struct xfs_dquot *olddquot = NULL;
int code;
trace_xfs_ioctl_setattr(ip);
/*
* Disallow 32bit project ids when projid32bit feature is not enabled.
*/
if (fa->fsx_projid > (__uint16_t)-1 && if (fa->fsx_projid > (__uint16_t)-1 &&
!xfs_sb_version_hasprojid32bit(&ip->i_mount->m_sb)) !xfs_sb_version_hasprojid32bit(&ip->i_mount->m_sb))
return -EINVAL; return -EINVAL;
...@@ -1169,13 +1157,37 @@ xfs_ioctl_setattr( ...@@ -1169,13 +1157,37 @@ xfs_ioctl_setattr(
* namespace. Enforce that restriction only if we are trying to change * namespace. Enforce that restriction only if we are trying to change
* the quota ID state. Everything else is allowed in user namespaces. * the quota ID state. Everything else is allowed in user namespaces.
*/ */
if (current_user_ns() != &init_user_ns) { if (current_user_ns() == &init_user_ns)
return 0;
if (xfs_get_projid(ip) != fa->fsx_projid) if (xfs_get_projid(ip) != fa->fsx_projid)
return -EINVAL; return -EINVAL;
if ((fa->fsx_xflags & XFS_XFLAG_PROJINHERIT) != if ((fa->fsx_xflags & XFS_XFLAG_PROJINHERIT) !=
(ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT)) (ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT))
return -EINVAL; return -EINVAL;
}
return 0;
}
STATIC int
xfs_ioctl_setattr(
xfs_inode_t *ip,
struct fsxattr *fa)
{
struct xfs_mount *mp = ip->i_mount;
struct xfs_trans *tp;
struct xfs_dquot *udqp = NULL;
struct xfs_dquot *pdqp = NULL;
struct xfs_dquot *olddquot = NULL;
int code;
trace_xfs_ioctl_setattr(ip);
code = xfs_ioctl_setattr_check_projid(ip, fa);
if (code)
return code;
/* /*
* If disk quotas is on, we make sure that the dquots do exist on disk, * If disk quotas is on, we make sure that the dquots do exist on disk,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment