From e738ed02d070ac10ba78618e6d0b3079fa209693 Mon Sep 17 00:00:00 2001 From: tappro Date: Mon, 4 Sep 2006 13:52:36 +0000 Subject: [PATCH] - pass type and time to the remote operation - sanity checks for remote unlink --- lustre/cmm/mdc_object.c | 3 ++ lustre/mdd/mdd_handler.c | 81 +++++++++++++++++++++++------------------------- lustre/mdt/mdt_handler.c | 1 + 3 files changed, 42 insertions(+), 43 deletions(-) diff --git a/lustre/cmm/mdc_object.c b/lustre/cmm/mdc_object.c index 76c06f8..d9da549 100644 --- a/lustre/cmm/mdc_object.c +++ b/lustre/cmm/mdc_object.c @@ -218,12 +218,15 @@ static int mdc_ref_del(const struct lu_context *ctx, struct md_object *mo, struct md_attr *ma) { struct mdc_device *mc = md2mdc_dev(md_obj2dev(mo)); + struct lu_attr *la = &ma->ma_attr; struct mdc_thread_info *mci; int rc; ENTRY; mci = mdc_info_init(ctx); mci->mci_opdata.fid1 = *lu_object_fid(&mo->mo_lu); + mci->mci_opdata.create_mode = la->la_mode; + mci->mci_opdata.mod_time = la->la_ctime; rc = md_unlink(mc->mc_desc.cl_exp, &mci->mci_opdata, &mci->mci_req); if (rc == 0) { diff --git a/lustre/mdd/mdd_handler.c b/lustre/mdd/mdd_handler.c index 8da7e1d..5a808ba 100644 --- a/lustre/mdd/mdd_handler.c +++ b/lustre/mdd/mdd_handler.c @@ -225,11 +225,11 @@ static int mdd_may_delete(const struct lu_context *ctxt, struct mdd_object *pobj, struct mdd_object *cobj, int is_dir) { - struct mdd_device *mdd = mdo2mdd(&pobj->mod_obj); + struct mdd_device *mdd = mdo2mdd(&cobj->mod_obj); int rc = 0; ENTRY; - LASSERT(cobj && pobj); + LASSERT(cobj); if (!lu_object_exists(&cobj->mod_obj.mo_lu)) RETURN(-ENOENT); @@ -247,7 +247,7 @@ static int mdd_may_delete(const struct lu_context *ctxt, } else if (S_ISDIR(mdd_object_type(cobj))) RETURN(-EISDIR); - if (mdd_is_dead_obj(pobj)) + if (pobj && mdd_is_dead_obj(pobj)) RETURN(-ENOENT); RETURN(rc); @@ -1246,6 +1246,41 @@ cleanup: mdd_trans_stop(ctxt, mdd, rc, handle); RETURN(rc); } +/* partial unlink */ +static int mdd_ref_del(const struct lu_context *ctxt, struct md_object *obj, + struct md_attr *ma) +{ + struct mdd_object *mdd_obj = md2mdd_obj(obj); + struct mdd_device *mdd = mdo2mdd(obj); + struct thandle *handle; + int rc; + ENTRY; + + mdd_txn_param_build(ctxt, &MDD_TXN_XATTR_SET); + handle = mdd_trans_start(ctxt, mdd); + if (IS_ERR(handle)) + RETURN(-ENOMEM); + + mdd_write_lock(ctxt, mdd_obj); + + rc = mdd_unlink_sanity_check(ctxt, NULL, mdd_obj, ma); + if (rc) + GOTO(cleanup, rc); + + __mdd_ref_del(ctxt, mdd_obj, handle); + + if (S_ISDIR(lu_object_attr(&obj->mo_lu))) { + /* unlink dot */ + __mdd_ref_del(ctxt, mdd_obj, handle); + } + + rc = __mdd_finish_unlink(ctxt, mdd_obj, ma, handle); + +cleanup: + mdd_write_unlock(ctxt, mdd_obj); + mdd_trans_stop(ctxt, mdd, rc, handle); + RETURN(rc); +} static int mdd_parent_fid(const struct lu_context *ctxt, struct mdd_object *obj, @@ -1966,46 +2001,6 @@ __mdd_ref_del(const struct lu_context *ctxt, struct mdd_object *obj, next->do_ops->do_ref_del(ctxt, next, handle); } -static int mdd_ref_del(const struct lu_context *ctxt, struct md_object *obj, - struct md_attr *ma) -{ - struct mdd_object *mdd_obj = md2mdd_obj(obj); - struct mdd_device *mdd = mdo2mdd(obj); - struct thandle *handle; - int isdir; - int rc; - ENTRY; - - mdd_txn_param_build(ctxt, &MDD_TXN_XATTR_SET); - handle = mdd_trans_start(ctxt, mdd); - if (IS_ERR(handle)) - RETURN(-ENOMEM); - - mdd_write_lock(ctxt, mdd_obj); - - isdir = S_ISDIR(lu_object_attr(&obj->mo_lu)); - /* rmdir checks */ - if (isdir && dt_try_as_dir(ctxt, mdd_object_child(mdd_obj))) { - rc = mdd_dir_is_empty(ctxt, mdd_obj); - if (rc != 0) - GOTO(cleanup, rc); - } - - __mdd_ref_del(ctxt, mdd_obj, handle); - - if (isdir) { - /* unlink dot */ - __mdd_ref_del(ctxt, mdd_obj, handle); - } - - rc = __mdd_finish_unlink(ctxt, mdd_obj, ma, handle); - -cleanup: - mdd_write_unlock(ctxt, mdd_obj); - mdd_trans_stop(ctxt, mdd, rc, handle); - RETURN(rc); -} - /* do NOT or the MAY_*'s, you'll get the weakest */ static int accmode(struct mdd_object *mdd_obj, int flags) { diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index 1ed746b..d838d56 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -2773,6 +2773,7 @@ static int mdt_destroy_export(struct obd_export *export) ENTRY; med = &export->exp_mdt_data; + LASSERT(med); target_destroy_export(export); if (obd_uuid_equals(&export->exp_client_uuid, &obd->obd_uuid)) -- 1.8.3.1