Allow to create file with compression DoM component.
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I8b5c4d5fd18033e796b1c7555c37251e4f7f9a49
Reviewed-on: https://review.whamcloud.com/c/ex/lustre-release/+/51968
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
/* do not reset onsrc as any object matters */
}
- if (opt.o_include_dom && v3->lmm_pattern == LOV_PATTERN_MDT) {
+ if (opt.o_include_dom && (v3->lmm_pattern & LOV_PATTERN_MDT)) {
LX_DEBUG("DoM component\n");
onsrc++;
continue;
v3 = (struct lov_user_md_v3 *)lov_comp_entry(comp_v1, i);
- if (v3->lmm_pattern == LOV_PATTERN_MDT) {
+ if (v3->lmm_pattern & LOV_PATTERN_MDT) {
src_comp_id = mirror_id_of(entry->lcme_id);
} else {
tgt_comp_id = mirror_id_of(entry->lcme_id);
return pattern_base == LOV_PATTERN_RAID0 ||
pattern_base == (LOV_PATTERN_RAID0 | LOV_PATTERN_OVERSTRIPING) ||
pattern_base == (LOV_PATTERN_RAID0 | LOV_PATTERN_COMPRESS) ||
- pattern_base == LOV_PATTERN_MDT;
+ pattern_base == LOV_PATTERN_MDT ||
+ pattern_base == (LOV_PATTERN_MDT | LOV_PATTERN_COMPRESS);
}
/* RELEASED and MDT patterns are not valid in many places, so rather than
* second one is always that applications which are
* doing large IOs.
*/
- if (lmm->lmm_pattern == LOV_PATTERN_MDT)
+ if (lmm->lmm_pattern & LOV_PATTERN_MDT)
i = comp_v1->lcm_entry_count > 1 ? 1 : 0;
else
i = comp_v1->lcm_entry_count > 1 ?
stripe_offset = le16_to_cpu(lum->lmm_stripe_offset);
if (!is_from_disk && stripe_offset != LOV_OFFSET_DEFAULT &&
- lov_pattern(le32_to_cpu(lum->lmm_pattern)) != LOV_PATTERN_MDT) {
+ !(lov_pattern(le32_to_cpu(lum->lmm_pattern)) & LOV_PATTERN_MDT)) {
/* if offset is not within valid range [0, osts_size) */
if (stripe_offset >= d->lod_ost_descs.ltd_tgts_size) {
CDEBUG(D_LAYOUT, "stripe offset %u >= bitmap size %u\n",
case LOV_USER_MAGIC_V1:
case LOV_USER_MAGIC_V3:
case LOV_USER_MAGIC_SPECIFIC:
- if (lov_pattern(le32_to_cpu(lum->lmm_pattern)) ==
+ if (lov_pattern(le32_to_cpu(lum->lmm_pattern)) &
LOV_PATTERN_MDT) {
/* DoM must use composite layout */
CDEBUG(D_LAYOUT, "DoM without composite layout\n");
}
/* Check DoM entry is always the first one */
- if (lov_pattern(le32_to_cpu(lum->lmm_pattern)) ==
+ if (lov_pattern(le32_to_cpu(lum->lmm_pattern)) &
LOV_PATTERN_MDT) {
/* DoM component must be the first in a mirror */
if (le64_to_cpu(ext->e_start) > 0) {
struct lov_desc *desc,
int append_stripes)
{
- if (comp->llc_pattern != LOV_PATTERN_MDT) {
+ if (!(comp->llc_pattern & LOV_PATTERN_MDT)) {
if (append_stripes) {
comp->llc_stripe_count = append_stripes;
} else if (!comp->llc_stripe_count) {
/* check if first entry in new layout is DOM */
lmm = (struct lov_mds_md_v1 *)((char *)merge_lcm +
merge_lcm->lcm_entries[0].lcme_offset);
- merge_has_dom = lov_pattern(le32_to_cpu(lmm->lmm_pattern)) ==
+ merge_has_dom = lov_pattern(le32_to_cpu(lmm->lmm_pattern)) &
LOV_PATTERN_MDT;
for (i = 0; i < merge_entry_count; i++) {
if (lod_comp->llc_pattern & LOV_PATTERN_F_RELEASED)
lod_comp_set_init(lod_comp);
- if (lov_pattern(lod_comp->llc_pattern) == LOV_PATTERN_MDT)
+ if (lov_pattern(lod_comp->llc_pattern) & LOV_PATTERN_MDT)
lod_comp_set_init(lod_comp);
if (lod_comp->llc_stripe == NULL)
if (!lo->ldo_comp_cnt)
return false;
- return (lov_pattern(lo->ldo_comp_entries[0].llc_pattern) ==
+ return (lov_pattern(lo->ldo_comp_entries[0].llc_pattern) &
LOV_PATTERN_MDT);
}
if (comp->llc_magic == LOV_MAGIC_FOREIGN)
return false;
- return !(((lov_pattern(comp->llc_pattern) == LOV_PATTERN_MDT) &&
+ return !(((lov_pattern(comp->llc_pattern) & LOV_PATTERN_MDT) &&
lod_comp_inited(comp)) || comp->llc_stripe);
}
if (v1->lmm_pattern == 0)
v1->lmm_pattern = LOV_PATTERN_RAID0;
- if (lov_pattern(v1->lmm_pattern) != LOV_PATTERN_RAID0 &&
- lov_pattern(v1->lmm_pattern) != LOV_PATTERN_MDT &&
- lov_pattern(v1->lmm_pattern) !=
- (LOV_PATTERN_RAID0 | LOV_PATTERN_COMPRESS) &&
- lov_pattern(v1->lmm_pattern) !=
- (LOV_PATTERN_RAID0 | LOV_PATTERN_OVERSTRIPING)) {
+ if (!lov_pattern_supported(lov_pattern(v1->lmm_pattern))) {
CDEBUG(D_LAYOUT, "%s: invalid pattern: %x\n",
lod2obd(d)->obd_name, v1->lmm_pattern);
GOTO(free_comp, rc = -EINVAL);
lod_comp->llc_stripe_count = desc->ld_default_stripe_count;
if (v1->lmm_stripe_count ||
- lov_pattern(v1->lmm_pattern) == LOV_PATTERN_MDT)
+ (lov_pattern(v1->lmm_pattern) & LOV_PATTERN_MDT))
lod_comp->llc_stripe_count = v1->lmm_stripe_count;
- if (lov_pattern(lod_comp->llc_pattern) == LOV_PATTERN_MDT &&
+ if ((lov_pattern(lod_comp->llc_pattern) & LOV_PATTERN_MDT) &&
lod_comp->llc_stripe_count != 0) {
CDEBUG(D_LAYOUT, "%s: invalid stripe count: %u\n",
lod2obd(d)->obd_name,
RETURN(0);
/* A Data-on-MDT component is being created */
- if (lov_pattern(lod_comp->llc_pattern) == LOV_PATTERN_MDT)
+ if (lov_pattern(lod_comp->llc_pattern) & LOV_PATTERN_MDT)
RETURN(0);
if (lod_comp->llc_pool)
static inline __u32 lov_entry_type(struct lov_stripe_md_entry *lsme)
{
if ((lov_pattern(lsme->lsme_pattern) & LOV_PATTERN_RAID0) ||
- (lov_pattern(lsme->lsme_pattern) == LOV_PATTERN_MDT) ||
+ (lov_pattern(lsme->lsme_pattern) & LOV_PATTERN_MDT) ||
(lov_pattern(lsme->lsme_pattern) == LOV_PATTERN_FOREIGN))
return lov_pattern(lsme->lsme_pattern &
~(LOV_PATTERN_OVERSTRIPING | LOV_PATTERN_COMPRESS));
if (magic != LOV_MAGIC_FOREIGN &&
le16_to_cpu(lmm->lmm_stripe_count) == 0 &&
- lov_pattern(le32_to_cpu(lmm->lmm_pattern)) != LOV_PATTERN_MDT)
+ !(lov_pattern(le32_to_cpu(lmm->lmm_pattern)) & LOV_PATTERN_MDT))
RETURN(ERR_PTR(-EINVAL));
if (magic == LOV_MAGIC_FOREIGN) {
static inline bool lsme_is_dom(struct lov_stripe_md_entry *lsme)
{
- return (lov_pattern(lsme->lsme_pattern) == LOV_PATTERN_MDT);
+ return (lov_pattern(lsme->lsme_pattern) & LOV_PATTERN_MDT);
}
static inline void copy_lsm_entry(struct lov_stripe_md_entry *dst,
v1 = (struct lov_mds_md *)((char *)comp_v1 + off);
/* DoM entry is the first entry always */
- if (lov_pattern(le32_to_cpu(v1->lmm_pattern)) == LOV_PATTERN_MDT)
+ if (lov_pattern(le32_to_cpu(v1->lmm_pattern)) & LOV_PATTERN_MDT)
return le64_to_cpu(comp_v1->lcm_entries[0].lcme_extent.e_end);
return 0;
/* Fast check for DoM entry with no mirroring, should be the first */
if (le16_to_cpu(comp_v1->lcm_mirror_count) == 0 &&
- lov_pattern(le32_to_cpu(v1->lmm_pattern)) != LOV_PATTERN_MDT)
+ !(lov_pattern(le32_to_cpu(v1->lmm_pattern)) & LOV_PATTERN_MDT))
RETURN(0);
/* check all entries otherwise */
off = le32_to_cpu(lcme->lcme_offset);
v1 = (struct lov_mds_md *)((char *)comp_v1 + off);
- if (lov_pattern(le32_to_cpu(v1->lmm_pattern)) ==
+ if (lov_pattern(le32_to_cpu(v1->lmm_pattern)) &
LOV_PATTERN_MDT)
dom_stripesize = le32_to_cpu(v1->lmm_stripe_size);
else
}
run_test 100j "basic debug test for compression"
+test_100k() {
+ (( $MDS1_VERSION >= $(version_code 2.14.0.92) )) ||
+ skip "Need MDS >= 2.14.0.92 for compression support"
+
+ local tf=$DIR/$tdir/$tfile
+ local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
+
+ save_lustre_params client "llite.*.enable_compression" > $p
+ stack_trap "rm -rf $DIR/$tdir; restore_lustre_params < $p" EXIT
+ $LCTL set_param llite.*.enable_compression=1
+
+ test_mkdir $DIR/$tdir
+
+ $LFS setstripe -E1M -L mdt -Z lz4 -E4M -Eeof -Z none $tf ||
+ error "set DoM compress component in $tf failed"
+
+ verify_comp_attr lcme_flags $tf 0x1 init,compress
+ verify_comp_attr compr-type $tf 0x1 lz4
+ verify_comp_attr pattern $tf 0x1 mdt,compress
+ verify_comp_attr pattern $tf 0x2 raid0,compress
+ verify_comp_attr pattern $tf 0x3 raid0
+}
+run_test 100k "create with DoM compression component"
+
export LFS_SETSTRIPE_COMPR_OK=""
complete_test $SECONDS
pool) cmd+=" -p $tf" ;;
comp-start) cmd+=" --component-start $tf" ;;
comp-end) cmd+=" --component-end $tf" ;;
+ compr-type) cmd+=" --compr-type $tf" ;;
+ compr-level) cmd+=" --compr-level $tf" ;;
+ compr-chunk) cmd+= " --compr-chunk $tf" ;;
lcme_flags) cmd+=" $tf | awk '/lcme_flags:/ { print \$2 }'" ;;
+ pattern) cmd+=" $tf | awk '/lmm_pattern:/ { print \$2 }'" ;;
*) error "invalid attribute $attr";;
esac
}
count = param->lsp_stripe_count;
- if (param->lsp_stripe_pattern == LOV_PATTERN_MDT) {
+ if (param->lsp_stripe_pattern & LOV_PATTERN_MDT) {
rc = -EINVAL;
llapi_error(LLAPI_MSG_ERROR, rc,
"Invalid pattern: '-L mdt', must be specified "
space, prefix);
if (is_dir) {
if (!is_raw && lum->lmm_stripe_count == 0 &&
- lov_pattern(lum->lmm_pattern) != LOV_PATTERN_MDT) {
+ !(lov_pattern(lum->lmm_pattern) & LOV_PATTERN_MDT)){
unsigned int scount;
rc = sattr_cache_get_defaults(NULL, path,
lum->lmm_stripe_offset ==
(typeof(lum->lmm_stripe_offset))(-1) ? -1 :
lum->lmm_stripe_offset);
- else if (lov_pattern(lum->lmm_pattern) == LOV_PATTERN_MDT)
+ else if (lov_pattern(lum->lmm_pattern) & LOV_PATTERN_MDT)
llapi_printf(LLAPI_MSG_NORMAL, "0");
else
llapi_printf(LLAPI_MSG_NORMAL, "%u",
if (!is_dir && !skip_objs && (verbose & VERBOSE_OBJID) &&
!(lum->lmm_pattern & LOV_PATTERN_F_RELEASED ||
- lov_pattern(lum->lmm_pattern) == LOV_PATTERN_MDT)) {
+ (lov_pattern(lum->lmm_pattern) & LOV_PATTERN_MDT))) {
char *space = " - ";
if (indent)
else if (v1->lmm_pattern == (LOV_PATTERN_RAID0 |
LOV_PATTERN_OVERSTRIPING))
comp->llc_pattern = LLAPI_LAYOUT_OVERSTRIPING;
- else if (v1->lmm_pattern == LOV_PATTERN_MDT)
+ else if (v1->lmm_pattern & LOV_PATTERN_MDT)
comp->llc_pattern = LLAPI_LAYOUT_MDT;
else
/* Lustre only supports RAID0, overstripping,
case LLAPI_LAYOUT_OVERSTRIPING:
lov_pattern = LOV_PATTERN_OVERSTRIPING | LOV_PATTERN_RAID0;
break;
+ case LLAPI_LAYOUT_RAID0 | LLAPI_LAYOUT_COMPRESS:
+ lov_pattern = LOV_PATTERN_RAID0 | LOV_PATTERN_COMPRESS;
+ break;
+ case LLAPI_LAYOUT_MDT | LLAPI_LAYOUT_COMPRESS:
+ lov_pattern = LOV_PATTERN_MDT | LOV_PATTERN_COMPRESS;
+ break;
default:
lov_pattern = EINVAL;
}
goto out_err;
/* DoM sanity checks */
- if (comp->llc_pattern == LLAPI_LAYOUT_MDT ||
- comp->llc_pattern == LOV_PATTERN_MDT) {
+ if (!(comp->llc_pattern & LLAPI_LAYOUT_INVALID) &&
+ (comp->llc_pattern & (LLAPI_LAYOUT_MDT | LOV_PATTERN_MDT))) {
/* DoM components can't be extension components */
if (comp->llc_flags & LCME_FL_EXTENSION) {
args->lsa_rc = LSE_DOM_EXTENSION;
if (rc)
return -errno;
- if (pattern != LOV_PATTERN_MDT && pattern != LLAPI_LAYOUT_MDT) {
+ if (pattern & LLAPI_LAYOUT_INVALID ||
+ !(pattern & (LOV_PATTERN_MDT | LLAPI_LAYOUT_MDT))) {
*size = 0;
return 0;
}