From ef7e210c3f747bc4c3c8768c7b6407cc91c5c319 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Tue, 21 Apr 2015 12:59:33 -0400 Subject: [PATCH] librbd: better handling for duplicate flatten requests A proxied flatten request could be replayed, resulting in a -EINVAL error code being generated on the second attempt. Filter out that error if it is known the parent did exist before the op started. Fixes: #11370 Backport: hammer Signed-off-by: Jason Dillaman --- src/librbd/internal.cc | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index ac219ad3a7c58..01d415dc542ba 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -2628,6 +2628,14 @@ reprotect_and_return_err: return r; } + { + RWLock::RLocker parent_locker(ictx->parent_lock); + if (ictx->parent_md.spec.pool_id == -1) { + lderr(cct) << "image has no parent" << dendl; + return -EINVAL; + } + } + uint64_t request_id = ictx->async_request_seq.inc(); r = invoke_async_request(ictx, "flatten", boost::bind(&async_flatten, ictx, _1, @@ -2636,9 +2644,13 @@ reprotect_and_return_err: ictx->image_watcher, request_id, boost::ref(prog_ctx))); + if (r < 0 && r != -EINVAL) { + return r; + } + notify_change(ictx->md_ctx, ictx->header_oid, ictx); ldout(cct, 20) << "flatten finished" << dendl; - return r; + return 0; } int async_flatten(ImageCtx *ictx, Context *ctx, ProgressContext &prog_ctx) -- 2.39.5