struct lfsck_bookmark *bk = &lfsck->li_bookmark_ram;
struct thandle *handle = NULL;
size_t buflen = buf->lb_len;
+ size_t lovea_size;
struct lov_mds_md_v1 *lmm;
struct lov_ost_data_v1 *objs;
struct lustre_handle lh = { 0 };
if (rc < 0)
GOTO(unlock_layout, rc);
- if (buf->lb_len < rc) {
- lu_buf_realloc(buf, rc);
+ lovea_size = rc;
+ if (buf->lb_len < lovea_size) {
+ lu_buf_realloc(buf, lovea_size);
buflen = buf->lb_len;
if (buf->lb_buf == NULL)
GOTO(unlock_layout, rc = -ENOMEM);
LASSERT(rc != 0);
goto again;
} else if (rc == -ENODATA || rc == 0) {
- rc = lov_mds_md_size(ea_off + 1, LOV_MAGIC_V1);
+ lovea_size = lov_mds_md_size(ea_off + 1, LOV_MAGIC_V1);
/* If the declared is not big enough, re-try. */
- if (buf->lb_len < rc)
+ if (buf->lb_len < lovea_size) {
+ rc = lovea_size;
goto again;
-
+ }
fl = LU_XATTR_CREATE;
} else if (rc < 0) {
GOTO(unlock_parent, rc);
goto again;
} else {
fl = LU_XATTR_REPLACE;
+ lovea_size = rc;
}
if (fl == LU_XATTR_CREATE) {
if (bk->lb_param & LPF_DRYRUN)
GOTO(unlock_parent, rc = 1);
- LASSERT(buf->lb_len >= rc);
+ LASSERT(buf->lb_len >= lovea_size);
- buf->lb_len = rc;
+ buf->lb_len = lovea_size;
rc = lfsck_layout_extend_lovea(env, lfsck, handle, parent, cfid,
buf, fl, ost_idx, ea_off, false);
if (bk->lb_param & LPF_DRYRUN)
GOTO(unlock_parent, rc = 1);
- LASSERT(buf->lb_len >= rc);
+ LASSERT(buf->lb_len >= lovea_size);
- buf->lb_len = rc;
+ buf->lb_len = lovea_size;
memset(lmm, 0, buf->lb_len);
rc = lfsck_layout_extend_lovea(env, lfsck, handle, parent, cfid,
buf, fl, ost_idx, ea_off, true);
if (bk->lb_param & LPF_DRYRUN)
GOTO(unlock_parent, rc = 1);
- rc = lov_mds_md_size(ea_off + 1, magic);
+ lovea_size = lov_mds_md_size(ea_off + 1, magic);
/* If the declared is not big enough, re-try. */
- if (buf->lb_len < rc)
+ if (buf->lb_len < lovea_size) {
+ rc = lovea_size;
goto again;
-
- buf->lb_len = rc;
+ }
+ buf->lb_len = lovea_size;
rc = lfsck_layout_extend_lovea(env, lfsck, handle, parent, cfid,
buf, fl, ost_idx, ea_off, false);
LASSERTF(rc > 0, "invalid rc = %d\n", rc);
- buf->lb_len = rc;
+ buf->lb_len = lovea_size;
for (i = 0; i < count; i++, objs++) {
/* The MDT-object was created via lfsck_layout_recover_create()
* by others before, and we fill the dummy layout EA. */
rc = rc1;
}
+ /* flush all async updating before exit. */
+ dt_sync(env, lfsck->li_next);
+
/* Under force exit case, some requests may be just freed without
* verification, those objects should be re-handled when next run.
* So not update the on-disk tracing file under such case. */