-/* -*- 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.
/*
* 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/
#define IOC_MDC_MAX_NR 50
#include <lustre/lustre_idl.h>
-#include <lu_target.h>
+#ifdef HAVE_SERVER_SUPPORT
+# include <lu_target.h>
+#endif
#include <lu_ref.h>
#include <lustre_lib.h>
#include <lustre_export.h>
#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;
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;
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 {
cfs_spinlock_t lsm_lock;
pid_t lsm_lock_owner; /* debugging */
+ /* maximum possible file size, might change as OSTs status changes,
+ * e.g. disconnected, deactivated */
+ __u64 lsm_maxbytes;
struct {
/* Public members. */
__u64 lw_object_id; /* lov object id */
__u64 lw_object_seq; /* lov object seq */
- __u64 lw_maxbytes; /* maximum possible file size */
/* LOV-private members start here -- only for use in lov/. */
__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;
#define lsm_object_id lsm_wire.lw_object_id
#define lsm_object_seq lsm_wire.lw_object_seq
-#define lsm_maxbytes lsm_wire.lw_maxbytes
#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
- while lock handling, the flags obtained on the enqueue
request are set here.
- while stats, the flags used for control delay/resend.
+ - while setattr, the flags used for distinguish punch operation
*/
int oi_flags;
/* Lock handle specific for every OSC lock. */
/* 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. */
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);
struct ost_server_data;
+struct osd_properties {
+ size_t osd_max_ea_size;
+};
+
#define OBT_MAGIC 0xBDDECEAE
/* hold common fields for "target" device */
struct obd_device_target {
__u32 obt_magic;
+ __u32 obt_instance;
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;
cfs_rw_semaphore_t obt_rwsem;
struct vfsmount *obt_vfsmnt;
struct file *obt_health_check_filp;
+ struct osd_properties obt_osd_properties;
+ struct obd_job_stats obt_jobstats;
};
/* llog contexts */
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;
obd_size fo_readcache_max_filesize;
cfs_spinlock_t fo_flags_lock;
- int fo_read_cache:1, /**< enable read-only cache */
+ unsigned int fo_read_cache:1, /**< enable read-only cache */
fo_writethrough_cache:1,/**< read cache writes */
fo_mds_ost_sync:1, /**< MDS-OST orphan recovery*/
fo_raid_degraded:1;/**< RAID device degraded */
__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;
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
* 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;
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;
cfs_waitq_t cl_destroy_waitq;
struct mdc_rpc_lock *cl_rpc_lock;
- struct mdc_rpc_lock *cl_setattr_lock;
struct mdc_rpc_lock *cl_close_lock;
struct osc_creator cl_oscc;
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)
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;
};
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;
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,
/* */
struct echo_obd {
- struct obdo eo_oa;
- cfs_spinlock_t eo_lock;
- __u64 eo_lastino;
- struct lustre_handle eo_nl_lock;
- cfs_atomic_t eo_prep;
+ struct obd_device_target eo_obt;
+ struct obdo eo_oa;
+ cfs_spinlock_t eo_lock;
+ __u64 eo_lastino;
+ struct lustre_handle eo_nl_lock;
+ cfs_atomic_t eo_prep;
};
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 {
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;
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 {
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;
};
struct niobuf_local {
+ __u64 lnb_file_offset;
__u64 offset;
__u32 len;
__u32 flags;
#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"
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;
};
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
obd_no_conn:1, /* deny new connections */
obd_inactive:1, /* device active/inactive
* (for /proc/status only!!) */
+ obd_no_ir:1, /* no imperative recovery. */
obd_process_conf:1; /* device is processing mgs config */
/* use separate field as it is set in interrupt to don't mess with
* protection of other bits using _bh lock */
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;
time_t obd_eviction_timer; /* for ping evictor */
int obd_max_recoverable_clients;
- int obd_connected_clients;
+ cfs_atomic_t obd_connected_clients;
int obd_stale_clients;
int obd_delayed_clients;
/* this lock protects all recovery list_heads, timer and
cfs_timer_t obd_recovery_timer;
time_t obd_recovery_start; /* seconds */
time_t obd_recovery_end; /* seconds, for lprocfs_status */
- time_t obd_recovery_time_hard;
+ int obd_recovery_time_hard;
int obd_recovery_timeout;
+ int obd_recovery_ir_factor;
/* new recovery stuff from CMD2 */
struct target_recovery_data obd_recovery_data;
};
#define OBD_LLOG_FL_SENDNOW 0x0001
+#define OBD_LLOG_FL_EXIT 0x0002
enum obd_cleanup_stage {
/* Special case hack for MDS LOVs */
#define KEY_CONNECT_FLAG "connect_flags"
#define KEY_SYNC_LOCK_CANCEL "sync_lock_cancel"
-
struct lu_context;
/* /!\ must be coherent with include/linux/namei.h on patched kernel */
#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);
/* Operation type */
__u32 op_opc;
+
+ /* Used by readdir */
+ __u32 op_npages;
+ __u64 op_offset;
};
struct md_enqueue_info;
struct md_op_data mi_data;
struct lookup_intent mi_it;
struct lustre_handle mi_lockh;
- struct dentry *mi_dentry;
struct inode *mi_dir;
md_enqueue_cb_t mi_cb;
+ __u64 mi_cbdata;
unsigned int mi_generation;
- void *mi_cbdata;
};
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);
*/
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);
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,
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,
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,
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 */
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);
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 **);
struct ptlrpc_request *);
int (*m_clear_open_replay_data)(struct obd_export *,
struct obd_client_handle *);
- int (*m_set_lock_data)(struct obd_export *, __u64 *, void *, __u32 *);
+ int (*m_set_lock_data)(struct obd_export *, __u64 *, void *, __u64 *);
ldlm_mode_t (*m_lock_match)(struct obd_export *, int,
const struct lu_fid *, ldlm_type_t,
struct ldlm_enqueue_info *);
int (*m_revalidate_lock)(struct obd_export *, struct lookup_intent *,
- struct lu_fid *);
+ struct lu_fid *, __u64 *bits);
/*
* NOTE: If adding ops, add another LPROCFS_MD_OP_INIT() line to
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);
};
} \
})
-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)
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 */