Whamcloud - gitweb
dt: simplify ->do{un,}lock() interface: lock type (read/write) is always known static...
authornikita <nikita>
Fri, 25 Aug 2006 10:44:15 +0000 (10:44 +0000)
committernikita <nikita>
Fri, 25 Aug 2006 10:44:15 +0000 (10:44 +0000)
lustre/include/dt_object.h
lustre/mdd/mdd_handler.c
lustre/mdd/mdd_internal.h
lustre/mdd/mdd_lov.c
lustre/osd/osd_handler.c
lustre/osd/osd_internal.h

index 0fdc728..b43670c 100644 (file)
@@ -53,14 +53,6 @@ struct dt_device;
 struct dt_object;
 struct dt_index_features;
 
-/*
- * Lock mode for DT objects.
- */
-enum dt_lock_mode {
-        DT_WRITE_LOCK = 1,
-        DT_READ_LOCK  = 2,
-};
-
 struct dt_device_param {
         unsigned           ddp_max_name_len;
         unsigned           ddp_max_nlink;
@@ -134,10 +126,14 @@ extern const struct dt_index_features dt_directory_features;
  * Per-dt-object operations.
  */
 struct dt_object_operations {
-        void  (*do_lock)(const struct lu_context *ctx,
-                         struct dt_object *dt, enum dt_lock_mode mode);
-        void  (*do_unlock)(const struct lu_context *ctx,
-                           struct dt_object *dt, enum dt_lock_mode mode);
+        void  (*do_read_lock)(const struct lu_context *ctx,
+                              struct dt_object *dt);
+        void  (*do_write_lock)(const struct lu_context *ctx,
+                               struct dt_object *dt);
+        void  (*do_read_unlock)(const struct lu_context *ctx,
+                                struct dt_object *dt);
+        void  (*do_write_unlock)(const struct lu_context *ctx,
+                                 struct dt_object *dt);
         /*
          * Note: following ->do_{x,}attr_{set,get}() operations are very
          * similar to ->moo_{x,}attr_{set,get}() operations in struct
index 744dc35..2e1eb79 100644 (file)
@@ -314,9 +314,9 @@ static inline int mdd_attr_get_internal_locked (const struct lu_context *ctxt,
                                                 struct md_attr *ma)
 {
         int rc;
-        mdd_lock(ctxt, mdd_obj, DT_READ_LOCK);
+        mdd_read_lock(ctxt, mdd_obj);
         rc = mdd_attr_get_internal(ctxt, mdd_obj, ma);
-        mdd_unlock(ctxt, mdd_obj, DT_READ_LOCK);
+        mdd_read_unlock(ctxt, mdd_obj);
         return rc;
 }
 
@@ -541,7 +541,7 @@ static int mdd_recovery_complete(const struct lu_context *ctxt,
                 GOTO(out, rc);
         }
         rc = mdd_cleanup_unlink_llog(ctx, mdd);
-      
+
         obd_notify(obd->u.mds.mds_osc_obd, NULL,
                    obd->obd_async_recov ? OBD_NOTIFY_SYNC_NONBLOCK :
                    OBD_NOTIFY_SYNC, NULL);
@@ -564,34 +564,46 @@ static struct lu_object_operations mdd_lu_obj_ops = {
        .loo_object_print   = mdd_object_print
 };
 
-void mdd_lock(const struct lu_context *ctxt, struct mdd_object *obj,
-              enum dt_lock_mode mode)
+void mdd_write_lock(const struct lu_context *ctxt, struct mdd_object *obj)
+{
+        struct dt_object  *next = mdd_object_child(obj);
+
+        next->do_ops->do_write_lock(ctxt, next);
+}
+
+void mdd_read_lock(const struct lu_context *ctxt, struct mdd_object *obj)
+{
+        struct dt_object  *next = mdd_object_child(obj);
+
+        next->do_ops->do_read_lock(ctxt, next);
+}
+
+void mdd_write_unlock(const struct lu_context *ctxt, struct mdd_object *obj)
 {
         struct dt_object  *next = mdd_object_child(obj);
 
-        next->do_ops->do_lock(ctxt, next, mode);
+        next->do_ops->do_write_unlock(ctxt, next);
 }
 
-void mdd_unlock(const struct lu_context *ctxt, struct mdd_object *obj,
-                enum dt_lock_mode mode)
+void mdd_read_unlock(const struct lu_context *ctxt, struct mdd_object *obj)
 {
         struct dt_object  *next = mdd_object_child(obj);
 
-        next->do_ops->do_unlock(ctxt, next, mode);
+        next->do_ops->do_read_unlock(ctxt, next);
 }
 
 static void mdd_lock2(const struct lu_context *ctxt,
                       struct mdd_object *o0, struct mdd_object *o1)
 {
-        mdd_lock(ctxt, o0, DT_WRITE_LOCK);
-        mdd_lock(ctxt, o1, DT_WRITE_LOCK);
+        mdd_write_lock(ctxt, o0);
+        mdd_write_lock(ctxt, o1);
 }
 
 static void mdd_unlock2(const struct lu_context *ctxt,
                         struct mdd_object *o0, struct mdd_object *o1)
 {
-        mdd_unlock(ctxt, o0, DT_WRITE_LOCK);
-        mdd_unlock(ctxt, o1, DT_WRITE_LOCK);
+        mdd_write_unlock(ctxt, o1);
+        mdd_write_unlock(ctxt, o0);
 }
 
 static struct thandle* mdd_trans_start(const struct lu_context *ctxt,
@@ -646,9 +658,9 @@ int mdd_attr_set_internal_locked(const struct lu_context *ctxt,
                                  struct thandle *handle)
 {
         int rc;
-        mdd_lock(ctxt, o, DT_WRITE_LOCK);
+        mdd_write_lock(ctxt, o);
         rc = mdd_attr_set_internal(ctxt, o, attr, handle);
-        mdd_unlock(ctxt, o, DT_WRITE_LOCK);
+        mdd_write_unlock(ctxt, o);
         return rc;
 }
 
@@ -879,10 +891,9 @@ int mdd_xattr_set_txn(const struct lu_context *ctxt, struct mdd_object *obj,
         int  rc;
         ENTRY;
 
-        mdd_lock(ctxt, obj, DT_WRITE_LOCK);
-        rc = __mdd_xattr_set(ctxt, obj, buf, buf_len, name,
-                             fl, handle);
-        mdd_unlock(ctxt, obj, DT_WRITE_LOCK);
+        mdd_write_lock(ctxt, obj);
+        rc = __mdd_xattr_set(ctxt, obj, buf, buf_len, name, fl, handle);
+        mdd_write_unlock(ctxt, obj);
 
         RETURN(rc);
 }
@@ -933,9 +944,9 @@ int mdd_xattr_del(const struct lu_context *ctxt, struct md_object *obj,
         if (IS_ERR(handle))
                 RETURN(PTR_ERR(handle));
 
-        mdd_lock(ctxt, mdd_obj, DT_WRITE_LOCK);
+        mdd_write_lock(ctxt, mdd_obj);
         rc = __mdd_xattr_del(ctxt, mdd, md2mdd_obj(obj), name, handle);
-        mdd_unlock(ctxt, mdd_obj, DT_WRITE_LOCK);
+        mdd_write_unlock(ctxt, mdd_obj);
 
         mdd_trans_stop(ctxt, mdd, rc, handle);
 
@@ -1212,7 +1223,7 @@ static int mdd_rename_lock(const struct lu_context *ctxt,
         ENTRY;
 
         if (src_pobj == tgt_pobj) {
-                mdd_lock(ctxt, src_pobj, DT_WRITE_LOCK);
+                mdd_write_lock(ctxt, src_pobj);
                 RETURN(0);
         }
         /*compared the parent child relationship of src_p&tgt_p*/
@@ -1238,9 +1249,9 @@ static void mdd_rename_unlock(const struct lu_context *ctxt,
                               struct mdd_object *src_pobj,
                               struct mdd_object *tgt_pobj)
 {
-        mdd_unlock(ctxt, src_pobj, DT_WRITE_LOCK);
+        mdd_write_unlock(ctxt, src_pobj);
         if (src_pobj != tgt_pobj)
-                mdd_unlock(ctxt, tgt_pobj, DT_WRITE_LOCK);
+                mdd_write_unlock(ctxt, tgt_pobj);
 }
 
 static int mdd_rename_sanity_check(const struct lu_context *ctxt,
@@ -1366,12 +1377,12 @@ static int mdd_lookup(const struct lu_context *ctxt, struct md_object *pobj,
 
         if (mdd_is_dead_obj(mdd_obj))
                 RETURN(-ESTALE);
-        mdd_lock(ctxt, mdd_obj, DT_READ_LOCK);
+        mdd_read_lock(ctxt, mdd_obj);
         if (S_ISDIR(mdd_object_type(ctxt, mdd_obj)) && dt_try_as_dir(ctxt, dir))
                 rc = dir->do_index_ops->dio_lookup(ctxt, dir, rec, key);
         else
                 rc = -ENOTDIR;
-        mdd_unlock(ctxt, mdd_obj, DT_READ_LOCK);
+        mdd_read_unlock(ctxt, mdd_obj);
         RETURN(rc);
 }
 
@@ -1547,7 +1558,7 @@ static int mdd_create(const struct lu_context *ctxt, struct md_object *pobj,
         if (IS_ERR(handle))
                 RETURN(PTR_ERR(handle));
 
-        mdd_lock(ctxt, mdd_pobj, DT_WRITE_LOCK);
+        mdd_write_lock(ctxt, mdd_pobj);
 
         /*
          * XXX check that link can be added to the parent in mkdir case.
@@ -1648,7 +1659,7 @@ cleanup:
         }
         if (lmm)
                 OBD_FREE(lmm, lmm_size);
-        mdd_unlock(ctxt, mdd_pobj, DT_WRITE_LOCK);
+        mdd_write_unlock(ctxt, mdd_pobj);
         mdd_trans_stop(ctxt, mdd, rc, handle);
         RETURN(rc);
 }
@@ -1697,11 +1708,11 @@ static int mdd_name_insert(const struct lu_context *ctxt,
         if (IS_ERR(handle))
                 RETURN(PTR_ERR(handle));
 
-        mdd_lock(ctxt, mdd_obj, DT_WRITE_LOCK);
+        mdd_write_lock(ctxt, mdd_obj);
 
         rc = __mdd_index_insert(ctxt, mdd_obj, fid, name, handle);
 
-        mdd_unlock(ctxt, mdd_obj, DT_WRITE_LOCK);
+        mdd_write_unlock(ctxt, mdd_obj);
         mdd_trans_stop(ctxt, mdd, rc, handle);
         RETURN(rc);
 }
@@ -1721,11 +1732,11 @@ static int mdd_name_remove(const struct lu_context *ctxt,
         if (IS_ERR(handle))
                 RETURN(PTR_ERR(handle));
 
-        mdd_lock(ctxt, mdd_obj, DT_WRITE_LOCK);
+        mdd_write_lock(ctxt, mdd_obj);
 
         rc = __mdd_index_delete(ctxt, mdd_obj, name, handle);
 
-        mdd_unlock(ctxt, mdd_obj, DT_WRITE_LOCK);
+        mdd_write_unlock(ctxt, mdd_obj);
 
         mdd_trans_stop(ctxt, mdd, rc, handle);
         RETURN(rc);
@@ -1829,9 +1840,9 @@ static int mdd_ref_add(const struct lu_context *ctxt, struct md_object *obj)
         if (IS_ERR(handle))
                 RETURN(-ENOMEM);
 
-        mdd_lock(ctxt, mdd_obj, DT_WRITE_LOCK);
+        mdd_write_lock(ctxt, mdd_obj);
         __mdd_ref_add(ctxt, mdd_obj, handle);
-        mdd_unlock(ctxt, mdd_obj, DT_WRITE_LOCK);
+        mdd_write_unlock(ctxt, mdd_obj);
 
         mdd_trans_stop(ctxt, mdd, 0, handle);
 
@@ -1864,7 +1875,7 @@ static int mdd_ref_del(const struct lu_context *ctxt, struct md_object *obj,
         if (IS_ERR(handle))
                 RETURN(-ENOMEM);
 
-        mdd_lock(ctxt, mdd_obj, DT_WRITE_LOCK);
+        mdd_write_lock(ctxt, mdd_obj);
 
         isdir = S_ISDIR(lu_object_attr(&obj->mo_lu));
         /* rmdir checks */
@@ -1884,7 +1895,7 @@ static int mdd_ref_del(const struct lu_context *ctxt, struct md_object *obj,
         rc = __mdd_finish_unlink(ctxt, mdd_obj, ma);
 
 cleanup:
-        mdd_unlock(ctxt, mdd_obj, DT_WRITE_LOCK);
+        mdd_write_unlock(ctxt, mdd_obj);
         mdd_trans_stop(ctxt, mdd, rc, handle);
         RETURN(rc);
 }
@@ -1946,13 +1957,13 @@ static int mdd_readpage(const struct lu_context *ctxt, struct md_object *obj,
         LASSERT(lu_object_exists(mdd2lu_obj(mdd_obj)));
         next = mdd_object_child(mdd_obj);
 
-        mdd_lock(ctxt, mdd_obj, DT_READ_LOCK);
+        mdd_read_lock(ctxt, mdd_obj);
         if (S_ISDIR(mdd_object_type(ctxt, mdd_obj)) &&
             dt_try_as_dir(ctxt, next))
                 rc = next->do_ops->do_readpage(ctxt, next, rdpg);
         else
                 rc = -ENOTDIR;
-        mdd_unlock(ctxt, mdd_obj, DT_READ_LOCK);
+        mdd_read_unlock(ctxt, mdd_obj);
         return rc;
 }
 
index 3835dfd..502b7f0 100644 (file)
@@ -95,10 +95,11 @@ int mdd_lov_setattr_async(const struct lu_context *ctxt, struct mdd_object *obj,
 
 struct mdd_thread_info *mdd_ctx_info(const struct lu_context *ctx);
 
-void mdd_lock(const struct lu_context *ctxt, struct mdd_object *obj,
-              enum dt_lock_mode mode);
-void mdd_unlock(const struct lu_context *ctxt, struct mdd_object *obj,
-                enum dt_lock_mode mode);
+void mdd_read_lock(const struct lu_context *ctxt, struct mdd_object *obj);
+void mdd_read_unlock(const struct lu_context *ctxt, struct mdd_object *obj);
+void mdd_write_lock(const struct lu_context *ctxt, struct mdd_object *obj);
+void mdd_write_unlock(const struct lu_context *ctxt, struct mdd_object *obj);
+
 extern struct lu_device_operations mdd_lu_ops;
 static inline int lu_device_is_mdd(struct lu_device *d)
 {
index 0e9938b..799ef93 100644 (file)
@@ -153,7 +153,7 @@ int mdd_get_md(const struct lu_context *ctxt, struct mdd_object *obj,
         ENTRY;
 
         if (need_locked)
-                mdd_lock(ctxt, obj, DT_READ_LOCK);
+                mdd_read_lock(ctxt, obj);
         next = mdd_object_child(obj);
         rc = next->do_ops->do_xattr_get(ctxt, next, md, *md_size,
                                         MDS_LOV_MD_NAME);
@@ -172,7 +172,7 @@ int mdd_get_md(const struct lu_context *ctxt, struct mdd_object *obj,
         }
 
         if (need_locked)
-                mdd_unlock(ctxt, obj, DT_READ_LOCK);
+                mdd_read_unlock(ctxt, obj);
 
         RETURN (rc);
 }
@@ -351,7 +351,7 @@ int mdd_lov_create(const struct lu_context *ctxt, struct mdd_device *mdd,
         oa = obdo_alloc();
         if (oa == NULL)
                 RETURN(-ENOMEM);
-        
+
         oa->o_uid = 0; /* must have 0 uid / gid on OST */
         oa->o_gid = 0;
         oa->o_mode = S_IFREG | 0600;
@@ -422,7 +422,7 @@ int mdd_lov_create(const struct lu_context *ctxt, struct mdd_device *mdd,
                 oa->o_valid |= OBD_MD_FLFID | OBD_MD_FLGENER;
                 oinfo.oi_oa = oa;
                 oinfo.oi_md = lsm;
-                        
+
                 rc = obd_setattr(lov_exp, &oinfo, NULL);
                 if (rc) {
                         CERROR("error setting attrs for "DFID": rc %d\n",
index e018a74..1be4ed3 100644 (file)
@@ -83,9 +83,7 @@ struct osd_object {
         struct iam_container   oo_container;
         struct iam_descr       oo_descr;
         struct iam_path_descr *oo_ipd;
-#if OSD_DEBUG_LOCKS
         const struct lu_context *oo_owner;
-#endif
 };
 
 /*
@@ -542,53 +540,63 @@ static struct dt_device_operations osd_dt_ops = {
         .dt_conf_get    = osd_conf_get
 };
 
-static void osd_object_lock(const struct lu_context *ctx, struct dt_object *dt,
-                            enum dt_lock_mode mode)
+static void osd_object_read_lock(const struct lu_context *ctx,
+                                 struct dt_object *dt)
 {
         struct osd_object      *obj = osd_dt_obj(dt);
         struct osd_thread_info *oti = lu_context_key_get(ctx, &osd_key);
 
-        LASSERT(mode == DT_WRITE_LOCK || mode == DT_READ_LOCK);
         LASSERT(osd_invariant(obj));
 
         LASSERT(obj->oo_owner != ctx);
+        down_read(&obj->oo_sem);
+        LASSERT(obj->oo_owner == NULL);
+        oti->oti_r_locks++;
+}
 
-        if (mode == DT_WRITE_LOCK) {
-                down_write(&obj->oo_sem);
-                LASSERT(obj->oo_owner == NULL);
-                /*
-                 * Write lock assumes transaction.
-                 */
-                LASSERT(oti->oti_txns > 0);
-                obj->oo_owner = ctx;
-                oti->oti_w_locks++;
-        } else {
-                down_read(&obj->oo_sem);
-                LASSERT(obj->oo_owner == NULL);
-                oti->oti_r_locks++;
-        }
+static void osd_object_write_lock(const struct lu_context *ctx,
+                                  struct dt_object *dt)
+{
+        struct osd_object      *obj = osd_dt_obj(dt);
+        struct osd_thread_info *oti = lu_context_key_get(ctx, &osd_key);
+
+        LASSERT(osd_invariant(obj));
+
+        LASSERT(obj->oo_owner != ctx);
+        down_write(&obj->oo_sem);
+        LASSERT(obj->oo_owner == NULL);
+        /*
+         * Write lock assumes transaction.
+         */
+        LASSERT(oti->oti_txns > 0);
+        obj->oo_owner = ctx;
+        oti->oti_w_locks++;
 }
 
-static void osd_object_unlock(const struct lu_context *ctx,
-                              struct dt_object *dt, enum dt_lock_mode mode)
+static void osd_object_read_unlock(const struct lu_context *ctx,
+                                   struct dt_object *dt)
 {
         struct osd_object      *obj = osd_dt_obj(dt);
         struct osd_thread_info *oti = lu_context_key_get(ctx, &osd_key);
 
-        LASSERT(mode == DT_WRITE_LOCK || mode == DT_READ_LOCK);
         LASSERT(osd_invariant(obj));
+        LASSERT(oti->oti_r_locks > 0);
+        oti->oti_r_locks--;
+        up_read(&obj->oo_sem);
+}
 
-        if (mode == DT_WRITE_LOCK) {
-                LASSERT(obj->oo_owner == ctx);
-                LASSERT(oti->oti_w_locks > 0);
-                oti->oti_w_locks--;
-                obj->oo_owner = NULL;
-                up_write(&obj->oo_sem);
-        } else {
-                LASSERT(oti->oti_r_locks > 0);
-                oti->oti_r_locks--;
-                up_read(&obj->oo_sem);
-        }
+static void osd_object_write_unlock(const struct lu_context *ctx,
+                                    struct dt_object *dt)
+{
+        struct osd_object      *obj = osd_dt_obj(dt);
+        struct osd_thread_info *oti = lu_context_key_get(ctx, &osd_key);
+
+        LASSERT(osd_invariant(obj));
+        LASSERT(obj->oo_owner == ctx);
+        LASSERT(oti->oti_w_locks > 0);
+        oti->oti_w_locks--;
+        obj->oo_owner = NULL;
+        up_write(&obj->oo_sem);
 }
 
 static int osd_attr_get(const struct lu_context *ctxt, struct dt_object *dt,
@@ -1142,19 +1150,21 @@ static int osd_readpage(const struct lu_context *ctxt,
 }
 
 static struct dt_object_operations osd_obj_ops = {
-        .do_lock       = osd_object_lock,
-        .do_unlock     = osd_object_unlock,
-        .do_attr_get   = osd_attr_get,
-        .do_attr_set   = osd_attr_set,
-        .do_create     = osd_object_create,
-        .do_index_try  = osd_index_try,
-        .do_ref_add    = osd_object_ref_add,
-        .do_ref_del    = osd_object_ref_del,
-        .do_xattr_get  = osd_xattr_get,
-        .do_xattr_set  = osd_xattr_set,
-        .do_xattr_del  = osd_xattr_del,
-        .do_xattr_list = osd_xattr_list,
-        .do_readpage   = osd_readpage,
+        .do_read_lock    = osd_object_read_lock,
+        .do_write_lock   = osd_object_write_lock,
+        .do_read_unlock  = osd_object_read_unlock,
+        .do_write_unlock = osd_object_write_unlock,
+        .do_attr_get     = osd_attr_get,
+        .do_attr_set     = osd_attr_set,
+        .do_create       = osd_object_create,
+        .do_index_try    = osd_index_try,
+        .do_ref_add      = osd_object_ref_add,
+        .do_ref_del      = osd_object_ref_del,
+        .do_xattr_get    = osd_xattr_get,
+        .do_xattr_set    = osd_xattr_set,
+        .do_xattr_del    = osd_xattr_del,
+        .do_xattr_list   = osd_xattr_list,
+        .do_readpage     = osd_readpage,
 };
 
 /*
index 6f3b418..eda65d0 100644 (file)
@@ -51,8 +51,6 @@ struct dentry *osd_open(struct dentry *parent, const char *name, mode_t mode);
 int osd_lookup_id(struct dt_device *dev, const char *name, mode_t mode,
                   struct osd_inode_id *id);
 
-#define OSD_DEBUG_LOCKS (1)
-
 struct osd_thread_info {
         const struct lu_context  *oti_ctx;
 
@@ -77,11 +75,9 @@ struct osd_thread_info {
          */
         struct file         oti_file;
         struct timespec     oti_time;
-#if OSD_DEBUG_LOCKS
         int                 oti_r_locks;
         int                 oti_w_locks;
         int                 oti_txns;
-#endif
 };
 
 #endif /* __KERNEL__ */