The same patch has been posted about one month ago. http://marc.info/?l=linux-btrfs&m=131363399500506&w=2
Thanks, Tsutomu (2011/09/12 5:33), Grazvydas Ignotas wrote: > Currently getdents syscall returns wrong offset for '.' directory entry, > which confuses some programs like wine. This can be observed with an > example program getdents(2) manpage: > > $ ./a.out /testfs/ > --------------- nread=96 --------------- > i-node# file type d_reclen d_off d_name > 256 directory 24 2 . > 256 directory 24 2 .. > 257 regular 24 3 a > 258 regular 24 2147483647 b > > Fix this by passing correct offsets to filldir(). > > Signed-off-by: Grazvydas Ignotas <nota...@gmail.com> > --- > fs/btrfs/inode.c | 5 ++--- > 1 files changed, 2 insertions(+), 3 deletions(-) > > diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c > index 0ccc743..5e7460b 100644 > --- a/fs/btrfs/inode.c > +++ b/fs/btrfs/inode.c > @@ -4125,7 +4125,7 @@ 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, 0, btrfs_ino(inode), DT_DIR); > if (over) > return 0; > filp->f_pos = 1; > @@ -4133,8 +4133,7 @@ static int btrfs_real_readdir(struct file *filp, void > *dirent, > /* special case for .., just use the back ref */ > if (filp->f_pos == 1) { > u64 pino = parent_ino(filp->f_path.dentry); > - over = filldir(dirent, "..", 2, > - 2, pino, DT_DIR); > + over = filldir(dirent, "..", 2, 1, pino, DT_DIR); > if (over) > return 0; > filp->f_pos = 2; -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html