Whamcloud - gitweb
LU-7638 recovery: do not abort update recovery.
[fs/lustre-release.git] / lustre / include / obd.h
index f515f7a..087df0a 100644 (file)
@@ -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, 2014, Intel Corporation.
+ * Copyright (c) 2011, 2015, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -52,7 +52,6 @@
 #include <lustre_fld.h>
 #include <lustre_handles.h>
 #include <lustre_intent.h>
-#include <lustre_capa.h>
 #include <lvfs.h>
 
 #define MAX_OBD_DEVICES 8192
@@ -245,28 +244,56 @@ struct client_obd {
        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;
-       struct list_head         cl_lru_osc; /* member of cl_cache->ccc_lru */
-       atomic_long_t           *cl_lru_left;
-       atomic_long_t            cl_lru_busy;
-       atomic_long_t            cl_lru_in_list;
-       atomic_long_t            cl_unstable_count;
-       struct list_head         cl_lru_list; /* lru page list */
-       spinlock_t               cl_lru_list_lock; /* page list protector */
-       atomic_t                 cl_lru_shrinkers;
+       /** LRU for osc caching pages */
+       struct cl_client_cache  *cl_cache;
+       /** member of cl_cache->ccc_lru */
+       struct list_head         cl_lru_osc;
+       /** # of available LRU slots left in the per-OSC cache.
+        * Available LRU slots are shared by all OSCs of the same file system,
+        * therefore this is a pointer to cl_client_cache::ccc_lru_left. */
+       atomic_long_t           *cl_lru_left;
+       /** # of busy LRU pages. A page is considered busy if it's in writeback
+        * queue, or in transfer. Busy pages can't be discarded so they are not
+        * in LRU cache. */
+       atomic_long_t            cl_lru_busy;
+       /** # of LRU pages in the cache for this client_obd */
+       atomic_long_t            cl_lru_in_list;
+       /** # of threads are shrinking LRU cache. To avoid contention, it's not
+        * allowed to have multiple threads shrinking LRU cache. */
+       atomic_t                 cl_lru_shrinkers;
+       /** The time when this LRU cache was last used. */
+       time_t                   cl_lru_last_used;
+       /** stats: how many reclaims have happened for this client_obd.
+        * reclaim and shrink - shrink is async, voluntarily rebalancing;
+        * reclaim is sync, initiated by IO thread when the LRU slots are
+        * in shortage. */
+       __u64                    cl_lru_reclaim;
+       /** List of LRU pages for this client_obd */
+       struct list_head         cl_lru_list;
+       /** Lock for LRU page list */
+       spinlock_t               cl_lru_list_lock;
+       /** # of unstable pages in this client_obd.
+        * An unstable page is a page state that WRITE RPC has finished but
+        * the transaction has NOT yet committed. */
+       atomic_long_t            cl_unstable_count;
+       /** Link to osc_shrinker_list */
+       struct list_head         cl_shrink_list;
 
        /* 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;
 
        /* modify rpcs in flight
         * currently used for metadata only */
        spinlock_t               cl_mod_rpcs_lock;
        __u16                    cl_max_mod_rpcs_in_flight;
+       __u16                    cl_mod_rpcs_in_flight;
+       __u16                    cl_close_rpcs_in_flight;
+       wait_queue_head_t        cl_mod_rpcs_waitq;
+       unsigned long           *cl_mod_tag_bitmap;
+       struct obd_histogram     cl_mod_rpcs_hist;
 
         /* mgc datastruct */
        struct mutex              cl_mgc_mutex;
@@ -402,9 +429,9 @@ struct niobuf_local {
        __u32           lnb_page_offset;
        __u32           lnb_len;
        __u32           lnb_flags;
+       int             lnb_rc;
        struct page     *lnb_page;
        void            *lnb_data;
-       int             lnb_rc;
 };
 
 #define LUSTRE_FLD_NAME         "fld"
@@ -442,6 +469,58 @@ struct niobuf_local {
 #define LUSTRE_MGS_OBDNAME "MGS"
 #define LUSTRE_MGC_OBDNAME "MGC"
 
+static inline int is_lwp_on_mdt(char *name)
+{
+       char   *ptr;
+
+       ptr = strrchr(name, '-');
+       if (ptr == NULL) {
+               CERROR("%s is not a obdname\n", name);
+               return 0;
+       }
+
+       /* LWP name on MDT is fsname-MDTxxxx-lwp-MDTxxxx */
+
+       if (strncmp(ptr + 1, "MDT", 3) != 0)
+               return 0;
+
+       while (*(--ptr) != '-' && ptr != name);
+
+       if (ptr == name)
+               return 0;
+
+       if (strncmp(ptr + 1, LUSTRE_LWP_NAME, strlen(LUSTRE_LWP_NAME)) != 0)
+               return 0;
+
+       return 1;
+}
+
+static inline int is_lwp_on_ost(char *name)
+{
+       char   *ptr;
+
+       ptr = strrchr(name, '-');
+       if (ptr == NULL) {
+               CERROR("%s is not a obdname\n", name);
+               return 0;
+       }
+
+       /* LWP name on OST is fsname-MDTxxxx-lwp-OSTxxxx */
+
+       if (strncmp(ptr + 1, "OST", 3) != 0)
+               return 0;
+
+       while (*(--ptr) != '-' && ptr != name);
+
+       if (ptr == name)
+               return 0;
+
+       if (strncmp(ptr + 1, LUSTRE_LWP_NAME, strlen(LUSTRE_LWP_NAME)) != 0)
+               return 0;
+
+       return 1;
+}
+
 /*
  * Events signalled through obd_notify() upcall-chain.
  */
@@ -504,14 +583,14 @@ struct obd_llog_group {
 #define OBD_DEVICE_MAGIC        0XAB5CD6EF
 
 struct obd_device {
-       struct obd_type         *obd_type;
-       __u32                    obd_magic;
+       struct obd_type                 *obd_type;
+       __u32                            obd_magic; /* OBD_DEVICE_MAGIC */
+       int                              obd_minor; /* device number: lctl dl */
+       struct lu_device                *obd_lu_dev;
 
-        /* common and UUID name of this device */
-       char                     obd_name[MAX_OBD_NAME];
-       struct obd_uuid          obd_uuid;
-       int                      obd_minor;
-       struct lu_device        *obd_lu_dev;
+       /* common and UUID name of this device */
+       struct obd_uuid                  obd_uuid;
+       char                             obd_name[MAX_OBD_NAME];
 
        /* bitfield modification is protected by obd_dev_lock */
        unsigned long
@@ -520,8 +599,7 @@ struct obd_device {
                obd_recovering:1,       /* there are recoverable clients */
                obd_abort_recovery:1,   /* recovery expired */
                obd_version_recov:1,    /* obd uses version checking */
-               obd_replayable:1,       /* recovery is enabled;
-                                        * inform clients */
+               obd_replayable:1,       /* recovery enabled; inform clients */
                obd_no_transno:1,       /* no committed-transno notification */
                obd_no_recov:1,         /* fail instead of retry messages */
                obd_stopping:1,         /* started cleanup */
@@ -533,8 +611,7 @@ struct obd_device {
                                         * (for /proc/status only!!) */
                obd_no_ir:1,            /* no imperative recovery. */
                obd_process_conf:1,     /* device is processing mgs config */
-               obd_uses_nid_stats:1,   /* maintain per-client OBD stats */
-               obd_force_abort_recovery:1; /* abort recovery forcely */
+               obd_uses_nid_stats:1;   /* maintain per-client OBD stats */
 
         /* use separate field as it is set in interrupt to don't mess with
          * protection of other bits using _bh lock */
@@ -545,23 +622,25 @@ struct obd_device {
        struct cfs_hash             *obd_nid_hash;
        /* nid stats body */
        struct cfs_hash             *obd_nid_stats_hash;
+       /* client_generation-export hash body */
+       struct cfs_hash             *obd_gen_hash;
        struct list_head        obd_nid_stats;
-       atomic_t                obd_refcount;
        struct list_head        obd_exports;
        struct list_head        obd_unlinked_exports;
        struct list_head        obd_delayed_exports;
        struct list_head        obd_lwp_list;
+       atomic_t                obd_refcount;
        int                     obd_num_exports;
        spinlock_t              obd_nid_lock;
        struct ldlm_namespace  *obd_namespace;
        struct ptlrpc_client    obd_ldlm_client; /* XXX OST/MDS only */
        /* a spinlock is OK for what we do now, may need a semaphore later */
        spinlock_t              obd_dev_lock; /* protect OBD bitfield above */
-       struct mutex            obd_dev_mutex;
-       __u64                   obd_last_committed;
        spinlock_t              obd_osfs_lock;
        struct obd_statfs       obd_osfs;       /* locked by obd_osfs_lock */
        __u64                   obd_osfs_age;
+       __u64                   obd_last_committed;
+       struct mutex            obd_dev_mutex;
        struct lvfs_run_ctxt    obd_lvfs_ctxt;
        struct obd_llog_group   obd_olg;        /* default llog group */
        struct obd_device       *obd_observer;
@@ -594,10 +673,11 @@ struct obd_device {
        int                     obd_recovery_ir_factor;
 
        /* 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;
+       struct target_recovery_data     obd_recovery_data;
+
        /* all lists are protected by obd_recovery_task_lock */
        struct list_head                obd_req_replay_queue;
        struct list_head                obd_lock_replay_queue;
@@ -615,12 +695,13 @@ struct obd_device {
                struct lov_obd lov;
                struct lmv_obd lmv;
        } u;
+
        /* Fields used by LProcFS */
-       unsigned int           obd_cntr_base;
-       struct lprocfs_stats  *obd_stats;
+       struct lprocfs_stats            *obd_stats;
+       unsigned int                    obd_cntr_base;
 
-       unsigned int           obd_md_cntr_base;
-       struct lprocfs_stats  *obd_md_stats;
+       unsigned int                     obd_md_cntr_base;
+       struct lprocfs_stats            *obd_md_stats;
 
        struct proc_dir_entry   *obd_proc_entry;
        struct proc_dir_entry   *obd_proc_exports_entry;
@@ -631,32 +712,22 @@ struct obd_device {
        wait_queue_head_t       obd_evict_inprogress_waitq;
        struct list_head        obd_evict_list; /* protected with pet_lock */
 
-        /**
-         * Ldlm pool part. Save last calculated SLV and Limit.
-         */
-       rwlock_t                obd_pool_lock;
-       int                     obd_pool_limit;
-       __u64                   obd_pool_slv;
-
-        /**
-         * A list of outstanding class_incref()'s against this obd. For
-         * debugging.
-         */
-        struct lu_ref          obd_reference;
+       /**
+        * LDLM pool part. Save last calculated SLV and Limit.
+        */
+       rwlock_t                        obd_pool_lock;
+       __u64                           obd_pool_slv;
+       int                             obd_pool_limit;
 
-       int                    obd_conn_inprogress;
-};
+       int                             obd_conn_inprogress;
 
-enum obd_cleanup_stage {
-/* Special case hack for MDS LOVs */
-        OBD_CLEANUP_EARLY,
-/* can be directly mapped to .ldto_device_fini() */
-        OBD_CLEANUP_EXPORTS,
+       /**
+        * List of outstanding class_incref()'s fo this OBD. For debugging. */
+       struct lu_ref                   obd_reference;
 };
 
 /* get/set_info keys */
 #define KEY_ASYNC               "async"
-#define KEY_CAPA_KEY            "capa_key"
 #define KEY_CHANGELOG_CLEAR     "changelog_clear"
 #define KEY_FID2PATH            "fid2path"
 #define KEY_CHECKSUM            "checksum"
@@ -687,22 +758,6 @@ enum obd_cleanup_stage {
 
 struct lu_context;
 
-/* /!\ must be coherent with include/linux/namei.h on patched kernel */
-#define IT_OPEN     (1 << 0)
-#define IT_CREAT    (1 << 1)
-#define IT_READDIR  (1 << 2)
-#define IT_GETATTR  (1 << 3)
-#define IT_LOOKUP   (1 << 4)
-#define IT_UNLINK   (1 << 5)
-#define IT_TRUNC    (1 << 6)
-#define IT_GETXATTR (1 << 7)
-#define IT_EXEC     (1 << 8)
-#define IT_PIN      (1 << 9)
-#define IT_LAYOUT   (1 << 10)
-#define IT_QUOTA_DQACQ (1 << 11)
-#define IT_QUOTA_CONN  (1 << 12)
-#define IT_SETXATTR (1 << 13)
-
 static inline int it_to_lock_mode(struct lookup_intent *it)
 {
        /* CREAT needs to be tested before open (both could be set) */
@@ -766,10 +821,6 @@ struct md_op_data {
 
        enum md_op_flags        op_flags;
 
-       /* Capa fields */
-       struct obd_capa        *op_capa1;
-       struct obd_capa        *op_capa2;
-
        /* Various operation flags. */
        enum mds_op_bias        op_bias;
 
@@ -801,12 +852,13 @@ typedef int (* md_enqueue_cb_t)(struct ptlrpc_request *req,
                                 int rc);
 
 struct md_enqueue_info {
-       struct md_op_data       mi_data;
-       struct lookup_intent    mi_it;
-       struct lustre_handle    mi_lockh;
-       struct inode           *mi_dir;
-       md_enqueue_cb_t         mi_cb;
-       void                   *mi_cbdata;
+       struct md_op_data               mi_data;
+       struct lookup_intent            mi_it;
+       struct lustre_handle            mi_lockh;
+       struct inode                   *mi_dir;
+       struct ldlm_enqueue_info        mi_einfo;
+       md_enqueue_cb_t                 mi_cb;
+       void                           *mi_cbdata;
 };
 
 struct obd_ops {
@@ -819,29 +871,28 @@ struct obd_ops {
                                __u32 keylen, void *key,
                                __u32 vallen, void *val,
                                struct ptlrpc_request_set *set);
-        int (*o_setup) (struct obd_device *dev, struct lustre_cfg *cfg);
-        int (*o_precleanup)(struct obd_device *dev,
-                            enum obd_cleanup_stage cleanup_stage);
-        int (*o_cleanup)(struct obd_device *dev);
+       int (*o_setup) (struct obd_device *dev, struct lustre_cfg *cfg);
+       int (*o_precleanup)(struct obd_device *dev);
+       int (*o_cleanup)(struct obd_device *dev);
        int (*o_process_config)(struct obd_device *dev, size_t len, void *data);
-        int (*o_postrecov)(struct obd_device *dev);
-        int (*o_add_conn)(struct obd_import *imp, struct obd_uuid *uuid,
-                          int priority);
-        int (*o_del_conn)(struct obd_import *imp, struct obd_uuid *uuid);
-        /* connect to the target device with given connection
-         * data. @ocd->ocd_connect_flags is modified to reflect flags actually
-         * granted by the target, which are guaranteed to be a subset of flags
-         * asked for. If @ocd == NULL, use default parameters. */
-        int (*o_connect)(const struct lu_env *env,
-                         struct obd_export **exp, struct obd_device *src,
-                         struct obd_uuid *cluuid, struct obd_connect_data *ocd,
-                         void *localdata);
-        int (*o_reconnect)(const struct lu_env *env,
-                           struct obd_export *exp, struct obd_device *src,
-                           struct obd_uuid *cluuid,
-                           struct obd_connect_data *ocd,
-                           void *localdata);
-        int (*o_disconnect)(struct obd_export *exp);
+       int (*o_postrecov)(struct obd_device *dev);
+       int (*o_add_conn)(struct obd_import *imp, struct obd_uuid *uuid,
+                         int priority);
+       int (*o_del_conn)(struct obd_import *imp, struct obd_uuid *uuid);
+       /* connect to the target device with given connection
+        * data. @ocd->ocd_connect_flags is modified to reflect flags actually
+        * granted by the target, which are guaranteed to be a subset of flags
+        * asked for. If @ocd == NULL, use default parameters. */
+       int (*o_connect)(const struct lu_env *env,
+                        struct obd_export **exp, struct obd_device *src,
+                        struct obd_uuid *cluuid, struct obd_connect_data *ocd,
+                        void *localdata);
+       int (*o_reconnect)(const struct lu_env *env,
+                          struct obd_export *exp, struct obd_device *src,
+                          struct obd_uuid *cluuid,
+                          struct obd_connect_data *ocd,
+                          void *localdata);
+       int (*o_disconnect)(struct obd_export *exp);
 
        /* Initialize/finalize fids infrastructure. */
        int (*o_fid_init)(struct obd_device *obd,
@@ -852,16 +903,14 @@ struct obd_ops {
        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
-         * about this.
-         */
-        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_unpackmd)(struct obd_export *exp,struct lov_stripe_md **mem_tgt,
-                          struct lov_mds_md *disk_src, int disk_len);
+       /*
+        * Object with @fid is getting deleted, we may want to do something
+        * about this.
+        */
+       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_create)(const struct lu_env *env, struct obd_export *exp,
                        struct obdo *oa);
        int (*o_destroy)(const struct lu_env *env, struct obd_export *exp,
@@ -879,50 +928,48 @@ struct obd_ops {
                          int objcount, struct obd_ioobj *obj,
                          struct niobuf_remote *remote, int pages,
                          struct niobuf_local *local, int rc);
-        int (*o_init_export)(struct obd_export *exp);
-        int (*o_destroy_export)(struct obd_export *exp);
-
-        int (*o_import_event)(struct obd_device *, struct obd_import *,
-                              enum obd_import_event);
-
-        int (*o_notify)(struct obd_device *obd, struct obd_device *watched,
-                        enum obd_notify_event ev, void *data);
-
-        int (*o_health_check)(const struct lu_env *env, struct obd_device *);
-        struct obd_uuid *(*o_get_uuid) (struct obd_export *exp);
-
-        /* quota methods */
-        int (*o_quotactl)(struct obd_device *, struct obd_export *,
-                          struct obd_quotactl *);
-
-        int (*o_ping)(const struct lu_env *, struct obd_export *exp);
-
-        /* pools methods */
-        int (*o_pool_new)(struct obd_device *obd, char *poolname);
-        int (*o_pool_del)(struct obd_device *obd, char *poolname);
-        int (*o_pool_add)(struct obd_device *obd, char *poolname,
-                          char *ostname);
-        int (*o_pool_rem)(struct obd_device *obd, char *poolname,
-                          char *ostname);
-        void (*o_getref)(struct obd_device *obd);
-        void (*o_putref)(struct obd_device *obd);
-        /*
-         * NOTE: If adding ops, add another LPROCFS_OBD_OP_INIT() line
-         * to lprocfs_alloc_obd_stats() in obdclass/lprocfs_status.c.
-         * Also, add a wrapper function in include/linux/obd_class.h. */
+       int (*o_init_export)(struct obd_export *exp);
+       int (*o_destroy_export)(struct obd_export *exp);
+
+       int (*o_import_event)(struct obd_device *, struct obd_import *,
+                             enum obd_import_event);
+
+       int (*o_notify)(struct obd_device *obd, struct obd_device *watched,
+                       enum obd_notify_event ev, void *data);
+
+       int (*o_health_check)(const struct lu_env *env, struct obd_device *);
+       struct obd_uuid *(*o_get_uuid) (struct obd_export *exp);
+
+       /* quota methods */
+       int (*o_quotactl)(struct obd_device *, struct obd_export *,
+                         struct obd_quotactl *);
+
+       int (*o_ping)(const struct lu_env *, struct obd_export *exp);
+
+       /* pools methods */
+       int (*o_pool_new)(struct obd_device *obd, char *poolname);
+       int (*o_pool_del)(struct obd_device *obd, char *poolname);
+       int (*o_pool_add)(struct obd_device *obd, char *poolname,
+                         char *ostname);
+       int (*o_pool_rem)(struct obd_device *obd, char *poolname,
+                         char *ostname);
+       void (*o_getref)(struct obd_device *obd);
+       void (*o_putref)(struct obd_device *obd);
+       /*
+        * NOTE: If adding ops, add another LPROCFS_OBD_OP_INIT() line
+        * to lprocfs_alloc_obd_stats() in obdclass/lprocfs_status.c.
+        * Also, add a wrapper function in include/linux/obd_class.h. */
 };
 
 /* lmv structures */
 struct lustre_md {
        struct mdt_body         *body;
-       struct lov_stripe_md    *lsm;
+       struct lu_buf            layout;
        struct lmv_stripe_md    *lmv;
 #ifdef CONFIG_FS_POSIX_ACL
        struct posix_acl        *posix_acl;
 #endif
        struct mdt_remote_perm  *remote_perm;
-       struct obd_capa         *mds_capa;
-       struct obd_capa         *oss_capa;
 };
 
 struct md_open_data {
@@ -991,7 +1038,7 @@ struct md_ops {
                         size_t , struct ptlrpc_request **);
 
        int (*m_fsync)(struct obd_export *, const struct lu_fid *,
-                      struct obd_capa *, struct ptlrpc_request **);
+                      struct ptlrpc_request **);
 
        int (*m_read_page)(struct obd_export *, struct md_op_data *,
                           struct md_callback *cb_op, __u64 hash_offset,
@@ -1001,27 +1048,22 @@ struct md_ops {
                        struct ptlrpc_request **);
 
        int (*m_setxattr)(struct obd_export *, const struct lu_fid *,
-                         struct obd_capa *, u64, const char *,
-                         const char *, int, int, int, __u32,
+                         u64, const char *, const char *, int, int, int, u32,
                          struct ptlrpc_request **);
 
        int (*m_getxattr)(struct obd_export *, const struct lu_fid *,
-                         struct obd_capa *, u64, const char *,
-                         const char *, int, int, int,
+                         u64, const char *, const char *, int, int, int,
                          struct ptlrpc_request **);
 
-        int (*m_intent_getattr_async)(struct obd_export *,
-                                      struct md_enqueue_info *,
-                                      struct ldlm_enqueue_info *);
+       int (*m_intent_getattr_async)(struct obd_export *,
+                                     struct md_enqueue_info *);
 
         int (*m_revalidate_lock)(struct obd_export *, struct lookup_intent *,
                                  struct lu_fid *, __u64 *bits);
 
 #define MD_STATS_LAST_OP m_revalidate_lock
 
-       int (*m_getstatus)(struct obd_export *, struct lu_fid *,
-                          struct obd_capa **);
-
+       int (*m_getstatus)(struct obd_export *, struct lu_fid *);
        int (*m_null_inode)(struct obd_export *, const struct lu_fid *);
 
        int (*m_find_cbdata)(struct obd_export *, const struct lu_fid *,
@@ -1051,29 +1093,24 @@ struct md_ops {
 
        int (*m_set_lock_data)(struct obd_export *, __u64 *, void *, __u64 *);
 
-       ldlm_mode_t (*m_lock_match)(struct obd_export *, __u64,
-                                   const struct lu_fid *, ldlm_type_t,
-                                   ldlm_policy_data_t *, ldlm_mode_t,
-                                   struct lustre_handle *);
+       enum ldlm_mode (*m_lock_match)(struct obd_export *, __u64,
+                                      const struct lu_fid *, enum ldlm_type,
+                                      union ldlm_policy_data *, enum ldlm_mode,
+                                      struct lustre_handle *);
 
        int (*m_cancel_unused)(struct obd_export *, const struct lu_fid *,
-                              ldlm_policy_data_t *, ldlm_mode_t,
-                              ldlm_cancel_flags_t flags, void *opaque);
-
-       int (*m_renew_capa)(struct obd_export *, struct obd_capa *oc,
-                           renew_capa_cb_t cb);
-
-       int (*m_unpack_capa)(struct obd_export *, struct ptlrpc_request *,
-                            const struct req_msg_field *, struct obd_capa **);
+                              union ldlm_policy_data *, enum ldlm_mode,
+                              enum ldlm_cancel_flags flags, void *opaque);
 
        int (*m_get_remote_perm)(struct obd_export *, const struct lu_fid *,
-                                struct obd_capa *, __u32,
-                                struct ptlrpc_request **);
+                                u32, struct ptlrpc_request **);
 
        int (*m_get_fid_from_lsm)(struct obd_export *,
                                  const struct lmv_stripe_md *,
                                  const char *name, int namelen,
                                  struct lu_fid *fid);
+       int (*m_unpackmd)(struct obd_export *exp, struct lmv_stripe_md **plsm,
+                         const union lmv_mds_md *lmv, size_t lmv_size);
 };
 
 static inline struct md_open_data *obd_mod_alloc(void)