Use DMU_OTN_UINT8_METADATA for local objects so their
data blocks would get an additional ditto copy. This
increases redundancy and hence the chance of recovery
by zpool scrub in the event of corruption.
Change-Id: I502da680521027733ea53744905c47f569a1b531
Signed-off-by: Isaac Huang <he.huang@intel.com>
Test-Parameters: mdtfilesystemtype=zfs mdsfilesystemtype=zfs ostfilesystemtype=zfs
Reviewed-on: http://review.whamcloud.com/13741
Tested-by: Jenkins
Reviewed-by: Alex Zhuravlev <alexey.zhuravlev@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
int __osd_zap_create(const struct lu_env *env, struct osd_device *osd,
dmu_buf_t **zap_dbp, dmu_tx_t *tx, struct lu_attr *la,
uint64_t parent, zap_flags_t flags);
int __osd_zap_create(const struct lu_env *env, struct osd_device *osd,
dmu_buf_t **zap_dbp, dmu_tx_t *tx, struct lu_attr *la,
uint64_t parent, zap_flags_t flags);
-int __osd_object_create(const struct lu_env *env, struct osd_device *osd,
+int __osd_object_create(const struct lu_env *env, struct osd_object *obj,
dmu_buf_t **dbp, dmu_tx_t *tx, struct lu_attr *la,
uint64_t parent);
dmu_buf_t **dbp, dmu_tx_t *tx, struct lu_attr *la,
uint64_t parent);
* dmu_tx_hold_bonus(tx, DMU_NEW_OBJECT) called and then assigned
* to a transaction group.
*/
* dmu_tx_hold_bonus(tx, DMU_NEW_OBJECT) called and then assigned
* to a transaction group.
*/
-int __osd_object_create(const struct lu_env *env, struct osd_device *osd,
+int __osd_object_create(const struct lu_env *env, struct osd_object *obj,
dmu_buf_t **dbp, dmu_tx_t *tx, struct lu_attr *la,
uint64_t parent)
{
dmu_buf_t **dbp, dmu_tx_t *tx, struct lu_attr *la,
uint64_t parent)
{
- uint64_t oid;
- int rc;
+ uint64_t oid;
+ int rc;
+ struct osd_device *osd = osd_obj2dev(obj);
+ const struct lu_fid *fid = lu_object_fid(&obj->oo_dt.do_lu);
+ dmu_object_type_t type = DMU_OT_PLAIN_FILE_CONTENTS;
/* Assert that the transaction has been assigned to a
transaction group. */
LASSERT(tx->tx_txg != 0);
/* Assert that the transaction has been assigned to a
transaction group. */
LASSERT(tx->tx_txg != 0);
+ /* Use DMU_OTN_UINT8_METADATA for local objects so their data blocks
+ * would get an additional ditto copy */
+ if (unlikely(S_ISREG(la->la_mode) &&
+ fid_seq_is_local_file(fid_seq(fid))))
+ type = DMU_OTN_UINT8_METADATA;
+
/* Create a new DMU object. */
/* Create a new DMU object. */
- oid = dmu_object_alloc(osd->od_os, DMU_OT_PLAIN_FILE_CONTENTS, 0,
+ oid = dmu_object_alloc(osd->od_os, type, 0,
DMU_OT_SA, DN_MAX_BONUSLEN, tx);
rc = -sa_buf_hold(osd->od_os, oid, osd_obj_tag, dbp);
LASSERTF(rc == 0, "sa_buf_hold "LPU64" failed: %d\n", oid, rc);
DMU_OT_SA, DN_MAX_BONUSLEN, tx);
rc = -sa_buf_hold(osd->od_os, oid, osd_obj_tag, dbp);
LASSERTF(rc == 0, "sa_buf_hold "LPU64" failed: %d\n", oid, rc);
return __osd_attr_init(env, osd, oid, tx, la, parent);
}
return __osd_attr_init(env, osd, oid, tx, la, parent);
}
-static dmu_buf_t *osd_mkidx(const struct lu_env *env, struct osd_device *osd,
+static dmu_buf_t *osd_mkidx(const struct lu_env *env, struct osd_object *obj,
struct lu_attr *la, uint64_t parent,
struct osd_thandle *oh)
{
struct lu_attr *la, uint64_t parent,
struct osd_thandle *oh)
{
* We set ZAP_FLAG_UINT64_KEY to let ZFS know than we are going to use
* binary keys */
LASSERT(S_ISREG(la->la_mode));
* We set ZAP_FLAG_UINT64_KEY to let ZFS know than we are going to use
* binary keys */
LASSERT(S_ISREG(la->la_mode));
- rc = __osd_zap_create(env, osd, &db, oh->ot_tx, la, parent,
+ rc = __osd_zap_create(env, osd_obj2dev(obj), &db, oh->ot_tx, la, parent,
ZAP_FLAG_UINT64_KEY);
if (rc)
return ERR_PTR(rc);
return db;
}
ZAP_FLAG_UINT64_KEY);
if (rc)
return ERR_PTR(rc);
return db;
}
-static dmu_buf_t *osd_mkdir(const struct lu_env *env, struct osd_device *osd,
+static dmu_buf_t *osd_mkdir(const struct lu_env *env, struct osd_object *obj,
struct lu_attr *la, uint64_t parent,
struct osd_thandle *oh)
{
struct lu_attr *la, uint64_t parent,
struct osd_thandle *oh)
{
int rc;
LASSERT(S_ISDIR(la->la_mode));
int rc;
LASSERT(S_ISDIR(la->la_mode));
- rc = __osd_zap_create(env, osd, &db, oh->ot_tx, la, parent, 0);
+ rc = __osd_zap_create(env, osd_obj2dev(obj), &db,
+ oh->ot_tx, la, parent, 0);
if (rc)
return ERR_PTR(rc);
return db;
}
if (rc)
return ERR_PTR(rc);
return db;
}
-static dmu_buf_t* osd_mkreg(const struct lu_env *env, struct osd_device *osd,
+static dmu_buf_t *osd_mkreg(const struct lu_env *env, struct osd_object *obj,
struct lu_attr *la, uint64_t parent,
struct osd_thandle *oh)
{
struct lu_attr *la, uint64_t parent,
struct osd_thandle *oh)
{
- dmu_buf_t *db;
- int rc;
+ dmu_buf_t *db;
+ int rc;
+ struct osd_device *osd = osd_obj2dev(obj);
LASSERT(S_ISREG(la->la_mode));
LASSERT(S_ISREG(la->la_mode));
- rc = __osd_object_create(env, osd, &db, oh->ot_tx, la, parent);
+ rc = __osd_object_create(env, obj, &db, oh->ot_tx, la, parent);
if (rc)
return ERR_PTR(rc);
if (rc)
return ERR_PTR(rc);
-static dmu_buf_t *osd_mksym(const struct lu_env *env, struct osd_device *osd,
+static dmu_buf_t *osd_mksym(const struct lu_env *env, struct osd_object *obj,
struct lu_attr *la, uint64_t parent,
struct osd_thandle *oh)
{
struct lu_attr *la, uint64_t parent,
struct osd_thandle *oh)
{
int rc;
LASSERT(S_ISLNK(la->la_mode));
int rc;
LASSERT(S_ISLNK(la->la_mode));
- rc = __osd_object_create(env, osd, &db, oh->ot_tx, la, parent);
+ rc = __osd_object_create(env, obj, &db, oh->ot_tx, la, parent);
if (rc)
return ERR_PTR(rc);
return db;
}
if (rc)
return ERR_PTR(rc);
return db;
}
-static dmu_buf_t *osd_mknod(const struct lu_env *env, struct osd_device *osd,
+static dmu_buf_t *osd_mknod(const struct lu_env *env, struct osd_object *obj,
struct lu_attr *la, uint64_t parent,
struct osd_thandle *oh)
{
struct lu_attr *la, uint64_t parent,
struct osd_thandle *oh)
{
if (S_ISCHR(la->la_mode) || S_ISBLK(la->la_mode))
la->la_valid |= LA_RDEV;
if (S_ISCHR(la->la_mode) || S_ISBLK(la->la_mode))
la->la_valid |= LA_RDEV;
- rc = __osd_object_create(env, osd, &db, oh->ot_tx, la, parent);
+ rc = __osd_object_create(env, obj, &db, oh->ot_tx, la, parent);
if (rc)
return ERR_PTR(rc);
return db;
}
typedef dmu_buf_t *(*osd_obj_type_f)(const struct lu_env *env,
if (rc)
return ERR_PTR(rc);
return db;
}
typedef dmu_buf_t *(*osd_obj_type_f)(const struct lu_env *env,
- struct osd_device *osd,
+ struct osd_object *obj,
struct lu_attr *la,
uint64_t parent,
struct osd_thandle *oh);
struct lu_attr *la,
uint64_t parent,
struct osd_thandle *oh);
if (hint && hint->dah_parent)
zapid = osd_dt_obj(hint->dah_parent)->oo_db->db_object;
if (hint && hint->dah_parent)
zapid = osd_dt_obj(hint->dah_parent)->oo_db->db_object;
- db = osd_create_type_f(dof->dof_type)(env, osd, attr, zapid, oh);
+ db = osd_create_type_f(dof->dof_type)(env, obj, attr, zapid, oh);
if (IS_ERR(db))
GOTO(out, rc = PTR_ERR(db));
if (IS_ERR(db))
GOTO(out, rc = PTR_ERR(db));
goto out_sa;
rc = -dmu_free_range(osd->od_os, xa_data_db->db_object,
goto out_sa;
rc = -dmu_free_range(osd->od_os, xa_data_db->db_object,
- 0, DMU_OBJECT_END, tx);
+ 0, DMU_OBJECT_END, tx);
if (rc)
goto out_sa;
} else if (rc == -ENOENT) {
if (rc)
goto out_sa;
} else if (rc == -ENOENT) {
la->la_valid = LA_MODE;
la->la_mode = S_IFREG | S_IRUGO | S_IWUSR;
la->la_valid = LA_MODE;
la->la_mode = S_IFREG | S_IRUGO | S_IWUSR;
- rc = __osd_object_create(env, osd, &xa_data_db, tx, la,
+ rc = __osd_object_create(env, obj, &xa_data_db, tx, la,
obj->oo_xattr);
if (rc)
goto out;
obj->oo_xattr);
if (rc)
goto out;