Whamcloud - gitweb
LU-4603 lmv: a few fixes about readdir of striped dir.
[fs/lustre-release.git] / lustre / include / obd.h
index 3b76c34..94f9d8c 100644 (file)
@@ -36,6 +36,9 @@
 
 #ifndef __OBD_H
 #define __OBD_H
+#ifndef __KERNEL__
+# error "userspace should not include <obd.h>"
+#endif
 
 #if defined(__linux__)
 #include <linux/obd.h>
 #error Unsupported operating system.
 #endif
 
-#define IOC_OSC_TYPE         'h'
-#define IOC_OSC_MIN_NR       20
-#define IOC_OSC_SET_ACTIVE   _IOWR(IOC_OSC_TYPE, 21, struct obd_device *)
-#define IOC_OSC_MAX_NR       50
-
-#define IOC_MDC_TYPE         'i'
-#define IOC_MDC_MIN_NR       20
-#define IOC_MDC_MAX_NR       50
-
 #include <lustre/lustre_idl.h>
 #include <lustre_lib.h>
 #include <libcfs/bitmap.h>
@@ -68,6 +62,7 @@
 #include <lustre_fid.h>
 #include <lustre_fld.h>
 #include <lustre_capa.h>
+#include <lvfs.h>
 
 #define MAX_OBD_DEVICES 8192
 
