X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fmdt%2Fmdt_internal.h;h=c96eebebafc7f44283f3b27912b845c623e9015d;hp=e84628f45f256aaa92042080b73d018eaf7e85a7;hb=3a78e12f100e43e2996976d06a95a1b8e61b33ff;hpb=9eb3d1db42d2937daef25950f6527ccb46221f8e diff --git a/lustre/mdt/mdt_internal.h b/lustre/mdt/mdt_internal.h index e84628f..c96eebe 100644 --- a/lustre/mdt/mdt_internal.h +++ b/lustre/mdt/mdt_internal.h @@ -28,6 +28,9 @@ /* * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. + * + * Copyright (c) 2011 Whamcloud, Inc. + * */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -169,12 +172,14 @@ struct mdt_device { cfs_proc_dir_entry_t *mdt_proc_entry; struct lprocfs_stats *mdt_stats; int mdt_sec_level; + struct rename_stats mdt_rename_stats; }; #define MDT_SERVICE_WATCHDOG_FACTOR (2) #define MDT_ROCOMPAT_SUPP (OBD_ROCOMPAT_LOVOBJID) #define MDT_INCOMPAT_SUPP (OBD_INCOMPAT_MDT | OBD_INCOMPAT_COMMON_LR | \ - OBD_INCOMPAT_FID | OBD_INCOMPAT_IAM_DIR) + OBD_INCOMPAT_FID | OBD_INCOMPAT_IAM_DIR | \ + OBD_INCOMPAT_LMM_VER | OBD_INCOMPAT_MULTI_OI) #define MDT_COS_DEFAULT (0) struct mdt_object { @@ -185,7 +190,9 @@ struct mdt_object { int mot_ioepoch_count; int mot_writecount; /* Lock to protect object's IO epoch. */ - cfs_semaphore_t mot_ioepoch_sem; + cfs_semaphore_t mot_ioepoch_sem; + /* Lock to protect create_data */ + cfs_semaphore_t mot_lov_sem; }; enum mdt_object_flags { @@ -204,6 +211,8 @@ enum mdt_object_flags { MOF_SOM_RECOV = (1 << 1), /** File has been just created. */ MOF_SOM_CREATED = (1 << 2), + /** lov object has been created. */ + MOF_LOV_CREATED = (1 << 3), }; struct mdt_lock_handle { @@ -251,7 +260,7 @@ struct mdt_reint_record { }; enum mdt_reint_flag { - MRF_SETATTR_LOCKED = 1 << 0, + MRF_OPEN_TRUNC = 1 << 0, }; /* @@ -384,7 +393,6 @@ struct mdt_thread_info { struct lr_server_data mti_lsd; struct lsd_client_data mti_lcd; loff_t mti_off; - struct txn_param mti_txn_param; struct lu_buf mti_buf; struct lustre_capa_key mti_capa_key; @@ -405,32 +413,11 @@ enum mdt_txn_op { MDT_TXN_LAST_RCVD_WRITE_OP, }; -/* - * Info allocated per-transaction. - */ -#define MDT_MAX_COMMIT_CB 4 -struct mdt_txn_info { - __u64 txi_transno; - unsigned int txi_cb_count; - struct lut_commit_cb txi_cb[MDT_MAX_COMMIT_CB]; +enum mdt_obj_exist{ + MDT_OBJ_MUST_EXIST, + MDT_OBJ_MAY_NOT_EXIST, }; -extern struct lu_context_key mdt_txn_key; - -static inline void mdt_trans_add_cb(const struct thandle *th, - lut_cb_t cb_func, void *cb_data) -{ - struct mdt_txn_info *txi; - - txi = lu_context_key_get(&th->th_ctx, &mdt_txn_key); - LASSERT(txi->txi_cb_count < ARRAY_SIZE(txi->txi_cb)); - - /* add new callback */ - txi->txi_cb[txi->txi_cb_count].lut_cb_func = cb_func; - txi->txi_cb[txi->txi_cb_count].lut_cb_data = cb_data; - txi->txi_cb_count++; -} - static inline const struct md_device_operations * mdt_child_ops(struct mdt_device * m) { @@ -503,6 +490,11 @@ static inline void mdt_export_evict(struct obd_export *exp) class_export_put(exp); } +static inline const char *mdt_obj_dev_name(const struct mdt_object *obj) +{ + return lu_dev_name(obj->mot_obj.mo_lu.lo_dev); +} + int mdt_get_disposition(struct ldlm_reply *rep, int flag); void mdt_set_disposition(struct mdt_thread_info *info, struct ldlm_reply *rep, int flag); @@ -532,16 +524,20 @@ void mdt_object_unlock(struct mdt_thread_info *, struct mdt_object *mdt_object_find(const struct lu_env *, struct mdt_device *, - const struct lu_fid *); + const struct lu_fid *, + enum mdt_obj_exist check_exist); struct mdt_object *mdt_object_find_lock(struct mdt_thread_info *, const struct lu_fid *, struct mdt_lock_handle *, - __u64); + __u64 ibits, + enum mdt_obj_exist check_exist); void mdt_object_unlock_put(struct mdt_thread_info *, struct mdt_object *, struct mdt_lock_handle *, int decref); +void mdt_client_compatibility(struct mdt_thread_info *info); + int mdt_close_unpack(struct mdt_thread_info *info); int mdt_reint_unpack(struct mdt_thread_info *info, __u32 op); int mdt_reint_rec(struct mdt_thread_info *, struct mdt_lock_handle *); @@ -576,7 +572,6 @@ int mdt_client_new(const struct lu_env *env, int mdt_export_stats_init(struct obd_device *obd, struct obd_export *exp, - int reconnect, void *client_nid); int mdt_pin(struct mdt_thread_info* info); @@ -623,11 +618,10 @@ int mdt_handle_last_unlink(struct mdt_thread_info *, struct mdt_object *, const struct md_attr *); void mdt_reconstruct_open(struct mdt_thread_info *, struct mdt_lock_handle *); -void mdt_trans_credit_init(const struct lu_env *env, - struct mdt_device *mdt, - enum mdt_txn_op op); -struct thandle* mdt_trans_start(const struct lu_env *env, - struct mdt_device *mdt); +struct thandle *mdt_trans_create(const struct lu_env *env, + struct mdt_device *mdt); +int mdt_trans_start(const struct lu_env *env, struct mdt_device *mdt, + struct thandle *th); void mdt_trans_stop(const struct lu_env *env, struct mdt_device *mdt, struct thandle *th); int mdt_record_write(const struct lu_env *env, @@ -670,6 +664,16 @@ static inline struct mdt_device *mdt_dev(struct lu_device *d) return container_of0(d, struct mdt_device, mdt_md_dev.md_lu_dev); } +static inline struct dt_object *mdt_obj2dt(struct mdt_object *mo) +{ + struct lu_object *lo; + struct mdt_device *mdt = mdt_dev(mo->mot_obj.mo_lu.lo_dev); + + lo = lu_object_locate(mo->mot_obj.mo_lu.lo_header, + mdt->mdt_bottom->dd_lu_dev.ld_type); + return lu2dt(lo); +} + /* mdt/mdt_identity.c */ #define MDT_IDENTITY_UPCALL_PATH "/usr/sbin/l_getidentity" @@ -691,7 +695,7 @@ static inline void mdt_fail_write(const struct lu_env *env, struct dt_device *dd, int id) { if (OBD_FAIL_CHECK_ORSET(id, OBD_FAIL_ONCE)) { - CERROR(LUSTRE_MDT_NAME": obd_fail_loc=%x, fail write ops\n", + CERROR(LUSTRE_MDT_NAME": cfs_fail_loc=%x, fail write ops\n", id); dd->dd_ops->dt_ro(env, dd); /* We set FAIL_ONCE because we never "un-fail" a device */ @@ -815,8 +819,14 @@ enum { LPROC_MDT_MKDIR, LPROC_MDT_RMDIR, LPROC_MDT_RENAME, + LPROC_MDT_GETATTR, + LPROC_MDT_SETATTR, LPROC_MDT_GETXATTR, LPROC_MDT_SETXATTR, + LPROC_MDT_STATFS, + LPROC_MDT_SYNC, + LPROC_MDT_SAMEDIR_RENAME, + LPROC_MDT_CROSSDIR_RENAME, LPROC_MDT_LAST, }; void mdt_counter_incr(struct obd_export *exp, int opcode); @@ -824,6 +834,9 @@ void mdt_stats_counter_init(struct lprocfs_stats *stats); void lprocfs_mdt_init_vars(struct lprocfs_static_vars *lvars); int mdt_procfs_init(struct mdt_device *mdt, const char *name); int mdt_procfs_fini(struct mdt_device *mdt); +void mdt_rename_counter_tally(struct mdt_thread_info *info, + struct mdt_device *mdt, struct obd_export *exp, + struct mdt_object *src, struct mdt_object *tgt); void mdt_time_start(const struct mdt_thread_info *info); void mdt_time_end(const struct mdt_thread_info *info, int idx); @@ -847,7 +860,7 @@ static inline void mdt_set_capainfo(struct mdt_thread_info *info, int offset, ci = md_capainfo(info->mti_env); LASSERT(ci); - ci->mc_fid[offset] = fid; + ci->mc_fid[offset] = *fid; ci->mc_capa[offset] = capa; } @@ -859,16 +872,14 @@ static inline void mdt_dump_capainfo(struct mdt_thread_info *info) if (!ci) return; for (i = 0; i < MD_CAPAINFO_MAX; i++) { - if (!ci->mc_fid[i]) - continue; if (!ci->mc_capa[i]) { CERROR("no capa for index %d "DFID"\n", - i, PFID(ci->mc_fid[i])); + i, PFID(&ci->mc_fid[i])); continue; } if (ci->mc_capa[i] == BYPASS_CAPA) { CERROR("bypass for index %d "DFID"\n", - i, PFID(ci->mc_fid[i])); + i, PFID(&ci->mc_fid[i])); continue; } DEBUG_CAPA(D_ERROR, ci->mc_capa[i], "index %d", i);