#endif
}
+#if defined(WITH_RBD_RWL)
template <typename I>
void DiscardRequest<I>::delete_image_cache_file() {
CephContext *cct = m_image_ctx.cct;
finish();
}
+#endif // WITH_RBD_RWL
+
template <typename I>
void DiscardRequest<I>::finish() {
#if defined(WITH_RBD_RWL)
#include "librbd/api/Config.h"
#include "librbd/api/Image.h"
#include "librbd/api/Io.h"
+#include "librbd/cache/Utils.h"
#include "librbd/exclusive_lock/AutomaticPolicy.h"
#include "librbd/exclusive_lock/StandardPolicy.h"
#include "librbd/deep_copy/MetadataCopyRequest.h"
#include "librbd/image/Types.h"
#include "librbd/io/AioCompletion.h"
#include "librbd/io/ImageRequest.h"
+#include "librbd/io/ImageDispatcherInterface.h"
#include "librbd/io/ObjectDispatcherInterface.h"
#include "librbd/io/ObjectRequest.h"
#include "librbd/io/ReadResult.h"
C_SaferCond ctx;
{
- std::shared_lock owner_locker{ictx->owner_lock};
- ictx->io_object_dispatcher->invalidate_cache(&ctx);
+ ictx->io_image_dispatcher->invalidate_cache(&ctx);
}
r = ctx.wait();
+
+ if (r < 0) {
+ ldout(cct, 20) << "failed to invalidate image cache" << dendl;
+ return r;
+ }
+
ictx->perfcounter->inc(l_librbd_invalidate_cache);
+
+ // Delete writeback cache if it is not initialized
+ if ((!ictx->exclusive_lock ||
+ !ictx->exclusive_lock->is_lock_owner()) &&
+ ictx->test_features(RBD_FEATURE_DIRTY_CACHE)) {
+ C_SaferCond ctx3;
+ librbd::cache::util::discard_cache<>(*ictx, &ctx3);
+ r = ctx3.wait();
+ }
return r;
}
false, features));
ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image, NULL));
+ ASSERT_EQ(0, rbd_invalidate_cache(image));
+
char test_data[TEST_IO_SIZE];
for (size_t i = 0; i < TEST_IO_SIZE; ++i) {
test_data[i] = (char) (rand() % (126 - 33) + 33);