static inline bool lov_pattern_supported(__u32 pattern)
{
- return (pattern & ~LOV_PATTERN_F_RELEASED) == LOV_PATTERN_RAID0 ||
- (pattern & ~LOV_PATTERN_F_RELEASED) ==
- (LOV_PATTERN_RAID0 | LOV_PATTERN_OVERSTRIPING) ||
- (pattern & ~LOV_PATTERN_F_RELEASED) == LOV_PATTERN_MDT;
+ __u32 pattern_base = pattern & ~LOV_PATTERN_F_RELEASED;
+
+ return pattern_base == LOV_PATTERN_RAID0 ||
+ pattern_base == (LOV_PATTERN_RAID0 | LOV_PATTERN_OVERSTRIPING) ||
+ pattern_base == LOV_PATTERN_MDT;
}
/* RELEASED and MDT patterns are not valid in many places, so rather than
}
pattern = le32_to_cpu(lmm->lmm_pattern);
- *dom = !!(lov_pattern(pattern) == LOV_PATTERN_MDT);
+ *dom = !!(lov_pattern(pattern) & LOV_PATTERN_MDT);
/* XXX: DoM file verification will be supportted via LU-11081. */
- if (lov_pattern(pattern) == LOV_PATTERN_MDT) {
+ if (lov_pattern(pattern) & LOV_PATTERN_MDT) {
#if 0
if (start != 0) {
CDEBUG(D_LFSCK, "The DoM entry for "DFID" is not "
if (lmm->lmm_magic == LOV_MAGIC_COMP_V1) {
struct lov_comp_md_v1 *comp_v1 = NULL;
struct lov_comp_md_entry_v1 *ent;
- struct lov_user_md_v1 *v1;
+ struct lov_user_md_v1 *v1 = NULL;
__u32 off;
int i = 0;
i, v1->lmm_stripe_count, v1->lmm_stripe_size);
}
+ if (v1 == NULL)
+ GOTO(out, rc = -EINVAL);
+
+ lmm->lmm_stripe_count = v1->lmm_stripe_count;
+ lmm->lmm_stripe_size = v1->lmm_stripe_size;
/**
* Return valid stripe_count and stripe_size instead of 0 for
* DoM files to avoid divide-by-zero for older userspace that
* 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 */
lum = tmp.lb_buf;
- 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++) {
lum = (struct lov_user_md_v1 *)((char *)src + offset);
lum3 = (struct lov_user_md_v3 *)((char *)tgt + offset + shift);
*(struct lov_user_md_v1 *)lum3 = *lum;
- if (lum->lmm_pattern == cpu_to_le32(LOV_PATTERN_MDT)) {
+ if (lum->lmm_pattern & cpu_to_le32(LOV_PATTERN_MDT)) {
lum3->lmm_magic = cpu_to_le32(LOV_USER_MAGIC_V1);
} else {
lum3->lmm_magic = cpu_to_le32(LOV_USER_MAGIC_V3);
if (le32_to_cpu(lum->lmm_magic) != LOV_USER_MAGIC_V1)
/* the i-th component includes pool info */
break;
- if (lum->lmm_pattern == cpu_to_le32(LOV_PATTERN_MDT))
+ if (lum->lmm_pattern & cpu_to_le32(LOV_PATTERN_MDT))
size += sizeof(struct lov_user_md_v1);
else
size += sizeof(struct lov_user_md_v3);
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 striping is already instantiated or INIT'ed DOM? */
static bool lod_is_instantiation_needed(struct lod_layout_component *comp)
{
- 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_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_OVERSTRIPING | LOV_PATTERN_COMPRESS));
return 0;
}
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_V1) {
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
}
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,
else
llapi_printf(LLAPI_MSG_NORMAL, fmt_idx,
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, fmt_idx,
if (!skip_objs && (verbose & VERBOSE_OBJID) &&
((!is_dir && !(lum->lmm_pattern & LOV_PATTERN_F_RELEASED ||
- lov_pattern(lum->lmm_pattern) == LOV_PATTERN_MDT)) ||
+ lov_pattern(lum->lmm_pattern) & LOV_PATTERN_MDT)) ||
(is_dir && (lum->lmm_magic == LOV_USER_MAGIC_SPECIFIC)))) {
char *space = " - ";
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
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;
}