Whamcloud - gitweb
LU-6142 lustre: convert use of container_of0 in include/
[fs/lustre-release.git] / lustre / include / cl_object.h
index 8795c82..abd341d 100644 (file)
@@ -179,15 +179,15 @@ struct cl_attr {
  * Fields in cl_attr that are being set.
  */
 enum cl_attr_valid {
-       CAT_SIZE   = 1 << 0,
-       CAT_KMS    = 1 << 1,
-       CAT_MTIME  = 1 << 3,
-       CAT_ATIME  = 1 << 4,
-       CAT_CTIME  = 1 << 5,
-       CAT_BLOCKS = 1 << 6,
-       CAT_UID    = 1 << 7,
-       CAT_GID    = 1 << 8,
-       CAT_PROJID = 1 << 9
+       CAT_SIZE        = BIT(0),
+       CAT_KMS         = BIT(1),
+       CAT_MTIME       = BIT(3),
+       CAT_ATIME       = BIT(4),
+       CAT_CTIME       = BIT(5),
+       CAT_BLOCKS      = BIT(6),
+       CAT_UID         = BIT(7),
+       CAT_GID         = BIT(8),
+       CAT_PROJID      = BIT(9),
 };
 
 /**
@@ -1756,6 +1756,31 @@ struct cl_io_rw_common {
        size_t  crw_count;
        int     crw_nonblock;
 };
+enum cl_setattr_subtype {
+       /** regular setattr **/
+       CL_SETATTR_REG = 1,
+       /** truncate(2) **/
+       CL_SETATTR_TRUNC,
+       /** fallocate(2) - mode preallocate **/
+       CL_SETATTR_FALLOCATE
+};
+
+struct cl_io_range {
+       loff_t cir_pos;
+       size_t cir_count;
+};
+
+struct cl_io_pt {
+       struct cl_io_pt *cip_next;
+       struct kiocb cip_iocb;
+       struct iov_iter cip_iter;
+       struct file *cip_file;
+       enum cl_io_type cip_iot;
+       unsigned int cip_need_restart:1;
+       loff_t cip_pos;
+       size_t cip_count;
+       ssize_t cip_result;
+};
 
 /**
  * State for io.
@@ -1804,6 +1829,14 @@ struct cl_io {
                        int                      sa_stripe_index;
                        struct ost_layout        sa_layout;
                        const struct lu_fid     *sa_parent_fid;
+                       /* SETATTR interface is used for regular setattr, */
+                       /* truncate(2) and fallocate(2) subtypes */
+                       enum cl_setattr_subtype  sa_subtype;
+                       /* The following are used for fallocate(2) */
+                       int                      sa_falloc_mode;
+                       loff_t                   sa_falloc_offset;
+                       loff_t                   sa_falloc_len;
+                       loff_t                   sa_falloc_end;
                } ci_setattr;
                struct cl_data_version_io {
                        u64 dv_data_version;
@@ -2018,8 +2051,8 @@ static inline struct cl_site *lu2cl_site(const struct lu_site *site)
 
 static inline struct cl_device *lu2cl_dev(const struct lu_device *d)
 {
-        LASSERT(d == NULL || IS_ERR(d) || lu_device_is_cl(d));
-        return container_of0(d, struct cl_device, cd_lu_dev);
+       LASSERT(d == NULL || IS_ERR(d) || lu_device_is_cl(d));
+       return container_of_safe(d, struct cl_device, cd_lu_dev);
 }
 
 static inline struct lu_device *cl2lu_dev(struct cl_device *d)
@@ -2029,45 +2062,45 @@ static inline struct lu_device *cl2lu_dev(struct cl_device *d)
 
 static inline struct cl_object *lu2cl(const struct lu_object *o)
 {
-        LASSERT(o == NULL || IS_ERR(o) || lu_device_is_cl(o->lo_dev));
-        return container_of0(o, struct cl_object, co_lu);
+       LASSERT(o == NULL || IS_ERR(o) || lu_device_is_cl(o->lo_dev));
+       return container_of_safe(o, struct cl_object, co_lu);
 }
 
 static inline const struct cl_object_conf *
 lu2cl_conf(const struct lu_object_conf *conf)
 {
-        return container_of0(conf, struct cl_object_conf, coc_lu);
+       return container_of_safe(conf, struct cl_object_conf, coc_lu);
 }
 
 static inline struct cl_object *cl_object_next(const struct cl_object *obj)
 {
-        return obj ? lu2cl(lu_object_next(&obj->co_lu)) : NULL;
+       return obj ? lu2cl(lu_object_next(&obj->co_lu)) : NULL;
 }
 
 static inline struct cl_object_header *luh2coh(const struct lu_object_header *h)
 {
-        return container_of0(h, struct cl_object_header, coh_lu);
+       return container_of_safe(h, struct cl_object_header, coh_lu);
 }
 
 static inline struct cl_site *cl_object_site(const struct cl_object *obj)
 {
-        return lu2cl_site(obj->co_lu.lo_dev->ld_site);
+       return lu2cl_site(obj->co_lu.lo_dev->ld_site);
 }
 
 static inline
 struct cl_object_header *cl_object_header(const struct cl_object *obj)
 {
-        return luh2coh(obj->co_lu.lo_header);
+       return luh2coh(obj->co_lu.lo_header);
 }
 
 static inline int cl_device_init(struct cl_device *d, struct lu_device_type *t)
 {
-        return lu_device_init(&d->cd_lu_dev, t);
+       return lu_device_init(&d->cd_lu_dev, t);
 }
 
 static inline void cl_device_fini(struct cl_device *d)
 {
-        lu_device_fini(&d->cd_lu_dev);
+       lu_device_fini(&d->cd_lu_dev);
 }
 
 void cl_page_slice_add(struct cl_page *page, struct cl_page_slice *slice,
@@ -2379,7 +2412,14 @@ static inline int cl_io_is_mkwrite(const struct cl_io *io)
 static inline int cl_io_is_trunc(const struct cl_io *io)
 {
        return io->ci_type == CIT_SETATTR &&
-               (io->u.ci_setattr.sa_avalid & ATTR_SIZE);
+               (io->u.ci_setattr.sa_avalid & ATTR_SIZE) &&
+               (io->u.ci_setattr.sa_subtype != CL_SETATTR_FALLOCATE);
+}
+
+static inline int cl_io_is_fallocate(const struct cl_io *io)
+{
+       return (io->ci_type == CIT_SETATTR) &&
+              (io->u.ci_setattr.sa_subtype == CL_SETATTR_FALLOCATE);
 }
 
 struct cl_io *cl_io_top(struct cl_io *io);