ceph: fix readdir EOVERFLOW on 32-bit archs
One of the readdir filldir_t callers was passing the raw ceph 64-bit ino instead of the hashed 32-bit one, producing an EOVERFLOW in the filler callback. Fix this by calling the ceph_vino_to_ino() helper to do the conversion. Reported-by: Jan Smets <jan.smets@alcatel-lucent.com> Tested-by: Jan Smets <jan.smets@alcatel-lucent.com> Signed-off-by: Sage Weil <sage@newdream.net>
This commit is contained in:
parent
7b88dadc13
commit
3105c19c45
|
@ -358,18 +358,22 @@ more:
|
|||
u64 pos = ceph_make_fpos(frag, off);
|
||||
struct ceph_mds_reply_inode *in =
|
||||
rinfo->dir_in[off - fi->offset].in;
|
||||
struct ceph_vino vino;
|
||||
ino_t ino;
|
||||
|
||||
dout("readdir off %d (%d/%d) -> %lld '%.*s' %p\n",
|
||||
off, off - fi->offset, rinfo->dir_nr, pos,
|
||||
rinfo->dir_dname_len[off - fi->offset],
|
||||
rinfo->dir_dname[off - fi->offset], in);
|
||||
BUG_ON(!in);
|
||||
ftype = le32_to_cpu(in->mode) >> 12;
|
||||
vino.ino = le64_to_cpu(in->ino);
|
||||
vino.snap = le64_to_cpu(in->snapid);
|
||||
ino = ceph_vino_to_ino(vino);
|
||||
if (filldir(dirent,
|
||||
rinfo->dir_dname[off - fi->offset],
|
||||
rinfo->dir_dname_len[off - fi->offset],
|
||||
pos,
|
||||
le64_to_cpu(in->ino),
|
||||
ftype) < 0) {
|
||||
pos, ino, ftype) < 0) {
|
||||
dout("filldir stopping us...\n");
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue