diff mbox

ceph: fix reset_readdir()

Message ID 1393578791-19917-1-git-send-email-zheng.z.yan@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Yan, Zheng Feb. 28, 2014, 9:13 a.m. UTC
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(-)

Comments

Alex Elder Feb. 28, 2014, 2:07 p.m. UTC | #1
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 */
> 

--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

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 */