]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
ceph: present consistent fsid, regardless of arch endianness
authorJeff Layton <jlayton@redhat.com>
Mon, 23 Oct 2017 14:58:40 +0000 (10:58 -0400)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 13 Nov 2017 11:11:42 +0000 (12:11 +0100)
Since its inception, ceph has presented the fsid as an opaque value
without any sort of endianness conversion. This means that the value
presented is different on architectures of different endianness.

While the value that should be stuffed into f_fsid is poorly-defined,
I think it would be best to strive for consistency here between
architectures, and clients (we need to present this properly to the
userland client as well).

Change ceph_statfs to convert the opaque words to host-endian before
doing the xor. On an upgrade, a big-endian box may see a different fsid
than it did before, but little-endian arches should see no change with
this patch.

Signed-off-by: Jeff Layton <jlayton@redhat.com>
Reviewed-by: Sage Weil <sage@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
fs/ceph/super.c

index e4082afedcb15a447ee7fd344aa2a3def391d43c..fe9fbb3f13f7c7128c00e103888cbbd8d1136717 100644 (file)
@@ -84,8 +84,9 @@ static int ceph_statfs(struct dentry *dentry, struct kstatfs *buf)
        buf->f_ffree = -1;
        buf->f_namelen = NAME_MAX;
 
-       /* leave fsid little-endian, regardless of host endianness */
-       fsid = *(u64 *)(&monmap->fsid) ^ *((u64 *)&monmap->fsid + 1);
+       /* Must convert the fsid, for consistent values across arches */
+       fsid = le64_to_cpu(*(__le64 *)(&monmap->fsid)) ^
+              le64_to_cpu(*((__le64 *)&monmap->fsid + 1));
        buf->f_fsid.val[0] = fsid & 0xffffffff;
        buf->f_fsid.val[1] = fsid >> 32;