* Author: Alex Zhuravlev <alexey.zhuravlev@intel.com>
*/
-#ifndef EXPORT_SYMTAB
-# define EXPORT_SYMTAB
-#endif
#define DEBUG_SUBSYSTEM S_MDS
#include <obd.h>
}
}
+ if (OBD_FAIL_CHECK(OBD_FAIL_MAKE_LOVEA_HOLE) &&
+ dt_object_exists(next) &&
+ dt_object_remote(next) == 0 && S_ISREG(attr->la_mode)) {
+ struct lod_thread_info *info = lod_env_info(env);
+ struct lu_buf *buf = &info->lti_buf;
+
+ buf->lb_buf = info->lti_ea_store;
+ buf->lb_len = info->lti_ea_store_size;
+ dt_declare_xattr_set(env, next, buf, XATTR_NAME_LOV,
+ LU_XATTR_REPLACE, handle);
+ }
+
+
RETURN(rc);
}
}
}
+ if (OBD_FAIL_CHECK(OBD_FAIL_MAKE_LOVEA_HOLE) &&
+ dt_object_exists(next) &&
+ dt_object_remote(next) == 0 && S_ISREG(attr->la_mode)) {
+ struct lod_thread_info *info = lod_env_info(env);
+ struct lu_buf *buf = &info->lti_buf;
+ struct lov_mds_md_v1 *lmm;
+ struct lov_ost_data_v1 *objs;
+ __u32 magic;
+ int rc1;
+
+ rc1 = lod_get_lov_ea(env, lo);
+ if (rc1 <= 0)
+ RETURN(rc);
+
+ buf->lb_buf = info->lti_ea_store;
+ buf->lb_len = info->lti_ea_store_size;
+ lmm = info->lti_ea_store;
+ magic = le32_to_cpu(lmm->lmm_magic);
+ if (le16_to_cpu(lmm->lmm_stripe_count) >= 2) {
+ if (magic == LOV_MAGIC_V1)
+ objs = &(lmm->lmm_objects[1]);
+ else
+ objs = &((struct lov_mds_md_v3 *)lmm)->lmm_objects[1];
+ memset(objs, 0, sizeof(*objs));
+ dt_xattr_set(env, next, buf, XATTR_NAME_LOV,
+ LU_XATTR_REPLACE, handle, BYPASS_CAPA);
+ }
+ }
+
RETURN(rc);
}
struct lov_desc *desc = &dev->lod_desc;
if (buf->lb_buf == NULL) {
- rc = sizeof(struct lov_user_md_v1);
- } else if (buf->lb_len >= sizeof(struct lov_user_md_v1)) {
- lum->lmm_magic = LOV_USER_MAGIC_V1;
+ rc = sizeof(*lum);
+ } else if (buf->lb_len >= sizeof(*lum)) {
+ lum->lmm_magic = cpu_to_le32(LOV_USER_MAGIC_V1);
lmm_oi_set_seq(&lum->lmm_oi, FID_SEQ_LOV_DEFAULT);
- lum->lmm_pattern = desc->ld_pattern;
- lum->lmm_stripe_size = desc->ld_default_stripe_size;
- lum->lmm_stripe_count = desc->ld_default_stripe_count;
- lum->lmm_stripe_offset = desc->ld_default_stripe_offset;
- rc = sizeof(struct lov_user_md_v1);
+ lmm_oi_cpu_to_le(&lum->lmm_oi, &lum->lmm_oi);
+ lum->lmm_pattern = cpu_to_le32(desc->ld_pattern);
+ lum->lmm_stripe_size = cpu_to_le32(
+ desc->ld_default_stripe_size);
+ lum->lmm_stripe_count = cpu_to_le16(
+ desc->ld_default_stripe_count);
+ lum->lmm_stripe_offset = cpu_to_le16(
+ desc->ld_default_stripe_offset);
+ rc = sizeof(*lum);
} else {
rc = -ERANGE;
}
struct lod_object *l = lod_dt_obj(dt);
struct lov_user_md_v1 *lum;
struct lov_user_md_v3 *v3 = NULL;
+ const char *pool_name = NULL;
int rc;
ENTRY;
l->ldo_def_stripe_size = 0;
l->ldo_def_stripenr = 0;
- LASSERT(buf);
- LASSERT(buf->lb_buf);
+ LASSERT(buf != NULL && buf->lb_buf != NULL);
lum = buf->lb_buf;
- rc = lod_verify_striping(d, buf, 0);
+ rc = lod_verify_striping(d, buf, false);
if (rc)
RETURN(rc);
- if (lum->lmm_magic == LOV_USER_MAGIC_V3)
+ if (lum->lmm_magic == LOV_USER_MAGIC_V3) {
v3 = buf->lb_buf;
+ if (v3->lmm_pool_name[0] != '\0')
+ pool_name = v3->lmm_pool_name;
+ }
/* if { size, offset, count } = { 0, -1, 0 } and no pool
* (i.e. all default values specified) then delete default
(int)lum->lmm_stripe_offset,
v3 ? "from" : "", v3 ? v3->lmm_pool_name : "");
- if (LOVEA_DELETE_VALUES((lum->lmm_stripe_size),
- (lum->lmm_stripe_count),
- (lum->lmm_stripe_offset)) &&
- lum->lmm_magic == LOV_USER_MAGIC_V1) {
+ if (LOVEA_DELETE_VALUES(lum->lmm_stripe_size, lum->lmm_stripe_count,
+ lum->lmm_stripe_offset, pool_name)) {
rc = dt_xattr_del(env, next, name, th, capa);
if (rc == -ENODATA)
rc = 0;
struct dt_allocation_hint *ah,
struct dt_object *parent,
struct dt_object *child,
- cfs_umode_t child_mode)
+ umode_t child_mode)
{
struct lod_device *d = lu2lod_dev(child->do_lu.lo_dev);
struct dt_object *nextp = NULL;
* can be called with local object existing
*/
if (!dt_object_exists(nextc) || dt_object_remote(nextc))
- nextc->do_ops->do_ah_init(env, ah, nextp, nextc, child_mode);
+ nextc->do_ops->do_ah_init(env, ah, dt_object_remote(nextp) ?
+ NULL : nextp, nextc, child_mode);
if (S_ISDIR(child_mode)) {
if (lp->ldo_striping_cached == 0) {
if (LOVEA_DELETE_VALUES(lo->ldo_def_stripe_size,
lo->ldo_def_stripenr,
- lo->ldo_def_stripe_offset))
+ lo->ldo_def_stripe_offset,
+ lo->ldo_pool))
RETURN(0);
OBD_ALLOC_PTR(v3);