Whamcloud - gitweb
LU-13974 llog: check stale osp object
[fs/lustre-release.git] / lustre / include / lustre_osc.h
index 656b60a..de848ae 100644 (file)
@@ -49,6 +49,7 @@
 #include <libcfs/libcfs.h>
 #include <obd.h>
 #include <cl_object.h>
+#include <lustre_crypto.h>
 
 /** \defgroup osc osc
  *  @{
@@ -168,6 +169,7 @@ struct osc_thread_info {
         */
        pgoff_t                 oti_next_index;
        pgoff_t                 oti_fn_index; /* first non-overlapped index */
+       pgoff_t                 oti_ng_index; /* negative lock caching */
        struct cl_sync_io       oti_anchor;
        struct cl_req_attr      oti_req_attr;
        struct lu_buf           oti_ladvise_buf;
@@ -184,7 +186,7 @@ static inline __u64 osc_enq2ldlm_flags(__u32 enqflags)
        if (enqflags & CEF_NONBLOCK)
                result |= LDLM_FL_BLOCK_NOWAIT;
        if (enqflags & CEF_GLIMPSE)
-               result |= LDLM_FL_HAS_INTENT;
+               result |= LDLM_FL_HAS_INTENT|LDLM_FL_CBPENDING;
        if (enqflags & CEF_DISCARD_DATA)
                result |= LDLM_FL_AST_DISCARD_DATA;
        if (enqflags & CEF_PEEK)
@@ -226,6 +228,14 @@ enum osc_dap_flags {
         * Return the lock even if it is being canceled.
         */
        OSC_DAP_FL_CANCELING = BIT(1),
+       /**
+        * check ast data is present, requested to cancel cb
+        */
+       OSC_DAP_FL_AST       = BIT(2),
+       /**
+        * look at right region for the desired lock
+        */
+       OSC_DAP_FL_RIGHT     = BIT(3),
 };
 
 /*
@@ -495,17 +505,17 @@ struct osc_page {
         * An offset within page from which next transfer starts. This is used
         * by cl_page_clip() to submit partial page transfers.
         */
-       int                   ops_from;
+       unsigned int            ops_from:PAGE_SHIFT,
        /**
-        * An offset within page at which next transfer ends.
+        * An offset within page at which next transfer ends(inclusive).
         *
         * \see osc_page::ops_from.
         */
-       int                   ops_to;
+                               ops_to:PAGE_SHIFT,
        /**
         * Boolean, true iff page is under transfer. Used for sanity checking.
         */
-       unsigned              ops_transfer_pinned:1,
+                               ops_transfer_pinned:1,
        /**
         * in LRU?
         */
@@ -689,6 +699,10 @@ int osc_fsync_ost(const struct lu_env *env, struct osc_object *obj,
 void osc_io_fsync_end(const struct lu_env *env,
                      const struct cl_io_slice *slice);
 void osc_read_ahead_release(const struct lu_env *env, void *cbdata);
+int osc_io_lseek_start(const struct lu_env *env,
+                      const struct cl_io_slice *slice);
+void osc_io_lseek_end(const struct lu_env *env,
+                     const struct cl_io_slice *slice);
 
 /* osc_lock.c */
 void osc_lock_to_lockless(const struct lu_env *env, struct osc_lock *ols,
@@ -737,7 +751,7 @@ static inline struct osc_io *osc_env_io(const struct lu_env *env)
 
 static inline struct osc_device *lu2osc_dev(const struct lu_device *d)
 {
-       return container_of0(d, struct osc_device, od_cl.cd_lu_dev);
+       return container_of_safe(d, struct osc_device, od_cl.cd_lu_dev);
 }
 
 static inline struct obd_export *osc_export(const struct osc_object *obj)
@@ -752,7 +766,7 @@ static inline struct client_obd *osc_cli(const struct osc_object *obj)
 
 static inline struct osc_object *cl2osc(const struct cl_object *obj)
 {
-       return container_of0(obj, struct osc_object, oo_cl);
+       return container_of_safe(obj, struct osc_object, oo_cl);
 }
 
 static inline struct cl_object *osc2cl(const struct osc_object *obj)
@@ -762,8 +776,8 @@ static inline struct cl_object *osc2cl(const struct osc_object *obj)
 
 static inline struct osc_device *obd2osc_dev(const struct obd_device *obd)
 {
-       return container_of0(obd->obd_lu_dev, struct osc_device,
-                            od_cl.cd_lu_dev);
+       return container_of_safe(obd->obd_lu_dev, struct osc_device,
+                                od_cl.cd_lu_dev);
 }
 
 static inline struct lu_device *osc2lu_dev(struct osc_device *osc)
@@ -778,13 +792,13 @@ static inline struct lu_object *osc2lu(struct osc_object *osc)
 
 static inline struct osc_object *lu2osc(const struct lu_object *obj)
 {
-       return container_of0(obj, struct osc_object, oo_cl.co_lu);
+       return container_of_safe(obj, struct osc_object, oo_cl.co_lu);
 }
 
 static inline struct osc_io *cl2osc_io(const struct lu_env *env,
                                       const struct cl_io_slice *slice)
 {
-       struct osc_io *oio = container_of0(slice, struct osc_io, oi_cl);
+       struct osc_io *oio = container_of(slice, struct osc_io, oi_cl);
 
        LINVRNT(oio == osc_env_io(env));
        return oio;
@@ -812,12 +826,12 @@ static inline enum cl_lock_mode osc_ldlm2cl_lock(enum ldlm_mode mode)
 
 static inline struct osc_page *cl2osc_page(const struct cl_page_slice *slice)
 {
-       return container_of0(slice, struct osc_page, ops_cl);
+       return container_of_safe(slice, struct osc_page, ops_cl);
 }
 
 static inline struct osc_page *oap2osc(struct osc_async_page *oap)
 {
-       return container_of0(oap, struct osc_page, ops_oap);
+       return container_of_safe(oap, struct osc_page, ops_oap);
 }
 
 static inline pgoff_t osc_index(struct osc_page *opg)
@@ -847,7 +861,7 @@ osc_cl_page_osc(struct cl_page *page, struct osc_object *osc)
 
 static inline struct osc_lock *cl2osc_lock(const struct cl_lock_slice *slice)
 {
-       return container_of0(slice, struct osc_lock, ols_cl);
+       return container_of_safe(slice, struct osc_lock, ols_cl);
 }
 
 static inline int osc_io_srvlock(struct osc_io *oio)
@@ -921,7 +935,9 @@ struct osc_extent {
        /** Non-delay RPC should be used for this extent. */
                                oe_ndelay:1,
        /** direct IO pages */
-                               oe_dio:1;
+                               oe_dio:1,
+       /** this extent consists of RDMA only pages */
+                               oe_is_rdma_only;
        /** how many grants allocated for this extent.
         *  Grant allocated for this extent. There is no grant allocated
         *  for reading extents and sync write extents. */