- if (strcmp(xattr_name, XATTR_NAME_LOV) == 0)
- GOTO(out, rc = -EACCES);
- if (strcmp(xattr_name, XATTR_NAME_LMA) == 0)
- GOTO(out, rc = 0);
- if (strcmp(xattr_name, XATTR_NAME_LINK) == 0)
- GOTO(out, rc = 0);
- } else if ((valid & OBD_MD_FLXATTR) &&
- (strncmp(xattr_name, XATTR_NAME_ACL_ACCESS,
- sizeof(XATTR_NAME_ACL_ACCESS) - 1) == 0 ||
- strncmp(xattr_name, XATTR_NAME_ACL_DEFAULT,
- sizeof(XATTR_NAME_ACL_DEFAULT) - 1) == 0)) {
- /* currently lustre limit acl access size */
- if (xattr_len > LUSTRE_POSIX_ACL_MAX_SIZE)
- GOTO(out, -ERANGE);
- }
-
- lockpart = MDS_INODELOCK_UPDATE;
+ } else if (strncmp(xattr_name, XATTR_TRUSTED_PREFIX,
+ sizeof(XATTR_TRUSTED_PREFIX) - 1) == 0) {
+
+ /* setxattr(LMV) with lum is used to shrink dir layout */
+ if (strcmp(xattr_name, XATTR_NAME_LMV) == 0) {
+ __u32 *magic = rr->rr_eadata;
+
+ if (le32_to_cpu(*magic) == LMV_USER_MAGIC ||
+ le32_to_cpu(*magic) == LMV_USER_MAGIC_SPECIFIC) {
+ rc = mdt_dir_layout_shrink(info);
+ GOTO(out, rc);
+ }
+ }
+
+ if (!md_capable(mdt_ucred(info), CFS_CAP_SYS_ADMIN))
+ GOTO(out, rc = -EPERM);
+
+ if (strcmp(xattr_name, XATTR_NAME_LOV) == 0 ||
+ strcmp(xattr_name, XATTR_NAME_LMA) == 0 ||
+ strcmp(xattr_name, XATTR_NAME_LMV) == 0 ||
+ strcmp(xattr_name, XATTR_NAME_LINK) == 0 ||
+ strcmp(xattr_name, XATTR_NAME_FID) == 0 ||
+ strcmp(xattr_name, XATTR_NAME_VERSION) == 0 ||
+ strcmp(xattr_name, XATTR_NAME_SOM) == 0 ||
+ strcmp(xattr_name, XATTR_NAME_HSM) == 0 ||
+ strcmp(xattr_name, XATTR_NAME_LFSCK_NAMESPACE) == 0)
+ GOTO(out, rc = 0);
+ } else if ((valid & OBD_MD_FLXATTR) &&
+ (strcmp(xattr_name, XATTR_NAME_ACL_ACCESS) == 0 ||
+ strcmp(xattr_name, XATTR_NAME_ACL_DEFAULT) == 0)) {
+ rc = mdt_nodemap_map_acl(info, rr->rr_eadata, xattr_len,
+ xattr_name, NODEMAP_CLIENT_TO_FS);
+ if (rc < 0)
+ GOTO(out, rc);
+ /* ACLs were mapped out, return an error so the user knows */
+ if (rc != xattr_len)
+ GOTO(out, rc = -EPERM);
+ } else if ((strlen(xattr_name) > strlen(XATTR_LUSTRE_LOV) + 1) &&
+ strncmp(xattr_name, XATTR_LUSTRE_LOV,
+ strlen(XATTR_LUSTRE_LOV)) == 0) {
+
+ if (strncmp(xattr_name, XATTR_LUSTRE_LOV".add",
+ strlen(XATTR_LUSTRE_LOV".add")) &&
+ strncmp(xattr_name, XATTR_LUSTRE_LOV".set",
+ strlen(XATTR_LUSTRE_LOV".set")) &&
+ strncmp(xattr_name, XATTR_LUSTRE_LOV".del",
+ strlen(XATTR_LUSTRE_LOV".del"))) {
+ CERROR("%s: invalid xattr name: %s\n",
+ mdt_obd_name(info->mti_mdt), xattr_name);
+ GOTO(out, rc = -EINVAL);
+ }
+
+ lockpart |= MDS_INODELOCK_LAYOUT;
+ }
+