From patchwork Thu Aug 18 02:19:14 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hidetoshi Seto X-Patchwork-Id: 1075452 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.4) with ESMTP id p7I2JtJx012659 for ; Thu, 18 Aug 2011 02:19:55 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754813Ab1HRCTx (ORCPT ); Wed, 17 Aug 2011 22:19:53 -0400 Received: from fgwmail6.fujitsu.co.jp ([192.51.44.36]:54118 "EHLO fgwmail6.fujitsu.co.jp" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754810Ab1HRCTw (ORCPT ); Wed, 17 Aug 2011 22:19:52 -0400 Received: from m4.gw.fujitsu.co.jp (unknown [10.0.50.74]) by fgwmail6.fujitsu.co.jp (Postfix) with ESMTP id EFD5A3EE0AE for ; Thu, 18 Aug 2011 11:19:50 +0900 (JST) Received: from smail (m4 [127.0.0.1]) by outgoing.m4.gw.fujitsu.co.jp (Postfix) with ESMTP id D888845DE4F for ; Thu, 18 Aug 2011 11:19:50 +0900 (JST) Received: from s4.gw.fujitsu.co.jp (s4.gw.fujitsu.co.jp [10.0.50.94]) by m4.gw.fujitsu.co.jp (Postfix) with ESMTP id B8C8A45DE4D for ; Thu, 18 Aug 2011 11:19:50 +0900 (JST) Received: from s4.gw.fujitsu.co.jp (localhost.localdomain [127.0.0.1]) by s4.gw.fujitsu.co.jp (Postfix) with ESMTP id A44251DB803B for ; Thu, 18 Aug 2011 11:19:50 +0900 (JST) Received: from ml13.s.css.fujitsu.com (ml13.s.css.fujitsu.com [10.240.81.133]) by s4.gw.fujitsu.co.jp (Postfix) with ESMTP id 6DBAC1DB802F for ; Thu, 18 Aug 2011 11:19:50 +0900 (JST) Received: from ml13.css.fujitsu.com (ml13 [127.0.0.1]) by ml13.s.css.fujitsu.com (Postfix) with ESMTP id 1263EFD0018; Thu, 18 Aug 2011 11:19:50 +0900 (JST) Received: from [127.0.0.1] (unknown [10.124.101.131]) by ml13.s.css.fujitsu.com (Postfix) with ESMTP id 9E3C0FD001A; Thu, 18 Aug 2011 11:19:49 +0900 (JST) X-SecurityPolicyCheck-FJ: OK by FujitsuOutboundMailChecker v1.3.1 Received: from FMVDA2A041[10.124.101.131] by FMVDA2A041 (FujitsuOutboundMailChecker v1.3.1/9992[10.124.101.131]); Thu, 18 Aug 2011 11:19:45 +0900 (JST) Message-ID: <4E4C76A2.5080605@jp.fujitsu.com> Date: Thu, 18 Aug 2011 11:19:14 +0900 From: Hidetoshi Seto User-Agent: Mozilla/5.0 (Windows NT 6.0; rv:6.0) Gecko/20110812 Thunderbird/6.0 MIME-Version: 1.0 To: Li Zefan CC: linux-btrfs@vger.kernel.org, chris.mason@oracle.com Subject: Re: [PATCH] btrfs: fix d_off in the first dirent References: <4E4B888D.6070904@jp.fujitsu.com> <4E4C74F1.1000701@cn.fujitsu.com> In-Reply-To: <4E4C74F1.1000701@cn.fujitsu.com> Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter1.kernel.org [140.211.167.41]); Thu, 18 Aug 2011 02:19:55 +0000 (UTC) (2011/08/18 11:12), Li Zefan wrote: >> diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c >> index 15fceef..9c1297b 100644 >> --- a/fs/btrfs/inode.c >> +++ b/fs/btrfs/inode.c >> @@ -4125,7 +4125,8 @@ static int btrfs_real_readdir(struct file *filp, void *dirent, >> >> /* special case for "." */ >> if (filp->f_pos == 0) { >> - over = filldir(dirent, ".", 1, 1, btrfs_ino(inode), DT_DIR); >> + over = filldir(dirent, ".", 1, >> + filp->f_pos, inode->i_ino, DT_DIR); > > please stick to btrfs_ino(). Wow, I made a misstep on rebase... Here is the updated one. Thanks, H.Seto ===== Since the d_off in the first dirent for "." (that originates from the 4th argument "offset" of filldir() for the 2nd dirent for "..") is wrongly assigned in btrfs_real_readdir(), telldir returns same offset for different locations. | # mkfs.btrfs /dev/sdb1 | # mount /dev/sdb1 fs0 | # cd fs0 | # touch file0 file1 | # ../test | telldir: 0 | readdir: d_off = 2, d_name = "." | telldir: 2 | readdir: d_off = 2, d_name = ".." | telldir: 2 | readdir: d_off = 3, d_name = "file0" | telldir: 3 | readdir: d_off = 2147483647, d_name = "file1" | telldir: 2147483647 To fix this problem, pass filp->f_pos (which is loff_t) instead. | # ../test | telldir: 0 | readdir: d_off = 1, d_name = "." | telldir: 1 | readdir: d_off = 2, d_name = ".." | telldir: 2 | readdir: d_off = 3, d_name = "file0" : At the moment the "offset" for "." is unused because there is no preceding dirent, however it is better to pass filp->f_pos to follow grammatical usage. Signed-off-by: Hidetoshi Seto --- fs/btrfs/inode.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 15fceef..addf025 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -4125,7 +4125,8 @@ static int btrfs_real_readdir(struct file *filp, void *dirent, /* special case for "." */ if (filp->f_pos == 0) { - over = filldir(dirent, ".", 1, 1, btrfs_ino(inode), DT_DIR); + over = filldir(dirent, ".", 1, + filp->f_pos, btrfs_ino(inode), DT_DIR); if (over) return 0; filp->f_pos = 1; @@ -4134,7 +4135,7 @@ static int btrfs_real_readdir(struct file *filp, void *dirent, if (filp->f_pos == 1) { u64 pino = parent_ino(filp->f_path.dentry); over = filldir(dirent, "..", 2, - 2, pino, DT_DIR); + filp->f_pos, pino, DT_DIR); if (over) return 0; filp->f_pos = 2;