ceph: fix reset_readdir()
When changing readdir postion, fi->next_offset should be set to 0 if the new postion is not in the first dirfrag. Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com> Reviewed-by: Alex Elder <elder@linaro.org>
This commit is contained in:
parent
f049420607
commit
dcd3cc05e5
@ -454,7 +454,7 @@ more:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void reset_readdir(struct ceph_file_info *fi)
|
static void reset_readdir(struct ceph_file_info *fi, unsigned frag)
|
||||||
{
|
{
|
||||||
if (fi->last_readdir) {
|
if (fi->last_readdir) {
|
||||||
ceph_mdsc_put_request(fi->last_readdir);
|
ceph_mdsc_put_request(fi->last_readdir);
|
||||||
@ -462,7 +462,10 @@ static void reset_readdir(struct ceph_file_info *fi)
|
|||||||
}
|
}
|
||||||
kfree(fi->last_name);
|
kfree(fi->last_name);
|
||||||
fi->last_name = NULL;
|
fi->last_name = NULL;
|
||||||
fi->next_offset = 2; /* compensate for . and .. */
|
if (ceph_frag_is_leftmost(frag))
|
||||||
|
fi->next_offset = 2; /* compensate for . and .. */
|
||||||
|
else
|
||||||
|
fi->next_offset = 0;
|
||||||
if (fi->dentry) {
|
if (fi->dentry) {
|
||||||
dput(fi->dentry);
|
dput(fi->dentry);
|
||||||
fi->dentry = NULL;
|
fi->dentry = NULL;
|
||||||
@ -507,7 +510,7 @@ static loff_t ceph_dir_llseek(struct file *file, loff_t offset, int whence)
|
|||||||
fpos_frag(offset) != fi->frag ||
|
fpos_frag(offset) != fi->frag ||
|
||||||
fpos_off(offset) < fi->offset) {
|
fpos_off(offset) < fi->offset) {
|
||||||
dout("dir_llseek dropping %p content\n", file);
|
dout("dir_llseek dropping %p content\n", file);
|
||||||
reset_readdir(fi);
|
reset_readdir(fi, fpos_frag(offset));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* bump dir_release_count if we did a forward seek */
|
/* bump dir_release_count if we did a forward seek */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user