Whamcloud - gitweb
Implement get_info(last_id) in obdfilter.
[fs/lustre-release.git] / lustre / include / obd.h
index 9446c16..fef125f 100644 (file)
 #include <lustre_quota.h>
 #include <lustre_fld.h>
 #include <lustre_capa.h>
+#include <class_hash.h>
+
+#include <libcfs/bitmap.h>
+
 
 #define MAX_OBD_DEVICES 8192
 
@@ -65,7 +69,7 @@ struct lov_oinfo {                 /* per-stripe data structure */
         struct list_head loi_write_item;
         struct list_head loi_read_item;
 
-        unsigned loi_kms_valid:1;
+        unsigned long loi_kms_valid:1;
         __u64 loi_kms;             /* known minimum size */
         struct ost_lvb loi_lvb;
         struct osc_async_rc     loi_ar;
@@ -132,31 +136,15 @@ struct obd_info;
 
 typedef int (*obd_enqueue_update_f)(struct obd_info *oinfo, int rc);
 
-/* obd_enqueue parameters common for all levels (lov, osc). */
-struct obd_enqueue_info {
-        /* Flags used while lock handling. */
-        int   ei_flags;
-        /* Type of the lock being enqueued. */
-        __u32 ei_type;
-        /* Mode of the lock being enqueued. */
-        __u32 ei_mode;
-        /* Different callbacks for lock handling (blocking, completion,
-           glimpse */
-        void *ei_cb_bl;
-        void *ei_cb_cp;
-        void *ei_cb_gl;
-        /* Data to be passed into callbacks. */
-        void *ei_cbdata;
-        /* Request set for OSC async requests. */
-        struct ptlrpc_request_set *ei_rqset;
-};
-
 /* obd info for a particular level (lov, osc). */
 struct obd_info {
         /* Lock policy. It keeps an extent which is specific for a particular
          * OSC. (e.g. lov_prep_enqueue_set initialises extent of the policy,
          * and osc_enqueue passes it into ldlm_lock_match & ldlm_cli_enqueue. */
         ldlm_policy_data_t      oi_policy;
+        /* Flags used while lock handling. The flags obtained on the enqueue
+         * request are set here, therefore they are request specific. */
+        int                     oi_flags;
         /* Lock handle specific for every OSC lock. */
         struct lustre_handle   *oi_lockh;
         /* lsm data specific for every OSC. */
@@ -250,7 +238,7 @@ struct oig_callback_context {
          * callees of this method are encouraged to abort their state
          * in the oig.  This may be called multiple times. */
         void (*occ_interrupted)(struct oig_callback_context *occ);
-        unsigned int interrupted:1;
+        unsigned long interrupted:1;
 };
 
 /* Individual type definitions */
@@ -382,6 +370,10 @@ struct filter_obd {
         int                      fo_fmd_max_num; /* per exp filter_mod_data */
         int                      fo_fmd_max_age; /* jiffies to fmd expiry */
 
+        /* sptlrpc stuff */
+        rwlock_t                 fo_sptlrpc_lock;
+        struct sptlrpc_rule_set  fo_sptlrpc_rset;
+
         /* capability related */
         unsigned int             fo_fl_oss_capa;
         struct list_head         fo_capa_keys;
@@ -392,6 +384,7 @@ struct filter_obd {
 #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 MDC_MAX_RIF_DEFAULT       8
 #define MDC_MAX_RIF_MAX         512
@@ -410,7 +403,8 @@ struct client_obd {
         int                      cl_max_mds_cookiesize;
 
         /* security configuration */
-        struct sec_flavor_config cl_sec_conf;
+        struct sptlrpc_rule_set  cl_sptlrpc_rset;
+        enum lustre_sec_part     cl_sec_part;
 
         //struct llog_canceld_ctxt *cl_llcd; /* it's included by obd_llog_ctxt */
         void                    *cl_llcd_offset;
@@ -458,6 +452,10 @@ struct client_obd {
         struct obd_histogram     cl_read_offset_hist;
         struct obd_histogram     cl_write_offset_hist;
 
+        /* number of in flight destroy rpcs is limited to max_rpcs_in_flight */
+        atomic_t                 cl_destroy_in_flight;
+        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;
@@ -471,7 +469,7 @@ struct client_obd {
         struct obd_export       *cl_mgc_mgsexp;
 
         /* Flags section */
-        unsigned int             cl_checksum:1; /* debug checksums */
+        unsigned long            cl_checksum:1; /* debug checksums */
 
         /* also protected by the poorly named _loi_list_lock lock above */
         struct osc_async_rc      cl_ar;
@@ -481,6 +479,8 @@ struct client_obd {
 
         /* sequence manager */
         struct lu_client_seq    *cl_seq;
+
+        atomic_t                 cl_resends; /* resend count */
 };
 #define obd2cli_tgt(obd) ((char *)(obd)->u.cli.cl_target_uuid.uuid)
 
@@ -497,15 +497,6 @@ struct mgs_obd {
         cfs_proc_dir_entry_t            *mgs_proc_live;
 };
 
-/* hah, upper limit 64 should be enough */
-#define N_NOSQUASH_NIDS 64
-struct rootsquash_info {
-        uid_t           rsi_uid;
-        gid_t           rsi_gid;
-        int             rsi_n_nosquash_nids;
-        lnet_nid_t      rsi_nosquash_nids[N_NOSQUASH_NIDS];
-};
-
 struct mds_obd {
         /* NB this field MUST be first */
         struct obd_device_target         mds_obt;
@@ -536,12 +527,17 @@ struct mds_obd {
         struct obd_export               *mds_osc_exp; /* XXX lov_exp */
         struct lov_desc                  mds_lov_desc;
         __u32                            mds_id;
-        obd_id                          *mds_lov_objids;
-        int                              mds_lov_objids_size;
-        __u32                            mds_lov_objids_in_file;
-        unsigned int                     mds_lov_objids_dirty:1;
-        int                              mds_lov_nextid_set;
+
+        /* mark pages dirty for write. */
+        bitmap_t                         *mds_lov_page_dirty;
+        /* array for store pages with obd_id */
+        void                            **mds_lov_page_array;
+        /* file for store objid */
         struct file                     *mds_lov_objid_filp;
+        __u32                            mds_lov_objid_count;
+        __u32                            mds_lov_objid_lastpage;
+        __u32                            mds_lov_objid_lastidx;
+
         struct file                     *mds_health_check_filp;
         unsigned long                   *mds_client_bitmap;
 //        struct upcall_cache             *mds_group_hash;
@@ -549,21 +545,37 @@ struct mds_obd {
         struct lustre_quota_info         mds_quota_info;
         struct semaphore                 mds_qonoff_sem;
         struct semaphore                 mds_health_sem;
-        unsigned long                    mds_lov_objids_valid:1,
-                                         mds_fl_user_xattr:1,
-                                         mds_fl_acl:1;
-
+        unsigned long                    mds_fl_user_xattr:1,
+                                         mds_fl_acl:1,
+                                         mds_evict_ost_nids:1,
+                                         mds_fl_cfglog:1,
+                                         mds_fl_synced:1;
 
         struct upcall_cache             *mds_identity_cache;
-        struct upcall_cache             *mds_rmtacl_cache;
-
-        /* root squash */
-        struct rootsquash_info          *mds_rootsquash_info;
 
         /* for capability keys update */
         struct lustre_capa_key          *mds_capa_keys;
 };
 
+/* lov objid */
+extern __u32 mds_max_ost_index;
+
+#define MDS_LOV_ALLOC_SIZE (CFS_PAGE_SIZE)
+
+#define OBJID_PER_PAGE() (MDS_LOV_ALLOC_SIZE / sizeof(obd_id))
+
+#define MDS_LOV_OBJID_PAGES_COUNT (mds_max_ost_index/OBJID_PER_PAGE())
+
+extern int mds_lov_init_objids(struct obd_device *obd);
+extern void mds_lov_destroy_objids(struct obd_device *obd);
+
+struct obd_id_info {
+        __u32   idx;
+        obd_id  *data;
+};
+
+/* */
+
 struct echo_obd {
         struct obdo          eo_oa;
         spinlock_t           eo_lock;
@@ -611,7 +623,7 @@ struct lov_qos {
         __u32              *lq_rr_array;    /* round-robin optimized list */
         unsigned int        lq_rr_size;     /* rr array size */
         unsigned int        lq_prio_free;   /* priority for free space */
-        unsigned int        lq_dirty:1,     /* recalc qos data */
+        unsigned long       lq_dirty:1,     /* recalc qos data */
                             lq_dirty_rr:1,  /* recalc round-robin list */
                             lq_same_space:1,/* the ost's all have approx.
                                                the same space avail */
@@ -624,7 +636,7 @@ struct lov_tgt_desc {
         struct ltd_qos      ltd_qos;     /* qos info per target */
         __u32               ltd_gen;
         __u32               ltd_index;   /* index in lov_obd->tgts */
-        unsigned int        ltd_active:1,/* is this target up for requests */
+        unsigned long       ltd_active:1,/* is this target up for requests */
                             ltd_activate:1,/* should this target be activated */
                             ltd_reap:1;  /* should this target be deleted */
 };
@@ -725,7 +737,6 @@ struct niobuf_local {
 struct obd_trans_info {
         __u64                    oti_transno;
         __u64                    oti_xid;
-        __u64                   *oti_objid;
         /* Only used on the server side for tracking acks. */
         struct oti_req_ack_lock {
                 struct lustre_handle lock;
@@ -806,6 +817,12 @@ enum obd_notify_event {
         OBD_NOTIFY_CONFIG
 };
 
+/* bit-mask flags for config events */
+enum config_flags {
+        CONFIG_LOG = 0x1,  /* finished processing config log */
+        CONFIG_SYNC = 0x2  /* mdt synced 1 ost */
+};
+
 /*
  * Data structure used to pass obd_notify()-event to non-obd listeners (llite
  * and liblustre being main examples).
@@ -838,20 +855,26 @@ struct obd_device {
         struct lu_device       *obd_lu_dev;
 
         int                     obd_minor;
-        unsigned int obd_attached:1,      /* finished attach */
-                     obd_set_up:1,        /* finished setup */
-                     obd_recovering:1,    /* there are recoverable clients */
-                     obd_abort_recovery:1,/* somebody ioctl'ed us to abort */
-                     obd_replayable:1,    /* recovery is enabled; inform clients */
-                     obd_no_transno:1,    /* no committed-transno notification */
-                     obd_no_recov:1,      /* fail instead of retry messages */
-                     obd_req_replaying:1, /* replaying requests */
-                     obd_stopping:1,      /* started cleanup */
-                     obd_starting:1,      /* started setup */
-                     obd_force:1,         /* cleanup with > 0 obd refcount */
-                     obd_fail:1,          /* cleanup with failover */
-                     obd_async_recov:1,   /* allow asyncronous orphan cleanup */
-                     obd_no_conn:1;       /* deny new connections */
+        unsigned long obd_attached:1,      /* finished attach */
+                      obd_set_up:1,        /* finished setup */
+                      obd_recovering:1,    /* there are recoverable clients */
+                      obd_abort_recovery:1,/* somebody ioctl'ed us to abort */
+                      obd_replayable:1,    /* recovery is enabled; inform clients */
+                      obd_no_transno:1,    /* no committed-transno notification */
+                      obd_no_recov:1,      /* fail instead of retry messages */
+                      obd_req_replaying:1, /* replaying requests */
+                      obd_stopping:1,      /* started cleanup */
+                      obd_starting:1,      /* started setup */
+                      obd_force:1,         /* cleanup with > 0 obd refcount */
+                      obd_fail:1,          /* cleanup with failover */
+                      obd_async_recov:1,   /* allow asyncronous orphan cleanup */
+                      obd_no_conn:1,       /* deny new connections */
+                      obd_inactive:1;      /* device active/inactive
+                                           * (for /proc/status only!!) */
+        /* uuid-export hash body */
+        struct lustre_class_hash_body *obd_uuid_hash_body;
+        /* nid-export hash body */
+        struct lustre_class_hash_body *obd_nid_hash_body; 
         atomic_t obd_refcount;
         cfs_waitq_t             obd_refcount_waitq;
         struct list_head        obd_exports;
@@ -890,8 +913,9 @@ struct obd_device {
         struct list_head                 obd_uncommitted_replies;
         spinlock_t                       obd_uncommitted_replies_lock;
         cfs_timer_t                      obd_recovery_timer;
-        time_t                           obd_recovery_start;
-        time_t                           obd_recovery_end;
+        time_t                           obd_recovery_start; /* seconds */
+        time_t                           obd_recovery_end; /* seconds */
+        time_t                           obd_recovery_max_time; /* seconds, bz13079 */
         
         /* new recovery stuff from CMD2 */
         struct target_recovery_data      obd_recovery_data;
@@ -927,6 +951,8 @@ struct obd_device {
         cfs_proc_dir_entry_t  *obd_svc_procroot;
         struct lprocfs_stats  *obd_svc_stats;
         struct semaphore       obd_proc_exp_sem;
+        atomic_t               obd_evict_inprogress;
+        cfs_waitq_t            obd_evict_inprogress_waitq;
 };
 
 #define OBD_OPT_FORCE           0x0001
@@ -960,6 +986,11 @@ enum obd_cleanup_stage {
 #define KEY_CONN_DATA           "conn_data"
 #define KEY_MAX_EASIZE          "max_easize"
 #define KEY_REVIMP_UPD          "revimp_update"
+#define KEY_LOV_IDX             "lov_idx"
+#define KEY_LAST_ID             "last_id"
+#define KEY_LOCK_TO_STRIPE      "lock_to_stripe"
+#define KEY_BLOCKSIZE           "blocksize"
+#define KEY_BLOCKSIZE_BITS      "blocksize_bits"
 
 struct lu_context;
 
@@ -1034,7 +1065,8 @@ struct obd_ops {
         int (*o_connect)(const struct lu_env *env,
                          struct lustre_handle *conn, struct obd_device *src,
                          struct obd_uuid *cluuid, struct obd_connect_data *ocd);
-        int (*o_reconnect)(struct obd_export *exp, struct obd_device *src,
+        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);
         int (*o_disconnect)(struct obd_export *exp);
@@ -1066,7 +1098,7 @@ struct obd_ops {
         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 need_create);
+        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_destroy)(struct obd_export *exp, struct obdo *oa,
@@ -1144,7 +1176,8 @@ struct obd_ops {
                           int niocount, struct niobuf_local *local,
                           struct obd_trans_info *oti, int rc);
         int (*o_enqueue)(struct obd_export *, struct obd_info *oinfo,
-                         struct obd_enqueue_info *einfo);
+                         struct ldlm_enqueue_info *einfo,
+                         struct ptlrpc_request_set *rqset);
         int (*o_match)(struct obd_export *, struct lov_stripe_md *, __u32 type,
                        ldlm_policy_data_t *, __u32 mode, int *flags, void *data,
                        struct lustre_handle *lockh);
@@ -1229,28 +1262,34 @@ struct lustre_md {
         struct obd_capa         *oss_capa;
 };
 
+struct md_open_data {
+        struct obd_client_handle *mod_och;
+        struct list_head          mod_replay_list;
+};
+
+struct lookup_intent;
+
 struct md_ops {
         int (*m_getstatus)(struct obd_export *, struct lu_fid *,
                            struct obd_capa **);
         int (*m_change_cbdata)(struct obd_export *, const struct lu_fid *,
                                ldlm_iterator_t, void *);
         int (*m_close)(struct obd_export *, struct md_op_data *,
-                       struct obd_client_handle *, struct ptlrpc_request **);
+                       struct md_open_data *, struct ptlrpc_request **);
         int (*m_create)(struct obd_export *, struct md_op_data *,
                         const void *, int, int, __u32, __u32, __u32,
                         __u64, struct ptlrpc_request **);
         int (*m_done_writing)(struct obd_export *, struct md_op_data  *,
-                              struct obd_client_handle *);
-        int (*m_enqueue)(struct obd_export *, int, struct lookup_intent *,
-                         int, struct md_op_data *, struct lustre_handle *,
-                         void *, int, ldlm_completion_callback,
-                         ldlm_blocking_callback, void *, int);
+                              struct md_open_data *);
+        int (*m_enqueue)(struct obd_export *, struct ldlm_enqueue_info *,
+                         struct lookup_intent *, struct md_op_data *,
+                         struct lustre_handle *, void *, int, int);
         int (*m_getattr)(struct obd_export *, const struct lu_fid *,
                          struct obd_capa *, obd_valid, int,
                          struct ptlrpc_request **);
         int (*m_getattr_name)(struct obd_export *, const struct lu_fid *,
                               struct obd_capa *, const char *, int, obd_valid,
-                              int, struct ptlrpc_request **);
+                              int, __u32, struct ptlrpc_request **);
         int (*m_intent_lock)(struct obd_export *, struct md_op_data *,
                              void *, int, struct lookup_intent *, int,
                              struct ptlrpc_request **,
@@ -1264,7 +1303,8 @@ struct md_ops {
                            const struct lu_fid *,
                            struct ptlrpc_request **);
         int (*m_setattr)(struct obd_export *, struct md_op_data *, void *,
-                         int , void *, int, struct ptlrpc_request **);
+                         int , void *, int, struct ptlrpc_request **,
+                         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 *,
@@ -1276,7 +1316,7 @@ struct md_ops {
 
         int (*m_setxattr)(struct obd_export *, const struct lu_fid *,
                           struct obd_capa *, obd_valid, const char *,
-                          const char *, int, int, int,
+                          const char *, int, int, int, __u32,
                           struct ptlrpc_request **);
 
         int (*m_getxattr)(struct obd_export *, const struct lu_fid *,
@@ -1287,7 +1327,7 @@ struct md_ops {
         int (*m_init_ea_size)(struct obd_export *, int, int, int);
 
         int (*m_get_lustre_md)(struct obd_export *, struct ptlrpc_request *,
-                               int, struct obd_export *, struct obd_export *,
+                               struct obd_export *, struct obd_export *,
                                struct lustre_md *);
 
         int (*m_free_lustre_md)(struct obd_export *, struct lustre_md *);
@@ -1299,9 +1339,10 @@ struct md_ops {
                                         struct obd_client_handle *);
         int (*m_set_lock_data)(struct obd_export *, __u64 *, void *);
 
-        int (*m_lock_match)(struct obd_export *, int, const struct lu_fid *,
-                            ldlm_type_t, ldlm_policy_data_t *, ldlm_mode_t,
-                            struct lustre_handle *);
+        ldlm_mode_t (*m_lock_match)(struct obd_export *, int,
+                                    const struct lu_fid *, ldlm_type_t,
+                                    ldlm_policy_data_t *, ldlm_mode_t,
+                                    struct lustre_handle *);
 
         int (*m_cancel_unused)(struct obd_export *, const struct lu_fid *,
                                ldlm_policy_data_t *, ldlm_mode_t, int flags,
@@ -1310,7 +1351,8 @@ struct md_ops {
                             renew_capa_cb_t cb);
 
         int (*m_get_remote_perm)(struct obd_export *, const struct lu_fid *,
-                                 struct obd_capa *, struct ptlrpc_request **);
+                                 struct obd_capa *, __u32,
+                                 struct ptlrpc_request **);
 
         /*
          * NOTE: If adding ops, add another LPROCFS_MD_OP_INIT() line to