Whamcloud - gitweb
LU-13974 llog: check stale osp object
[fs/lustre-release.git] / lustre / include / dt_object.h
index 79f6ac3..0330989 100644 (file)
@@ -88,6 +88,7 @@ struct dt_device_param {
        unsigned int       ddp_brw_size;        /* optimal RPC size */
        /* T10PI checksum type, zero if not supported */
        enum cksum_types   ddp_t10_cksum_type;
+       bool               ddp_has_lseek_data_hole;
 };
 
 /**
@@ -297,6 +298,17 @@ struct dt_device_operations {
                       struct dt_device *dev);
 
        /**
+        * Wait pending quota update finish
+        *
+        * There might be a window that quota usage has been updated,
+        * but commit callback to reduce pending write have not been
+        * finished, this is used to wait all pending update done.
+        *
+        * \param[in] dev       dt device
+        */
+       void (*dt_wait_quota_pending)(struct dt_device *dev);
+
+       /**
         * Start transaction commit asynchronously.
         *
 
@@ -332,19 +344,19 @@ struct dt_index_features {
 };
 
 enum dt_index_flags {
-        /** index supports variable sized keys */
-        DT_IND_VARKEY = 1 << 0,
-        /** index supports variable sized records */
-        DT_IND_VARREC = 1 << 1,
-        /** index can be modified */
-        DT_IND_UPDATE = 1 << 2,
-        /** index supports records with non-unique (duplicate) keys */
-        DT_IND_NONUNQ = 1 << 3,
-        /**
-         * index support fixed-size keys sorted with natural numerical way
-         * and is able to return left-side value if no exact value found
-         */
-        DT_IND_RANGE = 1 << 4,
+       /** index supports variable sized keys */
+       DT_IND_VARKEY = BIT(0),
+       /** index supports variable sized records */
+       DT_IND_VARREC = BIT(1),
+       /** index can be modified */
+       DT_IND_UPDATE = BIT(2),
+       /** index supports records with non-unique (duplicate) keys */
+       DT_IND_NONUNQ = BIT(3),
+       /**
+        * index support fixed-size keys sorted with natural numerical way
+        * and is able to return left-side value if no exact value found
+        */
+       DT_IND_RANGE = BIT(4),
 };
 
 /* for dt_read_lock() and dt_write_lock() object lock rule */
