X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Finclude%2Fobd_class.h;h=029b21e1d5d135b8504817847c1a4c4bbecf086f;hb=a067251099b6b225f2409f680d9e4423253d0730;hp=612e4c097943669942f9a5bd690b66966f46fb58;hpb=c47d656b7c42115fd83347c7594532c72b9a8326;p=fs%2Flustre-release.git diff --git a/lustre/include/obd_class.h b/lustre/include/obd_class.h index 612e4c0..029b21e 100644 --- a/lustre/include/obd_class.h +++ b/lustre/include/obd_class.h @@ -27,7 +27,7 @@ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, Whamcloud, Inc. + * Copyright (c) 2011, 2013, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -68,12 +68,13 @@ * interpret routine to be called. * lov_statfs_fini() must thus be called * by the request interpret routine */ - +#define OBD_STATFS_FOR_MDT0 0x0008 /* The statfs is only for retrieving + * information from MDT0. */ #define OBD_FL_PUNCH 0x00000001 /* To indicate it is punch operation */ /* OBD Device Declarations */ extern struct obd_device *obd_devs[MAX_OBD_DEVICES]; -extern cfs_rwlock_t obd_dev_lock; +extern rwlock_t obd_dev_lock; /* OBD Operations Declarations */ extern struct obd_device *class_conn2obd(struct lustre_handle *); @@ -104,6 +105,7 @@ struct obd_device * class_find_client_obd(struct obd_uuid *tgt_uuid, struct obd_device * class_devices_in_group(struct obd_uuid *grp_uuid, int *next); struct obd_device * class_num2obd(int num); +int get_devices_count(void); int class_notify_sptlrpc_conf(const char *fsname, int namelen); @@ -124,6 +126,10 @@ int kuc_ispayload(void *p); void *kuc_alloc(int payload_len, int transport, int type); void kuc_free(void *p, int payload_len); +struct llog_handle; +struct llog_rec_hdr; +typedef int (*llog_cb_t)(const struct lu_env *, struct llog_handle *, + struct llog_rec_hdr *, void *); /* obd_config.c */ struct lustre_cfg *lustre_cfg_rename(struct lustre_cfg *cfg, const char *new_name); @@ -139,6 +145,11 @@ struct obd_device *class_incref(struct obd_device *obd, void class_decref(struct obd_device *obd, const char *scope, const void *source); void dump_exports(struct obd_device *obd, int locks); +int class_config_llog_handler(const struct lu_env *env, + struct llog_handle *handle, + struct llog_rec_hdr *rec, void *data); +int class_add_conn(struct obd_device *obd, struct lustre_cfg *lcfg); +int class_add_uuid(const char *uuid, __u64 nid); /*obdecho*/ #ifdef LPROCFS @@ -162,13 +173,14 @@ struct config_llog_instance { void *cfg_instance; struct super_block *cfg_sb; struct obd_uuid cfg_uuid; + llog_cb_t cfg_callback; int cfg_last_idx; /* for partial llog processing */ int cfg_flags; }; -int class_config_parse_llog(struct llog_ctxt *ctxt, char *name, - struct config_llog_instance *cfg); -int class_config_dump_llog(struct llog_ctxt *ctxt, char *name, - struct config_llog_instance *cfg); +int class_config_parse_llog(const struct lu_env *env, struct llog_ctxt *ctxt, + char *name, struct config_llog_instance *cfg); +int class_config_dump_llog(const struct lu_env *env, struct llog_ctxt *ctxt, + char *name, struct config_llog_instance *cfg); enum { CONFIG_T_CONFIG = 0, @@ -186,7 +198,7 @@ struct config_llog_data { struct config_llog_data *cld_sptlrpc;/* depended sptlrpc log */ struct config_llog_data *cld_recover; /* imperative recover log */ struct obd_export *cld_mgcexp; - cfs_mutex_t cld_lock; + struct mutex cld_lock; int cld_type; unsigned int cld_stopping:1, /* we were told to stop * watching */ @@ -218,21 +230,19 @@ extern void (*class_export_dump_hook)(struct obd_export *); #endif -#define class_export_rpc_get(exp) \ +#define class_export_rpc_inc(exp) \ ({ \ cfs_atomic_inc(&(exp)->exp_rpc_count); \ CDEBUG(D_INFO, "RPC GETting export %p : new rpc_count %d\n", \ (exp), cfs_atomic_read(&(exp)->exp_rpc_count)); \ - class_export_get(exp); \ }) -#define class_export_rpc_put(exp) \ +#define class_export_rpc_dec(exp) \ ({ \ LASSERT_ATOMIC_POS(&exp->exp_rpc_count); \ cfs_atomic_dec(&(exp)->exp_rpc_count); \ CDEBUG(D_INFO, "RPC PUTting export %p : new rpc_count %d\n", \ (exp), cfs_atomic_read(&(exp)->exp_rpc_count)); \ - class_export_put(exp); \ }) #define class_export_lock_get(exp, lock) \ @@ -326,6 +336,9 @@ void md_from_obdo(struct md_op_data *op_data, struct obdo *oa, obd_flag valid); void obdo_from_md(struct obdo *oa, struct md_op_data *op_data, unsigned int valid); +void obdo_cpu_to_le(struct obdo *dobdo, struct obdo *sobdo); +void obdo_le_to_cpu(struct obdo *dobdo, struct obdo *sobdo); + #define OBT(dev) (dev)->obd_type #define OBP(dev, op) (dev)->obd_type->typ_dt_ops->o_ ## op #define MDP(dev, op) (dev)->obd_type->typ_md_ops->m_ ## op @@ -652,7 +665,7 @@ static inline void obd_cleanup_client_import(struct obd_device *obd) /* If we set up but never connected, the client import will not have been cleaned. */ - cfs_down_write(&obd->u.cli.cl_sem); + down_write(&obd->u.cli.cl_sem); if (obd->u.cli.cl_import) { struct obd_import *imp; imp = obd->u.cli.cl_import; @@ -666,7 +679,7 @@ static inline void obd_cleanup_client_import(struct obd_device *obd) client_destroy_import(imp); obd->u.cli.cl_import = NULL; } - cfs_up_write(&obd->u.cli.cl_sem); + up_write(&obd->u.cli.cl_sem); EXIT; } @@ -738,11 +751,21 @@ static inline int obd_alloc_diskmd(struct obd_export *exp, } static inline int obd_free_diskmd(struct obd_export *exp, - struct lov_mds_md **disk_tgt) -{ - LASSERT(disk_tgt); - LASSERT(*disk_tgt); - return obd_packmd(exp, disk_tgt, NULL); + struct lov_mds_md **disk_tgt) +{ + LASSERT(disk_tgt); + LASSERT(*disk_tgt); + /* + * LU-2590, for caller's convenience, *disk_tgt could be host + * endianness, it needs swab to LE if necessary, while just + * lov_mds_md header needs it for figuring out how much memory + * needs to be freed. + */ + if ((cpu_to_le32(LOV_MAGIC) != LOV_MAGIC) && + (((*disk_tgt)->lmm_magic == LOV_MAGIC_V1) || + ((*disk_tgt)->lmm_magic == LOV_MAGIC_V3))) + lustre_swab_lov_mds_md(*disk_tgt); + return obd_packmd(exp, disk_tgt, NULL); } /* Unpack an MD struct from disk to in-memory format. @@ -1029,28 +1052,29 @@ static inline int obd_disconnect(struct obd_export *exp) RETURN(rc); } -static inline int obd_fid_init(struct obd_export *exp) +static inline int obd_fid_init(struct obd_device *obd, struct obd_export *exp, + enum lu_cli_type type) { - int rc; - ENTRY; + int rc; + ENTRY; - OBD_CHECK_DT_OP(exp->exp_obd, fid_init, 0); - EXP_COUNTER_INCREMENT(exp, fid_init); + OBD_CHECK_DT_OP(obd, fid_init, 0); + OBD_COUNTER_INCREMENT(obd, fid_init); - rc = OBP(exp->exp_obd, fid_init)(exp); - RETURN(rc); + rc = OBP(obd, fid_init)(obd, exp, type); + RETURN(rc); } -static inline int obd_fid_fini(struct obd_export *exp) +static inline int obd_fid_fini(struct obd_device *obd) { - int rc; - ENTRY; + int rc; + ENTRY; - OBD_CHECK_DT_OP(exp->exp_obd, fid_fini, 0); - EXP_COUNTER_INCREMENT(exp, fid_fini); + OBD_CHECK_DT_OP(obd, fid_fini, 0); + OBD_COUNTER_INCREMENT(obd, fid_fini); - rc = OBP(exp->exp_obd, fid_fini)(exp); - RETURN(rc); + rc = OBP(obd, fid_fini)(obd); + RETURN(rc); } static inline int obd_fid_alloc(struct obd_export *exp, @@ -1067,19 +1091,6 @@ static inline int obd_fid_alloc(struct obd_export *exp, RETURN(rc); } -static inline int obd_fid_delete(struct obd_export *exp, - const struct lu_fid *fid) -{ - int rc; - ENTRY; - - EXP_CHECK_DT_OP(exp, fid_delete); - EXP_COUNTER_INCREMENT(exp, fid_delete); - - rc = OBP(exp->exp_obd, fid_delete)(exp, fid); - RETURN(rc); -} - static inline int obd_ping(const struct lu_env *env, struct obd_export *exp) { int rc; @@ -1192,24 +1203,13 @@ static inline int obd_extent_calc(struct obd_export *exp, } static inline struct dentry * -obd_lvfs_fid2dentry(struct obd_export *exp, __u64 id_ino, __u32 gen, __u64 gr) +obd_lvfs_fid2dentry(struct obd_export *exp, struct ost_id *oi, __u32 gen) { - LASSERT(exp->exp_obd); - - return lvfs_fid2dentry(&exp->exp_obd->obd_lvfs_ctxt, id_ino, gen, gr, - exp->exp_obd); -} + struct lvfs_run_ctxt *ctxt = &exp->exp_obd->obd_lvfs_ctxt; + LASSERT(exp->exp_obd); -static inline int -obd_lvfs_open_llog(struct obd_export *exp, __u64 id_ino, struct dentry *dentry) -{ - LASSERT(exp->exp_obd); - CERROR("FIXME what's the story here? This needs to be an obd fn?\n"); -#if 0 - return lvfs_open_llog(&exp->exp_obd->obd_lvfs_ctxt, id_ino, - dentry, exp->exp_obd); -#endif - return 0; + return ctxt->cb_ops.l_fid2dentry(ostid_id(oi), gen, ostid_seq(oi), + exp->exp_obd); } /* @max_age is the oldest time in jiffies that we accept using a cached data. @@ -1241,9 +1241,9 @@ static inline int obd_statfs_async(struct obd_export *exp, obd->obd_name, &obd->obd_osfs, obd->obd_osfs.os_bavail, obd->obd_osfs.os_blocks, obd->obd_osfs.os_ffree, obd->obd_osfs.os_files); - cfs_spin_lock(&obd->obd_osfs_lock); - memcpy(oinfo->oi_osfs, &obd->obd_osfs, sizeof(*oinfo->oi_osfs)); - cfs_spin_unlock(&obd->obd_osfs_lock); + spin_lock(&obd->obd_osfs_lock); + memcpy(oinfo->oi_osfs, &obd->obd_osfs, sizeof(*oinfo->oi_osfs)); + spin_unlock(&obd->obd_osfs_lock); oinfo->oi_flags |= OBD_STATFS_FROM_CACHE; if (oinfo->oi_cb_up) oinfo->oi_cb_up(oinfo, 0); @@ -1295,22 +1295,22 @@ static inline int obd_statfs(const struct lu_env *env, struct obd_export *exp, if (cfs_time_before_64(obd->obd_osfs_age, max_age)) { rc = OBP(obd, statfs)(env, exp, osfs, max_age, flags); if (rc == 0) { - cfs_spin_lock(&obd->obd_osfs_lock); - memcpy(&obd->obd_osfs, osfs, sizeof(obd->obd_osfs)); - obd->obd_osfs_age = cfs_time_current_64(); - cfs_spin_unlock(&obd->obd_osfs_lock); - } - } else { - CDEBUG(D_SUPER,"%s: use %p cache blocks "LPU64"/"LPU64 - " objects "LPU64"/"LPU64"\n", - obd->obd_name, &obd->obd_osfs, - obd->obd_osfs.os_bavail, obd->obd_osfs.os_blocks, - obd->obd_osfs.os_ffree, obd->obd_osfs.os_files); - cfs_spin_lock(&obd->obd_osfs_lock); - memcpy(osfs, &obd->obd_osfs, sizeof(*osfs)); - cfs_spin_unlock(&obd->obd_osfs_lock); - } - RETURN(rc); + spin_lock(&obd->obd_osfs_lock); + memcpy(&obd->obd_osfs, osfs, sizeof(obd->obd_osfs)); + obd->obd_osfs_age = cfs_time_current_64(); + spin_unlock(&obd->obd_osfs_lock); + } + } else { + CDEBUG(D_SUPER, "%s: use %p cache blocks "LPU64"/"LPU64 + " objects "LPU64"/"LPU64"\n", + obd->obd_name, &obd->obd_osfs, + obd->obd_osfs.os_bavail, obd->obd_osfs.os_blocks, + obd->obd_osfs.os_ffree, obd->obd_osfs.os_files); + spin_lock(&obd->obd_osfs_lock); + memcpy(osfs, &obd->obd_osfs, sizeof(*osfs)); + spin_unlock(&obd->obd_osfs_lock); + } + RETURN(rc); } static inline int obd_sync_rqset(struct obd_export *exp, struct obd_info *oinfo, @@ -1715,39 +1715,6 @@ static inline int obd_quotactl(struct obd_export *exp, RETURN(rc); } -static inline int obd_quota_adjust_qunit(struct obd_export *exp, - struct quota_adjust_qunit *oqaq, - struct lustre_quota_ctxt *qctxt, - struct ptlrpc_request_set *set) -{ -#if defined(LPROCFS) && defined(HAVE_QUOTA_SUPPORT) - struct timeval work_start; - struct timeval work_end; - long timediff; -#endif - int rc; - ENTRY; - -#if defined(LPROCFS) && defined(HAVE_QUOTA_SUPPORT) - if (qctxt) - cfs_gettimeofday(&work_start); -#endif - EXP_CHECK_DT_OP(exp, quota_adjust_qunit); - EXP_COUNTER_INCREMENT(exp, quota_adjust_qunit); - - rc = OBP(exp->exp_obd, quota_adjust_qunit)(exp, oqaq, qctxt, set); - -#if defined(LPROCFS) && defined(HAVE_QUOTA_SUPPORT) - if (qctxt) { - cfs_gettimeofday(&work_end); - timediff = cfs_timeval_sub(&work_end, &work_start, NULL); - lprocfs_counter_add(qctxt->lqc_stats, LQUOTA_ADJUST_QUNIT, - timediff); - } -#endif - RETURN(rc); -} - static inline int obd_health_check(const struct lu_env *env, struct obd_device *obd) { @@ -1780,13 +1747,13 @@ static inline int obd_register_observer(struct obd_device *obd, { ENTRY; OBD_CHECK_DEV(obd); - cfs_down_write(&obd->obd_observer_link_sem); + down_write(&obd->obd_observer_link_sem); if (obd->obd_observer && observer) { - cfs_up_write(&obd->obd_observer_link_sem); + up_write(&obd->obd_observer_link_sem); RETURN(-EALREADY); } obd->obd_observer = observer; - cfs_up_write(&obd->obd_observer_link_sem); + up_write(&obd->obd_observer_link_sem); RETURN(0); } @@ -1794,10 +1761,10 @@ static inline int obd_pin_observer(struct obd_device *obd, struct obd_device **observer) { ENTRY; - cfs_down_read(&obd->obd_observer_link_sem); + down_read(&obd->obd_observer_link_sem); if (!obd->obd_observer) { *observer = NULL; - cfs_up_read(&obd->obd_observer_link_sem); + up_read(&obd->obd_observer_link_sem); RETURN(-ENOENT); } *observer = obd->obd_observer; @@ -1807,7 +1774,7 @@ static inline int obd_pin_observer(struct obd_device *obd, static inline int obd_unpin_observer(struct obd_device *obd) { ENTRY; - cfs_up_read(&obd->obd_observer_link_sem); + up_read(&obd->obd_observer_link_sem); RETURN(0); } @@ -1890,15 +1857,14 @@ static inline int md_getattr(struct obd_export *exp, struct md_op_data *op_data, RETURN(rc); } -static inline int md_change_cbdata(struct obd_export *exp, - const struct lu_fid *fid, - ldlm_iterator_t it, void *data) +static inline int md_null_inode(struct obd_export *exp, + const struct lu_fid *fid) { int rc; ENTRY; - EXP_CHECK_MD_OP(exp, change_cbdata); - EXP_MD_COUNTER_INCREMENT(exp, change_cbdata); - rc = MDP(exp->exp_obd, change_cbdata)(exp, fid, it, data); + EXP_CHECK_MD_OP(exp, null_inode); + EXP_MD_COUNTER_INCREMENT(exp, null_inode); + rc = MDP(exp->exp_obd, null_inode)(exp, fid); RETURN(rc); } @@ -1983,18 +1949,18 @@ static inline int md_getattr_name(struct obd_export *exp, } static inline int md_intent_lock(struct obd_export *exp, - struct md_op_data *op_data, void *lmm, - int lmmsize, struct lookup_intent *it, - int flags, struct ptlrpc_request **reqp, - ldlm_blocking_callback cb_blocking, - int extra_lock_flags) + struct md_op_data *op_data, void *lmm, + int lmmsize, struct lookup_intent *it, + int lookup_flags, struct ptlrpc_request **reqp, + ldlm_blocking_callback cb_blocking, + __u64 extra_lock_flags) { int rc; ENTRY; EXP_CHECK_MD_OP(exp, intent_lock); EXP_MD_COUNTER_INCREMENT(exp, intent_lock); rc = MDP(exp->exp_obd, intent_lock)(exp, op_data, lmm, lmmsize, - it, flags, reqp, cb_blocking, + it, lookup_flags, reqp, cb_blocking, extra_lock_flags); RETURN(rc); } @@ -2181,7 +2147,7 @@ static inline int md_cancel_unused(struct obd_export *exp, RETURN(rc); } -static inline ldlm_mode_t md_lock_match(struct obd_export *exp, int flags, +static inline ldlm_mode_t md_lock_match(struct obd_export *exp, __u64 flags, const struct lu_fid *fid, ldlm_type_t type, ldlm_policy_data_t *policy, @@ -2272,11 +2238,11 @@ extern int obd_init_caches(void); extern void obd_cleanup_caches(void); /* support routines */ -extern cfs_mem_cache_t *obdo_cachep; +extern struct kmem_cache *obdo_cachep; #define OBDO_ALLOC(ptr) \ do { \ - OBD_SLAB_ALLOC_PTR_GFP((ptr), obdo_cachep, CFS_ALLOC_IO); \ + OBD_SLAB_ALLOC_PTR_GFP((ptr), obdo_cachep, __GFP_IO); \ } while(0) #define OBDO_FREE(ptr) \ @@ -2295,12 +2261,30 @@ static inline void fid2obdo(struct lu_fid *fid, struct obdo *oa) /* something here */ } +typedef int (*register_lwp_cb)(void *data); + +struct lwp_register_item { + struct obd_export **lri_exp; + register_lwp_cb lri_cb_func; + void *lri_cb_data; + cfs_list_t lri_list; + char lri_name[MTI_NAME_MAXLEN]; +}; + /* I'm as embarrassed about this as you are. * * // XXX do not look into _superhack with remaining eye * // XXX if this were any uglier, I'd get my own show on MTV */ extern int (*ptlrpc_put_connection_superhack)(struct ptlrpc_connection *c); +/* obd_mount.c */ +#ifdef HAVE_SERVER_SUPPORT +int lustre_register_lwp_item(const char *lwpname, struct obd_export **exp, + register_lwp_cb cb_func, void *cb_data); +void lustre_deregister_lwp_item(struct obd_export **exp); +int tgt_name2lwpname(const char *tgt_name, char *lwp_name); +#endif /* HAVE_SERVER_SUPPORT */ + /* sysctl.c */ extern void obd_sysctl_init (void); extern void obd_sysctl_clean (void);