• Hidetoshi Seto's avatar
    btrfs: fix d_off in the first dirent · 3765fefa
    Hidetoshi Seto authored
    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: default avatarHidetoshi Seto <seto.hidetoshi@jp.fujitsu.com>
    Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
    3765fefa
inode.c 197 KB