From f2ce26c3f7ae2cf89b6db33be0f48ba3eecfa7e6 Mon Sep 17 00:00:00 2001 From: wangdi Date: Fri, 16 Jun 2006 04:33:39 +0000 Subject: [PATCH] Branch: b_new_cmd 1) add mdd_unlink 2) fix error in ref_add/del 3) fix some build error --- lustre/fld/fld_handler.c | 5 +- lustre/fld/fld_iam.c | 5 +- lustre/include/dt_object.h | 4 +- lustre/mdd/mdd_handler.c | 115 ++++++++++++++++++++++++++++++++++++--------- lustre/osd/osd_handler.c | 15 +++--- 5 files changed, 109 insertions(+), 35 deletions(-) diff --git a/lustre/fld/fld_handler.c b/lustre/fld/fld_handler.c index b27da00..325cb54 100644 --- a/lustre/fld/fld_handler.c +++ b/lustre/fld/fld_handler.c @@ -34,6 +34,7 @@ # include # include # include +# include #else /* __KERNEL__ */ # include # include @@ -152,13 +153,13 @@ fld_cache_delete(struct fld_cache_info *fld_cache, __u64 lu_seq) static int fld_rrb_hash(struct lu_client_fld *fld, __u64 seq) { - return seq % fld->fld_count; + return do_div(seq, fld->fld_count); } static int fld_dht_hash(struct lu_client_fld *fld, __u64 seq) { CWARN("using Round Robin hash func for while\n"); - return seq % fld->fld_count; + return do_div(seq, fld->fld_count); } static struct lu_fld_hash fld_hash[2] = { diff --git a/lustre/fld/fld_iam.c b/lustre/fld/fld_iam.c index 712ee43..2248046 100644 --- a/lustre/fld/fld_iam.c +++ b/lustre/fld/fld_iam.c @@ -175,11 +175,10 @@ int fld_handle_lookup(struct lu_server_fld *fld, const struct lu_context *ctx, fidseq_t seq_num, mdsno_t *mds_num) { - int rc; - ENTRY; - struct dt_object *dt_obj = fld->fld_obj; struct dt_rec *rec = fld_rec(ctx, 0); + int rc; + ENTRY; rc = dt_obj->do_index_ops->dio_lookup(ctx, dt_obj, rec, fld_key(ctx, seq_num)); diff --git a/lustre/include/dt_object.h b/lustre/include/dt_object.h index ead68c2..4098bc9 100644 --- a/lustre/include/dt_object.h +++ b/lustre/include/dt_object.h @@ -227,7 +227,7 @@ struct dt_object_operations { */ int (*do_object_ref_add)(const struct lu_context *ctxt, - struct dt_object *dt); + struct dt_object *dt, struct thandle *th); /* * Del nlink of the object @@ -235,7 +235,7 @@ struct dt_object_operations { */ int (*do_object_ref_del)(const struct lu_context *ctxt, - struct dt_object *dt); + struct dt_object *dt, struct thandle *th); }; diff --git a/lustre/mdd/mdd_handler.c b/lustre/mdd/mdd_handler.c index 46b09d0..fecde1e 100644 --- a/lustre/mdd/mdd_handler.c +++ b/lustre/mdd/mdd_handler.c @@ -55,7 +55,10 @@ static void mdd_lock(const struct lu_context *ctx, struct mdd_object *obj, enum dt_lock_mode mode); static void mdd_unlock(const struct lu_context *ctx, struct mdd_object *obj, enum dt_lock_mode mode); - +static int __mdd_ref_add(const struct lu_context *ctxt, struct mdd_object *obj, + struct thandle *handle); +static int __mdd_ref_del(const struct lu_context *ctxt, struct mdd_object *obj, + struct thandle *handle); static struct md_object_operations mdd_obj_ops; static struct md_dir_operations mdd_dir_ops; static struct lu_object_operations mdd_lu_obj_ops; @@ -248,6 +251,7 @@ enum mdd_txn_op { MDD_TXN_INDEX_INSERT_OP, MDD_TXN_INDEX_DELETE_OP, MDD_TXN_LINK_OP, + MDD_TXN_UNLINK_OP, MDD_TXN_RENAME_OP, MDD_TXN_MKDIR_OP }; @@ -265,6 +269,7 @@ enum { MDD_TXN_INDEX_INSERT_CREDITS = 10, MDD_TXN_INDEX_DELETE_CREDITS = 10, MDD_TXN_LINK_CREDITS = 10, + MDD_TXN_UNLINK_CREDITS = 10, MDD_TXN_RENAME_CREDITS = 10, MDD_TXN_MKDIR_CREDITS = 10 }; @@ -286,6 +291,7 @@ DEFINE_MDD_TXN_OP_DESC(MDD_TXN_XATTR_SET); DEFINE_MDD_TXN_OP_DESC(MDD_TXN_INDEX_INSERT); DEFINE_MDD_TXN_OP_DESC(MDD_TXN_INDEX_DELETE); DEFINE_MDD_TXN_OP_DESC(MDD_TXN_LINK); +DEFINE_MDD_TXN_OP_DESC(MDD_TXN_UNLINK); DEFINE_MDD_TXN_OP_DESC(MDD_TXN_RENAME); DEFINE_MDD_TXN_OP_DESC(MDD_TXN_MKDIR); @@ -683,6 +689,7 @@ mdd_index_delete(const struct lu_context *ctxt, struct md_object *pobj, RETURN(rc); } */ + static int mdd_link(const struct lu_context *ctxt, struct md_object *tgt_obj, struct md_object *src_obj, const char *name) @@ -691,7 +698,7 @@ mdd_link(const struct lu_context *ctxt, struct md_object *tgt_obj, struct mdd_object *mdd_sobj = mdo2mddo(src_obj); struct mdd_device *mdd = mdo2mdd(src_obj); struct thandle *handle; - int rc, nlink; + int rc; ENTRY; mdd_txn_param_build(ctxt, &MDD_TXN_LINK); @@ -706,11 +713,7 @@ mdd_link(const struct lu_context *ctxt, struct md_object *tgt_obj, if (rc) GOTO(exit, rc); - rc = mdd_xattr_get(ctxt, src_obj, &nlink, sizeof(nlink), "NLINK"); - ++nlink; - - rc = __mdd_xattr_set(ctxt, mdd, mdd_sobj, - &nlink, sizeof(nlink), "NLINK", handle); + rc = __mdd_ref_add(ctxt, mdd_sobj, handle); exit: mdd_unlock2(ctxt, mdd_tobj, mdd_sobj); @@ -718,6 +721,42 @@ exit: RETURN(rc); } +static int +mdd_unlink(const struct lu_context *ctxt, struct md_object *pobj, + struct md_object *cobj, const char *name) +{ + struct mdd_device *mdd = mdo2mdd(pobj); + struct mdd_object *mdd_pobj = mdo2mddo(pobj); + struct mdd_object *mdd_cobj = mdo2mddo(cobj); + struct thandle *handle; + int rc; + ENTRY; + + mdd_txn_param_build(ctxt, &MDD_TXN_UNLINK); + handle = mdd_trans_start(ctxt, mdd); + if (IS_ERR(handle)) + RETURN(PTR_ERR(handle)); + + mdd_lock2(ctxt, mdd_pobj, mdd_cobj); + + rc = __mdd_index_delete(ctxt, mdd, mdd_pobj, name, handle); + if (rc) + GOTO(cleanup, rc); + + rc = __mdd_ref_del(ctxt, mdd_pobj, handle); + if (rc) + GOTO(cleanup, rc); + + rc = __mdd_ref_del(ctxt, mdd_cobj, handle); + if (rc) + GOTO(cleanup, rc); +cleanup: + /*FIXME: error handling*/ + mdd_lock2(ctxt, mdd_pobj, mdd_cobj); + mdd_trans_stop(ctxt, mdd, handle); + RETURN(rc); +} + static void mdd_rename_lock(struct mdd_device *mdd, struct mdd_object *src_pobj, struct mdd_object *tgt_pobj, @@ -772,6 +811,7 @@ mdd_rename(const struct lu_context *ctxt, struct md_object *src_pobj, GOTO(cleanup, rc); } cleanup: + /*FIXME: error handling*/ mdd_rename_unlock(mdd, mdd_spobj, mdd_tpobj, /*mdd_sobj,*/ mdd_tobj); mdd_trans_stop(ctxt, mdd, handle); RETURN(rc); @@ -902,34 +942,64 @@ static int mdd_statfs(const struct lu_context *ctx, RETURN(rc); } +static int +__mdd_ref_add(const struct lu_context *ctxt, struct mdd_object *obj, + struct thandle *handle) +{ + struct dt_object *next; + + LASSERT(!lu_object_exists(ctxt, &obj->mod_obj.mo_lu)); + next = mdd_object_child(obj); + return next->do_ops->do_object_ref_add(ctxt, next, handle); +} + static int mdd_ref_add(const struct lu_context *ctxt, struct md_object *obj) { struct mdd_object *mdd_obj = mdo2mddo(obj); - struct dt_object *next; - int rc; + struct mdd_device *mdd = mdo2mdd(obj); + struct thandle *handle; + int rc; ENTRY; - LASSERT(!lu_object_exists(ctxt, &obj->mo_lu)); - - next = mdd_object_child(mdd_obj); - rc = next->do_ops->do_object_ref_add(ctxt, next); - + mdd_txn_param_build(ctxt, &MDD_TXN_XATTR_SET); + handle = mdd_trans_start(ctxt, mdd); + if (!handle) + RETURN(-ENOMEM); + rc = __mdd_ref_add(ctxt, mdd_obj, handle); + + mdd_trans_stop(ctxt, mdd, handle); + RETURN(rc); } +static int +__mdd_ref_del(const struct lu_context *ctxt, struct mdd_object *obj, + struct thandle *handle) +{ + struct dt_object *next; + + LASSERT(!lu_object_exists(ctxt, &obj->mod_obj.mo_lu)); + next = mdd_object_child(obj); + return next->do_ops->do_object_ref_del(ctxt, next, handle); +} + static int mdd_ref_del(const struct lu_context *ctxt, struct md_object *obj) { struct mdd_object *mdd_obj = mdo2mddo(obj); - struct dt_object *next; - int rc; + struct mdd_device *mdd = mdo2mdd(obj); + struct thandle *handle; + int rc; ENTRY; - LASSERT(!lu_object_exists(ctxt, &obj->mo_lu)); - - next = mdd_object_child(mdd_obj); - rc = next->do_ops->do_object_ref_del(ctxt, next); + mdd_txn_param_build(ctxt, &MDD_TXN_XATTR_SET); + handle = mdd_trans_start(ctxt, mdd); + if (!handle) + RETURN(-ENOMEM); + rc = __mdd_ref_del(ctxt, mdd_obj, handle); - RETURN(0); + mdd_trans_stop(ctxt, mdd, handle); + + RETURN(rc); } struct md_device_operations mdd_ops = { @@ -944,7 +1014,8 @@ static struct md_dir_operations mdd_dir_ops = { .mdo_mkdir = mdd_mkdir, .mdo_rename = mdd_rename, .mdo_link = mdd_link, - .mdo_name_insert = mdd_mkname + .mdo_name_insert = mdd_mkname, + .mdo_unlink = mdd_unlink }; diff --git a/lustre/osd/osd_handler.c b/lustre/osd/osd_handler.c index e4b6104..d108890 100644 --- a/lustre/osd/osd_handler.c +++ b/lustre/osd/osd_handler.c @@ -32,6 +32,7 @@ #define DEBUG_SUBSYSTEM S_MDS #include +#include /* LUSTRE_VERSION_CODE */ #include @@ -594,31 +595,33 @@ static int osd_object_create(const struct lu_context *ctx, struct dt_object *dt, } static void osd_inode_inc_link(const struct lu_context *ctxt, - struct inode *inode) + struct inode *inode, struct thandle *th) { inode->i_nlink ++; + mark_inode_dirty(inode); } static void osd_inode_dec_link(const struct lu_context *ctxt, - struct inode *inode) + struct inode *inode, struct thandle *th) { inode->i_nlink --; + mark_inode_dirty(inode); } static int osd_object_ref_add(const struct lu_context *ctxt, - struct dt_object *dt) + struct dt_object *dt, struct thandle *th) { LASSERT(lu_object_exists(ctxt, &dt->do_lu)); - osd_inode_inc_link(ctxt, osd_dt_obj(dt)->oo_inode); + osd_inode_inc_link(ctxt, osd_dt_obj(dt)->oo_inode, th); return 0; } static int osd_object_ref_del(const struct lu_context *ctxt, - struct dt_object *dt) + struct dt_object *dt, struct thandle *th) { LASSERT(lu_object_exists(ctxt, &dt->do_lu)); - osd_inode_dec_link(ctxt, osd_dt_obj(dt)->oo_inode); + osd_inode_dec_link(ctxt, osd_dt_obj(dt)->oo_inode, th); return 0; } -- 1.8.3.1