The CephFS kernel client has regression starting from 6.18-rc1. We have issue in ceph_mds_auth_match() if fs_name == NULL: const char fs_name = mdsc->fsc->mount_options->mds_namespace; ... if (auth->match.fs_name && strcmp(auth->match.fs_name, fs_name)) { / fsname mismatch, try next one */ return 0; } Patrick Donnelly suggested that: In summary, we should definitely start decoding `fs_name` from the MDSMap and do strict authorizations checks against it. Note that the `-o mds_namespace=foo` should only be used for selecting the file system to mount and nothing else. It's possible no mds_namespace is specified but the kernel will mount the only file system that exists which may have name "foo". This patch reworks ceph_mdsmap_decode() and namespace_equals() with the goal of supporting the suggested concept. Now struct ceph_mdsmap contains m_fs_name field that receives copy of extracted FS name by ceph_extract_encoded_string(). For the case of "old" CephFS file systems, it is used "cephfs" name. [ idryomov: replace redundant %*pE with %s in ceph_mdsmap_decode(), get rid of a series of strlen() calls in ceph_namespace_match(), drop changes to namespace_equals() body to avoid treating empty mds_namespace as equal, drop changes to ceph_mdsc_handle_fsmap() as namespace_equals() isn't an equivalent substitution there ]
Showing the changes to include/linux (1 of 5 files). Show all
Unified · Split
| @@ -31,6 +31,12 @@ · 30 unmodified lines | |||
| 31 | #define CEPH_INO_CEPH 2 /* hidden .ceph dir */ | 31 | #define CEPH_INO_CEPH 2 /* hidden .ceph dir */ |
| 32 | #define CEPH_INO_GLOBAL_SNAPREALM 3 /* global dummy snaprealm */ | 32 | #define CEPH_INO_GLOBAL_SNAPREALM 3 /* global dummy snaprealm */ |
| 33 | 33 | ||
| 34 | /* | ||
| 35 | * name for "old" CephFS file systems, | ||
| 36 | * see ceph.git e2b151d009640114b2565c901d6f41f6cd5ec652 | ||
| 37 | */ | ||
| 38 | #define CEPH_OLD_FS_NAME "cephfs" | ||
| 39 | |||
| 34 | /* arbitrary limit on max # of monitors (cluster of 3 is typical) */ | 40 | /* arbitrary limit on max # of monitors (cluster of 3 is typical) */ |
| 35 | #define CEPH_MAX_MON 31 | 41 | #define CEPH_MAX_MON 31 |
| 36 | 42 | ||