|
|
@@ -100,6 +100,14 @@ static unsigned fpos_off(loff_t p)
|
|
|
return p & 0xffffffff;
|
|
|
}
|
|
|
|
|
|
+static int fpos_cmp(loff_t l, loff_t r)
|
|
|
+{
|
|
|
+ int v = ceph_frag_compare(fpos_frag(l), fpos_frag(r));
|
|
|
+ if (v)
|
|
|
+ return v;
|
|
|
+ return (int)(fpos_off(l) - fpos_off(r));
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* When possible, we try to satisfy a readdir by peeking at the
|
|
|
* dcache. We make this work by carefully ordering dentries on
|
|
|
@@ -156,7 +164,7 @@ more:
|
|
|
if (!d_unhashed(dentry) && dentry->d_inode &&
|
|
|
ceph_snap(dentry->d_inode) != CEPH_SNAPDIR &&
|
|
|
ceph_ino(dentry->d_inode) != CEPH_INO_CEPH &&
|
|
|
- ctx->pos <= di->offset)
|
|
|
+ fpos_cmp(ctx->pos, di->offset) <= 0)
|
|
|
break;
|
|
|
dout(" skipping %p %.*s at %llu (%llu)%s%s\n", dentry,
|
|
|
dentry->d_name.len, dentry->d_name.name, di->offset,
|