X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Finclude%2Fobd.h;h=5fa66e22728dca49e11492719428e6c7cccaea3d;hp=e670dbac8ff35ccd4c6a23bdbd75ec8efe5d57ac;hb=6ad1581bf6003631d87e8365c01c03b06be136de;hpb=01138321c7ce393c189a7ed11559c0938ce9f17e diff --git a/lustre/include/obd.h b/lustre/include/obd.h index e670dba..5fa66e2 100644 --- a/lustre/include/obd.h +++ b/lustre/include/obd.h @@ -1,6 +1,4 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * +/* * GPL HEADER START * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -28,9 +26,8 @@ /* * 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, 2012, Whamcloud, Inc. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -60,7 +57,9 @@ #define IOC_MDC_MAX_NR 50 #include -#include +#ifdef HAVE_SERVER_SUPPORT +# include +#endif #include #include #include @@ -73,14 +72,6 @@ #define MAX_OBD_DEVICES 8192 -/* this is really local to the OSC */ -struct loi_oap_pages { - cfs_list_t lop_pending; - cfs_list_t lop_urgent; - cfs_list_t lop_pending_group; - int lop_num_pending; -}; - struct osc_async_rc { int ar_rc; int ar_force_sync; @@ -92,14 +83,6 @@ struct lov_oinfo { /* per-stripe data structure */ int loi_ost_idx; /* OST stripe index in lov_tgt_desc->tgts */ int loi_ost_gen; /* generation of this loi_ost_idx */ - /* used by the osc to keep track of what objects to build into rpcs */ - struct loi_oap_pages loi_read_lop; - struct loi_oap_pages loi_write_lop; - cfs_list_t loi_ready_item; - cfs_list_t loi_hp_ready_item; - cfs_list_t loi_write_item; - cfs_list_t loi_read_item; - unsigned long loi_kms_valid:1; __u64 loi_kms; /* known minimum size */ struct ost_lvb loi_lvb; @@ -116,16 +99,6 @@ static inline void loi_kms_set(struct lov_oinfo *oinfo, __u64 kms) static inline void loi_init(struct lov_oinfo *loi) { - CFS_INIT_LIST_HEAD(&loi->loi_read_lop.lop_pending); - CFS_INIT_LIST_HEAD(&loi->loi_read_lop.lop_urgent); - CFS_INIT_LIST_HEAD(&loi->loi_read_lop.lop_pending_group); - CFS_INIT_LIST_HEAD(&loi->loi_write_lop.lop_pending); - CFS_INIT_LIST_HEAD(&loi->loi_write_lop.lop_urgent); - CFS_INIT_LIST_HEAD(&loi->loi_write_lop.lop_pending_group); - CFS_INIT_LIST_HEAD(&loi->loi_ready_item); - CFS_INIT_LIST_HEAD(&loi->loi_hp_ready_item); - CFS_INIT_LIST_HEAD(&loi->loi_write_item); - CFS_INIT_LIST_HEAD(&loi->loi_read_item); } struct lov_stripe_md { @@ -144,7 +117,8 @@ struct lov_stripe_md { __u32 lw_magic; __u32 lw_stripe_size; /* size of the stripe */ __u32 lw_pattern; /* striping pattern (RAID0, RAID1) */ - unsigned lw_stripe_count; /* number of objects being striped over */ + __u16 lw_stripe_count; /* number of objects being striped over */ + __u16 lw_layout_gen; /* generation of the layout */ char lw_pool_name[LOV_MAXPOOLNAME]; /* pool name */ } lsm_wire; @@ -154,6 +128,7 @@ struct lov_stripe_md { #define lsm_object_id lsm_wire.lw_object_id #define lsm_object_seq lsm_wire.lw_object_seq #define lsm_magic lsm_wire.lw_magic +#define lsm_layout_gen lsm_wire.lw_layout_gen #define lsm_stripe_size lsm_wire.lw_stripe_size #define lsm_pattern lsm_wire.lw_pattern #define lsm_stripe_count lsm_wire.lw_stripe_count @@ -192,6 +167,8 @@ struct obd_info { /* oss capability, its type is obd_capa in client to avoid copy. * in contrary its type is lustre_capa in OSS. */ void *oi_capa; + /* transfer jobid from ost_sync() to filter_sync()... */ + char *oi_jobid; }; /* compare all relevant fields. */ @@ -205,6 +182,57 @@ static inline int lov_stripe_md_cmp(struct lov_stripe_md *m1, return memcmp(&m1->lsm_wire, &m2->lsm_wire, sizeof m1->lsm_wire); } +static inline int lov_lum_lsm_cmp(struct lov_user_md *lum, + struct lov_stripe_md *lsm) +{ + if (lsm->lsm_magic != lum->lmm_magic) + return 1; + if ((lsm->lsm_stripe_count != 0) && (lum->lmm_stripe_count != 0) && + (lsm->lsm_stripe_count != lum->lmm_stripe_count)) + return 2; + if ((lsm->lsm_stripe_size != 0) && (lum->lmm_stripe_size != 0) && + (lsm->lsm_stripe_size != lum->lmm_stripe_size)) + return 3; + if ((lsm->lsm_pattern != 0) && (lum->lmm_pattern != 0) && + (lsm->lsm_pattern != lum->lmm_pattern)) + return 4; + if ((lsm->lsm_magic == LOV_MAGIC_V3) && + (strncmp(lsm->lsm_pool_name, + ((struct lov_user_md_v3 *)lum)->lmm_pool_name, + LOV_MAXPOOLNAME) != 0)) + return 5; + return 0; +} + +static inline int lov_lum_swab_if_needed(struct lov_user_md_v3 *lumv3, + int *lmm_magic, + struct lov_user_md *lum) +{ + if (lum && cfs_copy_from_user(lumv3, lum,sizeof(struct lov_user_md_v1))) + return -EFAULT; + + *lmm_magic = lumv3->lmm_magic; + + if (*lmm_magic == __swab32(LOV_USER_MAGIC_V1)) { + lustre_swab_lov_user_md_v1((struct lov_user_md_v1 *)lumv3); + *lmm_magic = LOV_USER_MAGIC_V1; + } else if (*lmm_magic == LOV_USER_MAGIC_V3) { + if (lum && cfs_copy_from_user(lumv3, lum, sizeof(*lumv3))) + return -EFAULT; + } else if (*lmm_magic == __swab32(LOV_USER_MAGIC_V3)) { + if (lum && cfs_copy_from_user(lumv3, lum, sizeof(*lumv3))) + return -EFAULT; + lustre_swab_lov_user_md_v3(lumv3); + *lmm_magic = LOV_USER_MAGIC_V3; + } else if (*lmm_magic != LOV_USER_MAGIC_V1) { + CDEBUG(D_IOCTL, + "bad userland LOV MAGIC: %#08x != %#08x nor %#08x\n", + *lmm_magic, LOV_USER_MAGIC_V1, LOV_USER_MAGIC_V3); + return -EINVAL; + } + return 0; +} + void lov_stripe_lock(struct lov_stripe_md *md); void lov_stripe_unlock(struct lov_stripe_md *md); @@ -242,7 +270,9 @@ struct obd_device_target { struct super_block *obt_sb; /** last_rcvd file */ struct file *obt_rcvd_filp; +#ifdef HAVE_SERVER_SUPPORT struct lu_target *obt_lut; +#endif __u64 obt_mount_count; cfs_semaphore_t obt_quotachecking; struct lustre_quota_ctxt obt_qctxt; @@ -250,7 +280,8 @@ struct obd_device_target { cfs_rw_semaphore_t obt_rwsem; struct vfsmount *obt_vfsmnt; struct file *obt_health_check_filp; - struct osd_properties obt_osd_properties; + struct osd_properties obt_osd_properties; + struct obd_job_stats obt_jobstats; }; /* llog contexts */ @@ -294,13 +325,13 @@ struct filter_obd { cfs_dentry_t *fo_dentry_O; cfs_dentry_t **fo_dentry_O_groups; struct filter_subdirs *fo_dentry_O_sub; - cfs_semaphore_t fo_init_lock; /* group initialization lock */ + cfs_mutex_t fo_init_lock; /* group initialization lock */ int fo_committed_group; cfs_spinlock_t fo_objidlock; /* protect fo_lastobjid */ unsigned long fo_destroys_in_progress; - cfs_semaphore_t fo_create_locks[FILTER_SUBDIR_COUNT]; + cfs_mutex_t fo_create_locks[FILTER_SUBDIR_COUNT]; cfs_list_t fo_export_list; int fo_subdir_count; @@ -324,7 +355,7 @@ struct filter_obd { __u64 *fo_last_objids; /* last created objid for groups, * protected by fo_objidlock */ - cfs_semaphore_t fo_alloc_lock; + cfs_mutex_t fo_alloc_lock; cfs_atomic_t fo_r_in_flight; cfs_atomic_t fo_w_in_flight; @@ -422,11 +453,22 @@ struct client_obd { long cl_dirty_transit; /* dirty synchronous */ long cl_avail_grant; /* bytes of credit for ost */ long cl_lost_grant; /* lost credits (trunc) */ - cfs_list_t cl_cache_waiters; /* waiting for cache/grant */ - cfs_time_t cl_next_shrink_grant; /* jiffies */ - cfs_list_t cl_grant_shrink_list; /* Timeout event list */ - cfs_semaphore_t cl_grant_sem; /*grant shrink list cfs_semaphore*/ - int cl_grant_shrink_interval; /* seconds */ + + /* since we allocate grant by blocks, we don't know how many grant will + * be used to add a page into cache. As a solution, we reserve maximum + * grant before trying to dirty a page and unreserve the rest. + * See osc_{reserve|unreserve}_grant for details. */ + long cl_reserved_grant; + cfs_list_t cl_cache_waiters; /* waiting for cache/grant */ + cfs_time_t cl_next_shrink_grant; /* jiffies */ + cfs_list_t cl_grant_shrink_list; /* Timeout event list */ + int cl_grant_shrink_interval; /* seconds */ + + /* A chunk is an optimal size used by osc_extent to determine + * the extent size. A chunk is max(CFS_PAGE_SIZE, OST block size) */ + int cl_chunkbits; + int cl_chunk; + int cl_extent_tax; /* extent overhead, by bytes */ /* keep track of objects that have lois that contain pages which * have been queued for async brw. this lock also protects the @@ -445,7 +487,10 @@ struct client_obd { * Exact type of ->cl_loi_list_lock is defined in arch/obd.h together * with client_obd_list_{un,}lock() and * client_obd_list_lock_{init,done}() functions. - */ + * + * NB by Jinshan: though field names are still _loi_, but actually + * osc_object{}s are in the list. + */ client_obd_lock_t cl_loi_list_lock; cfs_list_t cl_loi_ready_list; cfs_list_t cl_loi_hp_ready_list; @@ -454,9 +499,9 @@ struct client_obd { int cl_r_in_flight; int cl_w_in_flight; /* just a sum of the loi/lop pending numbers to be exported by /proc */ - int cl_pending_w_pages; - int cl_pending_r_pages; - int cl_max_pages_per_rpc; + cfs_atomic_t cl_pending_w_pages; + cfs_atomic_t cl_pending_r_pages; + int cl_max_pages_per_rpc; int cl_max_rpcs_in_flight; struct obd_histogram cl_read_rpc_hist; struct obd_histogram cl_write_rpc_hist; @@ -497,6 +542,9 @@ struct client_obd { struct lu_client_seq *cl_seq; cfs_atomic_t cl_resends; /* resend count */ + + /* ptlrpc work for writeback in ptlrpcd context */ + void *cl_writeback_work; }; #define obd2cli_tgt(obd) ((char *)(obd)->u.cli.cl_target_uuid.uuid) @@ -509,7 +557,7 @@ struct mgs_obd { struct super_block *mgs_sb; struct dentry *mgs_configs_dir; cfs_list_t mgs_fs_db_list; - cfs_semaphore_t mgs_sem; + cfs_mutex_t mgs_mutex; cfs_proc_dir_entry_t *mgs_proc_live; cfs_time_t mgs_start_time; }; @@ -524,7 +572,6 @@ struct mds_obd { int mds_max_cookiesize; __u64 mds_io_epoch; unsigned long mds_atime_diff; - cfs_semaphore_t mds_epoch_sem; struct ll_fid mds_rootfid; cfs_dentry_t *mds_pending_dir; cfs_dentry_t *mds_logs_dir; @@ -551,7 +598,6 @@ struct mds_obd { struct lustre_quota_info mds_quota_info; cfs_rw_semaphore_t mds_qonoff_sem; - cfs_semaphore_t mds_health_sem; unsigned long mds_fl_user_xattr:1, mds_fl_acl:1, mds_evict_ost_nids:1, @@ -600,7 +646,7 @@ struct ost_obd { struct ptlrpc_service *ost_service; struct ptlrpc_service *ost_create_service; struct ptlrpc_service *ost_io_service; - cfs_semaphore_t ost_health_sem; + cfs_mutex_t ost_health_mutex; }; struct echo_client_obd { @@ -713,7 +759,7 @@ struct lov_obd { struct lov_tgt_desc **lov_tgts; /* sparse array */ struct ost_pool lov_packed; /* all OSTs in a packed array */ - cfs_semaphore_t lov_lock; + cfs_mutex_t lov_lock; struct obd_connect_data lov_ocd; struct lov_qos lov_qos; /* qos info per lov */ cfs_atomic_t lov_refcount; @@ -734,7 +780,7 @@ struct lmv_tgt_desc { struct obd_export *ltd_exp; int ltd_active; /* is this target up for requests */ int ltd_idx; - cfs_semaphore_t ltd_fid_sem; + cfs_mutex_t ltd_fid_mutex; }; enum placement_policy { @@ -760,7 +806,7 @@ struct lmv_obd { int max_def_easize; int max_cookiesize; int server_timeout; - cfs_semaphore_t init_sem; + cfs_mutex_t init_mutex; struct lmv_tgt_desc *tgts; int tgts_size; @@ -772,6 +818,7 @@ struct lmv_obd { }; struct niobuf_local { + __u64 lnb_file_offset; __u64 offset; __u32 len; __u32 flags; @@ -787,6 +834,7 @@ struct niobuf_local { #define LUSTRE_CMM_NAME "cmm" #define LUSTRE_MDD_NAME "mdd" #define LUSTRE_OSD_NAME "osd-ldiskfs" +#define LUSTRE_OSD_ZFS_NAME "osd-zfs" #define LUSTRE_VVP_NAME "vvp" #define LUSTRE_LMV_NAME "lmv" #define LUSTRE_CMM_MDC_NAME "cmm-mdc" @@ -829,12 +877,16 @@ struct obd_trans_info { struct llog_cookie oti_onecookie; struct llog_cookie *oti_logcookies; int oti_numcookies; + /** synchronous write is needed */ + long oti_sync_write:1; /* initial thread handling transaction */ struct ptlrpc_thread * oti_thread; __u32 oti_conn_cnt; /** VBR: versions */ __u64 oti_pre_version; + /** JobID */ + char *oti_jobid; struct obd_uuid *oti_ost_uuid; }; @@ -986,11 +1038,10 @@ struct obd_llog_group { cfs_spinlock_t olg_lock; struct obd_export *olg_exp; int olg_initializing; - cfs_semaphore_t olg_cat_processing; + cfs_mutex_t olg_cat_processing; }; /* corresponds to one of the obd's */ -#define MAX_OBD_NAME 128 #define OBD_DEVICE_MAGIC 0XAB5CD6EF #define OBD_DEV_BY_DEVNAME 0xffffd0de @@ -1045,7 +1096,7 @@ struct obd_device { struct ptlrpc_client obd_ldlm_client; /* XXX OST/MDS only */ /* a spinlock is OK for what we do now, may need a semaphore later */ cfs_spinlock_t obd_dev_lock; /* protects obd bitfield above */ - cfs_semaphore_t obd_dev_sem; + cfs_mutex_t obd_dev_mutex; __u64 obd_last_committed; struct fsfilt_operations *obd_fsops; cfs_spinlock_t obd_osfs_lock; @@ -1133,6 +1184,7 @@ struct obd_device { }; #define OBD_LLOG_FL_SENDNOW 0x0001 +#define OBD_LLOG_FL_EXIT 0x0002 enum obd_cleanup_stage { /* Special case hack for MDS LOVs */ @@ -1190,13 +1242,15 @@ struct lu_context; #define IT_GETXATTR (1 << 7) #define IT_EXEC (1 << 8) #define IT_PIN (1 << 9) +#define IT_LAYOUT (1 << 10) static inline int it_to_lock_mode(struct lookup_intent *it) { /* CREAT needs to be tested before open (both could be set) */ if (it->it_op & IT_CREAT) return LCK_CW; - else if (it->it_op & (IT_READDIR | IT_GETATTR | IT_OPEN | IT_LOOKUP)) + else if (it->it_op & (IT_READDIR | IT_GETATTR | IT_OPEN | IT_LOOKUP | + IT_LAYOUT)) return LCK_CR; LASSERTF(0, "Invalid it_op: %d\n", it->it_op); @@ -1245,6 +1299,10 @@ struct md_op_data { /* Operation type */ __u32 op_opc; + + /* Used by readdir */ + __u32 op_npages; + __u64 op_offset; }; struct md_enqueue_info; @@ -1267,9 +1325,11 @@ struct obd_ops { cfs_module_t *o_owner; int (*o_iocontrol)(unsigned int cmd, struct obd_export *exp, int len, void *karg, void *uarg); - int (*o_get_info)(struct obd_export *, __u32 keylen, void *key, - __u32 *vallen, void *val, struct lov_stripe_md *lsm); - int (*o_set_info_async)(struct obd_export *, __u32 keylen, void *key, + int (*o_get_info)(const struct lu_env *env, struct obd_export *, + __u32 keylen, void *key, __u32 *vallen, void *val, + struct lov_stripe_md *lsm); + int (*o_set_info_async)(const struct lu_env *, struct obd_export *, + __u32 keylen, void *key, __u32 vallen, void *val, struct ptlrpc_request_set *set); int (*o_attach)(struct obd_device *dev, obd_count len, void *data); @@ -1313,9 +1373,9 @@ struct obd_ops { */ int (*o_fid_delete)(struct obd_export *exp, const struct lu_fid *fid); - int (*o_statfs)(struct obd_device *obd, struct obd_statfs *osfs, - __u64 max_age, __u32 flags); - int (*o_statfs_async)(struct obd_device *obd, struct obd_info *oinfo, + int (*o_statfs)(const struct lu_env *, struct obd_export *exp, + struct obd_statfs *osfs, __u64 max_age, __u32 flags); + int (*o_statfs_async)(struct obd_export *exp, struct obd_info *oinfo, __u64 max_age, struct ptlrpc_request_set *set); int (*o_packmd)(struct obd_export *exp, struct lov_mds_md **disk_tgt, struct lov_stripe_md *mem_src); @@ -1325,20 +1385,23 @@ struct obd_ops { obd_id *ids); /* FIXME: add fid capability support for create & destroy! */ int (*o_precreate)(struct obd_export *exp); - int (*o_create)(struct obd_export *exp, struct obdo *oa, - struct lov_stripe_md **ea, struct obd_trans_info *oti); + int (*o_create)(const struct lu_env *env, struct obd_export *exp, + struct obdo *oa, struct lov_stripe_md **ea, + struct obd_trans_info *oti); int (*o_create_async)(struct obd_export *exp, struct obd_info *oinfo, struct lov_stripe_md **ea, struct obd_trans_info *oti); - int (*o_destroy)(struct obd_export *exp, struct obdo *oa, - struct lov_stripe_md *ea, struct obd_trans_info *oti, - struct obd_export *md_exp, void *capa); - int (*o_setattr)(struct obd_export *exp, struct obd_info *oinfo, - struct obd_trans_info *oti); + int (*o_destroy)(const struct lu_env *env, struct obd_export *exp, + struct obdo *oa, struct lov_stripe_md *ea, + struct obd_trans_info *oti, struct obd_export *md_exp, + void *capa); + int (*o_setattr)(const struct lu_env *, struct obd_export *exp, + struct obd_info *oinfo, struct obd_trans_info *oti); int (*o_setattr_async)(struct obd_export *exp, struct obd_info *oinfo, struct obd_trans_info *oti, struct ptlrpc_request_set *rqset); - int (*o_getattr)(struct obd_export *exp, struct obd_info *oinfo); + int (*o_getattr)(const struct lu_env *env, struct obd_export *exp, + struct obd_info *oinfo); int (*o_getattr_async)(struct obd_export *exp, struct obd_info *oinfo, struct ptlrpc_request_set *set); int (*o_brw)(int rw, struct obd_export *exp, struct obd_info *oinfo, @@ -1348,11 +1411,11 @@ struct obd_ops { struct ost_lvb *lvb, int kms_only); int (*o_adjust_kms)(struct obd_export *exp, struct lov_stripe_md *lsm, obd_off size, int shrink); - int (*o_punch)(struct obd_export *exp, struct obd_info *oinfo, - struct obd_trans_info *oti, + int (*o_punch)(const struct lu_env *, struct obd_export *exp, + struct obd_info *oinfo, struct obd_trans_info *oti, struct ptlrpc_request_set *rqset); - int (*o_sync)(struct obd_export *exp, struct obd_info *oinfo, - obd_size start, obd_size end, + int (*o_sync)(const struct lu_env *env, struct obd_export *exp, + struct obd_info *oinfo, obd_size start, obd_size end, struct ptlrpc_request_set *set); int (*o_migrate)(struct lustre_handle *conn, struct lov_stripe_md *dst, struct lov_stripe_md *src, obd_size start, @@ -1363,13 +1426,13 @@ struct obd_ops { int (*o_iterate)(struct lustre_handle *conn, int (*)(obd_id, obd_seq, void *), obd_id *startid, obd_seq seq, void *data); - int (*o_preprw)(int cmd, struct obd_export *exp, struct obdo *oa, - int objcount, struct obd_ioobj *obj, - struct niobuf_remote *remote, int *nr_pages, - struct niobuf_local *local, - struct obd_trans_info *oti, - struct lustre_capa *capa); - int (*o_commitrw)(int cmd, struct obd_export *exp, struct obdo *oa, + int (*o_preprw)(const struct lu_env *env, int cmd, + struct obd_export *exp, struct obdo *oa, int objcount, + struct obd_ioobj *obj, struct niobuf_remote *remote, + int *nr_pages, struct niobuf_local *local, + struct obd_trans_info *oti, struct lustre_capa *capa); + int (*o_commitrw)(const struct lu_env *env, int cmd, + struct obd_export *exp, struct obdo *oa, int objcount, struct obd_ioobj *obj, struct niobuf_remote *remote, int pages, struct niobuf_local *local, @@ -1407,7 +1470,7 @@ struct obd_ops { int (*o_notify)(struct obd_device *obd, struct obd_device *watched, enum obd_notify_event ev, void *data); - int (*o_health_check)(struct obd_device *); + int (*o_health_check)(const struct lu_env *env, struct obd_device *); struct obd_uuid *(*o_get_uuid) (struct obd_export *exp); /* quota methods */ @@ -1421,7 +1484,7 @@ struct obd_ops { struct ptlrpc_request_set *rqset); - int (*o_ping)(struct obd_export *exp); + int (*o_ping)(const struct lu_env *, struct obd_export *exp); /* pools methods */ int (*o_pool_new)(struct obd_device *obd, char *poolname); @@ -1515,9 +1578,8 @@ struct md_ops { struct md_open_data **mod); int (*m_sync)(struct obd_export *, const struct lu_fid *, struct obd_capa *, struct ptlrpc_request **); - int (*m_readpage)(struct obd_export *, const struct lu_fid *, - struct obd_capa *, __u64, struct page **, - unsigned, struct ptlrpc_request **); + int (*m_readpage)(struct obd_export *, struct md_op_data *, + struct page **, struct ptlrpc_request **); int (*m_unlink)(struct obd_export *, struct md_op_data *, struct ptlrpc_request **); @@ -1587,7 +1649,7 @@ struct lsm_operations { void (*lsm_stripe_by_offset)(struct lov_stripe_md *, int *, obd_off *, obd_off *); int (*lsm_lmm_verify) (struct lov_mds_md *lmm, int lmm_bytes, - int *stripe_count); + __u16 *stripe_count); int (*lsm_unpackmd) (struct lov_obd *lov, struct lov_stripe_md *lsm, struct lov_mds_md *lmm); }; @@ -1671,8 +1733,8 @@ static inline struct md_open_data *obd_mod_alloc(void) } \ }) -extern void obdo_from_inode(struct obdo *dst, struct inode *src, - struct lu_fid *parent, obd_flag valid); +void obdo_from_inode(struct obdo *dst, struct inode *src, obd_flag valid); +void obdo_set_parent_fid(struct obdo *dst, const struct lu_fid *parent); /* return 1 if client should be resend request */ static inline int client_should_resend(int resend, struct client_obd *cli) @@ -1681,4 +1743,16 @@ static inline int client_should_resend(int resend, struct client_obd *cli) cfs_atomic_read(&cli->cl_resends) > resend : 1; } +/** + * Return device name for this device + * + * XXX: lu_device is declared before obd_device, while a pointer pointing + * back to obd_device in lu_device, so this helper function defines here + * instead of in lu_object.h + */ +static inline const char *lu_dev_name(const struct lu_device *lu_dev) +{ + return lu_dev->ld_obd->obd_name; +} + #endif /* __OBD_H */