- struct dt_object ldo_obj;
-
- /* if object is striped, then the next fields describe stripes */
- /* For striped directory, ldo_stripenr == slave stripe count */
- __u16 ldo_stripenr;
- __u16 ldo_layout_gen;
- __u32 ldo_stripe_size;
- __u32 ldo_pattern;
- __u16 ldo_released_stripenr;
- char *ldo_pool;
- struct dt_object **ldo_stripe;
- /* to know how much memory to free, ldo_stripenr can be less */
- /* default striping for directory represented by this object
- * is cached in stripenr/stripe_size */
- unsigned int ldo_stripes_allocated:16,
- ldo_striping_cached:1,
- ldo_def_striping_set:1,
- ldo_def_striping_cached:1,
- /* ldo_dir_slave_stripe indicate this is a slave stripe of
- * a striped dir */
- ldo_dir_slave_stripe:1;
- __u32 ldo_def_stripe_size;
- __u16 ldo_def_stripenr;
- __u16 ldo_def_stripe_offset;
- struct lod_dir_stripe_info *ldo_dir_stripe;
+ struct dt_object ldo_obj;
+ union {
+ /* file stripe */
+ struct {
+ /*
+ * don't change field order, because both file and
+ * directory use ldo_stripenr/ldo_stripes_allocated
+ * to access stripe number.
+ */
+ __u16 ldo_stripenr;
+ __u16 ldo_stripes_allocated;
+ __u16 ldo_layout_gen;
+ __u16 ldo_released_stripenr;
+ __u32 ldo_pattern;
+ __u32 ldo_stripe_size;
+ __u16 ldo_stripe_offset;
+ char *ldo_pool;
+ };
+ /* directory stripe */
+ struct {
+ __u16 ldo_dir_stripenr;
+ __u16 ldo_dir_stripes_allocated;
+ __u32 ldo_dir_stripe_offset;
+ __u32 ldo_dir_hash_type;
+ __u32 ldo_dir_slave_stripe:1,
+ ldo_dir_striped:1;
+ /*
+ * default striping is not cached, so this field is
+ * invalid after create, make sure it's used by
+ * lod_dir_striping_create_internal() only.
+ */
+ struct lod_default_striping *ldo_def_striping;
+ };
+ };
+ struct dt_object **ldo_stripe;