@@ -1051,6 +1063,18 @@ struct dt_object_operations {
        int   (*do_invalidate)(const struct lu_env *env, struct dt_object *dt);
 
        /**
+        * Check object stale state.
+        *
+        * OSP only.
+        *
+        * \param[in] dt        object
+        *
+        * \retval true         for stale object
+        * \retval false        for not stale object
+        */
+       bool (*do_check_stale)(struct dt_object *dt);
+
+       /**
         * Declare intention to instaintiate extended layout component.
         *
         * \param[in] env       execution environment
@@ -1317,11 +1341,21 @@ struct dt_body_operations {
         * then the method should maintain space accounting for the given
         * credentials.
         *
+        * user_size parameter is the apparent size of the file, ie the size
+        * of the clear text version of the file. It can differ from the actual
+        * amount of valuable data received when a file is encrypted,
+        * because encrypted pages always contain PAGE_SIZE bytes of data,
+        * even if clear text data is only a few bytes.
+        * In case of encrypted file, apparent size will be stored as the inode
+        * size, so that servers return to clients an object size they can use
+        * to determine clear text size.
+        *
         * \param[in] env       execution environment for this thread
         * \param[in] dt        object
         * \param[in] lb        array of descriptors for the buffers
         * \param[in] nr        size of the array
         * \param[in] th        transaction handle
+        * \param[in] user_size apparent size
         *
         * \retval 0            on success
         * \retval negative     negated errno on error
@@ -1330,7 +1364,8 @@ struct dt_body_operations {
                                struct dt_object *dt,
                                struct niobuf_local *lb,
                                int nr,
-                               struct thandle *th);
+                               struct thandle *th,
+                               __u64 user_size);
 
        /**
         * Return logical to physical block mapping for a given extent
@@ -1425,8 +1460,8 @@ struct dt_body_operations {
         * \retval negative     negated errno on error
         */
        int (*dbo_declare_fallocate)(const struct lu_env *env,
-                                   struct dt_object *dt,
-                                   struct thandle *th);
+                                   struct dt_object *dt, __u64 start,
+                                   __u64 end, int mode, struct thandle *th);
        /**
         * Allocate specified region for an object
         *
@@ -1446,6 +1481,19 @@ struct dt_body_operations {
                            __u64 end,
                            int mode,
                            struct thandle *th);
+       /**
+        * Do SEEK_HOLE/SEEK_DATA request on object
+        *
+        * \param[in] env       execution environment for this thread
+        * \param[in] dt        object
+        * \param[in] offset    the offset to start seek from
+        * \param[in] whence    seek mode, SEEK_HOLE or SEEK_DATA
+        *
+        * \retval hole/data offset     on success
+        * \retval negative             negated errno on error
+        */
+       loff_t (*dbo_lseek)(const struct lu_env *env, struct dt_object *dt,
+                           loff_t offset, int whence);
 };
 
 /**
@@ -1856,8 +1904,8 @@ static inline int lu_device_is_dt(const struct lu_device *d)
 
 static inline struct dt_device * lu2dt_dev(struct lu_device *l)
 {
-        LASSERT(lu_device_is_dt(l));
-        return container_of0(l, struct dt_device, dd_lu_dev);
+       LASSERT(lu_device_is_dt(l));
+       return container_of_safe(l, struct dt_device, dd_lu_dev);
 }
 
 struct dt_object {
@@ -1892,8 +1940,8 @@ static inline struct lu_device *dt2lu_dev(struct dt_device *d)
 
 static inline struct dt_object *lu2dt(struct lu_object *l)
 {
-        LASSERT(l == NULL || IS_ERR(l) || lu_device_is_dt(l->lo_dev));
-        return container_of0(l, struct dt_object, do_lu);
+       LASSERT(l == NULL || IS_ERR(l) || lu_device_is_dt(l->lo_dev));
+       return container_of_safe(l, struct dt_object, do_lu);
 }
 
 int  dt_object_init(struct dt_object *obj,
@@ -1914,13 +1962,13 @@ static inline int dt_object_remote(const struct dt_object *dt)
 static inline struct dt_object *lu2dt_obj(struct lu_object *o)
 {
        LASSERT(ergo(o != NULL, lu_device_is_dt(o->lo_dev)));
-       return container_of0(o, struct dt_object, do_lu);
+       return container_of_safe(o, struct dt_object, do_lu);
 }
 
 static inline struct dt_object *dt_object_child(struct dt_object *o)
 {
-       return container_of0(lu_object_next(&(o)->do_lu),
-                            struct dt_object, do_lu);
+       return container_of(lu_object_next(&(o)->do_lu),
+                           struct dt_object, do_lu);
 }
 
 /**
@@ -1964,7 +2012,9 @@ struct thandle {
         * including OSTs */
                                th_complex:1,
        /* whether ignore quota */
