X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fmdd%2Fmdd_device.c;h=e7923f1e2ce6f4c4cbbcc087e006393068d85b2b;hp=93234249179deb15a1c004d94f4b4b3ecaab4ba5;hb=d813c75df6798efbf3228347628c0d671ca7269c;hpb=6b183927e19715d093c80a35ebc42a1cda5e70e2 diff --git a/lustre/mdd/mdd_device.c b/lustre/mdd/mdd_device.c index 9323424..e7923f1 100644 --- a/lustre/mdd/mdd_device.c +++ b/lustre/mdd/mdd_device.c @@ -344,6 +344,28 @@ static int llog_changelog_cancel_cb(const struct lu_env *env, OBD_RACE(OBD_FAIL_MDS_CHANGELOG_RACE); } + /* Records folow one by one, cr_index++. We could calculate the + * last cr_index at this plain llog. And if it less then cookie endrec + * cancel the whole file. + */ + if ((LLOG_HDR_BITMAP_SIZE(llh->lgh_hdr) - hdr->lrh_index + + rec->cr.cr_index) < cl_cookie->endrec) { + int rc; + + if (unlikely(OBD_FAIL_PRECHECK(OBD_FAIL_MDS_CHANGELOG_DEL))) { + if (cfs_fail_val == 0) { + cfs_fail_val = (unsigned long)llh & 0xFFFFFFFF; + OBD_RACE(OBD_FAIL_MDS_CHANGELOG_DEL); + } + } + rc = llog_destroy(env, llh); + if (!rc) { + CDEBUG(D_HA, "Changelog destroyed plain "DFID"\n", + PFID(&llh->lgh_id.lgl_oi.oi_fid)); + RETURN(LLOG_DEL_PLAIN); + } + } + /* cancel them one at a time. I suppose we could store up the cookies * and cancel them all at once; probably more efficient, but this is * done as a user call, so who cares... */ @@ -725,7 +747,7 @@ int mdd_changelog_write_header(const struct lu_env *env, } reclen = llog_data_len(sizeof(*rec) + len); - buf = lu_buf_check_and_alloc(&mdd_env_info(env)->mti_big_buf, reclen); + buf = lu_buf_check_and_alloc(&mdd_env_info(env)->mti_chlg_buf, reclen); if (buf->lb_buf == NULL) RETURN(-ENOMEM); rec = buf->lb_buf; @@ -1978,6 +2000,7 @@ static void mdd_key_fini(const struct lu_context *ctx, lu_buf_free(&info->mti_big_buf); lu_buf_free(&info->mti_link_buf); lu_buf_free(&info->mti_xattr_buf); + lu_buf_free(&info->mti_chlg_buf); OBD_FREE_PTR(info); }