RETURN(size);
}
+static int mdt_nodemap_map_acl(struct mdt_thread_info *info, void *buf,
+ size_t size, const char *name,
+ enum nodemap_tree_type tree_type)
+{
+ struct lu_nodemap *nodemap;
+ struct obd_export *exp = info->mti_exp;
+ int rc = size;
+
+ ENTRY;
+
+ if (strcmp(name, XATTR_NAME_ACL_ACCESS) == 0 ||
+ strcmp(name, XATTR_NAME_ACL_DEFAULT) == 0) {
+ if (size > info->mti_mdt->mdt_max_ea_size ||
+ (!exp_connect_large_acl(exp) &&
+ size > LUSTRE_POSIX_ACL_MAX_SIZE_OLD))
+ GOTO(out, rc = -ERANGE);
+
+ nodemap = nodemap_get_from_exp(exp);
+ if (IS_ERR(nodemap))
+ GOTO(out, rc = PTR_ERR(nodemap));
+
+ rc = nodemap_map_acl(nodemap, buf, size, tree_type);
+ nodemap_putref(nodemap);
+ if (rc < 0)
+ GOTO(out, rc);
+ }
+out:
+ RETURN(rc);
+}
+
static int mdt_getxattr_all(struct mdt_thread_info *info,
struct mdt_body *reqbody, struct mdt_body *repbody,
struct lu_buf *buf, struct md_object *next)
rc = mo_xattr_get(env, next, buf, b);
if (rc < 0)
GOTO(out_shrink, rc);
-
+ rc = mdt_nodemap_map_acl(info, buf->lb_buf, rc, b,
+ NODEMAP_FS_TO_CLIENT);
+ if (rc < 0)
+ GOTO(out_shrink, rc);
sizes[eavallens] = rc;
eavallens++;
eavallen += rc;
valid = info->mti_body->mbo_valid & (OBD_MD_FLXATTR | OBD_MD_FLXATTRLS);
if (valid == OBD_MD_FLXATTR) {
- char *xattr_name = req_capsule_client_get(info->mti_pill,
- &RMF_NAME);
+ const char *xattr_name = req_capsule_client_get(info->mti_pill,
+ &RMF_NAME);
rc = mo_xattr_get(info->mti_env, next, buf, xattr_name);
+ rc = mdt_nodemap_map_acl(info, buf->lb_buf, rc, xattr_name,
+ NODEMAP_FS_TO_CLIENT);
} else if (valid == OBD_MD_FLXATTRLS) {
CDEBUG(D_INODE, "listxattr\n");
struct lu_attr *attr = &info->mti_attr.ma_attr;
struct mdt_object *obj;
struct md_object *child;
- struct obd_export *exp = info->mti_exp;
__u64 valid = attr->la_valid;
const char *xattr_name = rr->rr_name.ln_name;
int xattr_len = rr->rr_eadatalen;
} else if ((valid & OBD_MD_FLXATTR) &&
(strcmp(xattr_name, XATTR_NAME_ACL_ACCESS) == 0 ||
strcmp(xattr_name, XATTR_NAME_ACL_DEFAULT) == 0)) {
- struct lu_nodemap *nodemap;
-
- if ((xattr_len > info->mti_mdt->mdt_max_ea_size) ||
- (!exp_connect_large_acl(exp) &&
- xattr_len > LUSTRE_POSIX_ACL_MAX_SIZE_OLD))
- GOTO(out, rc = -ERANGE);
-
- nodemap = nodemap_get_from_exp(exp);
- if (IS_ERR(nodemap))
- GOTO(out, rc = PTR_ERR(nodemap));
-
- rc = nodemap_map_acl(nodemap, rr->rr_eadata, xattr_len,
- NODEMAP_CLIENT_TO_FS);
- nodemap_putref(nodemap);
+ 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);
return 1
}
-test_23() {
+test_23a() {
nodemap_version_check || return 0
nodemap_test_setup
nodemap_test_cleanup
}
-run_test 23 "test mapped ACLs"
+run_test 23a "test mapped regular ACLs"
+
+test_23b() { #LU-9929
+ remote_mgs_nodsh && skip "remote MGS with nodsh" && return
+ [ $(lustre_version_code mgs) -lt $(version_code 2.10.53) ] &&
+ skip "Need MGS >= 2.10.53" && return
+
+ nodemap_test_setup
+ trap nodemap_test_cleanup EXIT
+
+ local testdir=$DIR/$tdir
+ local fs_id=$((IDBASE+10))
+ local unmapped_id
+ local mapped_id
+ local fs_user
+
+ do_facet mgs $LCTL nodemap_modify --name c0 --property admin --value 1
+ wait_nm_sync c0 admin_nodemap
+
+ # Add idmap $ID0:$fs_id (500:60010)
+ do_facet mgs $LCTL nodemap_add_idmap --name c0 --idtype gid \
+ --idmap $ID0:$fs_id ||
+ error "add idmap $ID0:$fs_id to nodemap c0 failed"
+
+ # set/getfacl default acl on client0 (unmapped gid=500)
+ rm -rf $testdir
+ mkdir -p $testdir
+ # Here, USER0=$(getent passwd | grep :$ID0:$ID0: | cut -d: -f1)
+ setfacl -R -d -m group:$USER0:rwx $testdir ||
+ error "setfacl $testdir on ${clients_arr[0]} failed"
+ unmapped_id=$(getfacl $testdir | grep -E "default:group:.*:rwx" |
+ awk -F: '{print $3}')
+ [ "$unmapped_id" = "$USER0" ] ||
+ error "gid=$ID0 was not unmapped correctly on ${clients_arr[0]}"
+
+ # getfacl default acl on MGS (mapped gid=60010)
+ zconf_mount $mgs_HOST $MOUNT
+ do_rpc_nodes $mgs_HOST is_mounted $MOUNT ||
+ error "mount lustre on MGS failed"
+ mapped_id=$(do_node $mgs_HOST getfacl $testdir |
+ grep -E "default:group:.*:rwx" | awk -F: '{print $3}')
+ fs_user=$(do_facet mgs getent passwd |
+ grep :$fs_id:$fs_id: | cut -d: -f1)
+ [ $mapped_id -eq $fs_id -o "$mapped_id" = "$fs_user" ] ||
+ error "Should return gid=$fs_id or $fs_user on MGS"
+
+ rm -rf $testdir
+ do_facet mgs umount $MOUNT
+ nodemap_test_cleanup
+}
+run_test 23b "test mapped default ACLs"
test_24() {
nodemap_test_setup