]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/librbd/io/ImageRequest.h
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / librbd / io / ImageRequest.h
index 0fe10f2c9fe41c45c97145cc77df05ac52f644af..2c05c3847f0d98fb7733e0082fb63472713c1eb9 100644 (file)
@@ -6,10 +6,10 @@
 
 #include "include/int_types.h"
 #include "include/buffer_fwd.h"
-#include "common/snap_types.h"
 #include "common/zipkin_trace.h"
 #include "osd/osd_types.h"
 #include "librbd/Utils.h"
+#include "librbd/Types.h"
 #include "librbd/io/Types.h"
 #include <list>
 #include <utility>
@@ -35,32 +35,34 @@ public:
 
   static void aio_read(ImageCtxT *ictx, AioCompletion *c,
                        Extents &&image_extents, ReadResult &&read_result,
-                       int op_flags, const ZTracer::Trace &parent_trace);
+                       IOContext io_context, int op_flags, int read_flags,
+                       const ZTracer::Trace &parent_trace);
   static void aio_write(ImageCtxT *ictx, AioCompletion *c,
-                        Extents &&image_extents, bufferlist &&bl, int op_flags,
+                        Extents &&image_extents, bufferlist &&bl,
+                        IOContext io_context, int op_flags,
                        const ZTracer::Trace &parent_trace);
   static void aio_discard(ImageCtxT *ictx, AioCompletion *c,
                           Extents &&image_extents,
                           uint32_t discard_granularity_bytes,
+                          IOContext io_context,
                           const ZTracer::Trace &parent_trace);
   static void aio_flush(ImageCtxT *ictx, AioCompletion *c,
                         FlushSource flush_source,
                         const ZTracer::Trace &parent_trace);
   static void aio_writesame(ImageCtxT *ictx, AioCompletion *c,
                             Extents &&image_extents, bufferlist &&bl,
-                            int op_flags, const ZTracer::Trace &parent_trace);
+                            IOContext io_context, int op_flags,
+                            const ZTracer::Trace &parent_trace);
 
   static void aio_compare_and_write(ImageCtxT *ictx, AioCompletion *c,
-                                    Extents &&image_extents, bufferlist &&cmp_bl,
+                                    Extents &&image_extents,
+                                    bufferlist &&cmp_bl,
                                     bufferlist &&bl, uint64_t *mismatch_offset,
-                                    int op_flags, const ZTracer::Trace &parent_trace);
+                                    IOContext io_context, int op_flags,
+                                    const ZTracer::Trace &parent_trace);
 
   void send();
 
-  void set_bypass_image_cache() {
-    m_bypass_image_cache = true;
-  }
-
   inline const ZTracer::Trace &get_trace() const {
     return m_trace;
   }
@@ -71,25 +73,21 @@ protected:
   ImageCtxT &m_image_ctx;
   AioCompletion *m_aio_comp;
   Extents m_image_extents;
+  IOContext m_io_context;
   ZTracer::Trace m_trace;
-  bool m_bypass_image_cache = false;
 
   ImageRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
-               Extents &&image_extents, const char *trace_name,
+               Extents &&image_extents, IOContext io_context,
+               const char *trace_name,
               const ZTracer::Trace &parent_trace)
     : m_image_ctx(image_ctx), m_aio_comp(aio_comp),
-      m_image_extents(std::move(image_extents)),
+      m_image_extents(std::move(image_extents)), m_io_context(io_context),
       m_trace(librbd::util::create_trace(image_ctx, trace_name, parent_trace)) {
     m_trace.event("start");
   }
 
-  virtual bool finish_request_early() {
-    return false;
-  }
-  virtual int clip_request();
   virtual void update_timestamp();
   virtual void send_request() = 0;
-  virtual void send_image_cache_request() = 0;
 
   virtual aio_type_t get_aio_type() const = 0;
   virtual const char *get_request_type() const = 0;
@@ -102,13 +100,11 @@ public:
 
   ImageReadRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
                    Extents &&image_extents, ReadResult &&read_result,
-                   int op_flags, const ZTracer::Trace &parent_trace);
+                   IOContext io_context, int op_flags, int read_flags,
+                   const ZTracer::Trace &parent_trace);
 
 protected:
-  int clip_request() override;
-
   void send_request() override;
-  void send_image_cache_request() override;
 
   aio_type_t get_aio_type() const override {
     return AIO_TYPE_READ;
@@ -118,6 +114,7 @@ protected:
   }
 private:
   int m_op_flags;
