diff options
| -rw-r--r-- | fs/xfs/xfs_ioctl.c | 50 |
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 | ||
| 1145 | int | ||
| 1146 | xfs_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 | ||
| 1146 | STATIC int | 1174 | STATIC int |
| 1147 | xfs_ioctl_setattr( | 1175 | xfs_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, |
