From: huanghua Date: Fri, 7 Jul 2006 03:45:47 +0000 (+0000) Subject: (1)fix some defects found in inspection. X-Git-Tag: v1_8_0_110~486^2~1476 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=09e8358cf4a9869f9cab1a74f2324c52b0a42cbb;p=fs%2Flustre-release.git (1)fix some defects found in inspection. (2)disabled mdt_fs operation, waiting for read & write of osd. --- diff --git a/lustre/include/lu_object.h b/lustre/include/lu_object.h index c3993ec..9ee5988 100644 --- a/lustre/include/lu_object.h +++ b/lustre/include/lu_object.h @@ -337,10 +337,8 @@ struct lu_attr { __u32 la_flags; /* object flags */ __u32 la_nlink; /* number of persistent references to this * object */ -#ifdef MDT_CODE __u32 la_rdev; /* real device */ - __u64 la_valid; /* real device */ -#endif + __u64 la_valid; /* valid bits */ }; diff --git a/lustre/mdt/mdt_fs.c b/lustre/mdt/mdt_fs.c index 239c578..484fc84 100644 --- a/lustre/mdt/mdt_fs.c +++ b/lustre/mdt/mdt_fs.c @@ -400,8 +400,8 @@ int mdt_fs_setup(const struct lu_context *ctxt, mdt->mdt_last = NULL; } } else { - CERROR("cannot open %s: rc = %d\n", LAST_RCVD, rc); rc = PTR_ERR(last); + CERROR("cannot open %s: rc = %d\n", LAST_RCVD, rc); } return rc; } diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index 9536238..d4f4aba 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -10,6 +10,7 @@ * Author: Phil Schwan * Author: Mike Shaver * Author: Nikita Danilov + * Author: Huang Hua * * This file is part of the Lustre file system, http://www.lustre.org * Lustre is a trademark of Cluster File Systems, Inc. @@ -173,14 +174,13 @@ void mdt_pack_attr2body(struct mdt_body *b, struct lu_attr *attr) b->nlink = attr->la_nlink; } -static int mdt_getattr_pack_msg(struct mdt_thread_info *info) +static int mdt_getattr_pack_msg(struct mdt_thread_info *info, + struct mdt_object *o) { -#ifdef MDT_CODE const struct mdt_body *body = info->mti_body; struct req_capsule *pill = &info->mti_pill; struct ptlrpc_request *req = mdt_info_req(info); -#endif - struct md_object *next = mdt_object_child(info->mti_object); + struct md_object *next = mdt_object_child(o); struct lu_attr *la = &info->mti_attr; int rc; ENTRY; @@ -189,36 +189,32 @@ static int mdt_getattr_pack_msg(struct mdt_thread_info *info) if (rc){ RETURN(rc); } -#ifdef MDT_CODE if ((S_ISREG(la->la_mode) && (body->valid & OBD_MD_FLEASIZE)) || (S_ISDIR(la->la_mode) && (body->valid & OBD_MD_FLDIREA))) { rc = mo_xattr_get(info->mti_ctxt, next, NULL, 0, "lov"); CDEBUG(D_INODE, "got %d bytes MD data for object "DFID3"\n", - rc, PFID3(mdt_object_fid(info->mti_object))); + rc, PFID3(mdt_object_fid(o))); if (rc < 0) { - if (rc != -ENODATA) { + if (rc != -ENODATA && rc != -EOPNOTSUPP) { CERROR("error getting MD "DFID3": rc = %d\n", - PFID3(mdt_object_fid(info->mti_object)), + PFID3(mdt_object_fid(o)), rc); RETURN(rc); } - req_capsule_set_size(pill, &RMF_MDT_MD, RCL_SERVER, 0); + rc = 0; } else if (rc > MAX_MD_SIZE) { - req_capsule_set_size(pill, &RMF_MDT_MD, RCL_SERVER, 0); CERROR("MD size %d larger than maximum possible %u\n", rc, MAX_MD_SIZE); - } else { - req_capsule_set_size(pill, &RMF_MDT_MD, - RCL_SERVER, rc); + rc = 0; } } else if (S_ISLNK(la->la_mode) && (body->valid & OBD_MD_LINKNAME)) { - /* XXX:It also uese the mdt_md to hold symname. + /* XXX:It also uses the mdt_md to hold symname. * Are there any problem? will be swabbed? hope not. */ - int len = min_t(int, la->la_size + 1, body->eadatasize); - req_capsule_set_size(pill, &RMF_MDT_MD, RCL_SERVER, len); + rc = min_t(int, la->la_size + 1, body->eadatasize); } + req_capsule_set_size(pill, &RMF_MDT_MD, RCL_SERVER, rc); #ifdef CONFIG_FS_POSIX_ACL if ((req->rq_export->exp_connect_flags & OBD_CONNECT_ACL) && @@ -227,17 +223,15 @@ static int mdt_getattr_pack_msg(struct mdt_thread_info *info) rc = mo_xattr_get(info->mti_ctxt, next, NULL, 0, XATTR_NAME_ACL_ACCESS); if (rc < 0) { - if (rc != -ENODATA) { + if (rc != -ENODATA && rc != -EOPNOTSUPP) { CERROR("got acl size: %d\n", rc); RETURN(rc); } - req_capsule_set_size(pill, &RMF_EADATA, RCL_SERVER, 0); - } else - req_capsule_set_size(pill, &RMF_EADATA, - RCL_SERVER, rc); + rc = 0; + } + req_capsule_set_size(pill, &RMF_EADATA, RCL_SERVER, rc); } #endif -#endif if (OBD_FAIL_CHECK(OBD_FAIL_MDS_GETATTR_PACK)) { CERROR("failed MDT_GETATTR_PACK test\n"); RETURN(-ENOMEM); @@ -245,24 +239,22 @@ static int mdt_getattr_pack_msg(struct mdt_thread_info *info) rc = req_capsule_pack(&info->mti_pill); if (rc) { CERROR("lustre_pack_reply failed: rc %d\n", rc); - RETURN(rc); } - RETURN(0); + RETURN(rc); } -static int mdt_getattr_internal(struct mdt_thread_info *info) +static int mdt_getattr_internal(struct mdt_thread_info *info, + struct mdt_object *o) { - struct md_object *next = mdt_object_child(info->mti_object); + struct md_object *next = mdt_object_child(o); const struct mdt_body *reqbody = info->mti_body; struct mdt_body *repbody; struct lu_attr *la = &info->mti_attr; int rc; -#ifdef MDT_CODE void *buffer; int length; struct ptlrpc_request *req = mdt_info_req(info); -#endif ENTRY; rc = mo_attr_get(info->mti_ctxt, next, la); @@ -274,10 +266,9 @@ static int mdt_getattr_internal(struct mdt_thread_info *info) repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY); mdt_pack_attr2body(repbody, la); - repbody->fid1 = *mdt_object_fid(info->mti_object); + repbody->fid1 = *mdt_object_fid(o); repbody->valid |= OBD_MD_FLID; -#ifdef MDT_CODE buffer = req_capsule_server_get(&info->mti_pill, &RMF_MDT_MD); length = req_capsule_get_size(&info->mti_pill, &RMF_MDT_MD, RCL_SERVER); @@ -330,7 +321,7 @@ static int mdt_getattr_internal(struct mdt_thread_info *info) buffer, length, XATTR_NAME_ACL_ACCESS); if (rc < 0) { - if (rc != -ENODATA) { + if (rc != -ENODATA && rc != -EOPNOTSUPP) { CERROR("got acl size: %d\n", rc); RETURN(rc); } @@ -340,7 +331,6 @@ static int mdt_getattr_internal(struct mdt_thread_info *info) repbody->valid |= OBD_MD_FLACL; } #endif -#endif RETURN(0); } @@ -357,9 +347,9 @@ static int mdt_getattr(struct mdt_thread_info *info) CERROR(LUSTRE_MDT0_NAME": getattr lustre_pack_reply failed\n"); result = -ENOMEM; } else { - result = mdt_getattr_pack_msg(info); + result = mdt_getattr_pack_msg(info, info->mti_object); if (result == 0) - result = mdt_getattr_internal(info); + result = mdt_getattr_internal(info, info->mti_object); } RETURN(result); } @@ -400,6 +390,22 @@ static int mdt_getattr_name_lock(struct mdt_thread_info *info, /*step 2: lookup child's fid by name */ result = mdo_lookup(info->mti_ctxt, next, name, &child_fid); + if (result == -EREMOTE) { + /* This object is located on remote node */ + req_capsule_set_size(&info->mti_pill, &RMF_MDT_MD, + RCL_SERVER, 0); +#ifdef CONFIG_FS_POSIX_ACL + req_capsule_set_size(&info->mti_pill, &RMF_EADATA, + RCL_SERVER, 0); +#endif + result = req_capsule_pack(&info->mti_pill); + if (result == 0) { + struct mdt_body *repbody; + repbody = req_capsule_server_get(&info->mti_pill, + &RMF_MDT_BODY); + repbody->fid1 = child_fid; + } + } if (result != 0) GOTO(out_parent, result); @@ -411,9 +417,9 @@ static int mdt_getattr_name_lock(struct mdt_thread_info *info, GOTO(out_parent, result = PTR_ERR(child)); /* finally, we can get attr for child. */ - result = mdt_getattr_pack_msg(info); + result = mdt_getattr_pack_msg(info, child); if (result == 0) { - result = mdt_getattr_internal(info); + result = mdt_getattr_internal(info, child); } if (result != 0) mdt_object_unlock(ns, child, lhc); @@ -488,19 +494,7 @@ static int mdt_reint_internal(struct mdt_thread_info *info, __u32 op) rc = mdt_reint_unpack(info, op); if (rc == 0) { - struct mdt_reint_reply *rep; - - rep = &info->mti_reint_rep; - rep->mrr_body = req_capsule_server_get(&info->mti_pill, - &RMF_MDT_BODY); - if (rep->mrr_body != NULL) - /* - * XXX fill other fields in @rep with pointers to - * reply buffers. - */ - rc = mdt_reint_rec(info); - else - rc = -EFAULT; + rc = mdt_reint_rec(info); } RETURN(rc); @@ -1443,14 +1437,16 @@ static int mdt_intent_getattr(enum mdt_it_code opcode, intent_set_disposition(ldlm_rep, DISP_LOOKUP_EXECD); if (rc) { - intent_set_disposition(ldlm_rep, DISP_LOOKUP_NEG); + if (rc == -EREMOTE) + intent_set_disposition(ldlm_rep, DISP_LOOKUP_POS); + else + intent_set_disposition(ldlm_rep, DISP_LOOKUP_NEG); if (ldlm_rep) ldlm_rep->lock_policy_res2 = 0; RETURN(ELDLM_LOCK_ABORTED); } - else - intent_set_disposition(ldlm_rep, DISP_LOOKUP_POS); + intent_set_disposition(ldlm_rep, DISP_LOOKUP_POS); new_lock = ldlm_handle2lock(&lhc.mlh_lh); if (new_lock == NULL && (flags & LDLM_FL_INTENT_ONLY)) @@ -2019,8 +2015,9 @@ static void mdt_fini(const struct lu_context *ctx, struct mdt_device *m) ENTRY; +/* mdt_fs_cleanup(ctx, m); - +*/ mdt_stop_ptlrpc_service(m); /* finish the stack */ @@ -2067,6 +2064,13 @@ static int mdt_init0(const struct lu_context *ctx, struct mdt_device *m, m->mdt_max_mdsize = MAX_MD_SIZE; m->mdt_max_cookiesize = sizeof(struct llog_cookie); + m->mdt_flags = 0; + + /* Temporary. should parse mount option. */ + m->mdt_opts.mo_user_xattr = 0; + m->mdt_opts.mo_acl = 0; + + OBD_ALLOC_PTR(s); if (s == NULL) RETURN(-ENOMEM); @@ -2109,14 +2113,16 @@ static int mdt_init0(const struct lu_context *ctx, struct mdt_device *m, rc = mdt_start_ptlrpc_service(m); if (rc) GOTO(err_free_ns, rc); - +/* TODO: wait for read & write rc = mdt_fs_setup(ctx, m); if (rc) GOTO(err_stop_service, rc); - +*/ RETURN(0); +/* err_stop_service: mdt_stop_ptlrpc_service(m); +*/ err_free_ns: ldlm_namespace_free(m->mdt_namespace, 0); m->mdt_namespace = NULL; @@ -2130,6 +2136,7 @@ err_fini_site: lu_site_fini(s); err_free_site: OBD_FREE_PTR(s); + md_device_fini(&m->mdt_md_dev); return (rc); } @@ -2346,6 +2353,7 @@ static int mdt_obd_disconnect(struct obd_export *exp) RETURN(rc); } +/* FIXME: Can we avoid using these two interfaces? */ static int mdt_init_export(struct obd_export *exp) { struct mdt_export_data *med = &exp->exp_mdt_data; @@ -2646,10 +2654,10 @@ static struct mdt_opc_slice mdt_handlers[] = { }; MODULE_AUTHOR("Cluster File Systems, Inc. "); -MODULE_DESCRIPTION("Lustre Meta-data Target Prototype ("LUSTRE_MDT0_NAME")"); +MODULE_DESCRIPTION("Lustre Meta-data Target ("LUSTRE_MDT0_NAME")"); MODULE_LICENSE("GPL"); CFS_MODULE_PARM(mdt_num_threads, "ul", ulong, 0444, "number of mdt service threads to start"); -cfs_module(mdt, "0.0.4", mdt_mod_init, mdt_mod_exit); +cfs_module(mdt, "0.1.0", mdt_mod_init, mdt_mod_exit); diff --git a/lustre/mdt/mdt_internal.h b/lustre/mdt/mdt_internal.h index 0e83c69..ee6ada9 100644 --- a/lustre/mdt/mdt_internal.h +++ b/lustre/mdt/mdt_internal.h @@ -182,11 +182,6 @@ struct mdt_reint_record { }; -struct mdt_reint_reply { - struct mdt_body *mrr_body; - struct lov_mds_md *mrr_md; - struct llog_cookie *mrr_cookie; -}; #define XATTR_NAME_ACL_ACCESS "system.posix_acl_access" @@ -245,7 +240,6 @@ struct mdt_thread_info { * frequent. */ struct kstatfs mti_sfs; - struct mdt_reint_reply mti_reint_rep; }; static inline struct md_device_operations *mdt_child_ops(struct mdt_device * m) diff --git a/lustre/mdt/mdt_lib.c b/lustre/mdt/mdt_lib.c index cf022d7..c574855 100644 --- a/lustre/mdt/mdt_lib.c +++ b/lustre/mdt/mdt_lib.c @@ -44,7 +44,6 @@ /* unpacking */ static int mdt_setattr_unpack(struct mdt_thread_info *info) { -#ifdef MDT_CODE struct mdt_rec_setattr *rec; struct lu_attr *attr = &info->mti_attr; struct mdt_reint_record *rr = &info->mti_rr; @@ -82,9 +81,6 @@ static int mdt_setattr_unpack(struct mdt_thread_info *info) } RETURN(0); -#endif - ENTRY; - RETURN(-EOPNOTSUPP); } static int mdt_create_unpack(struct mdt_thread_info *info) @@ -102,15 +98,14 @@ static int mdt_create_unpack(struct mdt_thread_info *info) rr->rr_fid2 = &rec->cr_fid2; attr->la_mode = rec->cr_mode; rr->rr_name = req_capsule_client_get(pill, &RMF_NAME); -#ifdef MDT_CODE attr->la_rdev = rec->cr_rdev; attr->la_uid = rec->cr_fsuid; attr->la_gid = rec->cr_fsgid; attr->la_flags = rec->cr_flags; attr->la_ctime = rec->cr_time; + attr->la_mtime = rec->cr_time; if (req_capsule_field_present(pill, &RMF_SYMTGT)) rr->rr_tgt = req_capsule_client_get(pill, &RMF_SYMTGT); -#endif } else result = -EFAULT; RETURN(result); @@ -118,7 +113,6 @@ static int mdt_create_unpack(struct mdt_thread_info *info) static int mdt_link_unpack(struct mdt_thread_info *info) { -#ifdef MDT_CODE struct mdt_rec_link *rec; struct lu_attr *attr = &info->mti_attr; struct mdt_reint_record *rr = &info->mti_rr; @@ -134,19 +128,16 @@ static int mdt_link_unpack(struct mdt_thread_info *info) rr->rr_fid1 = &rec->lk_fid1; rr->rr_fid2 = &rec->lk_fid2; attr->la_ctime = rec->lk_time; + attr->la_mtime = rec->lk_time; rr->rr_name = req_capsule_client_get(pill, &RMF_NAME); if (rr->rr_name == NULL) RETURN(-EFAULT); RETURN(0); -#endif - ENTRY; - RETURN(-EOPNOTSUPP); } static int mdt_unlink_unpack(struct mdt_thread_info *info) { -#ifdef MDT_CODE struct mdt_rec_unlink *rec; struct lu_attr *attr = &info->mti_attr; struct mdt_reint_record *rr = &info->mti_rr; @@ -162,20 +153,17 @@ static int mdt_unlink_unpack(struct mdt_thread_info *info) rr->rr_fid1 = &rec->ul_fid1; rr->rr_fid2 = &rec->ul_fid2; attr->la_ctime = rec->ul_time; + attr->la_mtime = rec->ul_time; attr->la_mode = rec->ul_mode; rr->rr_name = req_capsule_client_get(pill, &RMF_NAME); if (rr->rr_name == NULL) RETURN(-EFAULT); RETURN(0); -#endif - ENTRY; - RETURN(-EOPNOTSUPP); } static int mdt_rename_unpack(struct mdt_thread_info *info) { -#ifdef MDT_CODE struct mdt_rec_rename *rec; struct lu_attr *attr = &info->mti_attr; struct mdt_reint_record *rr = &info->mti_rr; @@ -191,6 +179,7 @@ static int mdt_rename_unpack(struct mdt_thread_info *info) rr->rr_fid1 = &rec->rn_fid1; rr->rr_fid2 = &rec->rn_fid2; attr->la_ctime = rec->rn_time; + attr->la_mtime = rec->rn_time; rr->rr_name = req_capsule_client_get(pill, &RMF_NAME); if (rr->rr_name == NULL) @@ -199,10 +188,6 @@ static int mdt_rename_unpack(struct mdt_thread_info *info) if (rr->rr_tgt == NULL) RETURN(-EFAULT); RETURN(0); -#endif - - ENTRY; - RETURN(-EOPNOTSUPP); } static int mdt_open_unpack(struct mdt_thread_info *info) diff --git a/lustre/mdt/mdt_reint.c b/lustre/mdt/mdt_reint.c index 79b98bc..51d4d70 100644 --- a/lustre/mdt/mdt_reint.c +++ b/lustre/mdt/mdt_reint.c @@ -43,12 +43,14 @@ static int mdt_md_create(struct mdt_thread_info *info) struct mdt_object *parent; struct mdt_object *child; struct mdt_lock_handle *lh; - struct mdt_body *repbody = info->mti_reint_rep.mrr_body; + struct mdt_body *repbody; struct lu_attr *attr = &info->mti_attr; struct mdt_reint_record *rr = &info->mti_rr; int rc; ENTRY; + repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY); + lh = &info->mti_lh[MDT_LH_PARENT]; lh->mlh_mode = LCK_PW; @@ -82,49 +84,17 @@ static int mdt_md_create(struct mdt_thread_info *info) RETURN(rc); } -#if 0 -static int mdt_md_mkdir(struct mdt_thread_info *info) -{ - struct mdt_device *mdt = info->mti_mdt; - struct mdt_object *parent; - struct mdt_object *child; - struct mdt_lock_handle *lh; - - int result; - - lh = &info->mti_lh[MDT_LH_PARENT]; - lh->mlh_mode = LCK_PW; - - parent = mdt_object_find_lock(info->mti_ctxt, mdt, info->mti_rr.rr_fid1, - lh, MDS_INODELOCK_UPDATE); - if (IS_ERR(parent)) - return PTR_ERR(parent); - - child = mdt_object_find(info->mti_ctxt, mdt, info->mti_rr.rr_fid2); - if (!IS_ERR(child)) { - struct md_object *next = mdt_object_child(parent); - - result = mdo_create(info->mti_ctxt, next, info->mti_rr.rr_name, - mdt_object_child(child), &info->mti_attr); - mdt_object_put(info->mti_ctxt, child); - } else - result = PTR_ERR(child); - mdt_object_unlock(mdt->mdt_namespace, parent, lh); - mdt_object_put(info->mti_ctxt, parent); - return result; -} -#endif - /* partial request to create object only */ static int mdt_md_mkobj(struct mdt_thread_info *info) { struct mdt_device *mdt = info->mti_mdt; struct mdt_object *o; - struct mdt_body *repbody = info->mti_reint_rep.mrr_body; + struct mdt_body *repbody; int rc; - ENTRY; + repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY); + o = mdt_object_find(info->mti_ctxt, mdt, info->mti_rr.rr_fid1); if (!IS_ERR(o)) { struct md_object *next = mdt_object_child(o); @@ -152,7 +122,6 @@ static int mdt_md_mkobj(struct mdt_thread_info *info) static int mdt_reint_setattr(struct mdt_thread_info *info) { -#ifdef MDT_CODE struct lu_attr *attr = &info->mti_attr; struct mdt_reint_record *rr = &info->mti_rr; struct ptlrpc_request *req = mdt_info_req(info); @@ -234,9 +203,6 @@ out_unlock: } mdt_object_put(info->mti_ctxt, mo); return (rc); -#endif - ENTRY; - RETURN(-EOPNOTSUPP); } @@ -271,8 +237,6 @@ static int mdt_reint_create(struct mdt_thread_info *info) static int mdt_reint_unlink(struct mdt_thread_info *info) { -#ifdef MDT_CODE - struct lu_attr *attr = &info->mti_attr; struct mdt_reint_record *rr = &info->mti_rr; struct ptlrpc_request *req = mdt_info_req(info); struct mdt_object *mp; @@ -321,46 +285,11 @@ static int mdt_reint_unlink(struct mdt_thread_info *info) if (IS_ERR(mc)) GOTO(out_unlock_parent, rc = PTR_ERR(mc)); - if (lu_object_assert_not_exists(info->mti_ctxt, &mc->mot_obj.mo_lu)) - GOTO(out_unlock_child, rc = -ENOENT); - /* NB: Be aware of Bug 2029 */ /*step 3: deal with orphan */ - /* If this is potentially the last reference to this inode, get the - * OBD EA data first so the client can destroy OST objects. We - * only do the object removal later if no open files/links remain. */ - repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY); - rc = mo_attr_get(info->mti_ctxt, mdt_object_child(mc), attr); - if (rc != 0) - GOTO(out_unlock_child, rc); - - if (S_ISREG(attr->la_mode) && attr->la_nlink == 1) { - /* && if opencount == 0*/ - /* see mds_reint */ - void * lmm = req_capsule_server_get(&info->mti_pill, - &RMF_MDT_MD); - int len = req_capsule_get_size(&info->mti_pill, - &RMF_MDT_MD, - RCL_SERVER); - mdt_pack_attr2body(repbody, attr); - repbody->fid1 = *mdt_object_fid(mc); - repbody->valid |= OBD_MD_FLID; - - rc = mo_xattr_get(info->mti_ctxt, mdt_object_child(mc), - lmm, len, "lov"); - if (rc < 0) - GOTO(out_unlock_child, rc); - - if (S_ISDIR(attr->la_mode)) - repbody->valid |= OBD_MD_FLDIREA; - else - repbody->valid |= OBD_MD_FLEASIZE; - repbody->eadatasize = rc; - rc = 0; - } if (req->rq_export->exp_connect_flags & OBD_CONNECT_RDONLY) GOTO(out_unlock_child, rc = -EROFS); @@ -371,6 +300,10 @@ static int mdt_reint_unlink(struct mdt_thread_info *info) /*step 5: orphan handling & recovery issue */ if (rc == 0) { + /* If this is potentially the last reference to this inode, get the + * OBD EA data first so the client can destroy OST objects. We + * only do the object removal later if no open files/links remain. */ + /* FIXME & TODO: * 1. orphan handling here * 2. Please deal with logcookies here */ @@ -383,15 +316,10 @@ out_unlock_parent: mdt_object_unlock(info->mti_mdt->mdt_namespace, mp, lhp); mdt_object_put(info->mti_ctxt, mp); return rc; -#endif - - ENTRY; - RETURN(-EOPNOTSUPP); } static int mdt_reint_link(struct mdt_thread_info *info) { -#ifdef MDT_CODE struct mdt_reint_record *rr = &info->mti_rr; struct ptlrpc_request *req = mdt_info_req(info); struct mdt_object *ms; @@ -431,11 +359,6 @@ static int mdt_reint_link(struct mdt_thread_info *info) if (IS_ERR(mt)) GOTO(out_unlock_source, rc = PTR_ERR(mt)); - /* step 3: do some checking :TODO*/ - /* if isorphan(ms) - * return -ENOENT - */ - if (req->rq_export->exp_connect_flags & OBD_CONNECT_RDONLY) GOTO(out_unlock_target, rc = -EROFS); @@ -443,6 +366,7 @@ static int mdt_reint_link(struct mdt_thread_info *info) rc = mdo_link(info->mti_ctxt, mdt_object_child(mt), mdt_object_child(ms), rr->rr_name); GOTO(out_unlock_target, rc); + out_unlock_target: mdt_object_unlock(info->mti_mdt->mdt_namespace, mt, lht); mdt_object_put(info->mti_ctxt, mt); @@ -450,13 +374,8 @@ out_unlock_source: mdt_object_unlock(info->mti_mdt->mdt_namespace, ms, lhs); mdt_object_put(info->mti_ctxt, ms); return rc; -#endif - - ENTRY; - RETURN(-EOPNOTSUPP); } -#ifdef MDT_CODE /* partial operation for rename */ static int mdt_reint_rename_tgt(struct mdt_thread_info *info) { @@ -472,7 +391,7 @@ static int mdt_reint_rename_tgt(struct mdt_thread_info *info) ENTRY; - DEBUG_REQ(D_INODE, req, "rename_tgr "DFID3" to "DFID3" %s", + DEBUG_REQ(D_INODE, req, "rename_tgt "DFID3" to "DFID3" %s", PFID3(rr->rr_fid2), PFID3(rr->rr_fid1), rr->rr_tgt); @@ -490,6 +409,9 @@ static int mdt_reint_rename_tgt(struct mdt_thread_info *info) rr->rr_tgt, &tgt_fid); if (rc && rc != -ENOENT) GOTO(out_unlock_tgtdir, rc); + + if (req->rq_export->exp_connect_flags & OBD_CONNECT_RDONLY) + GOTO(out_unlock_tgt, rc = -EROFS); if (rc == 0) { lh_tgt = &info->mti_lh[MDT_LH_CHILD]; @@ -502,9 +424,6 @@ static int mdt_reint_rename_tgt(struct mdt_thread_info *info) GOTO(out_unlock_tgtdir, rc = PTR_ERR(mtgt)); } - if (req->rq_export->exp_connect_flags & OBD_CONNECT_RDONLY) - GOTO(out_unlock_tgt, rc = -EROFS); - /* step 3: rename_tgt or name_insert */ if (mtgt) rc = mdo_rename_tgt(info->mti_ctxt, mdt_object_child(mtgtdir), @@ -513,8 +432,8 @@ static int mdt_reint_rename_tgt(struct mdt_thread_info *info) else rc = mdo_name_insert(info->mti_ctxt, mdt_object_child(mtgtdir), rr->rr_tgt, rr->rr_fid2); - GOTO(out_unlock_tgt, rc); + out_unlock_tgt: if (mtgt) { mdt_object_unlock(ns, mtgt, lh_tgt); @@ -526,12 +445,10 @@ out_unlock_tgtdir: out: return rc; } -#endif static int mdt_reint_rename(struct mdt_thread_info *info) { -#ifdef MDT_CODE struct mdt_reint_record *rr = &info->mti_rr; struct req_capsule *pill = &info->mti_pill; struct ptlrpc_request *req = mdt_info_req(info); @@ -550,7 +467,7 @@ static int mdt_reint_rename(struct mdt_thread_info *info) ENTRY; - DEBUG_REQ(D_INODE, req, "rename "DFID3"/%s to "DFID3" %s", + DEBUG_REQ(D_INODE, req, "rename "DFID3"/%s to "DFID3"/%s", PFID3(rr->rr_fid1), rr->rr_tgt, PFID3(rr->rr_fid2), rr->rr_name); @@ -579,7 +496,6 @@ static int mdt_reint_rename(struct mdt_thread_info *info) MDS_INODELOCK_UPDATE); if (IS_ERR(mtgtdir)) GOTO(out_unlock_source, rc = PTR_ERR(mtgtdir)); - /*step 3: find & lock the old object*/ rc = mdo_lookup(info->mti_ctxt, mdt_object_child(msrcdir), @@ -601,8 +517,8 @@ static int mdt_reint_rename(struct mdt_thread_info *info) if (rc && rc != -ENOENT) GOTO(out_unlock_old, rc); - /* NB: the new_fid may be zero at this moment*/ if (rc == 0) { + /* the new_fid should have been filled at this moment*/ lh_new.mlh_mode = LCK_EX; mnew = mdt_object_find_lock(info->mti_ctxt, info->mti_mdt, &new_fid, &lh_new, @@ -611,9 +527,7 @@ static int mdt_reint_rename(struct mdt_thread_info *info) GOTO(out_unlock_old, rc = PTR_ERR(mnew)); } - /* step 5:TODO orphan handling on new object*/ - /* if isorphan(mnew) {...} - */ + /* step 5: dome some checking*/ if (req->rq_export->exp_connect_flags & OBD_CONNECT_RDONLY) GOTO(out_unlock_new, rc = -EROFS); @@ -622,7 +536,13 @@ static int mdt_reint_rename(struct mdt_thread_info *info) mdt_object_child(mtgtdir), &old_fid, rr->rr_name, mnew ? mdt_object_child(mnew): NULL, rr->rr_tgt); - GOTO(out_unlock_new, rc); + if (rc) + GOTO(out_unlock_new, rc); + + /* step 7: TODO:check old object */ + /* if (mold is orphan) + */ + out_unlock_new: if (mnew) { mdt_object_unlock(ns, mnew, &lh_new); @@ -639,11 +559,6 @@ out_unlock_source: mdt_object_put(info->mti_ctxt, msrcdir); out: return rc; -#endif - - - ENTRY; - RETURN(-EOPNOTSUPP); } diff --git a/lustre/mdt/mdt_xattr.c b/lustre/mdt/mdt_xattr.c index c925cfa..f17339e 100644 --- a/lustre/mdt/mdt_xattr.c +++ b/lustre/mdt/mdt_xattr.c @@ -1,8 +1,8 @@ /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- * vim:expandtab:shiftwidth=8:tabstop=8: * - * linux/mdt/mdt_reint.c - * Lustre Metadata Target (mdt) reintegration routines + * linux/mdt/mdt_xattr.c + * Lustre Metadata Target (mdt) extended attributes management. * * Copyright (C) 2002-2006 Cluster File Systems, Inc. * Author: Peter Braam @@ -40,11 +40,10 @@ /* return EADATA length to the caller. negative value means error */ static int mdt_getxattr_pack_reply(struct mdt_thread_info * info) { - char *xattr_name; - int rc = -EOPNOTSUPP; - int rc2; struct req_capsule *pill = &info->mti_pill ; struct ptlrpc_request *req = mdt_info_req(info); + char *xattr_name; + int rc; /* Imagine how many bytes we need */ if (info->mti_body->valid & OBD_MD_FLXATTR) { @@ -71,23 +70,22 @@ static int mdt_getxattr_pack_reply(struct mdt_thread_info * info) } if (rc < 0) { - if (rc != -ENODATA && rc != -EOPNOTSUPP) + if (rc != -ENODATA && rc != -EOPNOTSUPP) { CWARN("get EA size error: %d\n", rc); - /* return empty to client */ - req_capsule_extend(&info->mti_pill, &RQF_MDS_SETXATTR); + return rc; + } + rc = 0; } else { rc = min_t(int, info->mti_body->eadatasize, rc); - req_capsule_set_size(pill, &RMF_EADATA, RCL_SERVER, rc); } + req_capsule_set_size(pill, &RMF_EADATA, RCL_SERVER, rc); if (OBD_FAIL_CHECK(OBD_FAIL_MDS_GETXATTR_PACK)) { CERROR("failed MDS_GETXATTR_PACK test\n"); return -ENOMEM; } - rc2 = req_capsule_pack(pill); - if (rc2) - return rc2; + rc = req_capsule_pack(pill); return rc; } @@ -117,12 +115,11 @@ int mdt_getxattr(struct mdt_thread_info *info) rc = mdt_getxattr_pack_reply(info); if (rc < 0) RETURN(rc); - buf = req_capsule_server_get(&info->mti_pill, - &RMF_EADATA); - buflen = req_capsule_get_size(&info->mti_pill, - &RMF_EADATA, RCL_SERVER); - rep_body = req_capsule_server_get(&info->mti_pill, - &RMF_MDT_BODY); + buf = req_capsule_server_get(&info->mti_pill, &RMF_EADATA); + rep_body = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY); + buflen = req_capsule_get_size(&info->mti_pill, &RMF_EADATA, RCL_SERVER); + if (buflen == 0) + GOTO(no_xattr, rc = 0); if (info->mti_body->valid & OBD_MD_FLXATTR) { char *xattr_name = req_capsule_client_get(&info->mti_pill, @@ -145,6 +142,7 @@ int mdt_getxattr(struct mdt_thread_info *info) LBUG(); if (rc >= 0) { +no_xattr: rep_body->eadatasize = rc; rc = 0; } @@ -163,19 +161,12 @@ int mdt_setxattr(struct mdt_thread_info *info) struct mdt_lock_handle *lh; ENTRY; - lh = &info->mti_lh[MDT_LH_PARENT]; - lh->mlh_mode = LCK_EX; -/* if (req->rq_reqmsg->bufcount < 2) - * RETURN(-EFAULT); - */ DEBUG_REQ(D_INODE, req, "setxattr "DFID3"\n", PFID3(&info->mti_body->fid1)); /* MDS_CHECK_RESENT(req, mds_reconstruct_generic(req)); */ - lockpart = MDS_INODELOCK_UPDATE; - /* various sanity check for xattr name */ xattr_name = req_capsule_client_get(&info->mti_pill, &RMF_NAME); if (!xattr_name) { @@ -197,14 +188,20 @@ int mdt_setxattr(struct mdt_thread_info *info) GOTO(out, rc = -EOPNOTSUPP); } + lockpart = MDS_INODELOCK_UPDATE; if (!strcmp(xattr_name, XATTR_NAME_ACL_ACCESS)) lockpart |= MDS_INODELOCK_LOOKUP; + lh = &info->mti_lh[MDT_LH_PARENT]; + lh->mlh_mode = LCK_EX; rc = mdt_object_lock(info->mti_mdt->mdt_namespace, info->mti_object, lh, lockpart); if (rc != 0) GOTO(out, rc); + if (req->rq_export->exp_connect_flags & OBD_CONNECT_RDONLY) + GOTO(out_unlock, rc = -EROFS); + if (info->mti_body->valid & OBD_MD_FLXATTR) { char * xattr; if (!req_capsule_field_present(&info->mti_pill, &RMF_EADATA)) {