diff options
author | Jan Engelhardt <jengelh@medozas.de> | 2009-12-09 17:00:38 -0500 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2010-01-17 20:06:27 -0500 |
commit | 406266ab9ac8ed8b085c58aacd9e3161480dc5d5 (patch) | |
tree | 811d305c4c4fdf6b19279173959d06698a304416 /fs | |
parent | 3a1abec9f6880cf406593c392636199ea1c6c917 (diff) |
btrfs: fix missing last-entry in readdir(3)
parent 49313cdac7b34c9f7ecbb1780cfc648b1c082cd7 (v2.6.32-1-g49313cd)
commit ff48c08e1c05c67e8348ab6f8a24de8034e0e34d
Author: Jan Engelhardt <jengelh@medozas.de>
Date: Wed Dec 9 22:57:36 2009 +0100
Btrfs: fix missing last-entry in readdir(3)
When one does a 32-bit readdir(3), the last entry of a directory is
missing. This is however not due to passing a large value to filldir,
but it seems to have to do with glibc doing telldir or something
quirky. In any case, this patch fixes it in practice.
Signed-off-by: Jan Engelhardt <jengelh@medozas.de>
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/btrfs/inode.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 5440bab23635..d5aa97310943 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -3995,7 +3995,11 @@ skip: | |||
3995 | 3995 | ||
3996 | /* Reached end of directory/root. Bump pos past the last item. */ | 3996 | /* Reached end of directory/root. Bump pos past the last item. */ |
3997 | if (key_type == BTRFS_DIR_INDEX_KEY) | 3997 | if (key_type == BTRFS_DIR_INDEX_KEY) |
3998 | filp->f_pos = INT_LIMIT(off_t); | 3998 | /* |
3999 | * 32-bit glibc will use getdents64, but then strtol - | ||
4000 | * so the last number we can serve is this. | ||
4001 | */ | ||
4002 | filp->f_pos = 0x7fffffff; | ||
3999 | else | 4003 | else |
4000 | filp->f_pos++; | 4004 | filp->f_pos++; |
4001 | nopos: | 4005 | nopos: |