diff options
Diffstat (limited to 'fs/ext4')
-rw-r--r-- | fs/ext4/balloc.c | 2 | ||||
-rw-r--r-- | fs/ext4/extents.c | 3 | ||||
-rw-r--r-- | fs/ext4/inode.c | 55 | ||||
-rw-r--r-- | fs/ext4/page-io.c | 12 | ||||
-rw-r--r-- | fs/ext4/super.c | 23 |
5 files changed, 36 insertions, 59 deletions
diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c index f6dba4505f1c..12ccacda44e0 100644 --- a/fs/ext4/balloc.c +++ b/fs/ext4/balloc.c | |||
@@ -565,7 +565,7 @@ ext4_fsblk_t ext4_count_free_clusters(struct super_block *sb) | |||
565 | brelse(bitmap_bh); | 565 | brelse(bitmap_bh); |
566 | printk(KERN_DEBUG "ext4_count_free_clusters: stored = %llu" | 566 | printk(KERN_DEBUG "ext4_count_free_clusters: stored = %llu" |
567 | ", computed = %llu, %llu\n", | 567 | ", computed = %llu, %llu\n", |
568 | EXT4_B2C(sbi, ext4_free_blocks_count(es)), | 568 | EXT4_B2C(EXT4_SB(sb), ext4_free_blocks_count(es)), |
569 | desc_count, bitmap_count); | 569 | desc_count, bitmap_count); |
570 | return bitmap_count; | 570 | return bitmap_count; |
571 | #else | 571 | #else |
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 61fa9e1614af..607b1557d292 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c | |||
@@ -1095,7 +1095,7 @@ static int ext4_ext_grow_indepth(handle_t *handle, struct inode *inode, | |||
1095 | le32_to_cpu(EXT_FIRST_INDEX(neh)->ei_block), | 1095 | le32_to_cpu(EXT_FIRST_INDEX(neh)->ei_block), |
1096 | ext4_idx_pblock(EXT_FIRST_INDEX(neh))); | 1096 | ext4_idx_pblock(EXT_FIRST_INDEX(neh))); |
1097 | 1097 | ||
1098 | neh->eh_depth = cpu_to_le16(neh->eh_depth + 1); | 1098 | neh->eh_depth = cpu_to_le16(le16_to_cpu(neh->eh_depth) + 1); |
1099 | ext4_mark_inode_dirty(handle, inode); | 1099 | ext4_mark_inode_dirty(handle, inode); |
1100 | out: | 1100 | out: |
1101 | brelse(bh); | 1101 | brelse(bh); |
@@ -2955,7 +2955,6 @@ static int ext4_ext_convert_to_initialized(handle_t *handle, | |||
2955 | /* Pre-conditions */ | 2955 | /* Pre-conditions */ |
2956 | BUG_ON(!ext4_ext_is_uninitialized(ex)); | 2956 | BUG_ON(!ext4_ext_is_uninitialized(ex)); |
2957 | BUG_ON(!in_range(map->m_lblk, ee_block, ee_len)); | 2957 | BUG_ON(!in_range(map->m_lblk, ee_block, ee_len)); |
2958 | BUG_ON(map->m_lblk + map->m_len > ee_block + ee_len); | ||
2959 | 2958 | ||
2960 | /* | 2959 | /* |
2961 | * Attempt to transfer newly initialized blocks from the currently | 2960 | * Attempt to transfer newly initialized blocks from the currently |
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 240f6e2dc7ee..92655fd89657 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -1339,8 +1339,11 @@ static int mpage_da_submit_io(struct mpage_da_data *mpd, | |||
1339 | clear_buffer_unwritten(bh); | 1339 | clear_buffer_unwritten(bh); |
1340 | } | 1340 | } |
1341 | 1341 | ||
1342 | /* skip page if block allocation undone */ | 1342 | /* |
1343 | if (buffer_delay(bh) || buffer_unwritten(bh)) | 1343 | * skip page if block allocation undone and |
1344 | * block is dirty | ||
1345 | */ | ||
1346 | if (ext4_bh_delay_or_unwritten(NULL, bh)) | ||
1344 | skip_page = 1; | 1347 | skip_page = 1; |
1345 | bh = bh->b_this_page; | 1348 | bh = bh->b_this_page; |
1346 | block_start += bh->b_size; | 1349 | block_start += bh->b_size; |
@@ -2270,6 +2273,7 @@ retry: | |||
2270 | ext4_msg(inode->i_sb, KERN_CRIT, "%s: jbd2_start: " | 2273 | ext4_msg(inode->i_sb, KERN_CRIT, "%s: jbd2_start: " |
2271 | "%ld pages, ino %lu; err %d", __func__, | 2274 | "%ld pages, ino %lu; err %d", __func__, |
2272 | wbc->nr_to_write, inode->i_ino, ret); | 2275 | wbc->nr_to_write, inode->i_ino, ret); |
2276 | blk_finish_plug(&plug); | ||
2273 | goto out_writepages; | 2277 | goto out_writepages; |
2274 | } | 2278 | } |
2275 | 2279 | ||
@@ -2386,7 +2390,6 @@ static int ext4_da_write_begin(struct file *file, struct address_space *mapping, | |||
2386 | pgoff_t index; | 2390 | pgoff_t index; |
2387 | struct inode *inode = mapping->host; | 2391 | struct inode *inode = mapping->host; |
2388 | handle_t *handle; | 2392 | handle_t *handle; |
2389 | loff_t page_len; | ||
2390 | 2393 | ||
2391 | index = pos >> PAGE_CACHE_SHIFT; | 2394 | index = pos >> PAGE_CACHE_SHIFT; |
2392 | 2395 | ||
@@ -2433,13 +2436,6 @@ retry: | |||
2433 | */ | 2436 | */ |
2434 | if (pos + len > inode->i_size) | 2437 | if (pos + len > inode->i_size) |
2435 | ext4_truncate_failed_write(inode); | 2438 | ext4_truncate_failed_write(inode); |
2436 | } else { | ||
2437 | page_len = pos & (PAGE_CACHE_SIZE - 1); | ||
2438 | if (page_len > 0) { | ||
2439 | ret = ext4_discard_partial_page_buffers_no_lock(handle, | ||
2440 | inode, page, pos - page_len, page_len, | ||
2441 | EXT4_DISCARD_PARTIAL_PG_ZERO_UNMAPPED); | ||
2442 | } | ||
2443 | } | 2439 | } |
2444 | 2440 | ||
2445 | if (ret == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) | 2441 | if (ret == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) |
@@ -2482,7 +2478,6 @@ static int ext4_da_write_end(struct file *file, | |||
2482 | loff_t new_i_size; | 2478 | loff_t new_i_size; |
2483 | unsigned long start, end; | 2479 | unsigned long start, end; |
2484 | int write_mode = (int)(unsigned long)fsdata; | 2480 | int write_mode = (int)(unsigned long)fsdata; |
2485 | loff_t page_len; | ||
2486 | 2481 | ||
2487 | if (write_mode == FALL_BACK_TO_NONDELALLOC) { | 2482 | if (write_mode == FALL_BACK_TO_NONDELALLOC) { |
2488 | if (ext4_should_order_data(inode)) { | 2483 | if (ext4_should_order_data(inode)) { |
@@ -2507,7 +2502,7 @@ static int ext4_da_write_end(struct file *file, | |||
2507 | */ | 2502 | */ |
2508 | 2503 | ||
2509 | new_i_size = pos + copied; | 2504 | new_i_size = pos + copied; |
2510 | if (new_i_size > EXT4_I(inode)->i_disksize) { | 2505 | if (copied && new_i_size > EXT4_I(inode)->i_disksize) { |
2511 | if (ext4_da_should_update_i_disksize(page, end)) { | 2506 | if (ext4_da_should_update_i_disksize(page, end)) { |
2512 | down_write(&EXT4_I(inode)->i_data_sem); | 2507 | down_write(&EXT4_I(inode)->i_data_sem); |
2513 | if (new_i_size > EXT4_I(inode)->i_disksize) { | 2508 | if (new_i_size > EXT4_I(inode)->i_disksize) { |
@@ -2531,16 +2526,6 @@ static int ext4_da_write_end(struct file *file, | |||
2531 | } | 2526 | } |
2532 | ret2 = generic_write_end(file, mapping, pos, len, copied, | 2527 | ret2 = generic_write_end(file, mapping, pos, len, copied, |
2533 | page, fsdata); | 2528 | page, fsdata); |
2534 | |||
2535 | page_len = PAGE_CACHE_SIZE - | ||
2536 | ((pos + copied - 1) & (PAGE_CACHE_SIZE - 1)); | ||
2537 | |||
2538 | if (page_len > 0) { | ||
2539 | ret = ext4_discard_partial_page_buffers_no_lock(handle, | ||
2540 | inode, page, pos + copied - 1, page_len, | ||
2541 | EXT4_DISCARD_PARTIAL_PG_ZERO_UNMAPPED); | ||
2542 | } | ||
2543 | |||
2544 | copied = ret2; | 2529 | copied = ret2; |
2545 | if (ret2 < 0) | 2530 | if (ret2 < 0) |
2546 | ret = ret2; | 2531 | ret = ret2; |
@@ -2780,10 +2765,11 @@ static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset, | |||
2780 | iocb->private, io_end->inode->i_ino, iocb, offset, | 2765 | iocb->private, io_end->inode->i_ino, iocb, offset, |
2781 | size); | 2766 | size); |
2782 | 2767 | ||
2768 | iocb->private = NULL; | ||
2769 | |||
2783 | /* if not aio dio with unwritten extents, just free io and return */ | 2770 | /* if not aio dio with unwritten extents, just free io and return */ |
2784 | if (!(io_end->flag & EXT4_IO_END_UNWRITTEN)) { | 2771 | if (!(io_end->flag & EXT4_IO_END_UNWRITTEN)) { |
2785 | ext4_free_io_end(io_end); | 2772 | ext4_free_io_end(io_end); |
2786 | iocb->private = NULL; | ||
2787 | out: | 2773 | out: |
2788 | if (is_async) | 2774 | if (is_async) |
2789 | aio_complete(iocb, ret, 0); | 2775 | aio_complete(iocb, ret, 0); |
@@ -2807,7 +2793,6 @@ out: | |||
2807 | 2793 | ||
2808 | /* queue the work to convert unwritten extents to written */ | 2794 | /* queue the work to convert unwritten extents to written */ |
2809 | queue_work(wq, &io_end->work); | 2795 | queue_work(wq, &io_end->work); |
2810 | iocb->private = NULL; | ||
2811 | 2796 | ||
2812 | /* XXX: probably should move into the real I/O completion handler */ | 2797 | /* XXX: probably should move into the real I/O completion handler */ |
2813 | inode_dio_done(inode); | 2798 | inode_dio_done(inode); |
@@ -3202,26 +3187,8 @@ int ext4_discard_partial_page_buffers_no_lock(handle_t *handle, | |||
3202 | 3187 | ||
3203 | iblock = index << (PAGE_CACHE_SHIFT - inode->i_sb->s_blocksize_bits); | 3188 | iblock = index << (PAGE_CACHE_SHIFT - inode->i_sb->s_blocksize_bits); |
3204 | 3189 | ||
3205 | if (!page_has_buffers(page)) { | 3190 | if (!page_has_buffers(page)) |
3206 | /* | 3191 | create_empty_buffers(page, blocksize, 0); |
3207 | * If the range to be discarded covers a partial block | ||
3208 | * we need to get the page buffers. This is because | ||
3209 | * partial blocks cannot be released and the page needs | ||
3210 | * to be updated with the contents of the block before | ||
3211 | * we write the zeros on top of it. | ||
3212 | */ | ||
3213 | if ((from & (blocksize - 1)) || | ||
3214 | ((from + length) & (blocksize - 1))) { | ||
3215 | create_empty_buffers(page, blocksize, 0); | ||
3216 | } else { | ||
3217 | /* | ||
3218 | * If there are no partial blocks, | ||
3219 | * there is nothing to update, | ||
3220 | * so we can return now | ||
3221 | */ | ||
3222 | return 0; | ||
3223 | } | ||
3224 | } | ||
3225 | 3192 | ||
3226 | /* Find the buffer that contains "offset" */ | 3193 | /* Find the buffer that contains "offset" */ |
3227 | bh = page_buffers(page); | 3194 | bh = page_buffers(page); |
diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c index 7ce1d0b19c94..7e106c810c62 100644 --- a/fs/ext4/page-io.c +++ b/fs/ext4/page-io.c | |||
@@ -385,6 +385,18 @@ int ext4_bio_write_page(struct ext4_io_submit *io, | |||
385 | 385 | ||
386 | block_end = block_start + blocksize; | 386 | block_end = block_start + blocksize; |
387 | if (block_start >= len) { | 387 | if (block_start >= len) { |
388 | /* | ||
389 | * Comments copied from block_write_full_page_endio: | ||
390 | * | ||
391 | * The page straddles i_size. It must be zeroed out on | ||
392 | * each and every writepage invocation because it may | ||
393 | * be mmapped. "A file is mapped in multiples of the | ||
394 | * page size. For a file that is not a multiple of | ||
395 | * the page size, the remaining memory is zeroed when | ||
396 | * mapped, and writes to that region are not written | ||
397 | * out to the file." | ||
398 | */ | ||
399 | zero_user_segment(page, block_start, block_end); | ||
388 | clear_buffer_dirty(bh); | 400 | clear_buffer_dirty(bh); |
389 | set_buffer_uptodate(bh); | 401 | set_buffer_uptodate(bh); |
390 | continue; | 402 | continue; |
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 9953d80145ad..3e1329e2f826 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
@@ -1155,9 +1155,9 @@ static int ext4_show_options(struct seq_file *seq, struct vfsmount *vfs) | |||
1155 | seq_puts(seq, ",block_validity"); | 1155 | seq_puts(seq, ",block_validity"); |
1156 | 1156 | ||
1157 | if (!test_opt(sb, INIT_INODE_TABLE)) | 1157 | if (!test_opt(sb, INIT_INODE_TABLE)) |
1158 | seq_puts(seq, ",noinit_inode_table"); | 1158 | seq_puts(seq, ",noinit_itable"); |
1159 | else if (sbi->s_li_wait_mult != EXT4_DEF_LI_WAIT_MULT) | 1159 | else if (sbi->s_li_wait_mult != EXT4_DEF_LI_WAIT_MULT) |
1160 | seq_printf(seq, ",init_inode_table=%u", | 1160 | seq_printf(seq, ",init_itable=%u", |
1161 | (unsigned) sbi->s_li_wait_mult); | 1161 | (unsigned) sbi->s_li_wait_mult); |
1162 | 1162 | ||
1163 | ext4_show_quota_options(seq, sb); | 1163 | ext4_show_quota_options(seq, sb); |
@@ -1333,8 +1333,7 @@ enum { | |||
1333 | Opt_nomblk_io_submit, Opt_block_validity, Opt_noblock_validity, | 1333 | Opt_nomblk_io_submit, Opt_block_validity, Opt_noblock_validity, |
1334 | Opt_inode_readahead_blks, Opt_journal_ioprio, | 1334 | Opt_inode_readahead_blks, Opt_journal_ioprio, |
1335 | Opt_dioread_nolock, Opt_dioread_lock, | 1335 | Opt_dioread_nolock, Opt_dioread_lock, |
1336 | Opt_discard, Opt_nodiscard, | 1336 | Opt_discard, Opt_nodiscard, Opt_init_itable, Opt_noinit_itable, |
1337 | Opt_init_inode_table, Opt_noinit_inode_table, | ||
1338 | }; | 1337 | }; |
1339 | 1338 | ||
1340 | static const match_table_t tokens = { | 1339 | static const match_table_t tokens = { |
@@ -1407,9 +1406,9 @@ static const match_table_t tokens = { | |||
1407 | {Opt_dioread_lock, "dioread_lock"}, | 1406 | {Opt_dioread_lock, "dioread_lock"}, |
1408 | {Opt_discard, "discard"}, | 1407 | {Opt_discard, "discard"}, |
1409 | {Opt_nodiscard, "nodiscard"}, | 1408 | {Opt_nodiscard, "nodiscard"}, |
1410 | {Opt_init_inode_table, "init_itable=%u"}, | 1409 | {Opt_init_itable, "init_itable=%u"}, |
1411 | {Opt_init_inode_table, "init_itable"}, | 1410 | {Opt_init_itable, "init_itable"}, |
1412 | {Opt_noinit_inode_table, "noinit_itable"}, | 1411 | {Opt_noinit_itable, "noinit_itable"}, |
1413 | {Opt_err, NULL}, | 1412 | {Opt_err, NULL}, |
1414 | }; | 1413 | }; |
1415 | 1414 | ||
@@ -1683,7 +1682,9 @@ static int parse_options(char *options, struct super_block *sb, | |||
1683 | data_opt = EXT4_MOUNT_WRITEBACK_DATA; | 1682 | data_opt = EXT4_MOUNT_WRITEBACK_DATA; |
1684 | datacheck: | 1683 | datacheck: |
1685 | if (is_remount) { | 1684 | if (is_remount) { |
1686 | if (test_opt(sb, DATA_FLAGS) != data_opt) { | 1685 | if (!sbi->s_journal) |
1686 | ext4_msg(sb, KERN_WARNING, "Remounting file system with no journal so ignoring journalled data option"); | ||
1687 | else if (test_opt(sb, DATA_FLAGS) != data_opt) { | ||
1687 | ext4_msg(sb, KERN_ERR, | 1688 | ext4_msg(sb, KERN_ERR, |
1688 | "Cannot change data mode on remount"); | 1689 | "Cannot change data mode on remount"); |
1689 | return 0; | 1690 | return 0; |
@@ -1890,7 +1891,7 @@ set_qf_format: | |||
1890 | case Opt_dioread_lock: | 1891 | case Opt_dioread_lock: |
1891 | clear_opt(sb, DIOREAD_NOLOCK); | 1892 | clear_opt(sb, DIOREAD_NOLOCK); |
1892 | break; | 1893 | break; |
1893 | case Opt_init_inode_table: | 1894 | case Opt_init_itable: |
1894 | set_opt(sb, INIT_INODE_TABLE); | 1895 | set_opt(sb, INIT_INODE_TABLE); |
1895 | if (args[0].from) { | 1896 | if (args[0].from) { |
1896 | if (match_int(&args[0], &option)) | 1897 | if (match_int(&args[0], &option)) |
@@ -1901,7 +1902,7 @@ set_qf_format: | |||
1901 | return 0; | 1902 | return 0; |
1902 | sbi->s_li_wait_mult = option; | 1903 | sbi->s_li_wait_mult = option; |
1903 | break; | 1904 | break; |
1904 | case Opt_noinit_inode_table: | 1905 | case Opt_noinit_itable: |
1905 | clear_opt(sb, INIT_INODE_TABLE); | 1906 | clear_opt(sb, INIT_INODE_TABLE); |
1906 | break; | 1907 | break; |
1907 | default: | 1908 | default: |
@@ -3099,8 +3100,6 @@ static void ext4_destroy_lazyinit_thread(void) | |||
3099 | } | 3100 | } |
3100 | 3101 | ||
3101 | static int ext4_fill_super(struct super_block *sb, void *data, int silent) | 3102 | static int ext4_fill_super(struct super_block *sb, void *data, int silent) |
3102 | __releases(kernel_lock) | ||
3103 | __acquires(kernel_lock) | ||
3104 | { | 3103 | { |
3105 | char *orig_data = kstrdup(data, GFP_KERNEL); | 3104 | char *orig_data = kstrdup(data, GFP_KERNEL); |
3106 | struct buffer_head *bh; | 3105 | struct buffer_head *bh; |