| From e2ca070217909fdfa3a3f8f125bcd76943d81431 Mon Sep 17 00:00:00 2001 |
| From: Jeff Layton <jlayton@redhat.com> |
| Date: Thu, 12 Jan 2017 14:42:39 -0500 |
| Subject: [PATCH] ceph: fix endianness bug in frag_tree_split_cmp |
| |
| commit fe2ed42517533068ac03eed5630fffafff27eacf upstream. |
| |
| sparse says: |
| |
| fs/ceph/inode.c:308:36: warning: incorrect type in argument 1 (different base types) |
| fs/ceph/inode.c:308:36: expected unsigned int [unsigned] [usertype] a |
| fs/ceph/inode.c:308:36: got restricted __le32 [usertype] frag |
| fs/ceph/inode.c:308:46: warning: incorrect type in argument 2 (different base types) |
| fs/ceph/inode.c:308:46: expected unsigned int [unsigned] [usertype] b |
| fs/ceph/inode.c:308:46: got restricted __le32 [usertype] frag |
| |
| We need to convert these values to host-endian before calling the |
| comparator. |
| |
| Fixes: a407846ef7c6 ("ceph: don't assume frag tree splits in mds reply are sorted") |
| Signed-off-by: Jeff Layton <jlayton@redhat.com> |
| Reviewed-by: Sage Weil <sage@redhat.com> |
| Signed-off-by: Ilya Dryomov <idryomov@gmail.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c |
| index dd3a6dbf71eb..0beeec543329 100644 |
| --- a/fs/ceph/inode.c |
| +++ b/fs/ceph/inode.c |
| @@ -308,7 +308,8 @@ static int frag_tree_split_cmp(const void *l, const void *r) |
| { |
| struct ceph_frag_tree_split *ls = (struct ceph_frag_tree_split*)l; |
| struct ceph_frag_tree_split *rs = (struct ceph_frag_tree_split*)r; |
| - return ceph_frag_compare(ls->frag, rs->frag); |
| + return ceph_frag_compare(le32_to_cpu(ls->frag), |
| + le32_to_cpu(rs->frag)); |
| } |
| |
| static bool is_frag_child(u32 f, struct ceph_inode_frag *frag) |
| -- |
| 2.10.1 |
| |