@@ -99,13 +94,13 @@ static inline void loi_init(struct lov_oinfo *loi)
 }
 
 struct lov_stripe_md {
-       cfs_atomic_t     lsm_refc;
+       atomic_t        lsm_refc;
        spinlock_t      lsm_lock;
-        pid_t            lsm_lock_owner; /* debugging */
+       pid_t           lsm_lock_owner; /* debugging */
 
-        /* maximum possible file size, might change as OSTs status changes,
-         * e.g. disconnected, deactivated */
-        __u64            lsm_maxbytes;
+       /* maximum possible file size, might change as OSTs status changes,
+        * e.g. disconnected, deactivated */
+       __u64            lsm_maxbytes;
         struct {
                 /* Public members. */
                struct ost_id lw_object_oi; /* lov object id/seq */
@@ -144,6 +139,13 @@ static inline bool lsm_has_objects(struct lov_stripe_md *lsm)
        return true;
 }
 
+static inline int lov_stripe_md_size(unsigned int stripe_count)
+{
+       struct lov_stripe_md lsm;
+
+       return sizeof(lsm) + stripe_count * sizeof(lsm.lsm_oinfo[0]);
+}
+
 struct obd_info;
 
 typedef int (*obd_enqueue_update_f)(void *cookie, int rc);
@@ -182,13 +184,15 @@ struct obd_info {
 };
 
 struct obd_type {
-        cfs_list_t typ_chain;
-        struct obd_ops *typ_dt_ops;
-        struct md_ops *typ_md_ops;
-        cfs_proc_dir_entry_t *typ_procroot;
-        char *typ_name;
-        int  typ_refcnt;
-        struct lu_device_type *typ_lu;
+       struct list_head typ_chain;
+       struct obd_ops *typ_dt_ops;
+       struct md_ops *typ_md_ops;
+       struct proc_dir_entry *typ_procroot;
+       struct proc_dir_entry *typ_procsym;
+       __u32 typ_sym_filter;
+       char *typ_name;
+       int  typ_refcnt;
+       struct lu_device_type *typ_lu;
        spinlock_t obd_type_lock;
 };
 
@@ -229,12 +233,12 @@ struct timeout_item {
         cfs_list_t         ti_chain;
 };
 
-#define OSC_MAX_RIF_DEFAULT       8
-#define MDS_OSC_MAX_RIF_DEFAULT   50
-#define OSC_MAX_RIF_MAX         256
-#define OSC_MAX_DIRTY_DEFAULT  (OSC_MAX_RIF_DEFAULT * 4)
-#define OSC_MAX_DIRTY_MB_MAX   2048     /* arbitrary, but < MAX_LONG bytes */
-#define OSC_DEFAULT_RESENDS      10
+#define OBD_MAX_RIF_DEFAULT    8
+#define OBD_MAX_RIF_MAX                512
+#define OSC_MAX_RIF_MAX                256
+#define OSC_MAX_DIRTY_DEFAULT  (OBD_MAX_RIF_DEFAULT * 4)
+#define OSC_MAX_DIRTY_MB_MAX   2048     /* arbitrary, but < MAX_LONG bytes */
+#define OSC_DEFAULT_RESENDS    10
 
 /* possible values for fo_sync_lock_cancel */
 enum {
@@ -244,9 +248,6 @@ enum {
         NUM_SYNC_ON_CANCEL_STATES
 };
 
-#define MDC_MAX_RIF_DEFAULT       8
-#define MDC_MAX_RIF_MAX         512
-
 struct mdc_rpc_lock;
 struct obd_import;
 struct client_obd {
@@ -254,11 +255,12 @@ struct client_obd {
         struct obd_uuid          cl_target_uuid;
         struct obd_import       *cl_import; /* ptlrpc connection state */
         int                      cl_conn_count;
-        /* max_mds_easize is purely a performance thing so we don't have to
-         * call obd_size_diskmd() all the time. */
-        int                      cl_default_mds_easize;
-        int                      cl_max_mds_easize;
-        int                      cl_max_mds_cookiesize;
+       /* max_mds_easize is purely a performance thing so we don't have to
+        * call obd_size_diskmd() all the time. */
+       int                      cl_default_mds_easize;
+       int                      cl_max_mds_easize;
+       int                      cl_default_mds_cookiesize;
+       int                      cl_max_mds_cookiesize;
 
         enum lustre_sec_part     cl_sp_me;
         enum lustre_sec_part     cl_sp_to;
@@ -287,9 +289,9 @@ struct client_obd {
        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
-         * lists of osc_client_pages that hang off of the loi */
+       /* keep track of objects that have lois that contain pages which
+        * have been queued for async brw.  this lock also protects the
+        * lists of osc_client_pages that hang off of the loi */
         /*
          * ->cl_loi_list_lock protects consistency of
          * ->cl_loi_{ready,read,write}_list. ->ap_make_ready() and
@@ -313,44 +315,44 @@ struct client_obd {
         cfs_list_t               cl_loi_hp_ready_list;
         cfs_list_t               cl_loi_write_list;
         cfs_list_t               cl_loi_read_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 */
-       cfs_atomic_t             cl_pending_w_pages;
-       cfs_atomic_t             cl_pending_r_pages;
+       int                      cl_r_in_flight;
+       int                      cl_w_in_flight;
+       /* just a sum of the loi/lop pending numbers to be exported by /proc */
+       atomic_t                 cl_pending_w_pages;
+       atomic_t                 cl_pending_r_pages;
        __u32                    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;
-        struct obd_histogram     cl_read_page_hist;
-        struct obd_histogram     cl_write_page_hist;
-        struct obd_histogram     cl_read_offset_hist;
-        struct obd_histogram     cl_write_offset_hist;
+       int                      cl_max_rpcs_in_flight;
+       struct obd_histogram     cl_read_rpc_hist;
+       struct obd_histogram     cl_write_rpc_hist;
+       struct obd_histogram     cl_read_page_hist;
+       struct obd_histogram     cl_write_page_hist;
+       struct obd_histogram     cl_read_offset_hist;
+       struct obd_histogram     cl_write_offset_hist;
 
        /* lru for osc caching pages */
        struct cl_client_cache  *cl_cache;
        cfs_list_t               cl_lru_osc; /* member of cl_cache->ccc_lru */
-       cfs_atomic_t            *cl_lru_left;
-       cfs_atomic_t             cl_lru_busy;
-       cfs_atomic_t             cl_lru_shrinkers;
-       cfs_atomic_t             cl_lru_in_list;
+       atomic_t                *cl_lru_left;
+       atomic_t                 cl_lru_busy;
+       atomic_t                 cl_lru_shrinkers;
+       atomic_t                 cl_lru_in_list;
        cfs_list_t               cl_lru_list; /* lru page list */
        client_obd_lock_t        cl_lru_list_lock; /* page list protector */
-       cfs_atomic_t             cl_unstable_count;
+       atomic_t                 cl_unstable_count;
 
-        /* number of in flight destroy rpcs is limited to max_rpcs_in_flight */
-        cfs_atomic_t             cl_destroy_in_flight;
+       /* number of in flight destroy rpcs is limited to max_rpcs_in_flight */
+       atomic_t             cl_destroy_in_flight;
        wait_queue_head_t        cl_destroy_waitq;
 
         struct mdc_rpc_lock     *cl_rpc_lock;
         struct mdc_rpc_lock     *cl_close_lock;
 
         /* mgc datastruct */
-       struct semaphore         cl_mgc_sem;
+       struct mutex             cl_mgc_mutex;
        struct local_oid_storage *cl_mgc_los;
        struct dt_object        *cl_mgc_configs_dir;
-        cfs_atomic_t             cl_mgc_refcount;
-        struct obd_export       *cl_mgc_mgsexp;
+       atomic_t             cl_mgc_refcount;
+       struct obd_export       *cl_mgc_mgsexp;
 
         /* checksumming for data sent over the network */
         unsigned int             cl_checksum:1; /* 0 = disabled, 1 = enabled */
@@ -369,10 +371,10 @@ struct client_obd {
 #warning "please consider removing quotacheck compatibility code"
 #endif
 
-        /* sequence manager */
-        struct lu_client_seq    *cl_seq;
+       /* sequence manager */
+       struct lu_client_seq    *cl_seq;
 
-        cfs_atomic_t             cl_resends; /* resend count */
+       atomic_t             cl_resends; /* resend count */
 
        /* ptlrpc work for writeback in ptlrpcd context */
        void                    *cl_writeback_work;
@@ -421,26 +423,27 @@ struct lov_tgt_desc {
 };
 
 struct lov_obd {
-        struct lov_desc         desc;
-        struct lov_tgt_desc   **lov_tgts;              /* sparse array */
-        struct ost_pool         lov_packed;            /* all OSTs in a packed
-                                                          array */
+       struct lov_desc         desc;
+       struct lov_tgt_desc   **lov_tgts;               /* sparse array */
+       struct ost_pool         lov_packed;             /* all OSTs in a packed
+                                                          array */
        struct mutex            lov_lock;
-        struct obd_connect_data lov_ocd;
-        cfs_atomic_t            lov_refcount;
-        __u32                   lov_death_row;/* tgts scheduled to be deleted */
-        __u32                   lov_tgt_size;   /* size of tgts array */
-        int                     lov_connects;
-        int                     lov_pool_count;
-        cfs_hash_t             *lov_pools_hash_body; /* used for key access */
-        cfs_list_t              lov_pool_list; /* used for sequential access */
-        cfs_proc_dir_entry_t   *lov_pool_proc_entry;
-        enum lustre_sec_part    lov_sp_me;
+       struct obd_connect_data lov_ocd;
+       struct proc_dir_entry  *targets_proc_entry;
+       atomic_t                lov_refcount;
+       __u32                   lov_death_row;  /* tgts scheduled to be deleted */
+       __u32                   lov_tgt_size;   /* size of tgts array */
+       int                     lov_connects;
+       int                     lov_pool_count;
+       cfs_hash_t             *lov_pools_hash_body; /* used for key access */
+       struct list_head        lov_pool_list;  /* used for sequential access */
+       struct proc_dir_entry  *lov_pool_proc_entry;
+       enum lustre_sec_part    lov_sp_me;
 
        /* Cached LRU and unstable data from upper layer */
        void                   *lov_cache;
 
-       struct rw_semaphore     lov_notify_lock;
+       struct rw_semaphore     lov_notify_lock;
 };
 
 struct lmv_tgt_desc {
@@ -468,12 +471,14 @@ struct lmv_obd {
        struct lmv_desc         desc;
        struct obd_uuid         cluuid;
        struct obd_export       *exp;
+       struct proc_dir_entry   *targets_proc_entry;
 
        struct mutex            init_mutex;
        int                     connected;
        int                     max_easize;
        int                     max_def_easize;
        int                     max_cookiesize;
+       int                     max_def_cookiesize;
        int                     server_timeout;
 
        int                     tgts_size; /* size of tgts array */
@@ -702,7 +707,6 @@ struct obd_llog_group {
 
 /* corresponds to one of the obd's */
 #define OBD_DEVICE_MAGIC        0XAB5CD6EF
-#define OBD_DEV_BY_DEVNAME      0xffffd0de
 
 struct obd_device {
        struct obd_type         *obd_type;
@@ -744,14 +748,15 @@ struct obd_device {
         cfs_hash_t             *obd_uuid_hash;
         /* nid-export hash body */
         cfs_hash_t             *obd_nid_hash;
-        /* nid stats body */
-        cfs_hash_t             *obd_nid_stats_hash;
-        cfs_list_t              obd_nid_stats;
-        cfs_atomic_t            obd_refcount;
-        cfs_list_t              obd_exports;
-        cfs_list_t              obd_unlinked_exports;
-        cfs_list_t              obd_delayed_exports;
-        int                     obd_num_exports;
+       /* nid stats body */
+       cfs_hash_t             *obd_nid_stats_hash;
+       cfs_list_t              obd_nid_stats;
+       atomic_t            obd_refcount;
+       cfs_list_t              obd_exports;
+       cfs_list_t              obd_unlinked_exports;
+       cfs_list_t              obd_delayed_exports;
+       struct list_head        obd_lwp_list;
+       int                     obd_num_exports;
        spinlock_t              obd_nid_lock;
        struct ldlm_namespace  *obd_namespace;
        struct ptlrpc_client    obd_ldlm_client; /* XXX OST/MDS only */
@@ -768,14 +773,15 @@ struct obd_device {
        struct rw_semaphore     obd_observer_link_sem;
         struct obd_notify_upcall obd_upcall;
         struct obd_export       *obd_self_export;
+       struct obd_export       *obd_lwp_export;
         /* list of exports in LRU order, for ping evictor, with obd_dev_lock */
         cfs_list_t              obd_exports_timed;
         time_t                  obd_eviction_timer; /* for ping evictor */
 
-        int                              obd_max_recoverable_clients;
-        cfs_atomic_t                     obd_connected_clients;
-        int                              obd_stale_clients;
-        int                              obd_delayed_clients;
+       int                     obd_max_recoverable_clients;
+       atomic_t                obd_connected_clients;
+       int                     obd_stale_clients;
+       int                     obd_delayed_clients;
         /* this lock protects all recovery list_heads, timer and
          * obd_next_recovery_transno value */
        spinlock_t                       obd_recovery_task_lock;
@@ -791,15 +797,15 @@ struct obd_device {
        int                              obd_recovery_timeout;
        int                              obd_recovery_ir_factor;
 
-        /* new recovery stuff from CMD2 */
-        struct target_recovery_data      obd_recovery_data;
-        int                              obd_replayed_locks;
-        cfs_atomic_t                     obd_req_replay_clients;
-        cfs_atomic_t                     obd_lock_replay_clients;
-        /* all lists are protected by obd_recovery_task_lock */
-        cfs_list_t                       obd_req_replay_queue;
-        cfs_list_t                       obd_lock_replay_queue;
-        cfs_list_t                       obd_final_req_queue;
+       /* new recovery stuff from CMD2 */
+       struct target_recovery_data      obd_recovery_data;
+       int                              obd_replayed_locks;
+       atomic_t                     obd_req_replay_clients;
+       atomic_t                     obd_lock_replay_clients;
+       /* all lists are protected by obd_recovery_task_lock */
+       cfs_list_t                       obd_req_replay_queue;
+       cfs_list_t                       obd_lock_replay_queue;
+       cfs_list_t                       obd_final_req_queue;
 
        union {
 #ifdef HAVE_SERVER_SUPPORT
@@ -822,13 +828,12 @@ struct obd_device {
 
        struct proc_dir_entry   *obd_proc_entry;
        struct proc_dir_entry   *obd_proc_exports_entry;
-       void                    *obd_proc_private;      /* type private PDEs */
        struct proc_dir_entry   *obd_svc_procroot;
        struct lprocfs_stats    *obd_svc_stats;
        struct lprocfs_seq_vars *obd_vars;
-       cfs_atomic_t           obd_evict_inprogress;
-       wait_queue_head_t      obd_evict_inprogress_waitq;
-       cfs_list_t             obd_evict_list; /* protected with pet_lock */
+       atomic_t                obd_evict_inprogress;
+       wait_queue_head_t       obd_evict_inprogress_waitq;
+       cfs_list_t              obd_evict_list; /* protected with pet_lock */
 
         /**
          * Ldlm pool part. Save last calculated SLV and Limit.
@@ -879,7 +884,10 @@ enum obd_cleanup_stage {
 #define KEY_LOCK_TO_STRIPE      "lock_to_stripe"
 #define KEY_LOVDESC             "lovdesc"
 #define KEY_LOV_IDX             "lov_idx"
-#define KEY_MAX_EASIZE          "max_easize"
+#define KEY_MAX_EASIZE         "max_easize"
+#define KEY_DEFAULT_EASIZE     "default_easize"
+#define KEY_MAX_COOKIESIZE     "max_cookiesize"
+#define KEY_DEFAULT_COOKIESIZE "default_cookiesize"
 #define KEY_MDS_CONN            "mds_conn"
 #define KEY_MGSSEC              "mgssec"
 #define KEY_NEXT_ID             "next_id"
@@ -952,6 +960,7 @@ struct md_op_data {
         __u32                   op_fsgid;
         cfs_cap_t               op_cap;
         void                   *op_data;
+       size_t                  op_data_size;
 
         /* iattr fields and blocks. */
         struct iattr            op_attr;
@@ -972,12 +981,13 @@ struct md_op_data {
        /* Various operation flags. */
        enum mds_op_bias        op_bias;
 
-       /* Operation type */
-       __u32                   op_opc;
-
        /* Used by readdir */
        __u64                   op_hash_offset;
 
+       /* The offset of dir entry among the same hash entries, which
+        * is used to resolve the hash conflict. */
+       __u32                   op_same_hash_offset;
+
        /* Used by readdir */
        __u32                   op_npages;
 
@@ -1058,9 +1068,9 @@ struct obd_ops {
                          struct obd_export *exp, enum lu_cli_type type);
        int (*o_fid_fini)(struct obd_device *obd);
 
-        /* Allocate new fid according to passed @hint. */
-        int (*o_fid_alloc)(struct obd_export *exp, struct lu_fid *fid,
-                           struct md_op_data *op_data);
+       /* Allocate new fid according to passed @hint. */
+       int (*o_fid_alloc)(const struct lu_env *env, struct obd_export *exp,
+                          struct lu_fid *fid, struct md_op_data *op_data);
 
         /*
          * Object with @fid is getting deleted, we may want to do something
@@ -1074,10 +1084,6 @@ struct obd_ops {
                         struct lov_stripe_md *mem_src);
         int (*o_unpackmd)(struct obd_export *exp,struct lov_stripe_md **mem_tgt,
                           struct lov_mds_md *disk_src, int disk_len);
-        int (*o_preallocate)(struct lustre_handle *, obd_count *req,
-                             obd_id *ids);
-        /* FIXME: add fid capability support for create & destroy! */
-        int (*o_precreate)(struct obd_export *exp);
         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);
@@ -1097,28 +1103,6 @@ struct obd_ops {
                          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,
-                     obd_count oa_bufs, struct brw_page *pgarr,
-                     struct obd_trans_info *oti);
-        int (*o_merge_lvb)(struct obd_export *exp, struct lov_stripe_md *lsm,
-                           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)(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)(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,
-                         obd_size end, struct obd_trans_info *oti);
-        int (*o_copy)(struct lustre_handle *dstconn, struct lov_stripe_md *dst,
-                      struct lustre_handle *srconn, struct lov_stripe_md *src,
-                      obd_size start, obd_size end, struct obd_trans_info *);
-        int (*o_iterate)(struct lustre_handle *conn,
-                         int (*)(obd_id, obd_seq, void *),
-                         obd_id *startid, obd_seq seq, void *data);
         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,
@@ -1130,21 +1114,12 @@ struct obd_ops {
                           struct niobuf_remote *remote, int pages,
                           struct niobuf_local *local,
                           struct obd_trans_info *oti, int rc);
-        int (*o_enqueue)(struct obd_export *, struct obd_info *oinfo,
-                         struct ldlm_enqueue_info *einfo,
-                         struct ptlrpc_request_set *rqset);
         int (*o_change_cbdata)(struct obd_export *, struct lov_stripe_md *,
                                ldlm_iterator_t it, void *data);
         int (*o_find_cbdata)(struct obd_export *, struct lov_stripe_md *,
                              ldlm_iterator_t it, void *data);
-        int (*o_cancel)(struct obd_export *, struct lov_stripe_md *md,
-                        __u32 mode, struct lustre_handle *);
-        int (*o_cancel_unused)(struct obd_export *, struct lov_stripe_md *,
-                               ldlm_cancel_flags_t flags, void *opaque);
         int (*o_init_export)(struct obd_export *exp);
         int (*o_destroy_export)(struct obd_export *exp);
-        int (*o_extent_calc)(struct obd_export *, struct lov_stripe_md *,
-                             int cmd, obd_off *);
 
         /* llog related obd_methods */
         int (*o_llog_init)(struct obd_device *obd, struct obd_llog_group *grp,
@@ -1189,23 +1164,7 @@ struct obd_ops {
          * Also, add a wrapper function in include/linux/obd_class.h. */
 };
 
-enum {
-        LUSTRE_OPC_MKDIR    = (1 << 0),
-        LUSTRE_OPC_SYMLINK  = (1 << 1),
-        LUSTRE_OPC_MKNOD    = (1 << 2),
-        LUSTRE_OPC_CREATE   = (1 << 3),
-        LUSTRE_OPC_ANY      = (1 << 4)
-};
-
 /* lmv structures */
-#define MEA_MAGIC_LAST_CHAR      0xb2221ca1
-#define MEA_MAGIC_ALL_CHARS      0xb222a11c
-#define MEA_MAGIC_HASH_SEGMENT   0xb222a11b
-
-#define MAX_HASH_SIZE_32         0x7fffffffUL
-#define MAX_HASH_SIZE            0x7fffffffffffffffULL
-#define MAX_HASH_HIGHEST_BIT     0x1000000000000000ULL
-
 struct lustre_md {
        struct mdt_body         *body;
        struct lov_stripe_md    *lsm;
@@ -1223,11 +1182,12 @@ struct md_open_data {
        struct obd_client_handle        *mod_och;
        struct ptlrpc_request           *mod_open_req;
        struct ptlrpc_request           *mod_close_req;
-       cfs_atomic_t                     mod_refcount;
+       atomic_t                         mod_refcount;
        bool                             mod_is_create;
 };
 
 struct lookup_intent;
+struct cl_attr;
 
 struct md_ops {
        /* Every operation from MD_STATS_FIRST_OP up to and including
@@ -1250,15 +1210,15 @@ struct md_ops {
                        __u64, struct ptlrpc_request **);
 
        int (*m_enqueue)(struct obd_export *, struct ldlm_enqueue_info *,
+                        const union ldlm_policy_data *,
                         struct lookup_intent *, struct md_op_data *,
-                        struct lustre_handle *, void *, int,
-                        struct ptlrpc_request **, __u64);
+                        struct lustre_handle *, __u64);
 
        int (*m_getattr)(struct obd_export *, struct md_op_data *,
                         struct ptlrpc_request **);
 
        int (*m_intent_lock)(struct obd_export *, struct md_op_data *,
-                            void *, int, struct lookup_intent *, int,
+                            struct lookup_intent *,
                             struct ptlrpc_request **,
                             ldlm_blocking_callback, __u64);
 
@@ -1280,7 +1240,8 @@ struct md_ops {
                          struct page **, struct ptlrpc_request **);
 
        int (*m_read_entry)(struct obd_export *, struct md_op_data *,
-                           struct md_callback *cb_op, struct lu_dirent **ld);
+                           struct md_callback *cb_op, struct lu_dirent **ld,
+                           struct page **ppage);
 
        int (*m_unlink)(struct obd_export *, struct md_op_data *,
                        struct ptlrpc_request **);
@@ -1321,7 +1282,7 @@ struct md_ops {
                           const struct lu_fid *,
                           struct ptlrpc_request **);
 
-       int (*m_init_ea_size)(struct obd_export *, int, int, int);
+       int (*m_init_ea_size)(struct obd_export *, int, int, int, int);
 
        int (*m_get_lustre_md)(struct obd_export *, struct ptlrpc_request *,
                               struct obd_export *, struct obd_export *,
@@ -1329,6 +1290,13 @@ struct md_ops {
 
        int (*m_free_lustre_md)(struct obd_export *, struct lustre_md *);
 
+       int (*m_merge_attr)(struct obd_export *,
+                           const struct lmv_stripe_md *lsm,
+                           struct cl_attr *attr);
+
+       int (*m_update_lsm_md)(struct obd_export *, struct lmv_stripe_md *lsm,
+                              struct mdt_body *, ldlm_blocking_callback);
+
        int (*m_set_open_replay_data)(struct obd_export *,
                                      struct obd_client_handle *,
                                      struct lookup_intent *);
@@ -1398,18 +1366,18 @@ static inline struct lustre_capa *oinfo_capa(struct obd_info *oinfo)
 
 static inline struct md_open_data *obd_mod_alloc(void)
 {
-        struct md_open_data *mod;
-        OBD_ALLOC_PTR(mod);
-        if (mod == NULL)
-                return NULL;
-        cfs_atomic_set(&mod->mod_refcount, 1);
-        return mod;
+       struct md_open_data *mod;
+       OBD_ALLOC_PTR(mod);
+       if (mod == NULL)
+               return NULL;
+       atomic_set(&mod->mod_refcount, 1);
+       return mod;
 }
 
-#define obd_mod_get(mod) cfs_atomic_inc(&(mod)->mod_refcount)
+#define obd_mod_get(mod) atomic_inc(&(mod)->mod_refcount)
 #define obd_mod_put(mod)                                          \
 ({                                                                \
-       if (cfs_atomic_dec_and_test(&(mod)->mod_refcount)) {      \
+       if (atomic_dec_and_test(&(mod)->mod_refcount)) {          \
                if ((mod)->mod_open_req)                          \
                        ptlrpc_req_finished((mod)->mod_open_req); \
                OBD_FREE_PTR(mod);                                \
@@ -1422,8 +1390,8 @@ 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)
 {
-        return cfs_atomic_read(&cli->cl_resends) ?
-               cfs_atomic_read(&cli->cl_resends) > resend : 1;
+       return atomic_read(&cli->cl_resends) ?
+              atomic_read(&cli->cl_resends) > resend : 1;
 }
 
 /**
@@ -1486,4 +1454,16 @@ static inline int cli_brw_size(struct obd_device *obd)
        return obd->u.cli.cl_max_pages_per_rpc << PAGE_CACHE_SHIFT;
 }
 
+static inline void client_adjust_max_dirty(struct client_obd *cli)
+{
+        /* initializing */
+       if (cli->cl_dirty_max <= 0)
+               cli->cl_dirty_max = OSC_MAX_DIRTY_DEFAULT * 1024 * 1024;
+       else
+               cli->cl_dirty_max = cli->cl_max_rpcs_in_flight *
+                       (cli->cl_max_pages_per_rpc << PAGE_CACHE_SHIFT);
+       if (cli->cl_dirty_max >> PAGE_CACHE_SHIFT > totalram_pages / 8)
+               cli->cl_dirty_max = totalram_pages << (PAGE_CACHE_SHIFT - 3);
+}
+
 #endif /* __OBD_H */