Whamcloud - gitweb
LU-14688 mdt: changelog purge deletes plain llog
[fs/lustre-release.git] / lustre / obdclass / llog_osd.c
index 6021396..683b622 100644 (file)
@@ -903,9 +903,18 @@ static int llog_osd_next_block(const struct lu_env *env,
        LASSERT(loghandle);
        LASSERT(loghandle->lgh_ctxt);
 
        LASSERT(loghandle);
        LASSERT(loghandle->lgh_ctxt);
 
+       if (OBD_FAIL_PRECHECK(OBD_FAIL_MDS_CHANGELOG_DEL) &&
+           cfs_fail_val == ((unsigned long)loghandle & 0xFFFFFFFF)) {
+               OBD_RACE(OBD_FAIL_MDS_CHANGELOG_DEL);
+               msleep(MSEC_PER_SEC >> 2);
+       }
+
        o = loghandle->lgh_obj;
        LASSERT(o);
        o = loghandle->lgh_obj;
        LASSERT(o);
-       LASSERT(llog_osd_exist(loghandle));
+       dt_read_lock(env, o, 0);
+       if (!llog_osd_exist(loghandle))
+               GOTO(out, rc = -ESTALE); //object was destroyed
+
        dt = lu2dt_dev(o->do_lu.lo_dev);
        LASSERT(dt);
 
        dt = lu2dt_dev(o->do_lu.lo_dev);
        LASSERT(dt);
 
@@ -1050,6 +1059,7 @@ retry:
        }
        GOTO(out, rc = -EIO);
 out:
        }
        GOTO(out, rc = -EIO);
 out:
+       dt_read_unlock(env, o);
        return rc;
 }
 
        return rc;
 }
 
@@ -1094,7 +1104,10 @@ static int llog_osd_prev_block(const struct lu_env *env,
 
        o = loghandle->lgh_obj;
        LASSERT(o);
 
        o = loghandle->lgh_obj;
        LASSERT(o);
-       LASSERT(llog_osd_exist(loghandle));
+       dt_read_lock(env, o, 0);
+       if (!llog_osd_exist(loghandle))
+               GOTO(out, rc = -ESTALE);
+
        dt = lu2dt_dev(o->do_lu.lo_dev);
        LASSERT(dt);
 
        dt = lu2dt_dev(o->do_lu.lo_dev);
        LASSERT(dt);
 
@@ -1177,6 +1190,7 @@ static int llog_osd_prev_block(const struct lu_env *env,
        }
        GOTO(out, rc = -EIO);
 out:
        }
        GOTO(out, rc = -EIO);
 out:
+       dt_read_unlock(env, o);
        return rc;
 }
 
        return rc;
 }