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);
|
u64 pos = ceph_make_fpos(frag, off);
|
||||||
struct ceph_mds_reply_inode *in =
|
struct ceph_mds_reply_inode *in =
|
||||||
rinfo->dir_in[off - fi->offset].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",
|
dout("readdir off %d (%d/%d) -> %lld '%.*s' %p\n",
|
||||||
off, off - fi->offset, rinfo->dir_nr, pos,
|
off, off - fi->offset, rinfo->dir_nr, pos,
|
||||||
rinfo->dir_dname_len[off - fi->offset],
|
rinfo->dir_dname_len[off - fi->offset],
|
||||||
rinfo->dir_dname[off - fi->offset], in);
|
rinfo->dir_dname[off - fi->offset], in);
|
||||||
BUG_ON(!in);
|
BUG_ON(!in);
|
||||||
ftype = le32_to_cpu(in->mode) >> 12;
|
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,
|
if (filldir(dirent,
|
||||||
rinfo->dir_dname[off - fi->offset],
|
rinfo->dir_dname[off - fi->offset],
|
||||||
rinfo->dir_dname_len[off - fi->offset],
|
rinfo->dir_dname_len[off - fi->offset],
|
||||||
pos,
|
pos, ino, ftype) < 0) {
|
||||||
le64_to_cpu(in->ino),
|
|
||||||
ftype) < 0) {
|
|
||||||
dout("filldir stopping us...\n");
|
dout("filldir stopping us...\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue