• M
    Btrfs: fix the page that is beyond EOF · 0061280d
    Miao Xie 提交于
    Steps to reproduce:
     # mkfs.btrfs <disk>
     # mount <disk> <mnt>
     # dd if=/dev/zero of=<mnt>/<file> bs=512 seek=5 count=8
     # fallocate -p -o 2048 -l 16384 <mnt>/<file>
     # dd if=/dev/zero of=<mnt>/<file> bs=4096 seek=3 count=8 conv=notrunc,nocreat
     # umount <mnt>
     # dmesg
     WARNING: at fs/btrfs/inode.c:7140 btrfs_destroy_inode+0x2eb/0x330
    
    The reason is that we inputed a range which is beyond the end of the file. And
    because the end of this range was not page-aligned, we had to truncate the last
    page in this range, this operation is similar to a buffered file write. In other
    words, we reserved enough space and clear the data which was in the hole range
    on that page. But when we expanded that test file, write the data into the same
    page, we forgot that we have reserved enough space for the buffered write of
    that page because in most cases there is no page that is beyond the end of
    the file. As a result, we reserved the space twice.
    
    In fact, we needn't truncate the page if it is beyond the end of the file, just
    release the allocated space in that range. Fix the above problem by this way.
    Signed-off-by: NMiao Xie <miaox@cn.fujitsu.com>
    Signed-off-by: NChris Mason <chris.mason@fusionio.com>
    0061280d
file.c 60.5 KB