int i = 0, rc;
ENTRY;
-check:
- utime = lli->lli_rmtperm_utime;
- rc = do_check_remote_perm(lli, mask);
- if (!rc || ((rc != -ENOENT) && i))
- RETURN(rc);
+ do {
+ utime = lli->lli_rmtperm_utime;
+ rc = do_check_remote_perm(lli, mask);
+ if (!rc || (rc != -ENOENT && i))
+ break;
+
+ might_sleep();
+
+ down(&lli->lli_rmtperm_sem);
+ /* check again */
+ if (utime != lli->lli_rmtperm_utime) {
+ rc = do_check_remote_perm(lli, mask);
+ if (!rc || (rc != -ENOENT && i)) {
+ up(&lli->lli_rmtperm_sem);
+ break;
+ }
+ }
- might_sleep();
+ if (i++ > 5) {
+ CERROR("check remote perm falls in dead loop!\n");
+ LBUG();
+ }
- down(&lli->lli_rmtperm_sem);
- /* check again */
- if (utime != lli->lli_rmtperm_utime) {
- rc = do_check_remote_perm(lli, mask);
- if (!rc || ((rc != -ENOENT) && i)) {
+ oc = ll_mdscapa_get(inode);
+ rc = md_get_remote_perm(sbi->ll_md_exp, ll_inode2fid(inode), oc,
+ ll_i2suppgid(inode), &req);
+ capa_put(oc);
+ if (rc) {
up(&lli->lli_rmtperm_sem);
- RETURN(rc);
+ break;
}
- }
- if (i++ > 5) {
- CERROR("check remote perm falls in dead loop!\n");
- LBUG();
- }
+ perm = req_capsule_server_swab_get(&req->rq_pill, &RMF_ACL,
+ lustre_swab_mdt_remote_perm);
+ if (unlikely(perm == NULL)) {
+ up(&lli->lli_rmtperm_sem);
+ rc = -EPROTO;
+ break;
+ }
- oc = ll_mdscapa_get(inode);
- rc = md_get_remote_perm(sbi->ll_md_exp, ll_inode2fid(inode), oc,
- ll_i2suppgid(inode), &req);
- capa_put(oc);
- if (rc) {
+ rc = ll_update_remote_perm(inode, perm);
up(&lli->lli_rmtperm_sem);
- RETURN(rc);
- }
-
- perm = req_capsule_server_get(&req->rq_pill, &RMF_ACL);
- LASSERT(perm);
-
- rc = ll_update_remote_perm(inode, perm);
- up(&lli->lli_rmtperm_sem);
+ if (rc == -ENOMEM)
+ break;
+ ptlrpc_req_finished(req);
+ } while (1);
ptlrpc_req_finished(req);
-
- if (rc == -ENOMEM)
- RETURN(rc);
-
- goto check;
+ RETURN(rc);
}
#if 0 /* NB: remote perms can't be freed in ll_mdc_blocking_ast of UPDATE lock,
mdc_pack_body(req, fid, oc, valid, ea_size, -1, MDS_BFLAG_EXT_FLAGS);
req_capsule_set_size(&req->rq_pill, &RMF_MDT_MD, RCL_SERVER, ea_size);
- if (valid & OBD_MD_FLRMTPERM)
+ if (valid & OBD_MD_FLRMTPERM) {
+ LASSERT(client_is_remote(exp));
req_capsule_set_size(&req->rq_pill, &RMF_ACL, RCL_SERVER,
sizeof(struct mdt_remote_perm));
+ }
ptlrpc_request_set_replen(req);
rc = mdc_getattr_common(exp, req);
if (md->body->valid & OBD_MD_FLRMTPERM) {
/* remote permission */
- md->remote_perm = req_capsule_server_get(pill, &RMF_ACL);
+ LASSERT(client_is_remote(exp));
+ md->remote_perm = req_capsule_server_swab_get(pill, &RMF_ACL,
+ lustre_swab_mdt_remote_perm);
if (!md->remote_perm)
GOTO(out, rc = -EPROTO);
}
int rc;
ENTRY;
+ LASSERT(client_is_remote(exp));
+
*request = NULL;
req = ptlrpc_request_alloc(class_exp2cliimp(exp), &RQF_MDS_GETATTR);
if (req == NULL)
mdc_pack_body(req, fid, oc, OBD_MD_FLRMTPERM, 0, suppgid, 0);
+ req_capsule_set_size(&req->rq_pill, &RMF_ACL, RCL_SERVER,
+ sizeof(struct mdt_remote_perm));
+
ptlrpc_request_set_replen(req);
rc = ptlrpc_queue_wait(req);
!strncmp(xattr_name, user_string, sizeof(user_string) - 1))
RETURN(-EOPNOTSUPP);
- size = mo_xattr_get(info->mti_env,
- mdt_object_child(info->mti_object),
- &LU_BUF_NULL, xattr_name);
+ size = mo_xattr_get(info->mti_env,
+ mdt_object_child(info->mti_object),
+ &LU_BUF_NULL, xattr_name);
} else if ((valid & OBD_MD_FLXATTRLS) == OBD_MD_FLXATTRLS) {
size = mo_xattr_list(info->mti_env,
mdt_object_child(info->mti_object),
struct ptlrpc_request *req = mdt_info_req(info);
struct mdt_export_data *med = mdt_req2med(req);
struct md_ucred *uc = mdt_ucred(info);
- struct mdt_body *reqbody;
- struct mdt_body *repbody = NULL;
- struct md_object *next;
- struct lu_buf *buf;
+ struct mdt_body *reqbody;
+ struct mdt_body *repbody = NULL;
+ struct md_object *next;
+ struct lu_buf *buf;
int easize, rc;
ENTRY;
&RMF_NAME);
CDEBUG(D_INODE, "getxattr %s\n", xattr_name);
- rc = mo_xattr_get(info->mti_env, next, buf, xattr_name);
+ rc = mo_xattr_get(info->mti_env, next, buf, xattr_name);
if (rc < 0) {
CERROR("getxattr failed: %d\n", rc);
GOTO(out, rc);
return rc;
}
-static int mdt_rmtlsetfacl(struct mdt_thread_info *info, const char *xattr_name,
+static int mdt_rmtlsetfacl(struct mdt_thread_info *info,
+ struct md_object *next,
+ const char *xattr_name,
ext_acl_xattr_header *header,
posix_acl_xattr_header **out)
{
- struct ptlrpc_request *req = mdt_info_req(info);
+ struct ptlrpc_request *req = mdt_info_req(info);
struct mdt_export_data *med = mdt_req2med(req);
- struct md_ucred *uc = mdt_ucred(info);
- struct md_object *next = mdt_object_child(info->mti_object);
- struct lu_buf *buf = &info->mti_buf;
- int rc;
+ struct md_ucred *uc = mdt_ucred(info);
+ struct lu_buf *buf = &info->mti_buf;
+ int rc;
ENTRY;
rc = lustre_ext_acl_xattr_id2server(uc, med->med_idmap, header);
struct mdt_object *obj;
struct md_object *child;
__u64 valid = attr->la_valid;
- const char *xattr_name;
+ const char *xattr_name;
int xattr_len = 0;
__u64 lockpart;
int rc;
if (valid & OBD_MD_FLRMTLSETFACL) {
LASSERT(med->med_rmtclient);
- xattr_len = mdt_rmtlsetfacl(info, xattr_name,
+ xattr_len = mdt_rmtlsetfacl(info, child,
+ xattr_name,
(ext_acl_xattr_header *)xattr,
&new_xattr);
if (xattr_len < 0)