]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: should not permit update image metadata via snapshot 37417/head
authorsongweibin <song.weibin@zte.com.cn>
Thu, 24 Sep 2020 11:48:28 +0000 (19:48 +0800)
committersongweibin <song.weibin@zte.com.cn>
Sat, 26 Sep 2020 11:03:47 +0000 (19:03 +0800)
Fixes: https://github.com/ceph/ceph/pull/37121
Signed-off-by: songweibin <song.weibin@zte.com.cn>
src/librbd/Operations.cc
src/test/librbd/test_librbd.cc

index 8aeebe00fa33a202dc29f32eb4b86bb69ac60d19..7db2c0361d320269bc4927b79824d39eeeafa1c0 100644 (file)
@@ -1486,7 +1486,7 @@ int Operations<I>::metadata_set(const std::string &key,
 
   r = invoke_async_request("metadata_set",
                            exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL,
-                           true,
+                           false,
                            boost::bind(&Operations<I>::execute_metadata_set,
                                        this, key, value, _1),
                            boost::bind(&ImageWatcher<I>::notify_metadata_set,
@@ -1545,7 +1545,7 @@ int Operations<I>::metadata_remove(const std::string &key) {
 
   r = invoke_async_request("metadata_remove",
                            exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL,
-                           true,
+                           false,
                            boost::bind(&Operations<I>::execute_metadata_remove,
                                        this, key, _1),
                            boost::bind(&ImageWatcher<I>::notify_metadata_remove,
index 2afd8aac703b0cd68c039ea4d3efece3d1ec8f99..f62065099fad90a58d8091ed3c5f162849c90139 100644 (file)
@@ -5487,8 +5487,8 @@ TEST_F(TestLibRBD, Metadata)
   ASSERT_EQ(0, rbd_snap_protect(image1, "snap1"));
   ASSERT_EQ(0, rbd_snap_set(image1, "snap1"));
 
-  ASSERT_EQ(0, rbd_metadata_set(image1, "key1", "value1"));
-  ASSERT_EQ(0, rbd_metadata_set(image1, "key3", "value3"));
+  ASSERT_EQ(-EROFS, rbd_metadata_set(image1, "key1", "value1"));
+  ASSERT_EQ(-EROFS, rbd_metadata_remove(image1, "key2"));
 
   keys_len = sizeof(keys);
   vals_len = sizeof(vals);
@@ -5496,18 +5496,14 @@ TEST_F(TestLibRBD, Metadata)
   memset_rand(vals, vals_len);
   ASSERT_EQ(0, rbd_metadata_list(image1, "key", 0, keys, &keys_len, vals,
                                  &vals_len));
-  ASSERT_EQ(keys_len,
-            strlen("key1") + 1 + strlen("key2") + 1 + strlen("key3") + 1);
-  ASSERT_EQ(vals_len,
-            strlen("value1") + 1 + strlen("value2") + 1 + strlen("value3") + 1);
-  ASSERT_STREQ(keys, "key1");
-  ASSERT_STREQ(keys + strlen("key1") + 1, "key2");
-  ASSERT_STREQ(keys + strlen("key1") + 1 + strlen("key2") + 1, "key3");
-  ASSERT_STREQ(vals, "value1");
-  ASSERT_STREQ(vals + strlen("value1") + 1, "value2");
-  ASSERT_STREQ(vals + strlen("value1") + 1 + strlen("value2") + 1, "value3");
+  ASSERT_EQ(keys_len, strlen("key2") + 1);
+  ASSERT_EQ(vals_len, strlen("value2") + 1);
+  ASSERT_STREQ(keys, "key2");
+  ASSERT_STREQ(vals, "value2");
 
   ASSERT_EQ(0, rbd_snap_set(image1, NULL));
+  ASSERT_EQ(0, rbd_metadata_set(image1, "key1", "value1"));
+  ASSERT_EQ(0, rbd_metadata_set(image1, "key3", "value3"));
   keys_len = sizeof(keys);
   vals_len = sizeof(vals);
   memset_rand(keys, keys_len);
@@ -5650,15 +5646,15 @@ TEST_F(TestLibRBD, MetadataPP)
   ASSERT_EQ(0, image1.snap_set("snap1"));
 
   pairs.clear();
-  ASSERT_EQ(0, image1.metadata_set("key1", "value1"));
-  ASSERT_EQ(0, image1.metadata_set("key3", "value3"));
+  ASSERT_EQ(-EROFS, image1.metadata_set("key1", "value1"));
+  ASSERT_EQ(-EROFS, image1.metadata_remove("key2"));
   ASSERT_EQ(0, image1.metadata_list("key", 0, &pairs));
-  ASSERT_EQ(3U, pairs.size());
-  ASSERT_EQ(0, strncmp("value1", pairs["key1"].c_str(), 6));
+  ASSERT_EQ(1U, pairs.size());
   ASSERT_EQ(0, strncmp("value2", pairs["key2"].c_str(), 6));
-  ASSERT_EQ(0, strncmp("value3", pairs["key3"].c_str(), 6));
 
   ASSERT_EQ(0, image1.snap_set(NULL));
+  ASSERT_EQ(0, image1.metadata_set("key1", "value1"));
+  ASSERT_EQ(0, image1.metadata_set("key3", "value3"));
   ASSERT_EQ(0, image1.metadata_list("key", 0, &pairs));
   ASSERT_EQ(3U, pairs.size());
   ASSERT_EQ(0, strncmp("value1", pairs["key1"].c_str(), 6));