From: nikita Date: Fri, 25 Aug 2006 10:44:15 +0000 (+0000) Subject: dt: simplify ->do{un,}lock() interface: lock type (read/write) is always known static... X-Git-Tag: v1_8_0_110~486^2~1092 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=036c6dd0c586653140a1cfd63a74b981402e9467;p=fs%2Flustre-release.git dt: simplify ->do{un,}lock() interface: lock type (read/write) is always known statically, so encode it into method name --- diff --git a/lustre/include/dt_object.h b/lustre/include/dt_object.h index 0fdc728..b43670c 100644 --- a/lustre/include/dt_object.h +++ b/lustre/include/dt_object.h @@ -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 diff --git a/lustre/mdd/mdd_handler.c b/lustre/mdd/mdd_handler.c index 744dc35..2e1eb79 100644 --- a/lustre/mdd/mdd_handler.c +++ b/lustre/mdd/mdd_handler.c @@ -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; } diff --git a/lustre/mdd/mdd_internal.h b/lustre/mdd/mdd_internal.h index 3835dfd..502b7f0 100644 --- a/lustre/mdd/mdd_internal.h +++ b/lustre/mdd/mdd_internal.h @@ -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) { diff --git a/lustre/mdd/mdd_lov.c b/lustre/mdd/mdd_lov.c index 0e9938b..799ef93 100644 --- a/lustre/mdd/mdd_lov.c +++ b/lustre/mdd/mdd_lov.c @@ -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", diff --git a/lustre/osd/osd_handler.c b/lustre/osd/osd_handler.c index e018a74..1be4ed3 100644 --- a/lustre/osd/osd_handler.c +++ b/lustre/osd/osd_handler.c @@ -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, }; /* diff --git a/lustre/osd/osd_internal.h b/lustre/osd/osd_internal.h index 6f3b418..eda65d0 100644 --- a/lustre/osd/osd_internal.h +++ b/lustre/osd/osd_internal.h @@ -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__ */