* [PATCH] ceph: fix reset_readdir()
@ 2014-02-28 9:13 Yan, Zheng
2014-02-28 14:07 ` Alex Elder
0 siblings, 1 reply; 2+ messages in thread
From: Yan, Zheng @ 2014-02-28 9:13 UTC (permalink / raw)
To: ceph-devel; +Cc: Yan, Zheng
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>
---
fs/ceph/dir.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c
index a7eaf96..8ce8833 100644
--- a/fs/ceph/dir.c
+++ b/fs/ceph/dir.c
@@ -454,7 +454,7 @@ more:
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) {
ceph_mdsc_put_request(fi->last_readdir);
@@ -462,7 +462,10 @@ static void reset_readdir(struct ceph_file_info *fi)
}
kfree(fi->last_name);
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) {
dput(fi->dentry);
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_off(offset) < fi->offset) {
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 */
--
1.8.5.3
^ permalink raw reply related [flat|nested] 2+ messages in thread* Re: [PATCH] ceph: fix reset_readdir()
2014-02-28 9:13 [PATCH] ceph: fix reset_readdir() Yan, Zheng
@ 2014-02-28 14:07 ` Alex Elder
0 siblings, 0 replies; 2+ messages in thread
From: Alex Elder @ 2014-02-28 14:07 UTC (permalink / raw)
To: Yan, Zheng, ceph-devel
On 02/28/2014 03:13 AM, Yan, Zheng wrote:
> When changing readdir postion, fi->next_offset should be set to 0
> if the new postion is not in the first dirfrag.
Again, looks like this would have been a problem if any
fragment other than the first was being seeked to.
Looks good to me.
Reviewed-by: Alex Elder <elder@linaro.org>
> Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
> ---
> fs/ceph/dir.c | 9 ++++++---
> 1 file changed, 6 insertions(+), 3 deletions(-)
>
> diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c
> index a7eaf96..8ce8833 100644
> --- a/fs/ceph/dir.c
> +++ b/fs/ceph/dir.c
> @@ -454,7 +454,7 @@ more:
> 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) {
> ceph_mdsc_put_request(fi->last_readdir);
> @@ -462,7 +462,10 @@ static void reset_readdir(struct ceph_file_info *fi)
> }
> kfree(fi->last_name);
> 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) {
> dput(fi->dentry);
> 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_off(offset) < fi->offset) {
> 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 */
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2014-02-28 14:07 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-02-28 9:13 [PATCH] ceph: fix reset_readdir() Yan, Zheng
2014-02-28 14:07 ` Alex Elder
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.