Whamcloud - gitweb
LU-13669 llite: make readahead aware of hints
[fs/lustre-release.git] / lustre / include / cl_object.h
index 668158b..05c89eb 100644 (file)
@@ -623,7 +623,7 @@ enum cl_page_state {
          *
          * \invariant cl_page::cp_owner == NULL && cl_page::cp_req == NULL
          */
-        CPS_CACHED,
+       CPS_CACHED = 1,
         /**
          * Page is exclusively owned by some cl_io. Page may end up in this
          * state as a result of
@@ -715,8 +715,13 @@ enum cl_page_type {
          *  to vmpage which is not belonging to the same object of cl_page.
          *  it is used in DirectIO and lockless IO. */
         CPT_TRANSIENT,
+       CPT_NR
 };
 
+#define        CP_STATE_BITS   4
+#define        CP_TYPE_BITS    2
+#define        CP_MAX_LAYER    3
+
 /**
  * Fields are protected by the lock on struct page, except for atomics and
  * immutables.
@@ -728,46 +733,53 @@ enum cl_page_type {
  */
 struct cl_page {
        /** Reference counter. */
-       atomic_t                 cp_ref;
-       /* which slab kmem index this memory allocated from */
-       int                      cp_kmem_index;
+       atomic_t                cp_ref;
+       /** layout_entry + stripe index, composed using lov_comp_index() */
+       unsigned int            cp_lov_index;
+       pgoff_t                 cp_osc_index;
        /** An object this page is a part of. Immutable after creation. */
        struct cl_object        *cp_obj;
        /** vmpage */
        struct page             *cp_vmpage;
+       /**
+        * Assigned if doing direct IO, because in this case cp_vmpage is not
+        * a valid page cache page, hence the inode cannot be inferred from
+        * cp_vmpage->mapping->host.
+        */
+       struct inode            *cp_inode;
        /** Linkage of pages within group. Pages must be owned */
-       struct list_head         cp_batch;
+       struct list_head        cp_batch;
        /** array of slices offset. Immutable after creation. */
-       unsigned char            cp_layer_offset[3];
+       unsigned char           cp_layer_offset[CP_MAX_LAYER]; /* 24 bits */
        /** current slice index */
-       unsigned char            cp_layer_count:2;
+       unsigned char           cp_layer_count:2; /* 26 bits */
        /**
         * Page state. This field is const to avoid accidental update, it is
         * modified only internally within cl_page.c. Protected by a VM lock.
         */
-       const enum cl_page_state cp_state;
+       enum cl_page_state       cp_state:CP_STATE_BITS; /* 30 bits */
         /**
          * Page type. Only CPT_TRANSIENT is used so far. Immutable after
          * creation.
          */
-        enum cl_page_type        cp_type;
+       enum cl_page_type       cp_type:CP_TYPE_BITS; /* 32 bits */
+       /* which slab kmem index this memory allocated from */
+       short int               cp_kmem_index; /* 48 bits */
+       unsigned int            cp_unused1:16;  /* 64 bits */
 
-        /**
-         * Owning IO in cl_page_state::CPS_OWNED state. Sub-page can be owned
-         * by sub-io. Protected by a VM lock.
-         */
+       /**
+        * Owning IO in cl_page_state::CPS_OWNED state. Sub-page can be owned
+        * by sub-io. Protected by a VM lock.
+        */
         struct cl_io            *cp_owner;
-        /** List of references to this page, for debugging. */
-        struct lu_ref            cp_reference;
+       /** List of references to this page, for debugging. */
+        struct lu_ref          cp_reference;
        /** Link to an object, for debugging. */
-       struct lu_ref_link       cp_obj_ref;
+       struct lu_ref_link      cp_obj_ref;
        /** Link to a queue, for debugging. */
-       struct lu_ref_link       cp_queue_ref;
+       struct lu_ref_link      cp_queue_ref;
        /** Assigned if doing a sync_io */
-       struct cl_sync_io       *cp_sync_io;
-       /** layout_entry + stripe index, composed using lov_comp_index() */
-       unsigned int            cp_lov_index;
-       pgoff_t                 cp_osc_index;
+       struct cl_sync_io       *cp_sync_io;
 };
 
 /**
@@ -1405,6 +1417,11 @@ enum cl_io_type {
         * To give advice about access of a file
         */
        CIT_LADVISE,
+       /**
+        * SEEK_HOLE/SEEK_DATA handling to search holes or data
+        * across all file objects
+        */
+       CIT_LSEEK,
         CIT_OP_NR
 };
 
@@ -1798,6 +1815,8 @@ struct cl_io {
         enum cl_io_state               ci_state;
         /** main object this io is against. Immutable after creation. */
         struct cl_object              *ci_obj;
+       /** one AIO request might be split in cl_io_loop */
+       struct cl_dio_aio             *ci_aio;
         /**
          * Upper layer io, of which this io is a part of. Immutable after
          * creation.
@@ -1874,6 +1893,11 @@ struct cl_io {
                        enum lu_ladvise_type     li_advice;
                        __u64                    li_flags;
                } ci_ladvise;
+               struct cl_lseek_io {
+                       loff_t                   ls_start;
+                       loff_t                   ls_result;
+                       int                      ls_whence;
+               } ci_lseek;
         } u;
         struct cl_2queue     ci_queue;
         size_t               ci_nob;
@@ -1934,13 +1958,21 @@ struct cl_io {
        /**
         * Ignore lockless and do normal locking for this io.
         */
-                            ci_ignore_lockless:1,
+                            ci_dio_lock:1,
        /**
         * Set if we've tried all mirrors for this read IO, if it's not set,
         * the read IO will check to-be-read OSCs' status, and make fast-switch
         * another mirror if some of the OSTs are not healthy.
         */
-                            ci_tried_all_mirrors:1;
+                            ci_tried_all_mirrors:1,
+       /**
+        * Random read hints, readahead will be disabled.
+        */
+                            ci_rand_read:1,
+       /**
+        * Sequential read hints.
+        */
+                            ci_seq_read:1;
        /**
         * Bypass quota check
         */
@@ -2517,6 +2549,7 @@ int  cl_sync_io_wait(const struct lu_env *env, struct cl_sync_io *anchor,
 void cl_sync_io_note(const struct lu_env *env, struct cl_sync_io *anchor,
                     int ioret);
 struct cl_dio_aio *cl_aio_alloc(struct kiocb *iocb);
+void cl_aio_free(struct cl_dio_aio *aio);
 static inline void cl_sync_io_init(struct cl_sync_io *anchor, int nr)
 {
        cl_sync_io_init_notify(anchor, nr, NULL, NULL);
@@ -2547,6 +2580,7 @@ struct cl_dio_aio {
        struct cl_page_list     cda_pages;
        struct kiocb            *cda_iocb;
        ssize_t                 cda_bytes;
+       unsigned                cda_no_aio_complete:1;
 };
 
 /** @} cl_sync_io */