diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2011-09-26 09:04:20 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-09-26 09:04:20 -0700 |
commit | 163b9cf5f8760200e4671f8cbbbf3f585acfa9a6 (patch) | |
tree | 382854a711484caaf49188bb733a6386558e8327 | |
parent | 580ed93841c2915768628e873eff0b26382ed248 (diff) | |
download | stable-queue-163b9cf5f8760200e4671f8cbbbf3f585acfa9a6.tar.gz |
3.0 patches
-rw-r--r-- | queue-3.0/btrfs-fix-d_off-in-the-first-dirent.patch | 74 | ||||
-rw-r--r-- | queue-3.0/series | 1 |
2 files changed, 75 insertions, 0 deletions
diff --git a/queue-3.0/btrfs-fix-d_off-in-the-first-dirent.patch b/queue-3.0/btrfs-fix-d_off-in-the-first-dirent.patch new file mode 100644 index 0000000000..37002a8af2 --- /dev/null +++ b/queue-3.0/btrfs-fix-d_off-in-the-first-dirent.patch @@ -0,0 +1,74 @@ +From 3765fefaee2da83f10829fa64a74e6b7360350cb Mon Sep 17 00:00:00 2001 +From: Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com> +Date: Sun, 18 Sep 2011 10:20:46 -0400 +Subject: btrfs: fix d_off in the first dirent + +From: Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com> + +commit 3765fefaee2da83f10829fa64a74e6b7360350cb upstream. + +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 <seto.hidetoshi@jp.fujitsu.com> +Signed-off-by: Chris Mason <chris.mason@oracle.com> +Cc: Grazvydas Ignotas <notasas@gmail.com> +Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + +--- + fs/btrfs/inode.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +--- a/fs/btrfs/inode.c ++++ b/fs/btrfs/inode.c +@@ -4124,7 +4124,8 @@ static int btrfs_real_readdir(struct fil + + /* 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; +@@ -4133,7 +4134,7 @@ static int btrfs_real_readdir(struct fil + 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; diff --git a/queue-3.0/series b/queue-3.0/series index be92d9bfb6..8db4032424 100644 --- a/queue-3.0/series +++ b/queue-3.0/series @@ -209,3 +209,4 @@ alsa-usb-audio-clear-chip-probing-on-error-exit.patch drm-radeon-kms-fix-ddia-enable-on-some-rs690-systems.patch alsa-fm801-fix-double-free-in-case-of-error-in-tuner-detection.patch alsa-fm801-gracefully-handle-failure-of-tuner-auto-detect.patch +btrfs-fix-d_off-in-the-first-dirent.patch |