+  int m_read_flags;
 };
 
 template <typename ImageCtxT = ImageCtx>
@@ -132,15 +129,15 @@ protected:
   using typename ImageRequest<ImageCtxT>::Extents;
 
   AbstractImageWriteRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
-                            Extents &&image_extents, const char *trace_name,
+                            Extents &&image_extents, IOContext io_context,
+                            const char *trace_name,
                            const ZTracer::Trace &parent_trace)
     : ImageRequest<ImageCtxT>(image_ctx, aio_comp, std::move(image_extents),
-                             trace_name, parent_trace),
+                             io_context, trace_name, parent_trace),
       m_synchronous(false) {
   }
 
   void send_request() override;
-  bool finish_request_early() override;
 
   virtual int prune_object_extents(
       LightweightObjectExtents* object_extents) const {
@@ -148,9 +145,9 @@ protected:
   }
 
   void send_object_requests(const LightweightObjectExtents &object_extents,
-                            const ::SnapContext &snapc, uint64_t journal_tid);
+                            IOContext io_context, uint64_t journal_tid);
   virtual ObjectDispatchSpec *create_object_request(
-      const LightweightObjectExtent &object_extent, const ::SnapContext &snapc,
+      const LightweightObjectExtent &object_extent, IOContext io_context,
       uint64_t journal_tid, bool single_extent, Context *on_finish) = 0;
 
   virtual uint64_t append_journal_event(bool synchronous) = 0;
@@ -166,10 +163,12 @@ public:
   using typename ImageRequest<ImageCtxT>::Extents;
 
   ImageWriteRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
-                    Extents &&image_extents, bufferlist &&bl, int op_flags,
+                    Extents &&image_extents, bufferlist &&bl,
+                    IOContext io_context, int op_flags,
                    const ZTracer::Trace &parent_trace)
     : AbstractImageWriteRequest<ImageCtxT>(
-       image_ctx, aio_comp, std::move(image_extents), "write", parent_trace),
+       image_ctx, aio_comp, std::move(image_extents), io_context, "write",
+        parent_trace),
       m_bl(std::move(bl)), m_op_flags(op_flags) {
   }
 
@@ -186,11 +185,8 @@ protected:
   void assemble_extent(const LightweightObjectExtent &object_extent,
                        bufferlist *bl);
 
-  void send_image_cache_request() override;
-
-
   ObjectDispatchSpec *create_object_request(
-      const LightweightObjectExtent &object_extent, const ::SnapContext &snapc,
+      const LightweightObjectExtent &object_extent, IOContext io_context,
       uint64_t journal_tid, bool single_extent, Context *on_finish) override;
 
   uint64_t append_journal_event(bool synchronous) override;
@@ -206,10 +202,11 @@ class ImageDiscardRequest : public AbstractImageWriteRequest<ImageCtxT> {
 public:
   ImageDiscardRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
                       Extents&& image_extents,
-                     uint32_t discard_granularity_bytes,
+                     uint32_t discard_granularity_bytes, IOContext io_context,
                       const ZTracer::Trace &parent_trace)
     : AbstractImageWriteRequest<ImageCtxT>(
-       image_ctx, aio_comp, std::move(image_extents), "discard", parent_trace),
+       image_ctx, aio_comp, std::move(image_extents), io_context, "discard",
+        parent_trace),
       m_discard_granularity_bytes(discard_granularity_bytes) {
   }
 
@@ -223,10 +220,8 @@ protected:
     return "aio_discard";
   }
 
-  void send_image_cache_request() override;
-
   ObjectDispatchSpec *create_object_request(
-      const LightweightObjectExtent &object_extent, const ::SnapContext &snapc,
+      const LightweightObjectExtent &object_extent, IOContext io_context,
       uint64_t journal_tid, bool single_extent, Context *on_finish) override;
 
   uint64_t append_journal_event(bool synchronous) override;
@@ -245,20 +240,17 @@ public:
   ImageFlushRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
                     FlushSource flush_source,
                     const ZTracer::Trace &parent_trace)
-    : ImageRequest<ImageCtxT>(image_ctx, aio_comp, {}, "flush", parent_trace),
+    : ImageRequest<ImageCtxT>(image_ctx, aio_comp, {}, {}, "flush",
+                              parent_trace),
       m_flush_source(flush_source) {
   }
 
 protected:
   using typename ImageRequest<ImageCtxT>::ObjectRequests;
 
