diff options
author | Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> | 2008-08-19 22:16:43 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2008-08-19 22:16:43 -0400 |
commit | bf068ee266f9dbaa6dacb8433a366bb399e7ae5b (patch) | |
tree | dbbf7b4b8a65fd74bdb478bd62e94e5a79f41041 /fs | |
parent | 30a2f3c60a84092c8084dfe788b710f8d0768cd4 (diff) |
ext4: Handle unwritten extent properly with delayed allocation
When using fallocate the buffer_heads are marked unwritten and unmapped.
We need to map them in the writepages after a get_block. Otherwise we
split the uninit extents, but never write the content to disk.
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Mingming Cao <cmm@us.ibm.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/ext4/inode.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 59fbbe899acc..a1c7d7623213 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -1741,6 +1741,13 @@ static void mpage_put_bnr_to_bhs(struct mpage_da_data *mpd, sector_t logical, | |||
1741 | if (buffer_delay(bh)) { | 1741 | if (buffer_delay(bh)) { |
1742 | bh->b_blocknr = pblock; | 1742 | bh->b_blocknr = pblock; |
1743 | clear_buffer_delay(bh); | 1743 | clear_buffer_delay(bh); |
1744 | bh->b_bdev = inode->i_sb->s_bdev; | ||
1745 | } else if (buffer_unwritten(bh)) { | ||
1746 | bh->b_blocknr = pblock; | ||
1747 | clear_buffer_unwritten(bh); | ||
1748 | set_buffer_mapped(bh); | ||
1749 | set_buffer_new(bh); | ||
1750 | bh->b_bdev = inode->i_sb->s_bdev; | ||
1744 | } else if (buffer_mapped(bh)) | 1751 | } else if (buffer_mapped(bh)) |
1745 | BUG_ON(bh->b_blocknr != pblock); | 1752 | BUG_ON(bh->b_blocknr != pblock); |
1746 | 1753 | ||
@@ -1814,7 +1821,7 @@ static void mpage_da_map_blocks(struct mpage_da_data *mpd) | |||
1814 | * If blocks are delayed marked, we need to | 1821 | * If blocks are delayed marked, we need to |
1815 | * put actual blocknr and drop delayed bit | 1822 | * put actual blocknr and drop delayed bit |
1816 | */ | 1823 | */ |
1817 | if (buffer_delay(lbh)) | 1824 | if (buffer_delay(lbh) || buffer_unwritten(lbh)) |
1818 | mpage_put_bnr_to_bhs(mpd, next, &new); | 1825 | mpage_put_bnr_to_bhs(mpd, next, &new); |
1819 | 1826 | ||
1820 | /* go for the remaining blocks */ | 1827 | /* go for the remaining blocks */ |
@@ -1823,7 +1830,8 @@ static void mpage_da_map_blocks(struct mpage_da_data *mpd) | |||
1823 | } | 1830 | } |
1824 | } | 1831 | } |
1825 | 1832 | ||
1826 | #define BH_FLAGS ((1 << BH_Uptodate) | (1 << BH_Mapped) | (1 << BH_Delay)) | 1833 | #define BH_FLAGS ((1 << BH_Uptodate) | (1 << BH_Mapped) | \ |
1834 | (1 << BH_Delay) | (1 << BH_Unwritten)) | ||
1827 | 1835 | ||
1828 | /* | 1836 | /* |
1829 | * mpage_add_bh_to_extent - try to add one more block to extent of blocks | 1837 | * mpage_add_bh_to_extent - try to add one more block to extent of blocks |