-                               th_ignore_quota:1;
+                               th_ignore_quota:1,
+       /* whether restart transaction */
+                               th_restart_tran:1;
 };
 
 /**
@@ -2148,6 +2198,17 @@ static inline int dt_object_sync(const struct lu_env *env, struct dt_object *o,
        return o->do_ops->do_object_sync(env, o, start, end);
 }
 
+static inline int dt_fid_alloc(const struct lu_env *env,
+                              struct dt_device *d,
+                              struct lu_fid *fid,
+                              struct lu_object *parent,
+                              const struct lu_name *name)
+{
+       struct lu_device *l = dt2lu_dev(d);
+
+       return l->ld_ops->ldo_fid_alloc(env, l, fid, parent, name);
+}
+
 int dt_declare_version_set(const struct lu_env *env, struct dt_object *o,
                            struct thandle *th);
 void dt_version_set(const struct lu_env *env, struct dt_object *o,
@@ -2221,7 +2282,8 @@ static inline int dt_declare_record_write(const struct lu_env *env,
 
        LASSERTF(dt != NULL, "dt is NULL when we want to write record\n");
        LASSERT(th != NULL);
-       LASSERT(dt->do_body_ops);
+       LASSERTF(dt->do_body_ops, DFID" doesn't exit\n",
+                PFID(lu_object_fid(&dt->do_lu)));
        LASSERT(dt->do_body_ops->dbo_declare_write);
        rc = dt->do_body_ops->dbo_declare_write(env, dt, buf, pos, th);
        return rc;
@@ -2336,6 +2398,15 @@ static inline int dt_write_locked(const struct lu_env *env,
         return dt->do_ops->do_write_locked(env, dt);
 }
 
+static inline bool dt_object_stale(struct dt_object *dt)
+{
+       LASSERT(dt);
+       LASSERT(dt->do_ops);
+       LASSERT(dt->do_ops->do_check_stale);
+
+       return dt->do_ops->do_check_stale(dt);
+}
+
 static inline int dt_declare_attr_get(const struct lu_env *env,
                                      struct dt_object *dt)
 {
@@ -2484,13 +2555,13 @@ static inline int dt_declare_write_commit(const struct lu_env *env,
 
 
 static inline int dt_write_commit(const struct lu_env *env,
-                                  struct dt_object *d, struct niobuf_local *lnb,
-                                  int n, struct thandle *th)
+                                 struct dt_object *d, struct niobuf_local *lnb,
+                                 int n, struct thandle *th, __u64 size)
 {
-        LASSERT(d);
-        LASSERT(d->do_body_ops);
-        LASSERT(d->do_body_ops->dbo_write_commit);
-        return d->do_body_ops->dbo_write_commit(env, d, lnb, n, th);
+       LASSERT(d);
+       LASSERT(d->do_body_ops);
+       LASSERT(d->do_body_ops->dbo_write_commit);
+       return d->do_body_ops->dbo_write_commit(env, d, lnb, n, th, size);
 }
 
 static inline int dt_read_prep(const struct lu_env *env, struct dt_object *d,
@@ -2551,15 +2622,17 @@ static inline int dt_ladvise(const struct lu_env *env, struct dt_object *dt,
        return dt->do_body_ops->dbo_ladvise(env, dt, start, end, advice);
 }
 
-static inline int dt_declare_falloc(const struct lu_env *env,
-                                     struct dt_object *dt, struct thandle *th)
+static inline int dt_declare_fallocate(const struct lu_env *env,
+                                      struct dt_object *dt, __u64 start,
+                                      __u64 end, int mode, struct thandle *th)
 {
        LASSERT(dt);
        if (!dt->do_body_ops)
                return -EOPNOTSUPP;
        LASSERT(dt->do_body_ops);
        LASSERT(dt->do_body_ops->dbo_declare_fallocate);
-       return dt->do_body_ops->dbo_declare_fallocate(env, dt, th);
+       return dt->do_body_ops->dbo_declare_fallocate(env, dt, start, end,
+                                                     mode, th);
 }
 
 static inline int dt_falloc(const struct lu_env *env, struct dt_object *dt,
@@ -2585,6 +2658,17 @@ static inline int dt_fiemap_get(const struct lu_env *env, struct dt_object *d,
         return d->do_body_ops->dbo_fiemap_get(env, d, fm);
 }
 
+static inline loff_t dt_lseek(const struct lu_env *env, struct dt_object *d,
+                             loff_t offset, int whence)
+{
+       LASSERT(d);
+       if (d->do_body_ops == NULL)
+               return -EPROTO;
+       if (d->do_body_ops->dbo_lseek == NULL)
+               return -EOPNOTSUPP;
+       return d->do_body_ops->dbo_lseek(env, d, offset, whence);
+}
+
 static inline int dt_statfs_info(const struct lu_env *env,
                                 struct dt_device *dev,
                                struct obd_statfs *osfs,
@@ -2647,6 +2731,14 @@ static inline int dt_ro(const struct lu_env *env, struct dt_device *dev)
         return dev->dd_ops->dt_ro(env, dev);
 }
 
+static inline void dt_wait_quota_pending(struct dt_device *dev)
+{
+       LASSERT(dev);
+       LASSERT(dev->dd_ops);
+       if (dev->dd_ops->dt_wait_quota_pending)
+               dev->dd_ops->dt_wait_quota_pending(dev);
+}
+
 static inline int dt_declare_insert(const struct lu_env *env,
                                     struct dt_object *dt,
                                     const struct dt_rec *rec,
@@ -2919,7 +3011,7 @@ static inline struct dt_thread_info *dt_info(const struct lu_env *env)
 int dt_global_init(void);
 void dt_global_fini(void);
 int dt_tunables_init(struct dt_device *dt, struct obd_type *type,
-                    const char *name, struct lprocfs_vars *list);
+                    const char *name, struct ldebugfs_vars *list);
 int dt_tunables_fini(struct dt_device *dt);
 
 # ifdef CONFIG_PROC_FS