From fef813953adffc5866409963534b58d63bd9c3d3 Mon Sep 17 00:00:00 2001 From: huanghua Date: Mon, 21 Aug 2006 08:58:22 +0000 Subject: [PATCH] (1) some cleanup on code (2) change mdt_object->mot_writecount into an "int" --- lustre/mdt/mdt_handler.c | 92 ++++++++++++++++++++++++----------------------- lustre/mdt/mdt_internal.h | 2 +- lustre/mdt/mdt_lib.c | 8 ++--- lustre/mdt/mdt_open.c | 51 ++++++++++++++------------ lustre/mdt/mdt_reint.c | 10 +++--- 5 files changed, 87 insertions(+), 76 deletions(-) diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index a837505..7370357 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -68,7 +68,7 @@ unsigned long mdt_num_threads; struct mdt_handler { /* The name of this handler. */ const char *mh_name; - /* Fail id for this handler, checked at the beginning of this handler.*/ + /* Fail id for this handler, checked at the beginning of this handler*/ int mh_fail_id; /* Operation code for this handler */ __u32 mh_opc; @@ -158,7 +158,7 @@ static int mdt_statfs(struct mdt_thread_info *info) if (MDT_FAIL_CHECK(OBD_FAIL_MDS_STATFS_PACK)) { result = -ENOMEM; } else { - osfs = req_capsule_server_get(&info->mti_pill, &RMF_OBD_STATFS); + osfs = req_capsule_server_get(&info->mti_pill,&RMF_OBD_STATFS); /* XXX max_age optimisation is needed here. See mds_statfs */ result = next->md_ops->mdo_statfs(info->mti_ctxt, next, &info->mti_sfs); @@ -175,7 +175,7 @@ void mdt_pack_attr2body(struct mdt_body *b, const struct lu_attr *attr, b->valid |= OBD_MD_FLCTIME | OBD_MD_FLUID | OBD_MD_FLGID | OBD_MD_FLTYPE | OBD_MD_FLMODE | OBD_MD_FLNLINK | OBD_MD_FLFLAGS | - OBD_MD_FLATIME | OBD_MD_FLMTIME ; /* added by huanghua */ + OBD_MD_FLATIME | OBD_MD_FLMTIME ; if (!S_ISREG(attr->la_mode)) b->valid |= OBD_MD_FLSIZE | OBD_MD_FLBLOCKS | OBD_MD_FLRDEV; @@ -254,15 +254,12 @@ static int mdt_getattr_internal(struct mdt_thread_info *info, if (mdt_body_has_lov(la, reqbody)) { if (ma->ma_valid & MA_LOV) { LASSERT(ma->ma_lmm_size); - CDEBUG(D_INODE, "packing ea for "DFID"\n", - PFID(mdt_object_fid(o))); mdt_dump_lmm(D_INFO, ma->ma_lmm); repbody->eadatasize = ma->ma_lmm_size; if (S_ISDIR(la->la_mode)) repbody->valid |= OBD_MD_FLDIREA; else repbody->valid |= OBD_MD_FLEASIZE; - } } else if (S_ISLNK(la->la_mode) && reqbody->valid & OBD_MD_LINKNAME) { @@ -284,8 +281,8 @@ static int mdt_getattr_internal(struct mdt_thread_info *info, repbody->max_cookiesize = info->mti_mdt->mdt_max_cookiesize; repbody->max_mdsize = info->mti_mdt->mdt_max_mdsize; repbody->valid |= OBD_MD_FLMODEASIZE; - CDEBUG(D_INODE, "I am going to change the MAX_MD_SIZE & MAX_COOKIE" - " to : %d:%d\n", + CDEBUG(D_INODE, "I am going to change the MAX_MD_SIZE & " + "MAX_COOKIE to : %d:%d\n", repbody->max_mdsize, repbody->max_cookiesize); } @@ -419,6 +416,7 @@ static int mdt_getattr_name_lock(struct mdt_thread_info *info, if (result != 0) mdt_object_unlock(info, child, lhc, 1); else { + /* This is pure debugging code. */ struct ldlm_lock *lock; struct ldlm_res_id *res_id; lock = ldlm_handle2lock(&lhc->mlh_lh); @@ -426,15 +424,14 @@ static int mdt_getattr_name_lock(struct mdt_thread_info *info, res_id = &lock->l_resource->lr_name; LDLM_DEBUG(lock, "we will return this lock client\n"); LASSERTF(fid_res_name_eq(mdt_object_fid(child), - &lock->l_resource->lr_name), + &lock->l_resource->lr_name), "Lock res_id: %lu/%lu/%lu, Fid: "DFID".\n", - (unsigned long)res_id->name[0], - (unsigned long)res_id->name[1], - (unsigned long)res_id->name[2], - PFID(mdt_object_fid(child))); + (unsigned long)res_id->name[0], + (unsigned long)res_id->name[1], + (unsigned long)res_id->name[2], + PFID(mdt_object_fid(child))); LDLM_LOCK_PUT(lock); } - } mdt_object_put(info->mti_ctxt, child); @@ -590,7 +587,7 @@ static int mdt_readpage(struct mdt_thread_info *info) RETURN(-EFAULT); } rdpg->rp_count = reqbody->nlink; - rdpg->rp_npages = (rdpg->rp_count + CFS_PAGE_SIZE - 1)>> CFS_PAGE_SHIFT; + rdpg->rp_npages = (rdpg->rp_count + CFS_PAGE_SIZE - 1)>>CFS_PAGE_SHIFT; OBD_ALLOC(rdpg->rp_pages, rdpg->rp_npages * sizeof rdpg->rp_pages[0]); if (rdpg->rp_pages == NULL) RETURN(-ENOMEM); @@ -686,7 +683,6 @@ static int mdt_reint(struct mdt_thread_info *info) OBD_FAIL_RETURN(OBD_FAIL_MDS_REINT_NET, 0); rc = mdt_reint_internal(info, opc); - } else rc = opc; RETURN(rc); @@ -727,23 +723,24 @@ static int mdt_sync(struct mdt_thread_info *info) rc = mdt_device_sync(info); } else { /* sync an object */ - rc = mdt_unpack_req_pack_rep(info, HABEO_CORPUS | HABEO_REFERO); + rc = mdt_unpack_req_pack_rep(info, HABEO_CORPUS|HABEO_REFERO); if (rc == 0) { rc = mdt_object_sync(info); if (rc == 0) { struct md_object *next; const struct lu_fid *fid; + struct lu_attr *la; + next = mdt_object_child(info->mti_object); fid = mdt_object_fid(info->mti_object); info->mti_attr.ma_need = MA_INODE; - rc = mo_attr_get(info->mti_ctxt, - next, &info->mti_attr); + rc = mo_attr_get(info->mti_ctxt, next, + &info->mti_attr); + la = &info->mti_attr.ma_attr; if (rc == 0) { body = req_capsule_server_get(pill, &RMF_MDT_BODY); - mdt_pack_attr2body(body, - &info->mti_attr.ma_attr, - fid); + mdt_pack_attr2body(body, la, fid); } } } @@ -863,16 +860,16 @@ int fid_lock(struct ldlm_namespace *ns, const struct lu_fid *f, LASSERT(lh != NULL); LASSERT(f != NULL); - rc = ldlm_cli_enqueue_local(ns, *fid_build_res_name(f, res_id), LDLM_IBITS, - policy, mode, &flags, ldlm_blocking_ast, - ldlm_completion_ast, NULL, NULL, 0, NULL, - lh); + rc = ldlm_cli_enqueue_local(ns, *fid_build_res_name(f, res_id), + LDLM_IBITS, policy, mode, &flags, + ldlm_blocking_ast, ldlm_completion_ast, + NULL, NULL, 0, NULL, lh); return rc == ELDLM_OK ? 0 : -EIO; } /* just call ldlm_lock_decref() if decref, * else we only call ptlrpc_save_lock() to save this lock in req. - * when transaction committed, req will be released and lock will be released */ + * when transaction committed, req will be released, and lock will, too */ void fid_unlock(struct ptlrpc_request *req, const struct lu_fid *f, struct lustre_handle *lh, ldlm_mode_t mode, int decref) { @@ -928,7 +925,8 @@ int mdt_object_lock(struct mdt_thread_info *info, struct mdt_object *o, policy->l_inodebits.bits = ibits; - rc = fid_lock(ns, mdt_object_fid(o), &lh->mlh_lh, lh->mlh_mode, policy, res_id); + rc = fid_lock(ns, mdt_object_fid(o), &lh->mlh_lh, lh->mlh_mode, + policy, res_id); RETURN(rc); } @@ -1079,7 +1077,6 @@ static int mdt_unpack_req_pack_rep(struct mdt_thread_info *info, __u32 flags) RETURN(result); } -/* FIXME: fake untill journal callback is OK.*/ struct lu_context_key mdt_txn_key; static inline void mdt_finish_reply(struct mdt_thread_info *info, int rc) @@ -1088,8 +1085,9 @@ static inline void mdt_finish_reply(struct mdt_thread_info *info, int rc) struct ptlrpc_request *req = mdt_info_req(info); struct obd_export *exp = req->rq_export; + /* sometimes the reply message has not been successfully packed */ if (mdt == NULL || req == NULL || req->rq_repmsg == NULL) - LBUG(); + return; if (info->mti_trans_flags & MDT_NONEED_TRANSNO) return; @@ -1138,7 +1136,7 @@ static int mdt_req_handle(struct mdt_thread_info *info, result = 0; flags = h->mh_flags; - LASSERT(ergo(flags & (HABEO_CORPUS | HABEO_REFERO), h->mh_fmt != NULL)); + LASSERT(ergo(flags & (HABEO_CORPUS|HABEO_REFERO), h->mh_fmt != NULL)); if (h->mh_fmt != NULL) { req_capsule_set(&info->mti_pill, h->mh_fmt); @@ -1154,7 +1152,7 @@ static int mdt_req_handle(struct mdt_thread_info *info, LASSERT(h->mh_fmt != NULL); - dlm_req = req_capsule_client_get(&info->mti_pill, &RMF_DLM_REQ); + dlm_req = req_capsule_client_get(&info->mti_pill,&RMF_DLM_REQ); if (dlm_req != NULL) { if (info->mti_mdt->mdt_opts.mo_compat_resname) result = mdt_lock_resname_compat(info->mti_mdt, @@ -1182,12 +1180,12 @@ static int mdt_req_handle(struct mdt_thread_info *info, result = 0; LASSERT(current->journal_info == NULL); - if (flags & HABEO_CLAVIS && info->mti_mdt->mdt_opts.mo_compat_resname) { - struct ldlm_reply *dlm_rep; + if (flags & HABEO_CLAVIS && info->mti_mdt->mdt_opts.mo_compat_resname){ + struct ldlm_reply *dlmrep; - dlm_rep = req_capsule_server_get(&info->mti_pill, &RMF_DLM_REP); - if (dlm_rep != NULL) - result = mdt_lock_reply_compat(info->mti_mdt, dlm_rep); + dlmrep = req_capsule_server_get(&info->mti_pill, &RMF_DLM_REP); + if (dlmrep != NULL) + result = mdt_lock_reply_compat(info->mti_mdt, dlmrep); } /* If we're DISCONNECTing, the mdt_export_data is already freed */ @@ -1340,7 +1338,8 @@ static int mdt_reply(struct ptlrpc_request *req, int result, /* mds/handler.c */ extern int mds_msg_check_version(struct lustre_msg *msg); -static int mdt_handle0(struct ptlrpc_request *req, struct mdt_thread_info *info, +static int mdt_handle0(struct ptlrpc_request *req, + struct mdt_thread_info *info, struct mdt_opc_slice *supported) { struct mdt_handler *h; @@ -1359,7 +1358,8 @@ static int mdt_handle0(struct ptlrpc_request *req, struct mdt_thread_info *info, result = mdt_recovery(req); switch (result) { case +1: - h = mdt_handler_find(lustre_msg_get_opc(msg), supported); + h = mdt_handler_find(lustre_msg_get_opc(msg), + supported); if (h != NULL) result = mdt_req_handle(info, h, req); else { @@ -2673,8 +2673,9 @@ static int mdt_upcall(const struct lu_context *ctx, struct md_device *md, switch (ev) { case MD_LOV_SYNC: rc = next->md_ops->mdo_get_maxsize(ctx, next, - &m->mdt_max_mdsize, &m->mdt_max_cookiesize); - CDEBUG(D_INFO, "get max mdsize %d max cookiesize %d \n", + &m->mdt_max_mdsize, + &m->mdt_max_cookiesize); + CDEBUG(D_INFO, "get max mdsize %d max cookiesize %d\n", m->mdt_max_mdsize, m->mdt_max_cookiesize); break; default: @@ -2690,16 +2691,17 @@ static struct obd_ops mdt_obd_device_ops = { .o_owner = THIS_MODULE, .o_connect = mdt_obd_connect, .o_disconnect = mdt_obd_disconnect, - .o_init_export = mdt_init_export, /* By Huang Hua*/ - .o_destroy_export = mdt_destroy_export, /* By Huang Hua*/ + .o_init_export = mdt_init_export, + .o_destroy_export = mdt_destroy_export, }; -static struct lu_device* mdt_device_fini(const struct lu_context *ctx, struct lu_device *d) +static struct lu_device* mdt_device_fini(const struct lu_context *ctx, + struct lu_device *d) { struct mdt_device *m = mdt_dev(d); mdt_fini(ctx, m); - RETURN (NULL); + RETURN(NULL); } static void mdt_device_free(const struct lu_context *ctx, struct lu_device *d) diff --git a/lustre/mdt/mdt_internal.h b/lustre/mdt/mdt_internal.h index 90cb37f..11b7fc1 100644 --- a/lustre/mdt/mdt_internal.h +++ b/lustre/mdt/mdt_internal.h @@ -152,7 +152,7 @@ struct mdt_object { struct lu_object_header mot_header; struct md_object mot_obj; __u64 mot_io_epoch; - atomic_t mot_writecount; + int mot_writecount; }; struct mdt_lock_handle { diff --git a/lustre/mdt/mdt_lib.c b/lustre/mdt/mdt_lib.c index 6f53189..92d1dbf 100644 --- a/lustre/mdt/mdt_lib.c +++ b/lustre/mdt/mdt_lib.c @@ -292,7 +292,8 @@ static int mdt_unlink_unpack(struct mdt_thread_info *info) attr->la_mtime = rec->ul_time; attr->la_mode = rec->ul_mode; - attr->la_valid = LA_UID | LA_GID | LA_CTIME | LA_MTIME | LA_MODE; + attr->la_valid = LA_UID | LA_GID | LA_CTIME | + LA_MTIME | LA_MODE; rr->rr_name = req_capsule_client_get(pill, &RMF_NAME); if (rr->rr_name == NULL) result = -EFAULT; @@ -348,12 +349,11 @@ static int mdt_open_unpack(struct mdt_thread_info *info) attr->la_ctime = rec->cr_time; attr->la_mtime = rec->cr_time; attr->la_atime = rec->cr_time; - attr->la_valid = LA_MODE | LA_RDEV | LA_UID | LA_GID | LA_CTIME - | LA_MTIME | LA_ATIME; + attr->la_valid = LA_MODE | LA_RDEV | LA_UID | LA_GID | + LA_CTIME | LA_MTIME | LA_ATIME; info->mti_spec.sp_cr_flags = rec->cr_flags; rr->rr_name = req_capsule_client_get(pill, &RMF_NAME); if (rr->rr_name == NULL) - /*XXX: what about open by FID? */ result = -EFAULT; else result = 0; diff --git a/lustre/mdt/mdt_open.c b/lustre/mdt/mdt_open.c index 11b15fc..2602974 100644 --- a/lustre/mdt/mdt_open.c +++ b/lustre/mdt/mdt_open.c @@ -106,7 +106,7 @@ static int mdt_get_write_access(struct mdt_device *mdt, struct mdt_object *o, spin_lock(&mdt->mdt_epoch_lock); - if (atomic_read(&o->mot_writecount) < 0) { + if (o->mot_writecount < 0) { rc = -ETXTBSY; } else { if (o->mot_io_epoch != 0) { @@ -121,24 +121,22 @@ static int mdt_get_write_access(struct mdt_device *mdt, struct mdt_object *o, CDEBUG(D_INODE, "starting epoch "LPU64" for "DFID"\n", mdt->mdt_io_epoch, PFID(mdt_object_fid(o))); } - atomic_inc(&o->mot_writecount); + o->mot_writecount ++; } spin_unlock(&mdt->mdt_epoch_lock); RETURN(rc); } -static int mdt_put_write_access(struct mdt_device *mdt, struct mdt_object *o) +static void mdt_put_write_access(struct mdt_device *mdt, struct mdt_object *o) { - int rc; ENTRY; spin_lock(&mdt->mdt_epoch_lock); - atomic_dec(&o->mot_writecount); - rc = atomic_read(&o->mot_writecount); - if (rc == 0) + o->mot_writecount --; + if (o->mot_writecount == 0) o->mot_io_epoch = 0; spin_unlock(&mdt->mdt_epoch_lock); - RETURN(rc); + EXIT; } static int mdt_deny_write_access(struct mdt_device *mdt, struct mdt_object *o) @@ -146,25 +144,34 @@ static int mdt_deny_write_access(struct mdt_device *mdt, struct mdt_object *o) int rc = 0; ENTRY; spin_lock(&mdt->mdt_epoch_lock); - if (atomic_read(&o->mot_writecount) > 0) { + if (o->mot_writecount > 0) { rc = -ETXTBSY; } else - atomic_dec(&o->mot_writecount); + o->mot_writecount --; spin_unlock(&mdt->mdt_epoch_lock); RETURN(rc); } -static void mdt_allow_write_access(struct mdt_object *o) +static void mdt_allow_write_access(struct mdt_device *mdt, + struct mdt_object *o) { ENTRY; - atomic_inc(&o->mot_writecount); + spin_lock(&mdt->mdt_epoch_lock); + o->mot_writecount ++; + spin_unlock(&mdt->mdt_epoch_lock); EXIT; } -int mdt_query_write_access(struct mdt_object *o) +int mdt_query_write_access(struct mdt_device *mdt, struct mdt_object *o) { + int wc; ENTRY; - RETURN(atomic_read(&o->mot_writecount)); + + spin_lock(&mdt->mdt_epoch_lock); + wc = o->mot_writecount; + spin_unlock(&mdt->mdt_epoch_lock); + + RETURN(wc); } static int mdt_mfd_open(struct mdt_thread_info *info, @@ -200,12 +207,12 @@ static int mdt_mfd_open(struct mdt_thread_info *info, if (ma->ma_valid & MA_INODE) mdt_pack_attr2body(repbody, la, mdt_object_fid(o)); - /* this check need to return the exists object's fid back, so it is done + /* we need to return the existing object's fid back, so it is done * here, after preparing the reply */ if (!created && (flags & MDS_OPEN_EXCL) && (flags & MDS_OPEN_CREAT)) - RETURN (-EEXIST); + RETURN(-EEXIST); - /* if we are following a symlink, don't open + /* if we are following a symlink, don't open; * do not return open handle for special nodes as client required */ if (islnk || (!isreg && !isdir && @@ -240,7 +247,7 @@ static int mdt_mfd_open(struct mdt_thread_info *info, repbody->eadatasize = 0; repbody->aclsize = 0; - if (/*ma->ma_lmm_size && */ma->ma_valid & MA_LOV) { + if (ma->ma_valid & MA_LOV) { LASSERT(ma->ma_lmm_size); repbody->eadatasize = ma->ma_lmm_size; if (isdir) @@ -273,7 +280,7 @@ static int mdt_mfd_open(struct mdt_thread_info *info, /* (1) client wants transno when open to keep a ref count for replay; * see after_reply() and mdc_close_commit(); * (2) we need to record the transaction related stuff onto disk; - * But, question is: when do a rean only open, do we still need transno? + * The question is: when do a read_only open, do we still need transno? */ if (!created) { struct txn_param txn; @@ -336,7 +343,8 @@ int mdt_open_by_fid(struct mdt_thread_info* info, const struct lu_fid *fid, &info->mti_spec, &info->mti_attr); if (rc == 0) - rc = mdt_mfd_open(info, NULL, o, flags, 1); + rc = mdt_mfd_open(info, NULL, o, + flags, 1); } } mdt_object_put(info->mti_ctxt, o); @@ -449,7 +457,6 @@ int mdt_reint_open(struct mdt_thread_info *info) rr->rr_name, mdt_object_child(child), &info->mti_spec, - /* rr->rr_tgt, rr->rr_eadata, rr->rr_eadatalen,*/ &info->mti_attr); intent_set_disposition(ldlm_rep, DISP_OPEN_CREATE); if (result != 0) @@ -489,7 +496,7 @@ void mdt_mfd_close(const struct lu_context *ctxt, if (mfd->mfd_mode & FMODE_WRITE) { mdt_put_write_access(mdt, o); } else if (mfd->mfd_mode & MDS_FMODE_EXEC) { - mdt_allow_write_access(o); + mdt_allow_write_access(mdt, o); } mdt_mfd_free(mfd); diff --git a/lustre/mdt/mdt_reint.c b/lustre/mdt/mdt_reint.c index b67d355..67ffcbf 100644 --- a/lustre/mdt/mdt_reint.c +++ b/lustre/mdt/mdt_reint.c @@ -66,7 +66,6 @@ static int mdt_md_create(struct mdt_thread_info *info) ma->ma_need = MA_INODE; rc = mdo_create(info->mti_ctxt, next, rr->rr_name, mdt_object_child(child), &info->mti_spec, - /* rr->rr_tgt, NULL, 0, */ ma); if (rc == 0) { /* return fid & attr to client. */ @@ -252,7 +251,8 @@ static int mdt_reint_unlink(struct mdt_thread_info *info) /* step 1: lock the parent */ lhp = &info->mti_lh[MDT_LH_PARENT]; lhp->mlh_mode = LCK_EX; - mp = mdt_object_find_lock(info, rr->rr_fid1, lhp, MDS_INODELOCK_UPDATE); + mp = mdt_object_find_lock(info, rr->rr_fid1, lhp, + MDS_INODELOCK_UPDATE); if (IS_ERR(mp)) RETURN(PTR_ERR(mp)); @@ -335,7 +335,8 @@ static int mdt_reint_link(struct mdt_thread_info *info) /* step 1: lock the source */ lhs = &info->mti_lh[MDT_LH_PARENT]; lhs->mlh_mode = LCK_EX; - ms = mdt_object_find_lock(info, rr->rr_fid1, lhs, MDS_INODELOCK_UPDATE); + ms = mdt_object_find_lock(info, rr->rr_fid1, lhs, + MDS_INODELOCK_UPDATE); if (IS_ERR(ms)) RETURN(PTR_ERR(ms)); @@ -347,7 +348,8 @@ static int mdt_reint_link(struct mdt_thread_info *info) /*step 2: find & lock the target parent dir*/ lhp = &info->mti_lh[MDT_LH_CHILD]; lhp->mlh_mode = LCK_EX; - mp = mdt_object_find_lock(info, rr->rr_fid2, lhp, MDS_INODELOCK_UPDATE); + mp = mdt_object_find_lock(info, rr->rr_fid2, lhp, + MDS_INODELOCK_UPDATE); if (IS_ERR(mp)) GOTO(out_unlock_source, rc = PTR_ERR(mp)); -- 1.8.3.1