| From: =?utf-8?q?Lu=C3=ADs_Henriques_=3Clhenriques=40suse=2Ede=3E?= |
| Date: Tue, 24 May 2022 17:06:27 +0100 |
| Subject: ceph: use correct index when encoding client supported features |
| Mime-version: 1.0 |
| Content-type: text/plain; charset=UTF-8 |
| Content-transfer-encoding: 8bit |
| Git-commit: fea013e020e6ecc7be75bea0d61697b7e916b44d |
| Patch-mainline: v6.0-rc1 |
| References: bsc#1202822 |
| |
| Feature bits have to be encoded into the correct locations. This hasn't |
| been an issue so far because the only hole in the feature bits was in bit |
| 10 (CEPHFS_FEATURE_RECLAIM_CLIENT), which is located in the 2nd byte. When |
| adding more bits that go beyond the this 2nd byte, the bug will show up. |
| |
| [xiubli: remove incorrect comment for CEPHFS_FEATURES_CLIENT_SUPPORTED] |
| |
| Fixes: 9ba1e224538a ("ceph: allocate the correct amount of extra bytes for the session features") |
| Signed-off-by: Luís Henriques <lhenriques@suse.de> |
| Reviewed-by: Jeff Layton <jlayton@kernel.org> |
| Signed-off-by: Xiubo Li <xiubli@redhat.com> |
| Signed-off-by: Ilya Dryomov <idryomov@gmail.com> |
| |
| |
| fs/ceph/mds_client.c | 7 +++++-- |
| fs/ceph/mds_client.h | 6 ------ |
| 2 files changed, 5 insertions(+), 8 deletions(-) |
| |
| diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c |
| index 33f517d549ce..0aded10375fd 100644 |
| |
| |
| @@ -1220,14 +1220,17 @@ static int encode_supported_features(void **p, void *end) |
| if (count > 0) { |
| size_t i; |
| size_t size = FEATURE_BYTES(count); |
| + unsigned long bit; |
| |
| if (WARN_ON_ONCE(*p + 4 + size > end)) |
| return -ERANGE; |
| |
| ceph_encode_32(p, size); |
| memset(*p, 0, size); |
| - for (i = 0; i < count; i++) |
| - ((unsigned char*)(*p))[i / 8] |= BIT(feature_bits[i] % 8); |
| + for (i = 0; i < count; i++) { |
| + bit = feature_bits[i]; |
| + ((unsigned char *)(*p))[bit / 8] |= BIT(bit % 8); |
| + } |
| *p += size; |
| } else { |
| if (WARN_ON_ONCE(*p + 4 > end)) |
| diff --git a/fs/ceph/mds_client.h b/fs/ceph/mds_client.h |
| index 1140aecd82ce..2a49e331987b 100644 |
| |
| |
| @@ -33,10 +33,6 @@ enum ceph_feature_type { |
| CEPHFS_FEATURE_MAX = CEPHFS_FEATURE_METRIC_COLLECT, |
| }; |
| |
| -/* |
| - * This will always have the highest feature bit value |
| - * as the last element of the array. |
| - */ |
| #define CEPHFS_FEATURES_CLIENT_SUPPORTED { \ |
| 0, 1, 2, 3, 4, 5, 6, 7, \ |
| CEPHFS_FEATURE_MIMIC, \ |
| @@ -45,8 +41,6 @@ enum ceph_feature_type { |
| CEPHFS_FEATURE_MULTI_RECONNECT, \ |
| CEPHFS_FEATURE_DELEG_INO, \ |
| CEPHFS_FEATURE_METRIC_COLLECT, \ |
| - \ |
| - CEPHFS_FEATURE_MAX, \ |
| } |
| #define CEPHFS_FEATURES_CLIENT_REQUIRED {} |
| |
| |