]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: add ceph.dir.subvolume get vxattr 65104/head
authorEdwin Rodriguez <edwin.rodriguez1@ibm.com>
Mon, 18 Aug 2025 20:17:07 +0000 (16:17 -0400)
committerEdwin Rodriguez <edwin.rodriguez1@ibm.com>
Wed, 17 Sep 2025 11:54:29 +0000 (07:54 -0400)
This introduces handling for the "ceph.dir.subvolume" virtual xattr on directories.
- Returns ASCII "1" when the directory is a subvolume root, "0" otherwise.

QA:
- Extend CephFS subvolume tests to validate vxattr retrieval and behavior around setting/removal.

Fixes: https://tracker.ceph.com/issues/72556
Signed-off-by: Edwin Rodriguez <edwin.rodriguez1@ibm.com>
qa/tasks/cephfs/test_subvolume.py
src/mds/Server.cc
src/mds/Server.h

index 9a1755b21f4b822448539e323c5154c6b8dc1090..6d2f62d3d3f646873d108164b73418fc312c3871 100644 (file)
@@ -213,6 +213,28 @@ class TestSubvolume(CephFSTestCase):
         # cleanup
         self.mount_a.run_shell(['rm', '-rf', 'group/subvol3'])
 
+
+    def test_subvolume_vxattr_retrieval(self):
+        """
+        To verify that the ceph.dir.subvolume vxattr can be acquired using getfattr
+        """
+        # create subvolume dir
+        subvol_dir:str = 'group/subvol5'
+        self.mount_a.run_shell(['mkdir', subvol_dir])
+        mkdir_fattr = self.mount_a.getfattr(subvol_dir, 'ceph.dir.subvolume')
+        self.assertEqual('0', mkdir_fattr)
+
+        self.mount_a.setfattr(subvol_dir, 'ceph.dir.subvolume', '1')
+        new_fattr:str = self.mount_a.getfattr(subvol_dir, 'ceph.dir.subvolume')
+        self.assertEqual('1', new_fattr)
+
+        # clear subvolume flag
+        self.mount_a.removexattr(subvol_dir, 'ceph.dir.subvolume')
+
+        # cleanup
+        self.mount_a.run_shell(['rm', '-rf', subvol_dir])
+
+
 class TestSubvolumeReplicated(CephFSTestCase):
     CLIENTS_REQUIRED = 1
     MDSS_REQUIRED = 2
index fdfd5d3e08ad596ce4eca36183cac4d3a2000eb1..2c04de6aa6ac4bd7b36ffa6f67cb5f1fe0314714 100644 (file)
@@ -7284,6 +7284,9 @@ void Server::handle_client_getvxattr(const MDRequestRef& mdr)
       // since we only handle ceph vxattrs here
       r = -ENODATA; // no such attribute
     }
+  } else if (xattr_name == "ceph.dir.subvolume"sv) {
+    const auto* srnode = cur->get_projected_srnode();
+    *css << (srnode && srnode->is_subvolume() ? "1"sv : "0"sv);
   } else {
     // otherwise respond as invalid request
     // since we only handle ceph vxattrs here
index 234afe0f533b3f1bdda257ac56a7b59cba106d76..9ee5a9b687956ffd2b1b840ec089f8a0c9c5ade6 100644 (file)
@@ -505,21 +505,22 @@ private:
 
   static bool is_ceph_dir_vxattr(std::string_view xattr_name) {
     return xattr_name == "ceph.dir.layout" ||
-           xattr_name == "ceph.dir.layout.json" ||
-           xattr_name == "ceph.dir.layout.object_size" ||
-           xattr_name == "ceph.dir.layout.stripe_unit" ||
-           xattr_name == "ceph.dir.layout.stripe_count" ||
-           xattr_name == "ceph.dir.layout.pool" ||
-           xattr_name == "ceph.dir.layout.pool_name" ||
-           xattr_name == "ceph.dir.layout.pool_id" ||
-           xattr_name == "ceph.dir.layout.pool_namespace" ||
-           xattr_name == "ceph.dir.pin" ||
-           xattr_name == "ceph.dir.pin.random" ||
-           xattr_name == "ceph.dir.pin.distributed" ||
-            xattr_name == "ceph.dir.charmap"sv ||
-            xattr_name == "ceph.dir.normalization"sv ||
-            xattr_name == "ceph.dir.encoding"sv ||
-            xattr_name == "ceph.dir.casesensitive"sv;
+          xattr_name == "ceph.dir.layout.json" ||
+          xattr_name == "ceph.dir.layout.object_size" ||
+          xattr_name == "ceph.dir.layout.stripe_unit" ||
+          xattr_name == "ceph.dir.layout.stripe_count" ||
+          xattr_name == "ceph.dir.layout.pool" ||
+          xattr_name == "ceph.dir.layout.pool_name" ||
+          xattr_name == "ceph.dir.layout.pool_id" ||
+          xattr_name == "ceph.dir.layout.pool_namespace" ||
+          xattr_name == "ceph.dir.pin" ||
+          xattr_name == "ceph.dir.pin.random" ||
+          xattr_name == "ceph.dir.pin.distributed" ||
+          xattr_name == "ceph.dir.charmap"sv ||
+          xattr_name == "ceph.dir.normalization"sv ||
+          xattr_name == "ceph.dir.encoding"sv ||
+          xattr_name == "ceph.dir.casesensitive"sv ||
+          xattr_name == "ceph.dir.subvolume"sv;
   }
 
   static bool is_ceph_file_vxattr(std::string_view xattr_name) {