staging: lustre: fix comparison between signed and unsigned
[linux-2.6-block.git] / drivers / staging / lustre / lustre / include / obd.h
index a1bc2c478ff9a1d49a73f966f61ad667a1823d0a..37a3acbabd629b56602cca4062ba28b5af916e11 100644 (file)
 
 #include <linux/spinlock.h>
 
-#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 "lu_ref.h"
@@ -181,27 +172,6 @@ struct brw_page {
        u32 flag;
 };
 
-/* llog contexts */
-enum llog_ctxt_id {
-       LLOG_CONFIG_ORIG_CTXT  =  0,
-       LLOG_CONFIG_REPL_CTXT,
-       LLOG_MDS_OST_ORIG_CTXT,
-       LLOG_MDS_OST_REPL_CTXT,
-       LLOG_SIZE_ORIG_CTXT,
-       LLOG_SIZE_REPL_CTXT,
-       LLOG_RD1_ORIG_CTXT,
-       LLOG_RD1_REPL_CTXT,
-       LLOG_TEST_ORIG_CTXT,
-       LLOG_TEST_REPL_CTXT,
-       LLOG_LOVEA_ORIG_CTXT,
-       LLOG_LOVEA_REPL_CTXT,
-       LLOG_CHANGELOG_ORIG_CTXT,       /**< changelog generation on mdd */
-       LLOG_CHANGELOG_REPL_CTXT,       /**< changelog access on clients */
-       LLOG_CHANGELOG_USER_ORIG_CTXT,  /**< for multiple changelog consumers */
-       LLOG_AGENT_ORIG_CTXT,           /**< agent requests generation on cdt */
-       LLOG_MAX_CTXTS
-};
-
 struct timeout_item {
        enum timeout_event ti_event;
        unsigned long    ti_timeout;
@@ -211,11 +181,12 @@ struct timeout_item {
        struct list_head         ti_chain;
 };
 
-#define OSC_MAX_RIF_DEFAULT       8
-#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 {
@@ -225,9 +196,6 @@ enum {
        NUM_SYNC_ON_CANCEL_STATES
 };
 
-#define MDC_MAX_RIF_DEFAULT       8
-#define MDC_MAX_RIF_MAX         512
-
 enum obd_cl_sem_lock_class {
        OBD_CLI_SEM_NORMAL,
        OBD_CLI_SEM_MGC,
@@ -254,11 +222,11 @@ struct client_obd {
        struct sptlrpc_flavor    cl_flvr_mgc;   /* fixed flavor of mgc->mgs */
 
        /* the grant values are protected by loi_list_lock below */
-       long                 cl_dirty;   /* all _dirty_ in bytes */
-       long                 cl_dirty_max;     /* allowed w/o rpc */
-       long                 cl_dirty_transit; /* dirty synchronous */
-       long                 cl_avail_grant;   /* bytes of credit for ost */
-       long                 cl_lost_grant;    /* lost credits (trunc) */
+       unsigned long            cl_dirty_pages;        /* all _dirty_ in pahges */
+       unsigned long            cl_dirty_max_pages;    /* allowed w/o rpc */
+       unsigned long            cl_dirty_transit;      /* dirty synchronous */
+       unsigned long            cl_avail_grant;        /* bytes of credit for ost */
+       unsigned long            cl_lost_grant;         /* lost credits (trunc) */
 
        /* 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
@@ -275,7 +243,6 @@ struct client_obd {
         * the extent size. A chunk is max(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
@@ -301,13 +268,13 @@ struct client_obd {
        struct list_head               cl_loi_hp_ready_list;
        struct list_head               cl_loi_write_list;
        struct list_head               cl_loi_read_list;
-       int                   cl_r_in_flight;
-       int                   cl_w_in_flight;
+       __u32                    cl_r_in_flight;
+       __u32                    cl_w_in_flight;
        /* just a sum of the loi/lop pending numbers to be exported by sysfs */
        atomic_t             cl_pending_w_pages;
        atomic_t             cl_pending_r_pages;
        __u32                    cl_max_pages_per_rpc;
-       int                   cl_max_rpcs_in_flight;
+       __u32                    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;
@@ -470,12 +437,11 @@ struct lmv_obd {
 struct niobuf_local {
        __u64           lnb_file_offset;
        __u32           lnb_page_offset;
-       __u32           len;
-       __u32           flags;
-       struct page     *page;
-       struct dentry   *dentry;
-       int             lnb_grant_used;
-       int             rc;
+       __u32           lnb_len;
+       __u32           lnb_flags;
+       struct page     *lnb_page;
+       void            *lnb_data;
+       int             lnb_rc;
 };
 
 #define LUSTRE_FLD_NAME         "fld"
@@ -517,7 +483,6 @@ struct niobuf_local {
 #define N_LOCAL_TEMP_PAGE 0x10000000
 
 struct obd_trans_info {
-       __u64               oti_transno;
        __u64               oti_xid;
        /* Only used on the server side for tracking acks. */
        struct oti_req_ack_lock {
@@ -527,50 +492,11 @@ struct obd_trans_info {
        void                *oti_handle;
        struct llog_cookie       oti_onecookie;
        struct llog_cookie      *oti_logcookies;
-       int                   oti_numcookies;
-       /** synchronous write is needed */
-       unsigned 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;
 };
 
-static inline void oti_alloc_cookies(struct obd_trans_info *oti,
-                                    int num_cookies)
-{
-       if (!oti)
-               return;
-
-       if (num_cookies == 1)
-               oti->oti_logcookies = &oti->oti_onecookie;
-       else
-               oti->oti_logcookies = libcfs_kvzalloc(num_cookies * sizeof(oti->oti_onecookie),
-                                                     GFP_NOFS);
-
-       oti->oti_numcookies = num_cookies;
-}
-
-static inline void oti_free_cookies(struct obd_trans_info *oti)
-{
-       if (!oti || !oti->oti_logcookies)
-               return;
-
-       if (oti->oti_logcookies == &oti->oti_onecookie)
-               LASSERT(oti->oti_numcookies == 1);
-       else
-               kvfree(oti->oti_logcookies);
-
-       oti->oti_logcookies = NULL;
-       oti->oti_numcookies = 0;
-}
-
 /*
  * Events signalled through obd_notify() upcall-chain.
  */
@@ -616,7 +542,6 @@ struct target_recovery_data {
 };
 
 struct obd_llog_group {
-       int             olg_seq;
        struct llog_ctxt  *olg_ctxts[LLOG_MAX_CTXTS];
        wait_queue_head_t       olg_waitq;
        spinlock_t         olg_lock;
@@ -625,7 +550,6 @@ struct obd_llog_group {
 
 /* corresponds to one of the obd's */
 #define OBD_DEVICE_MAGIC       0XAB5CD6EF
-#define OBD_DEV_BY_DEVNAME      0xffffd0de
 
 struct lvfs_run_ctxt {
        struct dt_device *dt;
@@ -653,7 +577,6 @@ struct obd_device {
                      obd_starting:1,      /* started setup */
                      obd_force:1,       /* cleanup with > 0 obd refcount */
                      obd_fail:1,        /* cleanup with failover */
-                     obd_async_recov:1, /* allow asynchronous orphan cleanup */
                      obd_no_conn:1,       /* deny new connections */
                      obd_inactive:1,      /* device active/inactive
                                            * (for sysfs status only!!)
@@ -728,9 +651,6 @@ struct obd_device {
        struct completion       obd_kobj_unregister;
 };
 
-#define OBD_LLOG_FL_SENDNOW     0x0001
-#define OBD_LLOG_FL_EXIT       0x0002
-
 enum obd_cleanup_stage {
 /* Special case hack for MDS LOVs */
        OBD_CLEANUP_EARLY,
@@ -740,8 +660,6 @@ enum obd_cleanup_stage {
 
 /* get/set_info keys */
 #define KEY_ASYNC             "async"
-#define KEY_BLOCKSIZE_BITS      "blocksize_bits"
-#define KEY_BLOCKSIZE     "blocksize"
 #define KEY_CHANGELOG_CLEAR     "changelog_clear"
 #define KEY_FID2PATH       "fid2path"
 #define KEY_CHECKSUM       "checksum"
@@ -753,13 +671,11 @@ enum obd_cleanup_stage {
 #define KEY_GRANT_SHRINK       "grant_shrink"
 #define KEY_HSM_COPYTOOL_SEND   "hsm_send"
 #define KEY_INIT_RECOV_BACKUP   "init_recov_bk"
-#define KEY_INIT_RECOV   "initial_recov"
 #define KEY_INTERMDS       "inter_mds"
 #define KEY_LAST_ID         "last_id"
 #define KEY_LAST_FID           "last_fid"
 #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_DEFAULT_EASIZE     "default_easize"
 #define KEY_MDS_CONN       "mds_conn"
@@ -772,11 +688,9 @@ enum obd_cleanup_stage {
 /*      KEY_SET_INFO in lustre_idl.h */
 #define KEY_SPTLRPC_CONF       "sptlrpc_conf"
 #define KEY_CONNECT_FLAG       "connect_flags"
-#define KEY_SYNC_LOCK_CANCEL    "sync_lock_cancel"
 
 #define KEY_CACHE_SET          "cache_set"
 #define KEY_CACHE_LRU_SHRINK   "cache_lru_shrink"
-#define KEY_CHANGELOG_INDEX    "changelog_index"
 
 struct lu_context;
 
@@ -801,9 +715,11 @@ 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_GETATTR | IT_OPEN | IT_LOOKUP |
                              IT_LAYOUT))
                return LCK_CR;
+       else if (it->it_op & IT_READDIR)
+               return LCK_PR;
        else if (it->it_op &  IT_GETXATTR)
                return LCK_PR;
        else if (it->it_op &  IT_SETXATTR)
@@ -831,6 +747,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;
@@ -845,9 +762,6 @@ struct md_op_data {
        /* Various operation flags. */
        enum mds_op_bias        op_bias;
 
-       /* Operation type */
-       __u32              op_opc;
-
        /* Used by readdir */
        __u64              op_offset;
 
@@ -864,9 +778,21 @@ struct md_op_data {
        struct lustre_handle    op_lease_handle;
 };
 
+#define op_stripe_offset       op_ioepoch
+#define op_max_pages           op_valid
+
+struct md_callback {
+       int (*md_blocking_ast)(struct ldlm_lock *lock,
+                              struct ldlm_lock_desc *desc,
+                              void *data, int flag);
+};
+
 enum op_cli_flags {
        CLI_SET_MEA     = 1 << 0,
        CLI_RM_ENTRY    = 1 << 1,
+       CLI_HASH64      = BIT(2),
+       CLI_API32       = BIT(3),
+       CLI_MIGRATE     = BIT(4),
 };
 
 struct md_enqueue_info;
@@ -894,8 +820,6 @@ struct obd_ops {
                              __u32 keylen, void *key,
                              __u32 vallen, void *val,
                              struct ptlrpc_request_set *set);
-       int (*attach)(struct obd_device *dev, u32 len, void *data);
-       int (*detach)(struct obd_device *dev);
        int (*setup)(struct obd_device *dev, struct lustre_cfg *cfg);
        int (*precleanup)(struct obd_device *dev,
                          enum obd_cleanup_stage cleanup_stage);
@@ -927,8 +851,8 @@ struct obd_ops {
        int (*fid_fini)(struct obd_device *obd);
 
        /* Allocate new fid according to passed @hint. */
-       int (*fid_alloc)(struct obd_export *exp, struct lu_fid *fid,
-                        struct md_op_data *op_data);
+       int (*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
@@ -972,8 +896,6 @@ struct obd_ops {
                        struct niobuf_remote *remote, int pages,
                        struct niobuf_local *local,
                        struct obd_trans_info *oti, int rc);
-       int (*find_cbdata)(struct obd_export *, struct lov_stripe_md *,
-                          ldlm_iterator_t it, void *data);
        int (*init_export)(struct obd_export *exp);
        int (*destroy_export)(struct obd_export *exp);
 
@@ -1009,27 +931,11 @@ struct obd_ops {
         */
 };
 
-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;
-       struct lmv_stripe_md    *mea;
+       struct lmv_stripe_md    *lmv;
 #ifdef CONFIG_FS_POSIX_ACL
        struct posix_acl        *posix_acl;
 #endif
@@ -1045,12 +951,11 @@ struct md_open_data {
 };
 
 struct lookup_intent;
+struct cl_attr;
 
 struct md_ops {
        int (*getstatus)(struct obd_export *, struct lu_fid *);
        int (*null_inode)(struct obd_export *, const struct lu_fid *);
-       int (*find_cbdata)(struct obd_export *, const struct lu_fid *,
-                          ldlm_iterator_t, void *);
        int (*close)(struct obd_export *, struct md_op_data *,
                     struct md_open_data *, struct ptlrpc_request **);
        int (*create)(struct obd_export *, struct md_op_data *,
@@ -1059,15 +964,15 @@ struct md_ops {
        int (*done_writing)(struct obd_export *, struct md_op_data  *,
                            struct md_open_data *);
        int (*enqueue)(struct obd_export *, struct ldlm_enqueue_info *,
+                      const ldlm_policy_data_t *,
                       struct lookup_intent *, struct md_op_data *,
-                      struct lustre_handle *, void *, int,
-                      struct ptlrpc_request **, __u64);
+                      struct lustre_handle *, __u64);
        int (*getattr)(struct obd_export *, struct md_op_data *,
                       struct ptlrpc_request **);
        int (*getattr_name)(struct obd_export *, struct md_op_data *,
                            struct ptlrpc_request **);
        int (*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);
        int (*link)(struct obd_export *, struct md_op_data *,
@@ -1075,17 +980,14 @@ struct md_ops {
        int (*rename)(struct obd_export *, struct md_op_data *,
                      const char *, int, const char *, int,
                      struct ptlrpc_request **);
-       int (*is_subdir)(struct obd_export *, const struct lu_fid *,
-                        const struct lu_fid *,
-                          struct ptlrpc_request **);
        int (*setattr)(struct obd_export *, struct md_op_data *, void *,
                       int, void *, int, struct ptlrpc_request **,
                         struct md_open_data **mod);
        int (*sync)(struct obd_export *, const struct lu_fid *,
                    struct ptlrpc_request **);
-       int (*readpage)(struct obd_export *, struct md_op_data *,
-                       struct page **, struct ptlrpc_request **);
-
+       int (*read_page)(struct obd_export *, struct md_op_data *,
+                        struct md_callback *cb_op, __u64 hash_offset,
+                        struct page **ppage);
        int (*unlink)(struct obd_export *, struct md_op_data *,
                      struct ptlrpc_request **);
 
@@ -1105,12 +1007,20 @@ struct md_ops {
 
        int (*free_lustre_md)(struct obd_export *, struct lustre_md *);
 
+       int (*merge_attr)(struct obd_export *,
+                         const struct lmv_stripe_md *lsm,
+                         struct cl_attr *attr);
+
+       int (*update_lsm_md)(struct obd_export *, struct lmv_stripe_md *lsm,
+                            struct mdt_body *, ldlm_blocking_callback);
+
        int (*set_open_replay_data)(struct obd_export *,
                                    struct obd_client_handle *,
                                    struct lookup_intent *);
        int (*clear_open_replay_data)(struct obd_export *,
                                      struct obd_client_handle *);
-       int (*set_lock_data)(struct obd_export *, __u64 *, void *, __u64 *);
+       int (*set_lock_data)(struct obd_export *, const struct lustre_handle *,
+                            void *, __u64 *);
 
        enum ldlm_mode (*lock_match)(struct obd_export *, __u64,
                                     const struct lu_fid *, enum ldlm_type,
@@ -1121,6 +1031,11 @@ struct md_ops {
                             ldlm_policy_data_t *, enum ldlm_mode,
                             enum ldlm_cancel_flags flags, void *opaque);
 
+       int (*get_fid_from_lsm)(struct obd_export *,
+                               const struct lmv_stripe_md *,
+                               const char *name, int namelen,
+                               struct lu_fid *fid);
+
        int (*intent_getattr_async)(struct obd_export *,
                                    struct md_enqueue_info *,
                                    struct ldlm_enqueue_info *);
@@ -1164,10 +1079,6 @@ static inline const struct lsm_operations *lsm_op_find(int magic)
        }
 }
 
-/* Requests for obd_extent_calc() */
-#define OBD_CALC_STRIPE_START   1
-#define OBD_CALC_STRIPE_END     2
-
 static inline struct md_open_data *obd_mod_alloc(void)
 {
        struct md_open_data *mod;
@@ -1259,4 +1170,28 @@ static inline int cli_brw_size(struct obd_device *obd)
        return obd->u.cli.cl_max_pages_per_rpc << PAGE_SHIFT;
 }
 
+/*
+ * when RPC size or the max RPCs in flight is increased, the max dirty pages
+ * of the client should be increased accordingly to avoid sending fragmented
+ * RPCs over the network when the client runs out of the maximum dirty space
+ * when so many RPCs are being generated.
+ */
+static inline void client_adjust_max_dirty(struct client_obd *cli)
+{
+       /* initializing */
+       if (cli->cl_dirty_max_pages <= 0)
+               cli->cl_dirty_max_pages =
+                       (OSC_MAX_DIRTY_DEFAULT * 1024 * 1024) >> PAGE_SHIFT;
+       else {
+               unsigned long dirty_max = cli->cl_max_rpcs_in_flight *
+                                         cli->cl_max_pages_per_rpc;
+
+               if (dirty_max > cli->cl_dirty_max_pages)
+                       cli->cl_dirty_max_pages = dirty_max;
+       }
+
+       if (cli->cl_dirty_max_pages > totalram_pages / 8)
+               cli->cl_dirty_max_pages = totalram_pages / 8;
+}
+
 #endif /* __OBD_H */