magic != LOV_MAGIC_COMP_V1 && magic != LOV_MAGIC_FOREIGN)
GOTO(unlock, rc = -EINVAL);
- if (magic == LOV_MAGIC_COMP_V1) {
+ /* layout generation must be preserved, otherwise client won't
+ * be able to refresh it having a more recent generation */
+ if (magic == LOV_MAGIC_V1 || magic == LOV_MAGIC_V3) {
+ mo->ldo_is_composite = 0;
+ comp_cnt = 1;
+ mirror_cnt = 0;
+ mo->ldo_layout_gen = le16_to_cpu(v1->lmm_layout_gen);
+ } else if (magic == LOV_MAGIC_COMP_V1) {
comp_v1 = buf->lb_buf;
comp_cnt = le16_to_cpu(comp_v1->lcm_entry_count);
if (comp_cnt == 0)
mo->ldo_flr_state = le16_to_cpu(comp_v1->lcm_flags) &
LCM_FL_FLR_MASK;
mo->ldo_is_composite = 1;
+ mo->ldo_layout_gen = le32_to_cpu(comp_v1->lcm_layout_gen);
} else if (magic == LOV_MAGIC_FOREIGN) {
struct lov_foreign_md *foreign;
size_t length;
memcpy(mo->ldo_foreign_lov, buf->lb_buf, length);
GOTO(out, rc);
} else {
- mo->ldo_is_composite = 0;
- comp_cnt = 1;
- mirror_cnt = 0;
+ GOTO(out, rc = -EINVAL);
}
- mo->ldo_layout_gen = le16_to_cpu(v1->lmm_layout_gen);
rc = lod_alloc_comp_entries(mo, mirror_cnt, comp_cnt);
if (rc)
}
run_test 201 "MDT umount cascading disconnects timeouts"
+test_202() {
+ local td=$DIR/$tdir
+ local tf=$td/$tfile
+
+ (( $MDS1_VERSION >= $(version_code 2.16.0) )) ||
+ (( $MDS1_VERSION < $(version_code v2_15_55-64-g13557aa869) &&
+ $MDS1_VERSION >= $(version_code 2.14.0-ddn178) )) ||
+ (( $MDS1_VERSION < $(version_code 2.14.0-ddn87-14-gf1bd967799) )) ||
+ skip "need MDS with LU-18416 fix for layout version"
+
+ mkdir_on_mdt0 $td || error "can't mkdir"
+ $LFS setstripe -E128M -c1 -Eeof -c2 $td || error "can't setstripe"
+ replay_barrier mds1
+ touch $tf
+ local before=$($LFS getstripe -v $tf|awk '/lcm_layout_gen:/{print $2}')
+ fail mds1
+ cancel_lru_locks mdc
+ local after=$($LFS getstripe -v $tf|awk '/lcm_layout_gen:/{print $2}')
+ (( $before == $after )) || error "layout gen changed: $before -> $after"
+}
+run_test 202 "pfl replay should recovery layout generation"
+
complete_test $SECONDS
check_and_cleanup_lustre