From: fanyong Date: Thu, 6 Mar 2008 04:13:32 +0000 (+0000) Subject: Branch HEAD X-Git-Tag: v1_7_0_51~165 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=3db2db358a6e427bd7461c52dbd498de808a6659;p=fs%2Flustre-release.git Branch HEAD b=14976 i=eric.mei i=h.huang (1) Miss to call "req_capsule_set_size()" in "mdc_get_remote_perm()". (2) misc fix after mixed_layout_req landed. --- diff --git a/lustre/llite/remote_perm.c b/lustre/llite/remote_perm.c index 3e4ef7e..ae7b453 100644 --- a/lustre/llite/remote_perm.c +++ b/lustre/llite/remote_perm.c @@ -239,50 +239,55 @@ int lustre_check_remote_perm(struct inode *inode, int mask) 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, diff --git a/lustre/mdc/mdc_request.c b/lustre/mdc/mdc_request.c index b0f3159..0d16809 100644 --- a/lustre/mdc/mdc_request.c +++ b/lustre/mdc/mdc_request.c @@ -225,9 +225,11 @@ int mdc_getattr(struct obd_export *exp, const struct lu_fid *fid, 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); @@ -548,7 +550,9 @@ int mdc_get_lustre_md(struct obd_export *exp, struct ptlrpc_request *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); } @@ -1669,6 +1673,8 @@ int mdc_get_remote_perm(struct obd_export *exp, const struct lu_fid *fid, int rc; ENTRY; + LASSERT(client_is_remote(exp)); + *request = NULL; req = ptlrpc_request_alloc(class_exp2cliimp(exp), &RQF_MDS_GETATTR); if (req == NULL) @@ -1684,6 +1690,9 @@ int mdc_get_remote_perm(struct obd_export *exp, const struct lu_fid *fid, 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); diff --git a/lustre/mdt/mdt_xattr.c b/lustre/mdt/mdt_xattr.c index 2aaaeaf..83ecc74 100644 --- a/lustre/mdt/mdt_xattr.c +++ b/lustre/mdt/mdt_xattr.c @@ -68,9 +68,9 @@ static int mdt_getxattr_pack_reply(struct mdt_thread_info * info) !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), @@ -110,10 +110,10 @@ int mdt_getxattr(struct mdt_thread_info *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 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; @@ -168,7 +168,7 @@ int mdt_getxattr(struct mdt_thread_info *info) &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); @@ -210,16 +210,17 @@ out: 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); @@ -273,7 +274,7 @@ int mdt_reint_setxattr(struct mdt_thread_info *info, 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; @@ -346,7 +347,8 @@ int mdt_reint_setxattr(struct mdt_thread_info *info, 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)