Whamcloud - gitweb
- pass type and time to the remote operation
authortappro <tappro>
Mon, 4 Sep 2006 13:52:36 +0000 (13:52 +0000)
committertappro <tappro>
Mon, 4 Sep 2006 13:52:36 +0000 (13:52 +0000)
- sanity checks for remote unlink

lustre/cmm/mdc_object.c
lustre/mdd/mdd_handler.c
lustre/mdt/mdt_handler.c

index 76c06f8..d9da549 100644 (file)
@@ -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) {
index 8da7e1d..5a808ba 100644 (file)
@@ -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)
 {
index 1ed746b..d838d56 100644 (file)
@@ -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))