From: junxiang Mu <1948535941@qq.com> Date: Fri, 21 Jun 2024 02:10:21 +0000 (+0800) Subject: rbd: add the validate of the format and clone_format X-Git-Tag: v20.0.0~1476^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=74eee542ba198735fb304c1fee835164552409ee;p=ceph.git rbd: add the validate of the format and clone_format [ idryomov: squash test_unsupported_clone_format() into test_clone_format() ] Fixes: https://tracker.ceph.com/issues/65744 Signed-off-by: junxiang Mu <1948535941@qq.com> Signed-off-by: Ilya Dryomov --- diff --git a/src/librbd/api/Image.cc b/src/librbd/api/Image.cc index 19dc5aa68bd4e..d813242f5f470 100644 --- a/src/librbd/api/Image.cc +++ b/src/librbd/api/Image.cc @@ -570,8 +570,8 @@ int Image::deep_copy(I *src, librados::IoCtx& dest_md_ctx, if (opts.get(RBD_IMAGE_OPTION_FORMAT, &format) != 0) { opts.set(RBD_IMAGE_OPTION_FORMAT, format); } - if (format == 1) { - lderr(cct) << "old format not supported for destination image" << dendl; + if (format != 2) { + lderr(cct) << "unsupported destination image format: " << format << dendl; return -EINVAL; } uint64_t stripe_unit = src->stripe_unit; diff --git a/src/librbd/image/CloneRequest.cc b/src/librbd/image/CloneRequest.cc index 700bd24587649..d2e2547507cb2 100644 --- a/src/librbd/image/CloneRequest.cc +++ b/src/librbd/image/CloneRequest.cc @@ -87,8 +87,8 @@ void CloneRequest::validate_options() { uint64_t format = 0; m_opts.get(RBD_IMAGE_OPTION_FORMAT, &format); - if (format < 2) { - lderr(m_cct) << "format 2 or later required for clone" << dendl; + if (format != 2) { + lderr(m_cct) << "unsupported format for clone: " << format << dendl; complete(-EINVAL); return; } @@ -124,6 +124,12 @@ void CloneRequest::validate_options() { } } + if (m_clone_format < 1 || m_clone_format > 2) { + lderr(m_cct) << "unsupported clone format: " << m_clone_format << dendl; + complete(-EINVAL); + return; + } + if (m_clone_format == 1 && m_parent_io_ctx.get_namespace() != m_ioctx.get_namespace()) { ldout(m_cct, 1) << "clone v2 required for cross-namespace clones" << dendl; diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index dd674f3a9497c..c550053666995 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -638,6 +638,11 @@ int validate_pool(IoCtx &io_ctx, CephContext *cct) { uint64_t format; if (opts.get(RBD_IMAGE_OPTION_FORMAT, &format) != 0) format = cct->_conf.get_val("rbd_default_format"); + + if (format < 1 || format > 2) { + lderr(cct) << "unsupported format: " << format << dendl; + return -EINVAL; + } bool old_format = format == 1; // make sure it doesn't already exist, in either format diff --git a/src/test/pybind/test_rbd.py b/src/test/pybind/test_rbd.py index 5f52888f8eca0..47421cc4906a1 100644 --- a/src/test/pybind/test_rbd.py +++ b/src/test/pybind/test_rbd.py @@ -1730,6 +1730,11 @@ class TestClone(object): def test_clone_format(self): clone_name2 = get_temp_image_name() + assert_raises(InvalidArgument, self.rbd.clone, ioctx, image_name, + 'snap1', ioctx, clone_name2, features, clone_format=0) + assert_raises(InvalidArgument, self.rbd.clone, ioctx, image_name, + 'snap1', ioctx, clone_name2, features, clone_format=3) + self.rbd.clone(ioctx, image_name, 'snap1', ioctx, clone_name2, features, clone_format=1) with Image(ioctx, clone_name2) as clone2: