]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
librados: linger callbacks hold a reference to LingerOp
authorCasey Bodley <cbodley@redhat.com>
Fri, 26 Sep 2025 21:23:29 +0000 (17:23 -0400)
committerCasey Bodley <cbodley@redhat.com>
Thu, 2 Oct 2025 13:10:40 +0000 (09:10 -0400)
preserve a reference to LingerOp in case their invocation races with
another linger_cancel()

Signed-off-by: Casey Bodley <cbodley@redhat.com>
src/librados/IoCtxImpl.cc

index f49d1c8ec2b6ac9f4baec73a0675a619637843af..02ef3022274552a346894507e07946f61e130934 100644 (file)
@@ -88,25 +88,28 @@ struct CB_notify_Finish {
 
 struct CB_aio_linger_cancel {
   Objecter *objecter;
-  Objecter::LingerOp *linger_op;
+  boost::intrusive_ptr<Objecter::LingerOp> linger_op;
 
-  CB_aio_linger_cancel(Objecter *_objecter, Objecter::LingerOp *_linger_op)
-    : objecter(_objecter), linger_op(_linger_op)
+  CB_aio_linger_cancel(Objecter *_objecter,
+                       boost::intrusive_ptr<Objecter::LingerOp> op)
+    : objecter(_objecter), linger_op(std::move(op))
   {
   }
 
   void operator()() {
-    objecter->linger_cancel(linger_op);
+    objecter->linger_cancel(linger_op.get());
   }
 };
 
 struct C_aio_linger_Complete : public Context {
   AioCompletionImpl *c;
-  Objecter::LingerOp *linger_op;
+  boost::intrusive_ptr<Objecter::LingerOp> linger_op;
   bool cancel;
 
-  C_aio_linger_Complete(AioCompletionImpl *_c, Objecter::LingerOp *_linger_op, bool _cancel)
-    : c(_c), linger_op(_linger_op), cancel(_cancel)
+  C_aio_linger_Complete(AioCompletionImpl *_c,
+                        boost::intrusive_ptr<Objecter::LingerOp> op,
+                        bool _cancel)
+    : c(_c), linger_op(std::move(op)), cancel(_cancel)
   {
     c->get();
   }
@@ -115,7 +118,7 @@ struct C_aio_linger_Complete : public Context {
     if (cancel || r < 0)
       boost::asio::defer(c->io->client->finish_strand,
                         CB_aio_linger_cancel(c->io->objecter,
-                                             linger_op));
+                                             std::move(linger_op)));
 
     c->lock.lock();
     c->rval = r;
@@ -136,8 +139,9 @@ struct C_aio_notify_Complete : public C_aio_linger_Complete {
   bool finished = false;
   int ret_val = 0;
 
-  C_aio_notify_Complete(AioCompletionImpl *_c, Objecter::LingerOp *_linger_op)
-    : C_aio_linger_Complete(_c, _linger_op, false) {
+  C_aio_notify_Complete(AioCompletionImpl *_c,
+                        boost::intrusive_ptr<Objecter::LingerOp> op)
+    : C_aio_linger_Complete(_c, std::move(op), false) {
   }
 
   void handle_ack(int r) {