summaryrefslogtreecommitdiff
path: root/fs/ceph
diff options
context:
space:
mode:
authorAlex Markuze <amarkuze@redhat.com>2026-02-10 09:06:24 +0000
committerIlya Dryomov <idryomov@gmail.com>2026-04-22 01:40:23 +0200
commite58103cafff2e3ee2196d6d3347fc47d6e0a047a (patch)
treee39b67ca19573a99cf3536eeee67d896b1db883b /fs/ceph
parent1c439de70b1c3eb3c6bffa8245c16b9fc318f114 (diff)
ceph: handle InodeStat v8 versioned field in reply parsing
Add forward-compatible handling for the new versioned field introduced in InodeStat v8. This patch only skips the field without using it, preparing for future protocol extensions. The v8 encoding adds a versioned sub-structure that needs to be properly decoded and skipped to maintain compatibility with newer MDS versions. Signed-off-by: Alex Markuze <amarkuze@redhat.com> Reviewed-by: Viacheslav Dubeyko <Slava.Dubeyko@ibm.com> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Diffstat (limited to 'fs/ceph')
-rw-r--r--fs/ceph/mds_client.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
index 4fa471d9b3b2..3b534e6522e7 100644
--- a/fs/ceph/mds_client.c
+++ b/fs/ceph/mds_client.c
@@ -232,6 +232,26 @@ static int parse_reply_info_in(void **p, void *end,
info->fscrypt_file_len, bad);
}
}
+
+ /*
+ * InodeStat encoding versions:
+ * v1-v7: various fields added over time
+ * v8: added optmetadata (versioned sub-structure containing
+ * optional inode metadata like charmap for case-insensitive
+ * filesystems). The kernel client doesn't support
+ * case-insensitive lookups, so we skip this field.
+ * v9: added subvolume_id (parsed below)
+ */
+ if (struct_v >= 8) {
+ u32 v8_struct_len;
+
+ /* skip optmetadata versioned sub-structure */
+ ceph_decode_skip_8(p, end, bad); /* struct_v */
+ ceph_decode_skip_8(p, end, bad); /* struct_compat */
+ ceph_decode_32_safe(p, end, v8_struct_len, bad);
+ ceph_decode_skip_n(p, end, v8_struct_len, bad);
+ }
+
*p = end;
} else {
/* legacy (unversioned) struct */