aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/xfs/xfs_ioctl.c50
1 files changed, 31 insertions, 19 deletions
diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c
index 9f808539fc61..1f186d2eec06 100644
--- a/fs/xfs/xfs_ioctl.c
+++ b/fs/xfs/xfs_ioctl.c
@@ -1142,6 +1142,34 @@ xfs_ioctl_setattr_check_extsize(
1142 return 0; 1142 return 0;
1143} 1143}
1144 1144
1145int
1146xfs_ioctl_setattr_check_projid(
1147 struct xfs_inode *ip,
1148 struct fsxattr *fa)
1149{
1150 /* Disallow 32bit project ids if projid32bit feature is not enabled. */
1151 if (fa->fsx_projid > (__uint16_t)-1 &&
1152 !xfs_sb_version_hasprojid32bit(&ip->i_mount->m_sb))
1153 return -EINVAL;
1154
1155 /*
1156 * Project Quota ID state is only allowed to change from within the init
1157 * namespace. Enforce that restriction only if we are trying to change
1158 * the quota ID state. Everything else is allowed in user namespaces.
1159 */
1160 if (current_user_ns() == &init_user_ns)
1161 return 0;
1162
1163 if (xfs_get_projid(ip) != fa->fsx_projid)
1164 return -EINVAL;
1165 if ((fa->fsx_xflags & XFS_XFLAG_PROJINHERIT) !=
1166 (ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT))
1167 return -EINVAL;
1168
1169 return 0;
1170}
1171
1172
1145 1173
1146STATIC int 1174STATIC int
1147xfs_ioctl_setattr( 1175xfs_ioctl_setattr(
@@ -1157,25 +1185,9 @@ xfs_ioctl_setattr(
1157 1185
1158 trace_xfs_ioctl_setattr(ip); 1186 trace_xfs_ioctl_setattr(ip);
1159 1187
1160 /* 1188 code = xfs_ioctl_setattr_check_projid(ip, fa);
1161 * Disallow 32bit project ids when projid32bit feature is not enabled. 1189 if (code)
1162 */ 1190 return code;
1163 if (fa->fsx_projid > (__uint16_t)-1 &&
1164 !xfs_sb_version_hasprojid32bit(&ip->i_mount->m_sb))
1165 return -EINVAL;
1166
1167 /*
1168 * Project Quota ID state is only allowed to change from within the init
1169 * namespace. Enforce that restriction only if we are trying to change
1170 * the quota ID state. Everything else is allowed in user namespaces.
1171 */
1172 if (current_user_ns() != &init_user_ns) {
1173 if (xfs_get_projid(ip) != fa->fsx_projid)
1174 return -EINVAL;
1175 if ((fa->fsx_xflags & XFS_XFLAG_PROJINHERIT) !=
1176 (ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT))
1177 return -EINVAL;
1178 }
1179 1191
1180 /* 1192 /*
1181 * If disk quotas is on, we make sure that the dquots do exist on disk, 1193 * If disk quotas is on, we make sure that the dquots do exist on disk,