-  int clip_request() override {
-    return 0;
-  }
   void update_timestamp() override {
   }
   void send_request() override;
-  void send_image_cache_request() override;
 
   aio_type_t get_aio_type() const override {
     return AIO_TYPE_FLUSH;
@@ -277,9 +269,10 @@ class ImageWriteSameRequest : public AbstractImageWriteRequest<ImageCtxT> {
 public:
   ImageWriteSameRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
                         Extents&& image_extents, bufferlist &&bl,
-                        int op_flags, const ZTracer::Trace &parent_trace)
+                        IOContext io_context, int op_flags,
+                        const ZTracer::Trace &parent_trace)
     : AbstractImageWriteRequest<ImageCtxT>(
-       image_ctx, aio_comp, std::move(image_extents), "writesame",
+       image_ctx, aio_comp, std::move(image_extents), io_context, "writesame",
         parent_trace),
       m_data_bl(std::move(bl)), m_op_flags(op_flags) {
   }
@@ -294,10 +287,8 @@ protected:
     return "aio_writesame";
   }
 
-  void send_image_cache_request() override;
-
   ObjectDispatchSpec *create_object_request(
-      const LightweightObjectExtent &object_extent, const ::SnapContext &snapc,
+      const LightweightObjectExtent &object_extent, IOContext io_context,
       uint64_t journal_tid, bool single_extent, Context *on_finish) override;
 
   uint64_t append_journal_event(bool synchronous) override;
@@ -315,21 +306,21 @@ public:
   ImageCompareAndWriteRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
                               Extents &&image_extents, bufferlist &&cmp_bl,
                               bufferlist &&bl, uint64_t *mismatch_offset,
-                              int op_flags, const ZTracer::Trace &parent_trace)
+                              IOContext io_context, int op_flags,
+                               const ZTracer::Trace &parent_trace)
       : AbstractImageWriteRequest<ImageCtxT>(
-          image_ctx, aio_comp, std::move(image_extents), "compare_and_write", parent_trace),
+          image_ctx, aio_comp, std::move(image_extents), io_context,
+          "compare_and_write", parent_trace),
         m_cmp_bl(std::move(cmp_bl)), m_bl(std::move(bl)),
         m_mismatch_offset(mismatch_offset), m_op_flags(op_flags) {
   }
 
 protected:
-  void send_image_cache_request() override;
-
   void assemble_extent(const LightweightObjectExtent &object_extent,
                        bufferlist *bl);
 
   ObjectDispatchSpec *create_object_request(
-      const LightweightObjectExtent &object_extent, const ::SnapContext &snapc,
+      const LightweightObjectExtent &object_extent, IOContext io_context,
       uint64_t journal_tid, bool single_extent, Context *on_finish) override;
 
   uint64_t append_journal_event(bool synchronous) override;
@@ -352,6 +343,33 @@ private:
   int m_op_flags;
 };
 
+template <typename ImageCtxT = ImageCtx>
+class ImageListSnapsRequest : public ImageRequest<ImageCtxT> {
+public:
+  using typename ImageRequest<ImageCtxT>::Extents;
+
+  ImageListSnapsRequest(
+      ImageCtxT& image_ctx, AioCompletion* aio_comp,
+      Extents&& image_extents, SnapIds&& snap_ids, int list_snaps_flags,
+      SnapshotDelta* snapshot_delta, const ZTracer::Trace& parent_trace);
+
+protected:
+  void update_timestamp() override {}
+  void send_request() override;
+
+  aio_type_t get_aio_type() const override {
+    return AIO_TYPE_GENERIC;
+  }
+  const char *get_request_type() const override {
+    return "list-snaps";
+  }
+
+private:
+  SnapIds m_snap_ids;
+  int m_list_snaps_flags;
+  SnapshotDelta* m_snapshot_delta;
+};
+
 } // namespace io
 } // namespace librbd
 
@@ -363,5 +381,6 @@ extern template class librbd::io::ImageDiscardRequest<librbd::ImageCtx>;
 extern template class librbd::io::ImageFlushRequest<librbd::ImageCtx>;
 extern template class librbd::io::ImageWriteSameRequest<librbd::ImageCtx>;
 extern template class librbd::io::ImageCompareAndWriteRequest<librbd::ImageCtx>;
+extern template class librbd::io::ImageListSnapsRequest<librbd::ImageCtx>;
 
 #endif // CEPH_LIBRBD_IO_IMAGE_REQUEST_H