Whamcloud - gitweb
LU-2482 layout: introduce new layout for released files
[fs/lustre-release.git] / lustre / lod / lod_qos.c
index fa7eed8..8a4d1bb 100644 (file)
@@ -1233,6 +1233,7 @@ static int lod_use_defined_striping(const struct lu_env *env,
                GOTO(out, rc = -EINVAL);
        }
 
+       mo->ldo_pattern = le32_to_cpu(v1->lmm_pattern);
        mo->ldo_stripe_size = le32_to_cpu(v1->lmm_stripe_size);
        mo->ldo_stripenr = le16_to_cpu(v1->lmm_stripe_count);
        mo->ldo_layout_gen = le16_to_cpu(v1->lmm_layout_gen);
@@ -1282,10 +1283,14 @@ static int lod_qos_parse_config(const struct lu_env *env,
                RETURN(-EINVAL);
        }
 
-       if (v1->lmm_pattern != 0 && v1->lmm_pattern != LOV_PATTERN_RAID0) {
+       v1->lmm_magic = magic;
+       if (v1->lmm_pattern == 0)
+               v1->lmm_pattern = LOV_PATTERN_RAID0;
+       if (lov_pattern(v1->lmm_pattern) != LOV_PATTERN_RAID0) {
                CERROR("invalid pattern: %x\n", v1->lmm_pattern);
                RETURN(-EINVAL);
        }
+       lo->ldo_pattern = v1->lmm_pattern;
 
        if (v1->lmm_stripe_size)
                lo->ldo_stripe_size = v1->lmm_stripe_size;
@@ -1339,6 +1344,12 @@ static int lod_qos_parse_config(const struct lu_env *env,
        } else
                lod_object_set_pool(lo, NULL);
 
+       /* fixup for released file */
+       if (lo->ldo_pattern & LOV_PATTERN_F_RELEASED) {
+               lo->ldo_released_stripenr = lo->ldo_stripenr;
+               lo->ldo_stripenr = 0;
+       }
+
        RETURN(0);
 }
 
@@ -1376,6 +1387,10 @@ int lod_qos_prep_create(const struct lu_env *env, struct lod_object *lo,
        if (rc)
                GOTO(out, rc);
 
+       /* A released file is being created */
+       if (lo->ldo_stripenr == 0)
+               GOTO(out, rc = 0);
+
        if (likely(lo->ldo_stripe == NULL)) {
                /*
                 * no striping has been created so far