diff options
| -rw-r--r-- | fs/ext4/balloc.c | 5 | ||||
| -rw-r--r-- | fs/ext4/block_validity.c | 4 | ||||
| -rw-r--r-- | fs/ext4/dir.c | 26 | ||||
| -rw-r--r-- | fs/ext4/ext4.h | 167 | ||||
| -rw-r--r-- | fs/ext4/ext4_jbd2.h | 8 | ||||
| -rw-r--r-- | fs/ext4/extents.c | 417 | ||||
| -rw-r--r-- | fs/ext4/file.c | 2 | ||||
| -rw-r--r-- | fs/ext4/fsync.c | 35 | ||||
| -rw-r--r-- | fs/ext4/ialloc.c | 89 | ||||
| -rw-r--r-- | fs/ext4/inode.c | 723 | ||||
| -rw-r--r-- | fs/ext4/ioctl.c | 27 | ||||
| -rw-r--r-- | fs/ext4/mballoc.c | 120 | ||||
| -rw-r--r-- | fs/ext4/migrate.c | 2 | ||||
| -rw-r--r-- | fs/ext4/move_extent.c | 13 | ||||
| -rw-r--r-- | fs/ext4/namei.c | 61 | ||||
| -rw-r--r-- | fs/ext4/resize.c | 3 | ||||
| -rw-r--r-- | fs/ext4/super.c | 80 | ||||
| -rw-r--r-- | fs/ext4/symlink.c | 2 | ||||
| -rw-r--r-- | fs/ext4/xattr.c | 39 | ||||
| -rw-r--r-- | fs/jbd2/transaction.c | 5 | ||||
| -rw-r--r-- | fs/quota/dquot.c | 11 | ||||
| -rw-r--r-- | include/linux/quotaops.h | 37 | ||||
| -rw-r--r-- | include/trace/events/ext4.h | 94 |
23 files changed, 1136 insertions, 834 deletions
diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c index d2f37a5516c7..95b7594c76f9 100644 --- a/fs/ext4/balloc.c +++ b/fs/ext4/balloc.c | |||
| @@ -591,14 +591,15 @@ ext4_fsblk_t ext4_new_meta_blocks(handle_t *handle, struct inode *inode, | |||
| 591 | ret = ext4_mb_new_blocks(handle, &ar, errp); | 591 | ret = ext4_mb_new_blocks(handle, &ar, errp); |
| 592 | if (count) | 592 | if (count) |
| 593 | *count = ar.len; | 593 | *count = ar.len; |
| 594 | |||
| 595 | /* | 594 | /* |
| 596 | * Account for the allocated meta blocks | 595 | * Account for the allocated meta blocks. We will never |
| 596 | * fail EDQUOT for metdata, but we do account for it. | ||
| 597 | */ | 597 | */ |
| 598 | if (!(*errp) && EXT4_I(inode)->i_delalloc_reserved_flag) { | 598 | if (!(*errp) && EXT4_I(inode)->i_delalloc_reserved_flag) { |
| 599 | spin_lock(&EXT4_I(inode)->i_block_reservation_lock); | 599 | spin_lock(&EXT4_I(inode)->i_block_reservation_lock); |
| 600 | EXT4_I(inode)->i_allocated_meta_blocks += ar.len; | 600 | EXT4_I(inode)->i_allocated_meta_blocks += ar.len; |
| 601 | spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); | 601 | spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); |
| 602 | dquot_alloc_block_nofail(inode, ar.len); | ||
| 602 | } | 603 | } |
| 603 | return ret; | 604 | return ret; |
| 604 | } | 605 | } |
diff --git a/fs/ext4/block_validity.c b/fs/ext4/block_validity.c index 538c48655084..5b6973fbf1bd 100644 --- a/fs/ext4/block_validity.c +++ b/fs/ext4/block_validity.c | |||
| @@ -72,9 +72,9 @@ static int add_system_zone(struct ext4_sb_info *sbi, | |||
| 72 | else if (start_blk >= (entry->start_blk + entry->count)) | 72 | else if (start_blk >= (entry->start_blk + entry->count)) |
| 73 | n = &(*n)->rb_right; | 73 | n = &(*n)->rb_right; |
| 74 | else { | 74 | else { |
| 75 | if (start_blk + count > (entry->start_blk + | 75 | if (start_blk + count > (entry->start_blk + |
| 76 | entry->count)) | 76 | entry->count)) |
| 77 | entry->count = (start_blk + count - | 77 | entry->count = (start_blk + count - |
| 78 | entry->start_blk); | 78 | entry->start_blk); |
| 79 | new_node = *n; | 79 | new_node = *n; |
| 80 | new_entry = rb_entry(new_node, struct ext4_system_zone, | 80 | new_entry = rb_entry(new_node, struct ext4_system_zone, |
diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c index 86cb6d86a048..ea5e6cb7e2a5 100644 --- a/fs/ext4/dir.c +++ b/fs/ext4/dir.c | |||
| @@ -83,11 +83,10 @@ int ext4_check_dir_entry(const char *function, struct inode *dir, | |||
| 83 | error_msg = "inode out of bounds"; | 83 | error_msg = "inode out of bounds"; |
| 84 | 84 | ||
| 85 | if (error_msg != NULL) | 85 | if (error_msg != NULL) |
| 86 | __ext4_error(dir->i_sb, function, | 86 | ext4_error_inode(function, dir, |
| 87 | "bad entry in directory #%lu: %s - block=%llu" | 87 | "bad entry in directory: %s - block=%llu" |
| 88 | "offset=%u(%u), inode=%u, rec_len=%d, name_len=%d", | 88 | "offset=%u(%u), inode=%u, rec_len=%d, name_len=%d", |
| 89 | dir->i_ino, error_msg, | 89 | error_msg, (unsigned long long) bh->b_blocknr, |
| 90 | (unsigned long long) bh->b_blocknr, | ||
| 91 | (unsigned) (offset%bh->b_size), offset, | 90 | (unsigned) (offset%bh->b_size), offset, |
| 92 | le32_to_cpu(de->inode), | 91 | le32_to_cpu(de->inode), |
| 93 | rlen, de->name_len); | 92 | rlen, de->name_len); |
| @@ -111,7 +110,7 @@ static int ext4_readdir(struct file *filp, | |||
| 111 | 110 | ||
| 112 | if (EXT4_HAS_COMPAT_FEATURE(inode->i_sb, | 111 | if (EXT4_HAS_COMPAT_FEATURE(inode->i_sb, |
| 113 | EXT4_FEATURE_COMPAT_DIR_INDEX) && | 112 | EXT4_FEATURE_COMPAT_DIR_INDEX) && |
| 114 | ((EXT4_I(inode)->i_flags & EXT4_INDEX_FL) || | 113 | ((ext4_test_inode_flag(inode, EXT4_INODE_INDEX)) || |
| 115 | ((inode->i_size >> sb->s_blocksize_bits) == 1))) { | 114 | ((inode->i_size >> sb->s_blocksize_bits) == 1))) { |
| 116 | err = ext4_dx_readdir(filp, dirent, filldir); | 115 | err = ext4_dx_readdir(filp, dirent, filldir); |
| 117 | if (err != ERR_BAD_DX_DIR) { | 116 | if (err != ERR_BAD_DX_DIR) { |
| @@ -122,20 +121,20 @@ static int ext4_readdir(struct file *filp, | |||
| 122 | * We don't set the inode dirty flag since it's not | 121 | * We don't set the inode dirty flag since it's not |
| 123 | * critical that it get flushed back to the disk. | 122 | * critical that it get flushed back to the disk. |
| 124 | */ | 123 | */ |
| 125 | EXT4_I(filp->f_path.dentry->d_inode)->i_flags &= ~EXT4_INDEX_FL; | 124 | ext4_clear_inode_flag(filp->f_path.dentry->d_inode, EXT4_INODE_INDEX); |
| 126 | } | 125 | } |
| 127 | stored = 0; | 126 | stored = 0; |
| 128 | offset = filp->f_pos & (sb->s_blocksize - 1); | 127 | offset = filp->f_pos & (sb->s_blocksize - 1); |
| 129 | 128 | ||
| 130 | while (!error && !stored && filp->f_pos < inode->i_size) { | 129 | while (!error && !stored && filp->f_pos < inode->i_size) { |
| 131 | ext4_lblk_t blk = filp->f_pos >> EXT4_BLOCK_SIZE_BITS(sb); | 130 | struct ext4_map_blocks map; |
| 132 | struct buffer_head map_bh; | ||
| 133 | struct buffer_head *bh = NULL; | 131 | struct buffer_head *bh = NULL; |
| 134 | 132 | ||
| 135 | map_bh.b_state = 0; | 133 | map.m_lblk = filp->f_pos >> EXT4_BLOCK_SIZE_BITS(sb); |
| 136 | err = ext4_get_blocks(NULL, inode, blk, 1, &map_bh, 0); | 134 | map.m_len = 1; |
| 135 | err = ext4_map_blocks(NULL, inode, &map, 0); | ||
| 137 | if (err > 0) { | 136 | if (err > 0) { |
| 138 | pgoff_t index = map_bh.b_blocknr >> | 137 | pgoff_t index = map.m_pblk >> |
| 139 | (PAGE_CACHE_SHIFT - inode->i_blkbits); | 138 | (PAGE_CACHE_SHIFT - inode->i_blkbits); |
| 140 | if (!ra_has_index(&filp->f_ra, index)) | 139 | if (!ra_has_index(&filp->f_ra, index)) |
| 141 | page_cache_sync_readahead( | 140 | page_cache_sync_readahead( |
| @@ -143,7 +142,7 @@ static int ext4_readdir(struct file *filp, | |||
| 143 | &filp->f_ra, filp, | 142 | &filp->f_ra, filp, |
| 144 | index, 1); | 143 | index, 1); |
| 145 | filp->f_ra.prev_pos = (loff_t)index << PAGE_CACHE_SHIFT; | 144 | filp->f_ra.prev_pos = (loff_t)index << PAGE_CACHE_SHIFT; |
| 146 | bh = ext4_bread(NULL, inode, blk, 0, &err); | 145 | bh = ext4_bread(NULL, inode, map.m_lblk, 0, &err); |
| 147 | } | 146 | } |
| 148 | 147 | ||
| 149 | /* | 148 | /* |
| @@ -152,9 +151,8 @@ static int ext4_readdir(struct file *filp, | |||
| 152 | */ | 151 | */ |
| 153 | if (!bh) { | 152 | if (!bh) { |
| 154 | if (!dir_has_error) { | 153 | if (!dir_has_error) { |
| 155 | ext4_error(sb, "directory #%lu " | 154 | EXT4_ERROR_INODE(inode, "directory " |
| 156 | "contains a hole at offset %Lu", | 155 | "contains a hole at offset %Lu", |
| 157 | inode->i_ino, | ||
| 158 | (unsigned long long) filp->f_pos); | 156 | (unsigned long long) filp->f_pos); |
| 159 | dir_has_error = 1; | 157 | dir_has_error = 1; |
| 160 | } | 158 | } |
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index bf938cf7c5f0..60bd31026e7c 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h | |||
| @@ -29,6 +29,9 @@ | |||
| 29 | #include <linux/wait.h> | 29 | #include <linux/wait.h> |
| 30 | #include <linux/blockgroup_lock.h> | 30 | #include <linux/blockgroup_lock.h> |
| 31 | #include <linux/percpu_counter.h> | 31 | #include <linux/percpu_counter.h> |
| 32 | #ifdef __KERNEL__ | ||
| 33 | #include <linux/compat.h> | ||
| 34 | #endif | ||
| 32 | 35 | ||
| 33 | /* | 36 | /* |
| 34 | * The fourth extended filesystem constants/structures | 37 | * The fourth extended filesystem constants/structures |
| @@ -54,10 +57,10 @@ | |||
| 54 | #endif | 57 | #endif |
| 55 | 58 | ||
| 56 | #define EXT4_ERROR_INODE(inode, fmt, a...) \ | 59 | #define EXT4_ERROR_INODE(inode, fmt, a...) \ |
| 57 | ext4_error_inode(__func__, (inode), (fmt), ## a); | 60 | ext4_error_inode(__func__, (inode), (fmt), ## a) |
| 58 | 61 | ||
| 59 | #define EXT4_ERROR_FILE(file, fmt, a...) \ | 62 | #define EXT4_ERROR_FILE(file, fmt, a...) \ |
| 60 | ext4_error_file(__func__, (file), (fmt), ## a); | 63 | ext4_error_file(__func__, (file), (fmt), ## a) |
| 61 | 64 | ||
| 62 | /* data type for block offset of block group */ | 65 | /* data type for block offset of block group */ |
| 63 | typedef int ext4_grpblk_t; | 66 | typedef int ext4_grpblk_t; |
| @@ -72,7 +75,7 @@ typedef __u32 ext4_lblk_t; | |||
| 72 | typedef unsigned int ext4_group_t; | 75 | typedef unsigned int ext4_group_t; |
| 73 | 76 | ||
| 74 | /* | 77 | /* |
| 75 | * Flags used in mballoc's allocation_context flags field. | 78 | * Flags used in mballoc's allocation_context flags field. |
| 76 | * | 79 | * |
| 77 | * Also used to show what's going on for debugging purposes when the | 80 | * Also used to show what's going on for debugging purposes when the |
| 78 | * flag field is exported via the traceport interface | 81 | * flag field is exported via the traceport interface |
| @@ -126,6 +129,29 @@ struct ext4_allocation_request { | |||
| 126 | }; | 129 | }; |
| 127 | 130 | ||
| 128 | /* | 131 | /* |
| 132 | * Logical to physical block mapping, used by ext4_map_blocks() | ||
| 133 | * | ||
| 134 | * This structure is used to pass requests into ext4_map_blocks() as | ||
| 135 | * well as to store the information returned by ext4_map_blocks(). It | ||
| 136 | * takes less room on the stack than a struct buffer_head. | ||
| 137 | */ | ||
| 138 | #define EXT4_MAP_NEW (1 << BH_New) | ||
| 139 | #define EXT4_MAP_MAPPED (1 << BH_Mapped) | ||
| 140 | #define EXT4_MAP_UNWRITTEN (1 << BH_Unwritten) | ||
| 141 | #define EXT4_MAP_BOUNDARY (1 << BH_Boundary) | ||
| 142 | #define EXT4_MAP_UNINIT (1 << BH_Uninit) | ||
| 143 | #define EXT4_MAP_FLAGS (EXT4_MAP_NEW | EXT4_MAP_MAPPED |\ | ||
| 144 | EXT4_MAP_UNWRITTEN | EXT4_MAP_BOUNDARY |\ | ||
| 145 | EXT4_MAP_UNINIT) | ||
| 146 | |||
| 147 | struct ext4_map_blocks { | ||
| 148 | ext4_fsblk_t m_pblk; | ||
| 149 | ext4_lblk_t m_lblk; | ||
| 150 | unsigned int m_len; | ||
| 151 | unsigned int m_flags; | ||
| 152 | }; | ||
| 153 | |||
| 154 | /* | ||
| 129 | * For delayed allocation tracking | 155 | * For delayed allocation tracking |
| 130 | */ | 156 | */ |
| 131 | struct mpage_da_data { | 157 | struct mpage_da_data { |
| @@ -321,6 +347,83 @@ static inline __u32 ext4_mask_flags(umode_t mode, __u32 flags) | |||
| 321 | return flags & EXT4_OTHER_FLMASK; | 347 | return flags & EXT4_OTHER_FLMASK; |
| 322 | } | 348 | } |
| 323 | 349 | ||
| 350 | /* | ||
| 351 | * Inode flags used for atomic set/get | ||
| 352 | */ | ||
| 353 | enum { | ||
| 354 | EXT4_INODE_SECRM = 0, /* Secure deletion */ | ||
| 355 | EXT4_INODE_UNRM = 1, /* Undelete */ | ||
| 356 | EXT4_INODE_COMPR = 2, /* Compress file */ | ||
| 357 | EXT4_INODE_SYNC = 3, /* Synchronous updates */ | ||
| 358 | EXT4_INODE_IMMUTABLE = 4, /* Immutable file */ | ||
| 359 | EXT4_INODE_APPEND = 5, /* writes to file may only append */ | ||
| 360 | EXT4_INODE_NODUMP = 6, /* do not dump file */ | ||
| 361 | EXT4_INODE_NOATIME = 7, /* do not update atime */ | ||
| 362 | /* Reserved for compression usage... */ | ||
| 363 | EXT4_INODE_DIRTY = 8, | ||
| 364 | EXT4_INODE_COMPRBLK = 9, /* One or more compressed clusters */ | ||
| 365 | EXT4_INODE_NOCOMPR = 10, /* Don't compress */ | ||
| 366 | EXT4_INODE_ECOMPR = 11, /* Compression error */ | ||
| 367 | /* End compression flags --- maybe not all used */ | ||
| 368 | EXT4_INODE_INDEX = 12, /* hash-indexed directory */ | ||
| 369 | EXT4_INODE_IMAGIC = 13, /* AFS directory */ | ||
| 370 | EXT4_INODE_JOURNAL_DATA = 14, /* file data should be journaled */ | ||
| 371 | EXT4_INODE_NOTAIL = 15, /* file tail should not be merged */ | ||
| 372 | EXT4_INODE_DIRSYNC = 16, /* dirsync behaviour (directories only) */ | ||
| 373 | EXT4_INODE_TOPDIR = 17, /* Top of directory hierarchies*/ | ||
| 374 | EXT4_INODE_HUGE_FILE = 18, /* Set to each huge file */ | ||
| 375 | EXT4_INODE_EXTENTS = 19, /* Inode uses extents */ | ||
| 376 | EXT4_INODE_EA_INODE = 21, /* Inode used for large EA */ | ||
| 377 | EXT4_INODE_EOFBLOCKS = 22, /* Blocks allocated beyond EOF */ | ||
| 378 | EXT4_INODE_RESERVED = 31, /* reserved for ext4 lib */ | ||
| 379 | }; | ||
| 380 | |||
| 381 | #define TEST_FLAG_VALUE(FLAG) (EXT4_##FLAG##_FL == (1 << EXT4_INODE_##FLAG)) | ||
| 382 | #define CHECK_FLAG_VALUE(FLAG) if (!TEST_FLAG_VALUE(FLAG)) { \ | ||
| 383 | printk(KERN_EMERG "EXT4 flag fail: " #FLAG ": %d %d\n", \ | ||
| 384 | EXT4_##FLAG##_FL, EXT4_INODE_##FLAG); BUG_ON(1); } | ||
| 385 | |||
| 386 | /* | ||
| 387 | * Since it's pretty easy to mix up bit numbers and hex values, and we | ||
| 388 | * can't do a compile-time test for ENUM values, we use a run-time | ||
| 389 | * test to make sure that EXT4_XXX_FL is consistent with respect to | ||
| 390 | * EXT4_INODE_XXX. If all is well the printk and BUG_ON will all drop | ||
| 391 | * out so it won't cost any extra space in the compiled kernel image. | ||
| 392 | * But it's important that these values are the same, since we are | ||
| 393 | * using EXT4_INODE_XXX to test for the flag values, but EXT4_XX_FL | ||
| 394 | * must be consistent with the values of FS_XXX_FL defined in | ||
| 395 | * include/linux/fs.h and the on-disk values found in ext2, ext3, and | ||
| 396 | * ext4 filesystems, and of course the values defined in e2fsprogs. | ||
| 397 | * | ||
| 398 | * It's not paranoia if the Murphy's Law really *is* out to get you. :-) | ||
| 399 | */ | ||
| 400 | static inline void ext4_check_flag_values(void) | ||
| 401 | { | ||
| 402 | CHECK_FLAG_VALUE(SECRM); | ||
| 403 | CHECK_FLAG_VALUE(UNRM); | ||
| 404 | CHECK_FLAG_VALUE(COMPR); | ||
| 405 | CHECK_FLAG_VALUE(SYNC); | ||
| 406 | CHECK_FLAG_VALUE(IMMUTABLE); | ||
| 407 | CHECK_FLAG_VALUE(APPEND); | ||
| 408 | CHECK_FLAG_VALUE(NODUMP); | ||
| 409 | CHECK_FLAG_VALUE(NOATIME); | ||
| 410 | CHECK_FLAG_VALUE(DIRTY); | ||
| 411 | CHECK_FLAG_VALUE(COMPRBLK); | ||
| 412 | CHECK_FLAG_VALUE(NOCOMPR); | ||
| 413 | CHECK_FLAG_VALUE(ECOMPR); | ||
| 414 | CHECK_FLAG_VALUE(INDEX); | ||
| 415 | CHECK_FLAG_VALUE(IMAGIC); | ||
| 416 | CHECK_FLAG_VALUE(JOURNAL_DATA); | ||
| 417 | CHECK_FLAG_VALUE(NOTAIL); | ||
| 418 | CHECK_FLAG_VALUE(DIRSYNC); | ||
| 419 | CHECK_FLAG_VALUE(TOPDIR); | ||
| 420 | CHECK_FLAG_VALUE(HUGE_FILE); | ||
| 421 | CHECK_FLAG_VALUE(EXTENTS); | ||
| 422 | CHECK_FLAG_VALUE(EA_INODE); | ||
| 423 | CHECK_FLAG_VALUE(EOFBLOCKS); | ||
| 424 | CHECK_FLAG_VALUE(RESERVED); | ||
| 425 | } | ||
| 426 | |||
| 324 | /* Used to pass group descriptor data when online resize is done */ | 427 | /* Used to pass group descriptor data when online resize is done */ |
| 325 | struct ext4_new_group_input { | 428 | struct ext4_new_group_input { |
| 326 | __u32 group; /* Group number for this data */ | 429 | __u32 group; /* Group number for this data */ |
| @@ -332,6 +435,18 @@ struct ext4_new_group_input { | |||
| 332 | __u16 unused; | 435 | __u16 unused; |
| 333 | }; | 436 | }; |
| 334 | 437 | ||
| 438 | #if defined(__KERNEL__) && defined(CONFIG_COMPAT) | ||
| 439 | struct compat_ext4_new_group_input { | ||
| 440 | u32 group; | ||
| 441 | compat_u64 block_bitmap; | ||
| 442 | compat_u64 inode_bitmap; | ||
| 443 | compat_u64 inode_table; | ||
| 444 | u32 blocks_count; | ||
| 445 | u16 reserved_blocks; | ||
| 446 | u16 unused; | ||
| 447 | }; | ||
| 448 | #endif | ||
| 449 | |||
| 335 | /* The struct ext4_new_group_input in kernel space, with free_blocks_count */ | 450 | /* The struct ext4_new_group_input in kernel space, with free_blocks_count */ |
| 336 | struct ext4_new_group_data { | 451 | struct ext4_new_group_data { |
| 337 | __u32 group; | 452 | __u32 group; |
| @@ -355,7 +470,7 @@ struct ext4_new_group_data { | |||
| 355 | #define EXT4_GET_BLOCKS_CREATE_UNINIT_EXT (EXT4_GET_BLOCKS_UNINIT_EXT|\ | 470 | #define EXT4_GET_BLOCKS_CREATE_UNINIT_EXT (EXT4_GET_BLOCKS_UNINIT_EXT|\ |
| 356 | EXT4_GET_BLOCKS_CREATE) | 471 | EXT4_GET_BLOCKS_CREATE) |
| 357 | /* Caller is from the delayed allocation writeout path, | 472 | /* Caller is from the delayed allocation writeout path, |
| 358 | so set the magic i_delalloc_reserve_flag after taking the | 473 | so set the magic i_delalloc_reserve_flag after taking the |
| 359 | inode allocation semaphore for */ | 474 | inode allocation semaphore for */ |
| 360 | #define EXT4_GET_BLOCKS_DELALLOC_RESERVE 0x0004 | 475 | #define EXT4_GET_BLOCKS_DELALLOC_RESERVE 0x0004 |
| 361 | /* caller is from the direct IO path, request to creation of an | 476 | /* caller is from the direct IO path, request to creation of an |
| @@ -398,6 +513,7 @@ struct ext4_new_group_data { | |||
| 398 | #define EXT4_IOC_ALLOC_DA_BLKS _IO('f', 12) | 513 | #define EXT4_IOC_ALLOC_DA_BLKS _IO('f', 12) |
| 399 | #define EXT4_IOC_MOVE_EXT _IOWR('f', 15, struct move_extent) | 514 | #define EXT4_IOC_MOVE_EXT _IOWR('f', 15, struct move_extent) |
| 400 | 515 | ||
| 516 | #if defined(__KERNEL__) && defined(CONFIG_COMPAT) | ||
| 401 | /* | 517 | /* |
| 402 | * ioctl commands in 32 bit emulation | 518 | * ioctl commands in 32 bit emulation |
| 403 | */ | 519 | */ |
| @@ -408,11 +524,13 @@ struct ext4_new_group_data { | |||
| 408 | #define EXT4_IOC32_GETRSVSZ _IOR('f', 5, int) | 524 | #define EXT4_IOC32_GETRSVSZ _IOR('f', 5, int) |
| 409 | #define EXT4_IOC32_SETRSVSZ _IOW('f', 6, int) | 525 | #define EXT4_IOC32_SETRSVSZ _IOW('f', 6, int) |
| 410 | #define EXT4_IOC32_GROUP_EXTEND _IOW('f', 7, unsigned int) | 526 | #define EXT4_IOC32_GROUP_EXTEND _IOW('f', 7, unsigned int) |
| 527 | #define EXT4_IOC32_GROUP_ADD _IOW('f', 8, struct compat_ext4_new_group_input) | ||
| 411 | #ifdef CONFIG_JBD2_DEBUG | 528 | #ifdef CONFIG_JBD2_DEBUG |
| 412 | #define EXT4_IOC32_WAIT_FOR_READONLY _IOR('f', 99, int) | 529 | #define EXT4_IOC32_WAIT_FOR_READONLY _IOR('f', 99, int) |
| 413 | #endif | 530 | #endif |
| 414 | #define EXT4_IOC32_GETVERSION_OLD FS_IOC32_GETVERSION | 531 | #define EXT4_IOC32_GETVERSION_OLD FS_IOC32_GETVERSION |
| 415 | #define EXT4_IOC32_SETVERSION_OLD FS_IOC32_SETVERSION | 532 | #define EXT4_IOC32_SETVERSION_OLD FS_IOC32_SETVERSION |
| 533 | #endif | ||
| 416 | 534 | ||
| 417 | 535 | ||
| 418 | /* | 536 | /* |
| @@ -616,9 +734,8 @@ struct ext4_ext_cache { | |||
| 616 | */ | 734 | */ |
| 617 | struct ext4_inode_info { | 735 | struct ext4_inode_info { |
| 618 | __le32 i_data[15]; /* unconverted */ | 736 | __le32 i_data[15]; /* unconverted */ |
| 619 | __u32 i_flags; | ||
| 620 | ext4_fsblk_t i_file_acl; | ||
| 621 | __u32 i_dtime; | 737 | __u32 i_dtime; |
| 738 | ext4_fsblk_t i_file_acl; | ||
| 622 | 739 | ||
| 623 | /* | 740 | /* |
| 624 | * i_block_group is the number of the block group which contains | 741 | * i_block_group is the number of the block group which contains |
| @@ -629,6 +746,7 @@ struct ext4_inode_info { | |||
| 629 | */ | 746 | */ |
| 630 | ext4_group_t i_block_group; | 747 | ext4_group_t i_block_group; |
| 631 | unsigned long i_state_flags; /* Dynamic state flags */ | 748 | unsigned long i_state_flags; /* Dynamic state flags */ |
| 749 | unsigned long i_flags; | ||
| 632 | 750 | ||
| 633 | ext4_lblk_t i_dir_start_lookup; | 751 | ext4_lblk_t i_dir_start_lookup; |
| 634 | #ifdef CONFIG_EXT4_FS_XATTR | 752 | #ifdef CONFIG_EXT4_FS_XATTR |
| @@ -1062,22 +1180,25 @@ enum { | |||
| 1062 | EXT4_STATE_DA_ALLOC_CLOSE, /* Alloc DA blks on close */ | 1180 | EXT4_STATE_DA_ALLOC_CLOSE, /* Alloc DA blks on close */ |
| 1063 | EXT4_STATE_EXT_MIGRATE, /* Inode is migrating */ | 1181 | EXT4_STATE_EXT_MIGRATE, /* Inode is migrating */ |
| 1064 | EXT4_STATE_DIO_UNWRITTEN, /* need convert on dio done*/ | 1182 | EXT4_STATE_DIO_UNWRITTEN, /* need convert on dio done*/ |
| 1183 | EXT4_STATE_NEWENTRY, /* File just added to dir */ | ||
| 1065 | }; | 1184 | }; |
| 1066 | 1185 | ||
| 1067 | static inline int ext4_test_inode_state(struct inode *inode, int bit) | 1186 | #define EXT4_INODE_BIT_FNS(name, field) \ |
| 1068 | { | 1187 | static inline int ext4_test_inode_##name(struct inode *inode, int bit) \ |
| 1069 | return test_bit(bit, &EXT4_I(inode)->i_state_flags); | 1188 | { \ |
| 1070 | } | 1189 | return test_bit(bit, &EXT4_I(inode)->i_##field); \ |
| 1071 | 1190 | } \ | |
| 1072 | static inline void ext4_set_inode_state(struct inode *inode, int bit) | 1191 | static inline void ext4_set_inode_##name(struct inode *inode, int bit) \ |
| 1073 | { | 1192 | { \ |
| 1074 | set_bit(bit, &EXT4_I(inode)->i_state_flags); | 1193 | set_bit(bit, &EXT4_I(inode)->i_##field); \ |
| 1194 | } \ | ||
| 1195 | static inline void ext4_clear_inode_##name(struct inode *inode, int bit) \ | ||
| 1196 | { \ | ||
| 1197 | clear_bit(bit, &EXT4_I(inode)->i_##field); \ | ||
| 1075 | } | 1198 | } |
| 1076 | 1199 | ||
| 1077 | static inline void ext4_clear_inode_state(struct inode *inode, int bit) | 1200 | EXT4_INODE_BIT_FNS(flag, flags) |
| 1078 | { | 1201 | EXT4_INODE_BIT_FNS(state, state_flags) |
| 1079 | clear_bit(bit, &EXT4_I(inode)->i_state_flags); | ||
| 1080 | } | ||
| 1081 | #else | 1202 | #else |
| 1082 | /* Assume that user mode programs are passing in an ext4fs superblock, not | 1203 | /* Assume that user mode programs are passing in an ext4fs superblock, not |
| 1083 | * a kernel struct super_block. This will allow us to call the feature-test | 1204 | * a kernel struct super_block. This will allow us to call the feature-test |
| @@ -1264,7 +1385,7 @@ struct ext4_dir_entry_2 { | |||
| 1264 | 1385 | ||
| 1265 | #define is_dx(dir) (EXT4_HAS_COMPAT_FEATURE(dir->i_sb, \ | 1386 | #define is_dx(dir) (EXT4_HAS_COMPAT_FEATURE(dir->i_sb, \ |
| 1266 | EXT4_FEATURE_COMPAT_DIR_INDEX) && \ | 1387 | EXT4_FEATURE_COMPAT_DIR_INDEX) && \ |
| 1267 | (EXT4_I(dir)->i_flags & EXT4_INDEX_FL)) | 1388 | ext4_test_inode_flag((dir), EXT4_INODE_INDEX)) |
| 1268 | #define EXT4_DIR_LINK_MAX(dir) (!is_dx(dir) && (dir)->i_nlink >= EXT4_LINK_MAX) | 1389 | #define EXT4_DIR_LINK_MAX(dir) (!is_dx(dir) && (dir)->i_nlink >= EXT4_LINK_MAX) |
| 1269 | #define EXT4_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2 || (dir)->i_nlink == 1) | 1390 | #define EXT4_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2 || (dir)->i_nlink == 1) |
| 1270 | 1391 | ||
| @@ -1678,6 +1799,7 @@ struct ext4_group_info { | |||
| 1678 | ext4_grpblk_t bb_first_free; /* first free block */ | 1799 | ext4_grpblk_t bb_first_free; /* first free block */ |
| 1679 | ext4_grpblk_t bb_free; /* total free blocks */ | 1800 | ext4_grpblk_t bb_free; /* total free blocks */ |
| 1680 | ext4_grpblk_t bb_fragments; /* nr of freespace fragments */ | 1801 | ext4_grpblk_t bb_fragments; /* nr of freespace fragments */ |
| 1802 | ext4_grpblk_t bb_largest_free_order;/* order of largest frag in BG */ | ||
| 1681 | struct list_head bb_prealloc_list; | 1803 | struct list_head bb_prealloc_list; |
| 1682 | #ifdef DOUBLE_CHECK | 1804 | #ifdef DOUBLE_CHECK |
| 1683 | void *bb_bitmap; | 1805 | void *bb_bitmap; |
| @@ -1772,9 +1894,8 @@ extern int ext4_ext_tree_init(handle_t *handle, struct inode *); | |||
| 1772 | extern int ext4_ext_writepage_trans_blocks(struct inode *, int); | 1894 | extern int ext4_ext_writepage_trans_blocks(struct inode *, int); |
| 1773 | extern int ext4_ext_index_trans_blocks(struct inode *inode, int nrblocks, | 1895 | extern int ext4_ext_index_trans_blocks(struct inode *inode, int nrblocks, |
| 1774 | int chunk); | 1896 | int chunk); |
| 1775 | extern int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | 1897 | extern int ext4_ext_map_blocks(handle_t *handle, struct inode *inode, |
| 1776 | ext4_lblk_t iblock, unsigned int max_blocks, | 1898 | struct ext4_map_blocks *map, int flags); |
| 1777 | struct buffer_head *bh_result, int flags); | ||
| 1778 | extern void ext4_ext_truncate(struct inode *); | 1899 | extern void ext4_ext_truncate(struct inode *); |
| 1779 | extern void ext4_ext_init(struct super_block *); | 1900 | extern void ext4_ext_init(struct super_block *); |
| 1780 | extern void ext4_ext_release(struct super_block *); | 1901 | extern void ext4_ext_release(struct super_block *); |
| @@ -1782,6 +1903,8 @@ extern long ext4_fallocate(struct inode *inode, int mode, loff_t offset, | |||
| 1782 | loff_t len); | 1903 | loff_t len); |
| 1783 | extern int ext4_convert_unwritten_extents(struct inode *inode, loff_t offset, | 1904 | extern int ext4_convert_unwritten_extents(struct inode *inode, loff_t offset, |
| 1784 | ssize_t len); | 1905 | ssize_t len); |
| 1906 | extern int ext4_map_blocks(handle_t *handle, struct inode *inode, | ||
| 1907 | struct ext4_map_blocks *map, int flags); | ||
| 1785 | extern int ext4_get_blocks(handle_t *handle, struct inode *inode, | 1908 | extern int ext4_get_blocks(handle_t *handle, struct inode *inode, |
| 1786 | sector_t block, unsigned int max_blocks, | 1909 | sector_t block, unsigned int max_blocks, |
| 1787 | struct buffer_head *bh, int flags); | 1910 | struct buffer_head *bh, int flags); |
diff --git a/fs/ext4/ext4_jbd2.h b/fs/ext4/ext4_jbd2.h index b79ad5126468..dade0c024797 100644 --- a/fs/ext4/ext4_jbd2.h +++ b/fs/ext4/ext4_jbd2.h | |||
| @@ -273,7 +273,7 @@ static inline int ext4_should_journal_data(struct inode *inode) | |||
| 273 | return 1; | 273 | return 1; |
| 274 | if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) | 274 | if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) |
| 275 | return 1; | 275 | return 1; |
| 276 | if (EXT4_I(inode)->i_flags & EXT4_JOURNAL_DATA_FL) | 276 | if (ext4_test_inode_flag(inode, EXT4_INODE_JOURNAL_DATA)) |
| 277 | return 1; | 277 | return 1; |
| 278 | return 0; | 278 | return 0; |
| 279 | } | 279 | } |
| @@ -284,7 +284,7 @@ static inline int ext4_should_order_data(struct inode *inode) | |||
| 284 | return 0; | 284 | return 0; |
| 285 | if (!S_ISREG(inode->i_mode)) | 285 | if (!S_ISREG(inode->i_mode)) |
| 286 | return 0; | 286 | return 0; |
| 287 | if (EXT4_I(inode)->i_flags & EXT4_JOURNAL_DATA_FL) | 287 | if (ext4_test_inode_flag(inode, EXT4_INODE_JOURNAL_DATA)) |
| 288 | return 0; | 288 | return 0; |
| 289 | if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_ORDERED_DATA) | 289 | if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_ORDERED_DATA) |
| 290 | return 1; | 290 | return 1; |
| @@ -297,7 +297,7 @@ static inline int ext4_should_writeback_data(struct inode *inode) | |||
| 297 | return 0; | 297 | return 0; |
| 298 | if (EXT4_JOURNAL(inode) == NULL) | 298 | if (EXT4_JOURNAL(inode) == NULL) |
| 299 | return 1; | 299 | return 1; |
| 300 | if (EXT4_I(inode)->i_flags & EXT4_JOURNAL_DATA_FL) | 300 | if (ext4_test_inode_flag(inode, EXT4_INODE_JOURNAL_DATA)) |
| 301 | return 0; | 301 | return 0; |
| 302 | if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_WRITEBACK_DATA) | 302 | if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_WRITEBACK_DATA) |
| 303 | return 1; | 303 | return 1; |
| @@ -321,7 +321,7 @@ static inline int ext4_should_dioread_nolock(struct inode *inode) | |||
| 321 | return 0; | 321 | return 0; |
| 322 | if (!S_ISREG(inode->i_mode)) | 322 | if (!S_ISREG(inode->i_mode)) |
| 323 | return 0; | 323 | return 0; |
| 324 | if (!(EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL)) | 324 | if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) |
| 325 | return 0; | 325 | return 0; |
| 326 | if (ext4_should_journal_data(inode)) | 326 | if (ext4_should_journal_data(inode)) |
| 327 | return 0; | 327 | return 0; |
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 236b834b4ca8..377309c1af65 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c | |||
| @@ -107,11 +107,8 @@ static int ext4_ext_truncate_extend_restart(handle_t *handle, | |||
| 107 | if (err <= 0) | 107 | if (err <= 0) |
| 108 | return err; | 108 | return err; |
| 109 | err = ext4_truncate_restart_trans(handle, inode, needed); | 109 | err = ext4_truncate_restart_trans(handle, inode, needed); |
| 110 | /* | 110 | if (err == 0) |
| 111 | * We have dropped i_data_sem so someone might have cached again | 111 | err = -EAGAIN; |
| 112 | * an extent we are going to truncate. | ||
| 113 | */ | ||
| 114 | ext4_ext_invalidate_cache(inode); | ||
| 115 | 112 | ||
| 116 | return err; | 113 | return err; |
| 117 | } | 114 | } |
| @@ -185,10 +182,10 @@ static ext4_fsblk_t ext4_ext_find_goal(struct inode *inode, | |||
| 185 | if (flex_size >= EXT4_FLEX_SIZE_DIR_ALLOC_SCHEME) { | 182 | if (flex_size >= EXT4_FLEX_SIZE_DIR_ALLOC_SCHEME) { |
| 186 | /* | 183 | /* |
| 187 | * If there are at least EXT4_FLEX_SIZE_DIR_ALLOC_SCHEME | 184 | * If there are at least EXT4_FLEX_SIZE_DIR_ALLOC_SCHEME |
| 188 | * block groups per flexgroup, reserve the first block | 185 | * block groups per flexgroup, reserve the first block |
| 189 | * group for directories and special files. Regular | 186 | * group for directories and special files. Regular |
| 190 | * files will start at the second block group. This | 187 | * files will start at the second block group. This |
| 191 | * tends to speed up directory access and improves | 188 | * tends to speed up directory access and improves |
| 192 | * fsck times. | 189 | * fsck times. |
| 193 | */ | 190 | */ |
| 194 | block_group &= ~(flex_size-1); | 191 | block_group &= ~(flex_size-1); |
| @@ -439,10 +436,10 @@ static int __ext4_ext_check(const char *function, struct inode *inode, | |||
| 439 | return 0; | 436 | return 0; |
| 440 | 437 | ||
| 441 | corrupted: | 438 | corrupted: |
| 442 | __ext4_error(inode->i_sb, function, | 439 | ext4_error_inode(function, inode, |
| 443 | "bad header/extent in inode #%lu: %s - magic %x, " | 440 | "bad header/extent: %s - magic %x, " |
| 444 | "entries %u, max %u(%u), depth %u(%u)", | 441 | "entries %u, max %u(%u), depth %u(%u)", |
| 445 | inode->i_ino, error_msg, le16_to_cpu(eh->eh_magic), | 442 | error_msg, le16_to_cpu(eh->eh_magic), |
| 446 | le16_to_cpu(eh->eh_entries), le16_to_cpu(eh->eh_max), | 443 | le16_to_cpu(eh->eh_entries), le16_to_cpu(eh->eh_max), |
| 447 | max, le16_to_cpu(eh->eh_depth), depth); | 444 | max, le16_to_cpu(eh->eh_depth), depth); |
| 448 | 445 | ||
| @@ -1622,9 +1619,7 @@ int ext4_ext_try_to_merge(struct inode *inode, | |||
| 1622 | merge_done = 1; | 1619 | merge_done = 1; |
| 1623 | WARN_ON(eh->eh_entries == 0); | 1620 | WARN_ON(eh->eh_entries == 0); |
| 1624 | if (!eh->eh_entries) | 1621 | if (!eh->eh_entries) |
| 1625 | ext4_error(inode->i_sb, | 1622 | EXT4_ERROR_INODE(inode, "eh->eh_entries = 0!"); |
| 1626 | "inode#%lu, eh->eh_entries = 0!", | ||
| 1627 | inode->i_ino); | ||
| 1628 | } | 1623 | } |
| 1629 | 1624 | ||
| 1630 | return merge_done; | 1625 | return merge_done; |
| @@ -2039,7 +2034,7 @@ ext4_ext_in_cache(struct inode *inode, ext4_lblk_t block, | |||
| 2039 | struct ext4_ext_cache *cex; | 2034 | struct ext4_ext_cache *cex; |
| 2040 | int ret = EXT4_EXT_CACHE_NO; | 2035 | int ret = EXT4_EXT_CACHE_NO; |
| 2041 | 2036 | ||
| 2042 | /* | 2037 | /* |
| 2043 | * We borrow i_block_reservation_lock to protect i_cached_extent | 2038 | * We borrow i_block_reservation_lock to protect i_cached_extent |
| 2044 | */ | 2039 | */ |
| 2045 | spin_lock(&EXT4_I(inode)->i_block_reservation_lock); | 2040 | spin_lock(&EXT4_I(inode)->i_block_reservation_lock); |
| @@ -2361,7 +2356,7 @@ static int ext4_ext_remove_space(struct inode *inode, ext4_lblk_t start) | |||
| 2361 | int depth = ext_depth(inode); | 2356 | int depth = ext_depth(inode); |
| 2362 | struct ext4_ext_path *path; | 2357 | struct ext4_ext_path *path; |
| 2363 | handle_t *handle; | 2358 | handle_t *handle; |
| 2364 | int i = 0, err = 0; | 2359 | int i, err; |
| 2365 | 2360 | ||
| 2366 | ext_debug("truncate since %u\n", start); | 2361 | ext_debug("truncate since %u\n", start); |
| 2367 | 2362 | ||
| @@ -2370,23 +2365,26 @@ static int ext4_ext_remove_space(struct inode *inode, ext4_lblk_t start) | |||
| 2370 | if (IS_ERR(handle)) | 2365 | if (IS_ERR(handle)) |
| 2371 | return PTR_ERR(handle); | 2366 | return PTR_ERR(handle); |
| 2372 | 2367 | ||
| 2368 | again: | ||
| 2373 | ext4_ext_invalidate_cache(inode); | 2369 | ext4_ext_invalidate_cache(inode); |
| 2374 | 2370 | ||
| 2375 | /* | 2371 | /* |
| 2376 | * We start scanning from right side, freeing all the blocks | 2372 | * We start scanning from right side, freeing all the blocks |
| 2377 | * after i_size and walking into the tree depth-wise. | 2373 | * after i_size and walking into the tree depth-wise. |
| 2378 | */ | 2374 | */ |
| 2375 | depth = ext_depth(inode); | ||
| 2379 | path = kzalloc(sizeof(struct ext4_ext_path) * (depth + 1), GFP_NOFS); | 2376 | path = kzalloc(sizeof(struct ext4_ext_path) * (depth + 1), GFP_NOFS); |
| 2380 | if (path == NULL) { | 2377 | if (path == NULL) { |
| 2381 | ext4_journal_stop(handle); | 2378 | ext4_journal_stop(handle); |
| 2382 | return -ENOMEM; | 2379 | return -ENOMEM; |
| 2383 | } | 2380 | } |
| 2381 | path[0].p_depth = depth; | ||
| 2384 | path[0].p_hdr = ext_inode_hdr(inode); | 2382 | path[0].p_hdr = ext_inode_hdr(inode); |
| 2385 | if (ext4_ext_check(inode, path[0].p_hdr, depth)) { | 2383 | if (ext4_ext_check(inode, path[0].p_hdr, depth)) { |
| 2386 | err = -EIO; | 2384 | err = -EIO; |
| 2387 | goto out; | 2385 | goto out; |
| 2388 | } | 2386 | } |
| 2389 | path[0].p_depth = depth; | 2387 | i = err = 0; |
| 2390 | 2388 | ||
| 2391 | while (i >= 0 && err == 0) { | 2389 | while (i >= 0 && err == 0) { |
| 2392 | if (i == depth) { | 2390 | if (i == depth) { |
| @@ -2480,6 +2478,8 @@ static int ext4_ext_remove_space(struct inode *inode, ext4_lblk_t start) | |||
| 2480 | out: | 2478 | out: |
| 2481 | ext4_ext_drop_refs(path); | 2479 | ext4_ext_drop_refs(path); |
| 2482 | kfree(path); | 2480 | kfree(path); |
| 2481 | if (err == -EAGAIN) | ||
| 2482 | goto again; | ||
| 2483 | ext4_journal_stop(handle); | 2483 | ext4_journal_stop(handle); |
| 2484 | 2484 | ||
| 2485 | return err; | 2485 | return err; |
| @@ -2544,7 +2544,7 @@ static void bi_complete(struct bio *bio, int error) | |||
| 2544 | /* FIXME!! we need to try to merge to left or right after zero-out */ | 2544 | /* FIXME!! we need to try to merge to left or right after zero-out */ |
| 2545 | static int ext4_ext_zeroout(struct inode *inode, struct ext4_extent *ex) | 2545 | static int ext4_ext_zeroout(struct inode *inode, struct ext4_extent *ex) |
| 2546 | { | 2546 | { |
| 2547 | int ret = -EIO; | 2547 | int ret; |
| 2548 | struct bio *bio; | 2548 | struct bio *bio; |
| 2549 | int blkbits, blocksize; | 2549 | int blkbits, blocksize; |
| 2550 | sector_t ee_pblock; | 2550 | sector_t ee_pblock; |
| @@ -2568,6 +2568,9 @@ static int ext4_ext_zeroout(struct inode *inode, struct ext4_extent *ex) | |||
| 2568 | len = ee_len; | 2568 | len = ee_len; |
| 2569 | 2569 | ||
| 2570 | bio = bio_alloc(GFP_NOIO, len); | 2570 | bio = bio_alloc(GFP_NOIO, len); |
| 2571 | if (!bio) | ||
| 2572 | return -ENOMEM; | ||
| 2573 | |||
| 2571 | bio->bi_sector = ee_pblock; | 2574 | bio->bi_sector = ee_pblock; |
| 2572 | bio->bi_bdev = inode->i_sb->s_bdev; | 2575 | bio->bi_bdev = inode->i_sb->s_bdev; |
| 2573 | 2576 | ||
| @@ -2595,22 +2598,20 @@ static int ext4_ext_zeroout(struct inode *inode, struct ext4_extent *ex) | |||
| 2595 | submit_bio(WRITE, bio); | 2598 | submit_bio(WRITE, bio); |
| 2596 | wait_for_completion(&event); | 2599 | wait_for_completion(&event); |
| 2597 | 2600 | ||
| 2598 | if (test_bit(BIO_UPTODATE, &bio->bi_flags)) | 2601 | if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) { |
| 2599 | ret = 0; | 2602 | bio_put(bio); |
| 2600 | else { | 2603 | return -EIO; |
| 2601 | ret = -EIO; | ||
| 2602 | break; | ||
| 2603 | } | 2604 | } |
| 2604 | bio_put(bio); | 2605 | bio_put(bio); |
| 2605 | ee_len -= done; | 2606 | ee_len -= done; |
| 2606 | ee_pblock += done << (blkbits - 9); | 2607 | ee_pblock += done << (blkbits - 9); |
| 2607 | } | 2608 | } |
| 2608 | return ret; | 2609 | return 0; |
| 2609 | } | 2610 | } |
| 2610 | 2611 | ||
| 2611 | #define EXT4_EXT_ZERO_LEN 7 | 2612 | #define EXT4_EXT_ZERO_LEN 7 |
| 2612 | /* | 2613 | /* |
| 2613 | * This function is called by ext4_ext_get_blocks() if someone tries to write | 2614 | * This function is called by ext4_ext_map_blocks() if someone tries to write |
| 2614 | * to an uninitialized extent. It may result in splitting the uninitialized | 2615 | * to an uninitialized extent. It may result in splitting the uninitialized |
| 2615 | * extent into multiple extents (upto three - one initialized and two | 2616 | * extent into multiple extents (upto three - one initialized and two |
| 2616 | * uninitialized). | 2617 | * uninitialized). |
| @@ -2620,39 +2621,55 @@ static int ext4_ext_zeroout(struct inode *inode, struct ext4_extent *ex) | |||
| 2620 | * c> Splits in three extents: Somone is writing in middle of the extent | 2621 | * c> Splits in three extents: Somone is writing in middle of the extent |
| 2621 | */ | 2622 | */ |
| 2622 | static int ext4_ext_convert_to_initialized(handle_t *handle, | 2623 | static int ext4_ext_convert_to_initialized(handle_t *handle, |
| 2623 | struct inode *inode, | 2624 | struct inode *inode, |
| 2624 | struct ext4_ext_path *path, | 2625 | struct ext4_map_blocks *map, |
| 2625 | ext4_lblk_t iblock, | 2626 | struct ext4_ext_path *path) |
| 2626 | unsigned int max_blocks) | ||
| 2627 | { | 2627 | { |
| 2628 | struct ext4_extent *ex, newex, orig_ex; | 2628 | struct ext4_extent *ex, newex, orig_ex; |
| 2629 | struct ext4_extent *ex1 = NULL; | 2629 | struct ext4_extent *ex1 = NULL; |
| 2630 | struct ext4_extent *ex2 = NULL; | 2630 | struct ext4_extent *ex2 = NULL; |
| 2631 | struct ext4_extent *ex3 = NULL; | 2631 | struct ext4_extent *ex3 = NULL; |
| 2632 | struct ext4_extent_header *eh; | 2632 | struct ext4_extent_header *eh; |
| 2633 | ext4_lblk_t ee_block; | 2633 | ext4_lblk_t ee_block, eof_block; |
| 2634 | unsigned int allocated, ee_len, depth; | 2634 | unsigned int allocated, ee_len, depth; |
| 2635 | ext4_fsblk_t newblock; | 2635 | ext4_fsblk_t newblock; |
| 2636 | int err = 0; | 2636 | int err = 0; |
| 2637 | int ret = 0; | 2637 | int ret = 0; |
| 2638 | int may_zeroout; | ||
| 2639 | |||
| 2640 | ext_debug("ext4_ext_convert_to_initialized: inode %lu, logical" | ||
| 2641 | "block %llu, max_blocks %u\n", inode->i_ino, | ||
| 2642 | (unsigned long long)map->m_lblk, map->m_len); | ||
| 2643 | |||
| 2644 | eof_block = (inode->i_size + inode->i_sb->s_blocksize - 1) >> | ||
| 2645 | inode->i_sb->s_blocksize_bits; | ||
| 2646 | if (eof_block < map->m_lblk + map->m_len) | ||
| 2647 | eof_block = map->m_lblk + map->m_len; | ||
| 2638 | 2648 | ||
| 2639 | depth = ext_depth(inode); | 2649 | depth = ext_depth(inode); |
| 2640 | eh = path[depth].p_hdr; | 2650 | eh = path[depth].p_hdr; |
| 2641 | ex = path[depth].p_ext; | 2651 | ex = path[depth].p_ext; |
| 2642 | ee_block = le32_to_cpu(ex->ee_block); | 2652 | ee_block = le32_to_cpu(ex->ee_block); |
| 2643 | ee_len = ext4_ext_get_actual_len(ex); | 2653 | ee_len = ext4_ext_get_actual_len(ex); |
| 2644 | allocated = ee_len - (iblock - ee_block); | 2654 | allocated = ee_len - (map->m_lblk - ee_block); |
| 2645 | newblock = iblock - ee_block + ext_pblock(ex); | 2655 | newblock = map->m_lblk - ee_block + ext_pblock(ex); |
| 2656 | |||
| 2646 | ex2 = ex; | 2657 | ex2 = ex; |
| 2647 | orig_ex.ee_block = ex->ee_block; | 2658 | orig_ex.ee_block = ex->ee_block; |
| 2648 | orig_ex.ee_len = cpu_to_le16(ee_len); | 2659 | orig_ex.ee_len = cpu_to_le16(ee_len); |
| 2649 | ext4_ext_store_pblock(&orig_ex, ext_pblock(ex)); | 2660 | ext4_ext_store_pblock(&orig_ex, ext_pblock(ex)); |
| 2650 | 2661 | ||
| 2662 | /* | ||
| 2663 | * It is safe to convert extent to initialized via explicit | ||
| 2664 | * zeroout only if extent is fully insde i_size or new_size. | ||
| 2665 | */ | ||
| 2666 | may_zeroout = ee_block + ee_len <= eof_block; | ||
| 2667 | |||
| 2651 | err = ext4_ext_get_access(handle, inode, path + depth); | 2668 | err = ext4_ext_get_access(handle, inode, path + depth); |
| 2652 | if (err) | 2669 | if (err) |
| 2653 | goto out; | 2670 | goto out; |
| 2654 | /* If extent has less than 2*EXT4_EXT_ZERO_LEN zerout directly */ | 2671 | /* If extent has less than 2*EXT4_EXT_ZERO_LEN zerout directly */ |
| 2655 | if (ee_len <= 2*EXT4_EXT_ZERO_LEN) { | 2672 | if (ee_len <= 2*EXT4_EXT_ZERO_LEN && may_zeroout) { |
| 2656 | err = ext4_ext_zeroout(inode, &orig_ex); | 2673 | err = ext4_ext_zeroout(inode, &orig_ex); |
| 2657 | if (err) | 2674 | if (err) |
| 2658 | goto fix_extent_len; | 2675 | goto fix_extent_len; |
| @@ -2665,10 +2682,10 @@ static int ext4_ext_convert_to_initialized(handle_t *handle, | |||
| 2665 | return allocated; | 2682 | return allocated; |
| 2666 | } | 2683 | } |
| 2667 | 2684 | ||
| 2668 | /* ex1: ee_block to iblock - 1 : uninitialized */ | 2685 | /* ex1: ee_block to map->m_lblk - 1 : uninitialized */ |
| 2669 | if (iblock > ee_block) { | 2686 | if (map->m_lblk > ee_block) { |
| 2670 | ex1 = ex; | 2687 | ex1 = ex; |
| 2671 | ex1->ee_len = cpu_to_le16(iblock - ee_block); | 2688 | ex1->ee_len = cpu_to_le16(map->m_lblk - ee_block); |
| 2672 | ext4_ext_mark_uninitialized(ex1); | 2689 | ext4_ext_mark_uninitialized(ex1); |
| 2673 | ex2 = &newex; | 2690 | ex2 = &newex; |
| 2674 | } | 2691 | } |
| @@ -2677,15 +2694,15 @@ static int ext4_ext_convert_to_initialized(handle_t *handle, | |||
| 2677 | * we insert ex3, if ex1 is NULL. This is to avoid temporary | 2694 | * we insert ex3, if ex1 is NULL. This is to avoid temporary |
| 2678 | * overlap of blocks. | 2695 | * overlap of blocks. |
| 2679 | */ | 2696 | */ |
| 2680 | if (!ex1 && allocated > max_blocks) | 2697 | if (!ex1 && allocated > map->m_len) |
| 2681 | ex2->ee_len = cpu_to_le16(max_blocks); | 2698 | ex2->ee_len = cpu_to_le16(map->m_len); |
| 2682 | /* ex3: to ee_block + ee_len : uninitialised */ | 2699 | /* ex3: to ee_block + ee_len : uninitialised */ |
| 2683 | if (allocated > max_blocks) { | 2700 | if (allocated > map->m_len) { |
| 2684 | unsigned int newdepth; | 2701 | unsigned int newdepth; |
| 2685 | /* If extent has less than EXT4_EXT_ZERO_LEN zerout directly */ | 2702 | /* If extent has less than EXT4_EXT_ZERO_LEN zerout directly */ |
| 2686 | if (allocated <= EXT4_EXT_ZERO_LEN) { | 2703 | if (allocated <= EXT4_EXT_ZERO_LEN && may_zeroout) { |
| 2687 | /* | 2704 | /* |
| 2688 | * iblock == ee_block is handled by the zerouout | 2705 | * map->m_lblk == ee_block is handled by the zerouout |
| 2689 | * at the beginning. | 2706 | * at the beginning. |
| 2690 | * Mark first half uninitialized. | 2707 | * Mark first half uninitialized. |
| 2691 | * Mark second half initialized and zero out the | 2708 | * Mark second half initialized and zero out the |
| @@ -2698,7 +2715,7 @@ static int ext4_ext_convert_to_initialized(handle_t *handle, | |||
| 2698 | ext4_ext_dirty(handle, inode, path + depth); | 2715 | ext4_ext_dirty(handle, inode, path + depth); |
| 2699 | 2716 | ||
| 2700 | ex3 = &newex; | 2717 | ex3 = &newex; |
| 2701 | ex3->ee_block = cpu_to_le32(iblock); | 2718 | ex3->ee_block = cpu_to_le32(map->m_lblk); |
| 2702 | ext4_ext_store_pblock(ex3, newblock); | 2719 | ext4_ext_store_pblock(ex3, newblock); |
| 2703 | ex3->ee_len = cpu_to_le16(allocated); | 2720 | ex3->ee_len = cpu_to_le16(allocated); |
| 2704 | err = ext4_ext_insert_extent(handle, inode, path, | 2721 | err = ext4_ext_insert_extent(handle, inode, path, |
| @@ -2711,7 +2728,7 @@ static int ext4_ext_convert_to_initialized(handle_t *handle, | |||
| 2711 | ex->ee_len = orig_ex.ee_len; | 2728 | ex->ee_len = orig_ex.ee_len; |
| 2712 | ext4_ext_store_pblock(ex, ext_pblock(&orig_ex)); | 2729 | ext4_ext_store_pblock(ex, ext_pblock(&orig_ex)); |
| 2713 | ext4_ext_dirty(handle, inode, path + depth); | 2730 | ext4_ext_dirty(handle, inode, path + depth); |
| 2714 | /* blocks available from iblock */ | 2731 | /* blocks available from map->m_lblk */ |
| 2715 | return allocated; | 2732 | return allocated; |
| 2716 | 2733 | ||
| 2717 | } else if (err) | 2734 | } else if (err) |
| @@ -2733,8 +2750,8 @@ static int ext4_ext_convert_to_initialized(handle_t *handle, | |||
| 2733 | */ | 2750 | */ |
| 2734 | depth = ext_depth(inode); | 2751 | depth = ext_depth(inode); |
| 2735 | ext4_ext_drop_refs(path); | 2752 | ext4_ext_drop_refs(path); |
| 2736 | path = ext4_ext_find_extent(inode, | 2753 | path = ext4_ext_find_extent(inode, map->m_lblk, |
| 2737 | iblock, path); | 2754 | path); |
| 2738 | if (IS_ERR(path)) { | 2755 | if (IS_ERR(path)) { |
| 2739 | err = PTR_ERR(path); | 2756 | err = PTR_ERR(path); |
| 2740 | return err; | 2757 | return err; |
| @@ -2754,12 +2771,12 @@ static int ext4_ext_convert_to_initialized(handle_t *handle, | |||
| 2754 | return allocated; | 2771 | return allocated; |
| 2755 | } | 2772 | } |
| 2756 | ex3 = &newex; | 2773 | ex3 = &newex; |
| 2757 | ex3->ee_block = cpu_to_le32(iblock + max_blocks); | 2774 | ex3->ee_block = cpu_to_le32(map->m_lblk + map->m_len); |
| 2758 | ext4_ext_store_pblock(ex3, newblock + max_blocks); | 2775 | ext4_ext_store_pblock(ex3, newblock + map->m_len); |
| 2759 | ex3->ee_len = cpu_to_le16(allocated - max_blocks); | 2776 | ex3->ee_len = cpu_to_le16(allocated - map->m_len); |
| 2760 | ext4_ext_mark_uninitialized(ex3); | 2777 | ext4_ext_mark_uninitialized(ex3); |
| 2761 | err = ext4_ext_insert_extent(handle, inode, path, ex3, 0); | 2778 | err = ext4_ext_insert_extent(handle, inode, path, ex3, 0); |
| 2762 | if (err == -ENOSPC) { | 2779 | if (err == -ENOSPC && may_zeroout) { |
| 2763 | err = ext4_ext_zeroout(inode, &orig_ex); | 2780 | err = ext4_ext_zeroout(inode, &orig_ex); |
| 2764 | if (err) | 2781 | if (err) |
| 2765 | goto fix_extent_len; | 2782 | goto fix_extent_len; |
| @@ -2769,7 +2786,7 @@ static int ext4_ext_convert_to_initialized(handle_t *handle, | |||
| 2769 | ext4_ext_store_pblock(ex, ext_pblock(&orig_ex)); | 2786 | ext4_ext_store_pblock(ex, ext_pblock(&orig_ex)); |
| 2770 | ext4_ext_dirty(handle, inode, path + depth); | 2787 | ext4_ext_dirty(handle, inode, path + depth); |
| 2771 | /* zeroed the full extent */ | 2788 | /* zeroed the full extent */ |
| 2772 | /* blocks available from iblock */ | 2789 | /* blocks available from map->m_lblk */ |
| 2773 | return allocated; | 2790 | return allocated; |
| 2774 | 2791 | ||
| 2775 | } else if (err) | 2792 | } else if (err) |
| @@ -2783,11 +2800,13 @@ static int ext4_ext_convert_to_initialized(handle_t *handle, | |||
| 2783 | * update the extent length after successful insert of the | 2800 | * update the extent length after successful insert of the |
| 2784 | * split extent | 2801 | * split extent |
| 2785 | */ | 2802 | */ |
| 2786 | orig_ex.ee_len = cpu_to_le16(ee_len - | 2803 | ee_len -= ext4_ext_get_actual_len(ex3); |
| 2787 | ext4_ext_get_actual_len(ex3)); | 2804 | orig_ex.ee_len = cpu_to_le16(ee_len); |
| 2805 | may_zeroout = ee_block + ee_len <= eof_block; | ||
| 2806 | |||
| 2788 | depth = newdepth; | 2807 | depth = newdepth; |
| 2789 | ext4_ext_drop_refs(path); | 2808 | ext4_ext_drop_refs(path); |
| 2790 | path = ext4_ext_find_extent(inode, iblock, path); | 2809 | path = ext4_ext_find_extent(inode, map->m_lblk, path); |
| 2791 | if (IS_ERR(path)) { | 2810 | if (IS_ERR(path)) { |
| 2792 | err = PTR_ERR(path); | 2811 | err = PTR_ERR(path); |
| 2793 | goto out; | 2812 | goto out; |
| @@ -2801,14 +2820,14 @@ static int ext4_ext_convert_to_initialized(handle_t *handle, | |||
| 2801 | if (err) | 2820 | if (err) |
| 2802 | goto out; | 2821 | goto out; |
| 2803 | 2822 | ||
| 2804 | allocated = max_blocks; | 2823 | allocated = map->m_len; |
| 2805 | 2824 | ||
| 2806 | /* If extent has less than EXT4_EXT_ZERO_LEN and we are trying | 2825 | /* If extent has less than EXT4_EXT_ZERO_LEN and we are trying |
| 2807 | * to insert a extent in the middle zerout directly | 2826 | * to insert a extent in the middle zerout directly |
| 2808 | * otherwise give the extent a chance to merge to left | 2827 | * otherwise give the extent a chance to merge to left |
| 2809 | */ | 2828 | */ |
| 2810 | if (le16_to_cpu(orig_ex.ee_len) <= EXT4_EXT_ZERO_LEN && | 2829 | if (le16_to_cpu(orig_ex.ee_len) <= EXT4_EXT_ZERO_LEN && |
| 2811 | iblock != ee_block) { | 2830 | map->m_lblk != ee_block && may_zeroout) { |
| 2812 | err = ext4_ext_zeroout(inode, &orig_ex); | 2831 | err = ext4_ext_zeroout(inode, &orig_ex); |
| 2813 | if (err) | 2832 | if (err) |
| 2814 | goto fix_extent_len; | 2833 | goto fix_extent_len; |
| @@ -2818,7 +2837,7 @@ static int ext4_ext_convert_to_initialized(handle_t *handle, | |||
| 2818 | ext4_ext_store_pblock(ex, ext_pblock(&orig_ex)); | 2837 | ext4_ext_store_pblock(ex, ext_pblock(&orig_ex)); |
| 2819 | ext4_ext_dirty(handle, inode, path + depth); | 2838 | ext4_ext_dirty(handle, inode, path + depth); |
| 2820 | /* zero out the first half */ | 2839 | /* zero out the first half */ |
| 2821 | /* blocks available from iblock */ | 2840 | /* blocks available from map->m_lblk */ |
| 2822 | return allocated; | 2841 | return allocated; |
| 2823 | } | 2842 | } |
| 2824 | } | 2843 | } |
| @@ -2829,12 +2848,12 @@ static int ext4_ext_convert_to_initialized(handle_t *handle, | |||
| 2829 | */ | 2848 | */ |
| 2830 | if (ex1 && ex1 != ex) { | 2849 | if (ex1 && ex1 != ex) { |
| 2831 | ex1 = ex; | 2850 | ex1 = ex; |
| 2832 | ex1->ee_len = cpu_to_le16(iblock - ee_block); | 2851 | ex1->ee_len = cpu_to_le16(map->m_lblk - ee_block); |
| 2833 | ext4_ext_mark_uninitialized(ex1); | 2852 | ext4_ext_mark_uninitialized(ex1); |
| 2834 | ex2 = &newex; | 2853 | ex2 = &newex; |
| 2835 | } | 2854 | } |
| 2836 | /* ex2: iblock to iblock + maxblocks-1 : initialised */ | 2855 | /* ex2: map->m_lblk to map->m_lblk + maxblocks-1 : initialised */ |
| 2837 | ex2->ee_block = cpu_to_le32(iblock); | 2856 | ex2->ee_block = cpu_to_le32(map->m_lblk); |
| 2838 | ext4_ext_store_pblock(ex2, newblock); | 2857 | ext4_ext_store_pblock(ex2, newblock); |
| 2839 | ex2->ee_len = cpu_to_le16(allocated); | 2858 | ex2->ee_len = cpu_to_le16(allocated); |
| 2840 | if (ex2 != ex) | 2859 | if (ex2 != ex) |
| @@ -2877,7 +2896,7 @@ static int ext4_ext_convert_to_initialized(handle_t *handle, | |||
| 2877 | goto out; | 2896 | goto out; |
| 2878 | insert: | 2897 | insert: |
| 2879 | err = ext4_ext_insert_extent(handle, inode, path, &newex, 0); | 2898 | err = ext4_ext_insert_extent(handle, inode, path, &newex, 0); |
| 2880 | if (err == -ENOSPC) { | 2899 | if (err == -ENOSPC && may_zeroout) { |
| 2881 | err = ext4_ext_zeroout(inode, &orig_ex); | 2900 | err = ext4_ext_zeroout(inode, &orig_ex); |
| 2882 | if (err) | 2901 | if (err) |
| 2883 | goto fix_extent_len; | 2902 | goto fix_extent_len; |
| @@ -2904,7 +2923,7 @@ fix_extent_len: | |||
| 2904 | } | 2923 | } |
| 2905 | 2924 | ||
| 2906 | /* | 2925 | /* |
| 2907 | * This function is called by ext4_ext_get_blocks() from | 2926 | * This function is called by ext4_ext_map_blocks() from |
| 2908 | * ext4_get_blocks_dio_write() when DIO to write | 2927 | * ext4_get_blocks_dio_write() when DIO to write |
| 2909 | * to an uninitialized extent. | 2928 | * to an uninitialized extent. |
| 2910 | * | 2929 | * |
| @@ -2927,9 +2946,8 @@ fix_extent_len: | |||
| 2927 | */ | 2946 | */ |
| 2928 | static int ext4_split_unwritten_extents(handle_t *handle, | 2947 | static int ext4_split_unwritten_extents(handle_t *handle, |
| 2929 | struct inode *inode, | 2948 | struct inode *inode, |
| 2949 | struct ext4_map_blocks *map, | ||
| 2930 | struct ext4_ext_path *path, | 2950 | struct ext4_ext_path *path, |
| 2931 | ext4_lblk_t iblock, | ||
| 2932 | unsigned int max_blocks, | ||
| 2933 | int flags) | 2951 | int flags) |
| 2934 | { | 2952 | { |
| 2935 | struct ext4_extent *ex, newex, orig_ex; | 2953 | struct ext4_extent *ex, newex, orig_ex; |
| @@ -2937,41 +2955,55 @@ static int ext4_split_unwritten_extents(handle_t *handle, | |||
| 2937 | struct ext4_extent *ex2 = NULL; | 2955 | struct ext4_extent *ex2 = NULL; |
| 2938 | struct ext4_extent *ex3 = NULL; | 2956 | struct ext4_extent *ex3 = NULL; |
| 2939 | struct ext4_extent_header *eh; | 2957 | struct ext4_extent_header *eh; |
| 2940 | ext4_lblk_t ee_block; | 2958 | ext4_lblk_t ee_block, eof_block; |
| 2941 | unsigned int allocated, ee_len, depth; | 2959 | unsigned int allocated, ee_len, depth; |
| 2942 | ext4_fsblk_t newblock; | 2960 | ext4_fsblk_t newblock; |
| 2943 | int err = 0; | 2961 | int err = 0; |
| 2962 | int may_zeroout; | ||
| 2963 | |||
| 2964 | ext_debug("ext4_split_unwritten_extents: inode %lu, logical" | ||
| 2965 | "block %llu, max_blocks %u\n", inode->i_ino, | ||
| 2966 | (unsigned long long)map->m_lblk, map->m_len); | ||
| 2967 | |||
| 2968 | eof_block = (inode->i_size + inode->i_sb->s_blocksize - 1) >> | ||
| 2969 | inode->i_sb->s_blocksize_bits; | ||
| 2970 | if (eof_block < map->m_lblk + map->m_len) | ||
| 2971 | eof_block = map->m_lblk + map->m_len; | ||
| 2944 | 2972 | ||
| 2945 | ext_debug("ext4_split_unwritten_extents: inode %lu," | ||
| 2946 | "iblock %llu, max_blocks %u\n", inode->i_ino, | ||
| 2947 | (unsigned long long)iblock, max_blocks); | ||
| 2948 | depth = ext_depth(inode); | 2973 | depth = ext_depth(inode); |
| 2949 | eh = path[depth].p_hdr; | 2974 | eh = path[depth].p_hdr; |
| 2950 | ex = path[depth].p_ext; | 2975 | ex = path[depth].p_ext; |
| 2951 | ee_block = le32_to_cpu(ex->ee_block); | 2976 | ee_block = le32_to_cpu(ex->ee_block); |
| 2952 | ee_len = ext4_ext_get_actual_len(ex); | 2977 | ee_len = ext4_ext_get_actual_len(ex); |
| 2953 | allocated = ee_len - (iblock - ee_block); | 2978 | allocated = ee_len - (map->m_lblk - ee_block); |
| 2954 | newblock = iblock - ee_block + ext_pblock(ex); | 2979 | newblock = map->m_lblk - ee_block + ext_pblock(ex); |
| 2980 | |||
| 2955 | ex2 = ex; | 2981 | ex2 = ex; |
| 2956 | orig_ex.ee_block = ex->ee_block; | 2982 | orig_ex.ee_block = ex->ee_block; |
| 2957 | orig_ex.ee_len = cpu_to_le16(ee_len); | 2983 | orig_ex.ee_len = cpu_to_le16(ee_len); |
| 2958 | ext4_ext_store_pblock(&orig_ex, ext_pblock(ex)); | 2984 | ext4_ext_store_pblock(&orig_ex, ext_pblock(ex)); |
| 2959 | 2985 | ||
| 2960 | /* | 2986 | /* |
| 2987 | * It is safe to convert extent to initialized via explicit | ||
| 2988 | * zeroout only if extent is fully insde i_size or new_size. | ||
| 2989 | */ | ||
| 2990 | may_zeroout = ee_block + ee_len <= eof_block; | ||
| 2991 | |||
| 2992 | /* | ||
| 2961 | * If the uninitialized extent begins at the same logical | 2993 | * If the uninitialized extent begins at the same logical |
| 2962 | * block where the write begins, and the write completely | 2994 | * block where the write begins, and the write completely |
| 2963 | * covers the extent, then we don't need to split it. | 2995 | * covers the extent, then we don't need to split it. |
| 2964 | */ | 2996 | */ |
| 2965 | if ((iblock == ee_block) && (allocated <= max_blocks)) | 2997 | if ((map->m_lblk == ee_block) && (allocated <= map->m_len)) |
| 2966 | return allocated; | 2998 | return allocated; |
| 2967 | 2999 | ||
| 2968 | err = ext4_ext_get_access(handle, inode, path + depth); | 3000 | err = ext4_ext_get_access(handle, inode, path + depth); |
| 2969 | if (err) | 3001 | if (err) |
| 2970 | goto out; | 3002 | goto out; |
| 2971 | /* ex1: ee_block to iblock - 1 : uninitialized */ | 3003 | /* ex1: ee_block to map->m_lblk - 1 : uninitialized */ |
| 2972 | if (iblock > ee_block) { | 3004 | if (map->m_lblk > ee_block) { |
| 2973 | ex1 = ex; | 3005 | ex1 = ex; |
| 2974 | ex1->ee_len = cpu_to_le16(iblock - ee_block); | 3006 | ex1->ee_len = cpu_to_le16(map->m_lblk - ee_block); |
| 2975 | ext4_ext_mark_uninitialized(ex1); | 3007 | ext4_ext_mark_uninitialized(ex1); |
| 2976 | ex2 = &newex; | 3008 | ex2 = &newex; |
| 2977 | } | 3009 | } |
| @@ -2980,18 +3012,18 @@ static int ext4_split_unwritten_extents(handle_t *handle, | |||
| 2980 | * we insert ex3, if ex1 is NULL. This is to avoid temporary | 3012 | * we insert ex3, if ex1 is NULL. This is to avoid temporary |
| 2981 | * overlap of blocks. | 3013 | * overlap of blocks. |
| 2982 | */ | 3014 | */ |
| 2983 | if (!ex1 && allocated > max_blocks) | 3015 | if (!ex1 && allocated > map->m_len) |
| 2984 | ex2->ee_len = cpu_to_le16(max_blocks); | 3016 | ex2->ee_len = cpu_to_le16(map->m_len); |
| 2985 | /* ex3: to ee_block + ee_len : uninitialised */ | 3017 | /* ex3: to ee_block + ee_len : uninitialised */ |
| 2986 | if (allocated > max_blocks) { | 3018 | if (allocated > map->m_len) { |
| 2987 | unsigned int newdepth; | 3019 | unsigned int newdepth; |
| 2988 | ex3 = &newex; | 3020 | ex3 = &newex; |
| 2989 | ex3->ee_block = cpu_to_le32(iblock + max_blocks); | 3021 | ex3->ee_block = cpu_to_le32(map->m_lblk + map->m_len); |
| 2990 | ext4_ext_store_pblock(ex3, newblock + max_blocks); | 3022 | ext4_ext_store_pblock(ex3, newblock + map->m_len); |
| 2991 | ex3->ee_len = cpu_to_le16(allocated - max_blocks); | 3023 | ex3->ee_len = cpu_to_le16(allocated - map->m_len); |
| 2992 | ext4_ext_mark_uninitialized(ex3); | 3024 | ext4_ext_mark_uninitialized(ex3); |
| 2993 | err = ext4_ext_insert_extent(handle, inode, path, ex3, flags); | 3025 | err = ext4_ext_insert_extent(handle, inode, path, ex3, flags); |
| 2994 | if (err == -ENOSPC) { | 3026 | if (err == -ENOSPC && may_zeroout) { |
| 2995 | err = ext4_ext_zeroout(inode, &orig_ex); | 3027 | err = ext4_ext_zeroout(inode, &orig_ex); |
| 2996 | if (err) | 3028 | if (err) |
| 2997 | goto fix_extent_len; | 3029 | goto fix_extent_len; |
| @@ -3001,7 +3033,7 @@ static int ext4_split_unwritten_extents(handle_t *handle, | |||
| 3001 | ext4_ext_store_pblock(ex, ext_pblock(&orig_ex)); | 3033 | ext4_ext_store_pblock(ex, ext_pblock(&orig_ex)); |
| 3002 | ext4_ext_dirty(handle, inode, path + depth); | 3034 | ext4_ext_dirty(handle, inode, path + depth); |
| 3003 | /* zeroed the full extent */ | 3035 | /* zeroed the full extent */ |
| 3004 | /* blocks available from iblock */ | 3036 | /* blocks available from map->m_lblk */ |
| 3005 | return allocated; | 3037 | return allocated; |
| 3006 | 3038 | ||
| 3007 | } else if (err) | 3039 | } else if (err) |
| @@ -3015,11 +3047,13 @@ static int ext4_split_unwritten_extents(handle_t *handle, | |||
| 3015 | * update the extent length after successful insert of the | 3047 | * update the extent length after successful insert of the |
| 3016 | * split extent | 3048 | * split extent |
| 3017 | */ | 3049 | */ |
| 3018 | orig_ex.ee_len = cpu_to_le16(ee_len - | 3050 | ee_len -= ext4_ext_get_actual_len(ex3); |
| 3019 | ext4_ext_get_actual_len(ex3)); | 3051 | orig_ex.ee_len = cpu_to_le16(ee_len); |
| 3052 | may_zeroout = ee_block + ee_len <= eof_block; | ||
| 3053 | |||
| 3020 | depth = newdepth; | 3054 | depth = newdepth; |
| 3021 | ext4_ext_drop_refs(path); | 3055 | ext4_ext_drop_refs(path); |
| 3022 | path = ext4_ext_find_extent(inode, iblock, path); | 3056 | path = ext4_ext_find_extent(inode, map->m_lblk, path); |
| 3023 | if (IS_ERR(path)) { | 3057 | if (IS_ERR(path)) { |
| 3024 | err = PTR_ERR(path); | 3058 | err = PTR_ERR(path); |
| 3025 | goto out; | 3059 | goto out; |
| @@ -3033,7 +3067,7 @@ static int ext4_split_unwritten_extents(handle_t *handle, | |||
| 3033 | if (err) | 3067 | if (err) |
| 3034 | goto out; | 3068 | goto out; |
| 3035 | 3069 | ||
| 3036 | allocated = max_blocks; | 3070 | allocated = map->m_len; |
| 3037 | } | 3071 | } |
| 3038 | /* | 3072 | /* |
| 3039 | * If there was a change of depth as part of the | 3073 | * If there was a change of depth as part of the |
| @@ -3042,15 +3076,15 @@ static int ext4_split_unwritten_extents(handle_t *handle, | |||
| 3042 | */ | 3076 | */ |
| 3043 | if (ex1 && ex1 != ex) { | 3077 | if (ex1 && ex1 != ex) { |
| 3044 | ex1 = ex; | 3078 | ex1 = ex; |
| 3045 | ex1->ee_len = cpu_to_le16(iblock - ee_block); | 3079 | ex1->ee_len = cpu_to_le16(map->m_lblk - ee_block); |
| 3046 | ext4_ext_mark_uninitialized(ex1); | 3080 | ext4_ext_mark_uninitialized(ex1); |
| 3047 | ex2 = &newex; | 3081 | ex2 = &newex; |
| 3048 | } | 3082 | } |
| 3049 | /* | 3083 | /* |
| 3050 | * ex2: iblock to iblock + maxblocks-1 : to be direct IO written, | 3084 | * ex2: map->m_lblk to map->m_lblk + map->m_len-1 : to be written |
| 3051 | * uninitialised still. | 3085 | * using direct I/O, uninitialised still. |
| 3052 | */ | 3086 | */ |
| 3053 | ex2->ee_block = cpu_to_le32(iblock); | 3087 | ex2->ee_block = cpu_to_le32(map->m_lblk); |
| 3054 | ext4_ext_store_pblock(ex2, newblock); | 3088 | ext4_ext_store_pblock(ex2, newblock); |
| 3055 | ex2->ee_len = cpu_to_le16(allocated); | 3089 | ex2->ee_len = cpu_to_le16(allocated); |
| 3056 | ext4_ext_mark_uninitialized(ex2); | 3090 | ext4_ext_mark_uninitialized(ex2); |
| @@ -3062,7 +3096,7 @@ static int ext4_split_unwritten_extents(handle_t *handle, | |||
| 3062 | goto out; | 3096 | goto out; |
| 3063 | insert: | 3097 | insert: |
| 3064 | err = ext4_ext_insert_extent(handle, inode, path, &newex, flags); | 3098 | err = ext4_ext_insert_extent(handle, inode, path, &newex, flags); |
| 3065 | if (err == -ENOSPC) { | 3099 | if (err == -ENOSPC && may_zeroout) { |
| 3066 | err = ext4_ext_zeroout(inode, &orig_ex); | 3100 | err = ext4_ext_zeroout(inode, &orig_ex); |
| 3067 | if (err) | 3101 | if (err) |
| 3068 | goto fix_extent_len; | 3102 | goto fix_extent_len; |
| @@ -3152,10 +3186,9 @@ static void unmap_underlying_metadata_blocks(struct block_device *bdev, | |||
| 3152 | 3186 | ||
| 3153 | static int | 3187 | static int |
| 3154 | ext4_ext_handle_uninitialized_extents(handle_t *handle, struct inode *inode, | 3188 | ext4_ext_handle_uninitialized_extents(handle_t *handle, struct inode *inode, |
| 3155 | ext4_lblk_t iblock, unsigned int max_blocks, | 3189 | struct ext4_map_blocks *map, |
| 3156 | struct ext4_ext_path *path, int flags, | 3190 | struct ext4_ext_path *path, int flags, |
| 3157 | unsigned int allocated, struct buffer_head *bh_result, | 3191 | unsigned int allocated, ext4_fsblk_t newblock) |
| 3158 | ext4_fsblk_t newblock) | ||
| 3159 | { | 3192 | { |
| 3160 | int ret = 0; | 3193 | int ret = 0; |
| 3161 | int err = 0; | 3194 | int err = 0; |
| @@ -3163,15 +3196,14 @@ ext4_ext_handle_uninitialized_extents(handle_t *handle, struct inode *inode, | |||
| 3163 | 3196 | ||
| 3164 | ext_debug("ext4_ext_handle_uninitialized_extents: inode %lu, logical" | 3197 | ext_debug("ext4_ext_handle_uninitialized_extents: inode %lu, logical" |
| 3165 | "block %llu, max_blocks %u, flags %d, allocated %u", | 3198 | "block %llu, max_blocks %u, flags %d, allocated %u", |
| 3166 | inode->i_ino, (unsigned long long)iblock, max_blocks, | 3199 | inode->i_ino, (unsigned long long)map->m_lblk, map->m_len, |
| 3167 | flags, allocated); | 3200 | flags, allocated); |
| 3168 | ext4_ext_show_leaf(inode, path); | 3201 | ext4_ext_show_leaf(inode, path); |
| 3169 | 3202 | ||
| 3170 | /* get_block() before submit the IO, split the extent */ | 3203 | /* get_block() before submit the IO, split the extent */ |
| 3171 | if ((flags & EXT4_GET_BLOCKS_PRE_IO)) { | 3204 | if ((flags & EXT4_GET_BLOCKS_PRE_IO)) { |
| 3172 | ret = ext4_split_unwritten_extents(handle, | 3205 | ret = ext4_split_unwritten_extents(handle, inode, map, |
| 3173 | inode, path, iblock, | 3206 | path, flags); |
| 3174 | max_blocks, flags); | ||
| 3175 | /* | 3207 | /* |
| 3176 | * Flag the inode(non aio case) or end_io struct (aio case) | 3208 | * Flag the inode(non aio case) or end_io struct (aio case) |
| 3177 | * that this IO needs to convertion to written when IO is | 3209 | * that this IO needs to convertion to written when IO is |
| @@ -3182,7 +3214,7 @@ ext4_ext_handle_uninitialized_extents(handle_t *handle, struct inode *inode, | |||
| 3182 | else | 3214 | else |
| 3183 | ext4_set_inode_state(inode, EXT4_STATE_DIO_UNWRITTEN); | 3215 | ext4_set_inode_state(inode, EXT4_STATE_DIO_UNWRITTEN); |
| 3184 | if (ext4_should_dioread_nolock(inode)) | 3216 | if (ext4_should_dioread_nolock(inode)) |
| 3185 | set_buffer_uninit(bh_result); | 3217 | map->m_flags |= EXT4_MAP_UNINIT; |
| 3186 | goto out; | 3218 | goto out; |
| 3187 | } | 3219 | } |
| 3188 | /* IO end_io complete, convert the filled extent to written */ | 3220 | /* IO end_io complete, convert the filled extent to written */ |
| @@ -3210,14 +3242,12 @@ ext4_ext_handle_uninitialized_extents(handle_t *handle, struct inode *inode, | |||
| 3210 | * the buffer head will be unmapped so that | 3242 | * the buffer head will be unmapped so that |
| 3211 | * a read from the block returns 0s. | 3243 | * a read from the block returns 0s. |
| 3212 | */ | 3244 | */ |
| 3213 | set_buffer_unwritten(bh_result); | 3245 | map->m_flags |= EXT4_MAP_UNWRITTEN; |
| 3214 | goto out1; | 3246 | goto out1; |
| 3215 | } | 3247 | } |
| 3216 | 3248 | ||
| 3217 | /* buffered write, writepage time, convert*/ | 3249 | /* buffered write, writepage time, convert*/ |
| 3218 | ret = ext4_ext_convert_to_initialized(handle, inode, | 3250 | ret = ext4_ext_convert_to_initialized(handle, inode, map, path); |
| 3219 | path, iblock, | ||
| 3220 | max_blocks); | ||
| 3221 | if (ret >= 0) | 3251 | if (ret >= 0) |
| 3222 | ext4_update_inode_fsync_trans(handle, inode, 1); | 3252 | ext4_update_inode_fsync_trans(handle, inode, 1); |
| 3223 | out: | 3253 | out: |
| @@ -3226,7 +3256,7 @@ out: | |||
| 3226 | goto out2; | 3256 | goto out2; |
| 3227 | } else | 3257 | } else |
| 3228 | allocated = ret; | 3258 | allocated = ret; |
| 3229 | set_buffer_new(bh_result); | 3259 | map->m_flags |= EXT4_MAP_NEW; |
| 3230 | /* | 3260 | /* |
| 3231 | * if we allocated more blocks than requested | 3261 | * if we allocated more blocks than requested |
| 3232 | * we need to make sure we unmap the extra block | 3262 | * we need to make sure we unmap the extra block |
| @@ -3234,11 +3264,11 @@ out: | |||
| 3234 | * unmapped later when we find the buffer_head marked | 3264 | * unmapped later when we find the buffer_head marked |
| 3235 | * new. | 3265 | * new. |
| 3236 | */ | 3266 | */ |
| 3237 | if (allocated > max_blocks) { | 3267 | if (allocated > map->m_len) { |
| 3238 | unmap_underlying_metadata_blocks(inode->i_sb->s_bdev, | 3268 | unmap_underlying_metadata_blocks(inode->i_sb->s_bdev, |
| 3239 | newblock + max_blocks, | 3269 | newblock + map->m_len, |
| 3240 | allocated - max_blocks); | 3270 | allocated - map->m_len); |
| 3241 | allocated = max_blocks; | 3271 | allocated = map->m_len; |
| 3242 | } | 3272 | } |
| 3243 | 3273 | ||
| 3244 | /* | 3274 | /* |
| @@ -3252,13 +3282,13 @@ out: | |||
| 3252 | ext4_da_update_reserve_space(inode, allocated, 0); | 3282 | ext4_da_update_reserve_space(inode, allocated, 0); |
| 3253 | 3283 | ||
| 3254 | map_out: | 3284 | map_out: |
| 3255 | set_buffer_mapped(bh_result); | 3285 | map->m_flags |= EXT4_MAP_MAPPED; |
| 3256 | out1: | 3286 | out1: |
| 3257 | if (allocated > max_blocks) | 3287 | if (allocated > map->m_len) |
| 3258 | allocated = max_blocks; | 3288 | allocated = map->m_len; |
| 3259 | ext4_ext_show_leaf(inode, path); | 3289 | ext4_ext_show_leaf(inode, path); |
| 3260 | bh_result->b_bdev = inode->i_sb->s_bdev; | 3290 | map->m_pblk = newblock; |
| 3261 | bh_result->b_blocknr = newblock; | 3291 | map->m_len = allocated; |
| 3262 | out2: | 3292 | out2: |
| 3263 | if (path) { | 3293 | if (path) { |
| 3264 | ext4_ext_drop_refs(path); | 3294 | ext4_ext_drop_refs(path); |
| @@ -3284,26 +3314,23 @@ out2: | |||
| 3284 | * | 3314 | * |
| 3285 | * return < 0, error case. | 3315 | * return < 0, error case. |
| 3286 | */ | 3316 | */ |
| 3287 | int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | 3317 | int ext4_ext_map_blocks(handle_t *handle, struct inode *inode, |
| 3288 | ext4_lblk_t iblock, | 3318 | struct ext4_map_blocks *map, int flags) |
| 3289 | unsigned int max_blocks, struct buffer_head *bh_result, | ||
| 3290 | int flags) | ||
| 3291 | { | 3319 | { |
| 3292 | struct ext4_ext_path *path = NULL; | 3320 | struct ext4_ext_path *path = NULL; |
| 3293 | struct ext4_extent_header *eh; | 3321 | struct ext4_extent_header *eh; |
| 3294 | struct ext4_extent newex, *ex, *last_ex; | 3322 | struct ext4_extent newex, *ex, *last_ex; |
| 3295 | ext4_fsblk_t newblock; | 3323 | ext4_fsblk_t newblock; |
| 3296 | int err = 0, depth, ret, cache_type; | 3324 | int i, err = 0, depth, ret, cache_type; |
| 3297 | unsigned int allocated = 0; | 3325 | unsigned int allocated = 0; |
| 3298 | struct ext4_allocation_request ar; | 3326 | struct ext4_allocation_request ar; |
| 3299 | ext4_io_end_t *io = EXT4_I(inode)->cur_aio_dio; | 3327 | ext4_io_end_t *io = EXT4_I(inode)->cur_aio_dio; |
| 3300 | 3328 | ||
| 3301 | __clear_bit(BH_New, &bh_result->b_state); | ||
| 3302 | ext_debug("blocks %u/%u requested for inode %lu\n", | 3329 | ext_debug("blocks %u/%u requested for inode %lu\n", |
| 3303 | iblock, max_blocks, inode->i_ino); | 3330 | map->m_lblk, map->m_len, inode->i_ino); |
| 3304 | 3331 | ||
| 3305 | /* check in cache */ | 3332 | /* check in cache */ |
| 3306 | cache_type = ext4_ext_in_cache(inode, iblock, &newex); | 3333 | cache_type = ext4_ext_in_cache(inode, map->m_lblk, &newex); |
| 3307 | if (cache_type) { | 3334 | if (cache_type) { |
| 3308 | if (cache_type == EXT4_EXT_CACHE_GAP) { | 3335 | if (cache_type == EXT4_EXT_CACHE_GAP) { |
| 3309 | if ((flags & EXT4_GET_BLOCKS_CREATE) == 0) { | 3336 | if ((flags & EXT4_GET_BLOCKS_CREATE) == 0) { |
| @@ -3316,12 +3343,12 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | |||
| 3316 | /* we should allocate requested block */ | 3343 | /* we should allocate requested block */ |
| 3317 | } else if (cache_type == EXT4_EXT_CACHE_EXTENT) { | 3344 | } else if (cache_type == EXT4_EXT_CACHE_EXTENT) { |
| 3318 | /* block is already allocated */ | 3345 | /* block is already allocated */ |
| 3319 | newblock = iblock | 3346 | newblock = map->m_lblk |
| 3320 | - le32_to_cpu(newex.ee_block) | 3347 | - le32_to_cpu(newex.ee_block) |
| 3321 | + ext_pblock(&newex); | 3348 | + ext_pblock(&newex); |
| 3322 | /* number of remaining blocks in the extent */ | 3349 | /* number of remaining blocks in the extent */ |
| 3323 | allocated = ext4_ext_get_actual_len(&newex) - | 3350 | allocated = ext4_ext_get_actual_len(&newex) - |
| 3324 | (iblock - le32_to_cpu(newex.ee_block)); | 3351 | (map->m_lblk - le32_to_cpu(newex.ee_block)); |
| 3325 | goto out; | 3352 | goto out; |
| 3326 | } else { | 3353 | } else { |
| 3327 | BUG(); | 3354 | BUG(); |
| @@ -3329,7 +3356,7 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | |||
| 3329 | } | 3356 | } |
| 3330 | 3357 | ||
| 3331 | /* find extent for this block */ | 3358 | /* find extent for this block */ |
| 3332 | path = ext4_ext_find_extent(inode, iblock, NULL); | 3359 | path = ext4_ext_find_extent(inode, map->m_lblk, NULL); |
| 3333 | if (IS_ERR(path)) { | 3360 | if (IS_ERR(path)) { |
| 3334 | err = PTR_ERR(path); | 3361 | err = PTR_ERR(path); |
| 3335 | path = NULL; | 3362 | path = NULL; |
| @@ -3345,8 +3372,9 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | |||
| 3345 | */ | 3372 | */ |
| 3346 | if (unlikely(path[depth].p_ext == NULL && depth != 0)) { | 3373 | if (unlikely(path[depth].p_ext == NULL && depth != 0)) { |
| 3347 | EXT4_ERROR_INODE(inode, "bad extent address " | 3374 | EXT4_ERROR_INODE(inode, "bad extent address " |
| 3348 | "iblock: %d, depth: %d pblock %lld", | 3375 | "lblock: %lu, depth: %d pblock %lld", |
| 3349 | iblock, depth, path[depth].p_block); | 3376 | (unsigned long) map->m_lblk, depth, |
| 3377 | path[depth].p_block); | ||
| 3350 | err = -EIO; | 3378 | err = -EIO; |
| 3351 | goto out2; | 3379 | goto out2; |
| 3352 | } | 3380 | } |
| @@ -3364,12 +3392,12 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | |||
| 3364 | */ | 3392 | */ |
| 3365 | ee_len = ext4_ext_get_actual_len(ex); | 3393 | ee_len = ext4_ext_get_actual_len(ex); |
| 3366 | /* if found extent covers block, simply return it */ | 3394 | /* if found extent covers block, simply return it */ |
| 3367 | if (in_range(iblock, ee_block, ee_len)) { | 3395 | if (in_range(map->m_lblk, ee_block, ee_len)) { |
| 3368 | newblock = iblock - ee_block + ee_start; | 3396 | newblock = map->m_lblk - ee_block + ee_start; |
| 3369 | /* number of remaining blocks in the extent */ | 3397 | /* number of remaining blocks in the extent */ |
| 3370 | allocated = ee_len - (iblock - ee_block); | 3398 | allocated = ee_len - (map->m_lblk - ee_block); |
| 3371 | ext_debug("%u fit into %u:%d -> %llu\n", iblock, | 3399 | ext_debug("%u fit into %u:%d -> %llu\n", map->m_lblk, |
| 3372 | ee_block, ee_len, newblock); | 3400 | ee_block, ee_len, newblock); |
| 3373 | 3401 | ||
| 3374 | /* Do not put uninitialized extent in the cache */ | 3402 | /* Do not put uninitialized extent in the cache */ |
| 3375 | if (!ext4_ext_is_uninitialized(ex)) { | 3403 | if (!ext4_ext_is_uninitialized(ex)) { |
| @@ -3379,8 +3407,8 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | |||
| 3379 | goto out; | 3407 | goto out; |
| 3380 | } | 3408 | } |
| 3381 | ret = ext4_ext_handle_uninitialized_extents(handle, | 3409 | ret = ext4_ext_handle_uninitialized_extents(handle, |
| 3382 | inode, iblock, max_blocks, path, | 3410 | inode, map, path, flags, allocated, |
| 3383 | flags, allocated, bh_result, newblock); | 3411 | newblock); |
| 3384 | return ret; | 3412 | return ret; |
| 3385 | } | 3413 | } |
| 3386 | } | 3414 | } |
| @@ -3394,7 +3422,7 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | |||
| 3394 | * put just found gap into cache to speed up | 3422 | * put just found gap into cache to speed up |
| 3395 | * subsequent requests | 3423 | * subsequent requests |
| 3396 | */ | 3424 | */ |
| 3397 | ext4_ext_put_gap_in_cache(inode, path, iblock); | 3425 | ext4_ext_put_gap_in_cache(inode, path, map->m_lblk); |
| 3398 | goto out2; | 3426 | goto out2; |
| 3399 | } | 3427 | } |
| 3400 | /* | 3428 | /* |
| @@ -3402,11 +3430,11 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | |||
| 3402 | */ | 3430 | */ |
| 3403 | 3431 | ||
| 3404 | /* find neighbour allocated blocks */ | 3432 | /* find neighbour allocated blocks */ |
| 3405 | ar.lleft = iblock; | 3433 | ar.lleft = map->m_lblk; |
| 3406 | err = ext4_ext_search_left(inode, path, &ar.lleft, &ar.pleft); | 3434 | err = ext4_ext_search_left(inode, path, &ar.lleft, &ar.pleft); |
| 3407 | if (err) | 3435 | if (err) |
| 3408 | goto out2; | 3436 | goto out2; |
| 3409 | ar.lright = iblock; | 3437 | ar.lright = map->m_lblk; |
| 3410 | err = ext4_ext_search_right(inode, path, &ar.lright, &ar.pright); | 3438 | err = ext4_ext_search_right(inode, path, &ar.lright, &ar.pright); |
| 3411 | if (err) | 3439 | if (err) |
| 3412 | goto out2; | 3440 | goto out2; |
| @@ -3417,26 +3445,26 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | |||
| 3417 | * EXT_INIT_MAX_LEN and for an uninitialized extent this limit is | 3445 | * EXT_INIT_MAX_LEN and for an uninitialized extent this limit is |
| 3418 | * EXT_UNINIT_MAX_LEN. | 3446 | * EXT_UNINIT_MAX_LEN. |
| 3419 | */ | 3447 | */ |
| 3420 | if (max_blocks > EXT_INIT_MAX_LEN && | 3448 | if (map->m_len > EXT_INIT_MAX_LEN && |
| 3421 | !(flags & EXT4_GET_BLOCKS_UNINIT_EXT)) | 3449 | !(flags & EXT4_GET_BLOCKS_UNINIT_EXT)) |
| 3422 | max_blocks = EXT_INIT_MAX_LEN; | 3450 | map->m_len = EXT_INIT_MAX_LEN; |
| 3423 | else if (max_blocks > EXT_UNINIT_MAX_LEN && | 3451 | else if (map->m_len > EXT_UNINIT_MAX_LEN && |
| 3424 | (flags & EXT4_GET_BLOCKS_UNINIT_EXT)) | 3452 | (flags & EXT4_GET_BLOCKS_UNINIT_EXT)) |
| 3425 | max_blocks = EXT_UNINIT_MAX_LEN; | 3453 | map->m_len = EXT_UNINIT_MAX_LEN; |
| 3426 | 3454 | ||
| 3427 | /* Check if we can really insert (iblock)::(iblock+max_blocks) extent */ | 3455 | /* Check if we can really insert (m_lblk)::(m_lblk + m_len) extent */ |
| 3428 | newex.ee_block = cpu_to_le32(iblock); | 3456 | newex.ee_block = cpu_to_le32(map->m_lblk); |
| 3429 | newex.ee_len = cpu_to_le16(max_blocks); | 3457 | newex.ee_len = cpu_to_le16(map->m_len); |
| 3430 | err = ext4_ext_check_overlap(inode, &newex, path); | 3458 | err = ext4_ext_check_overlap(inode, &newex, path); |
| 3431 | if (err) | 3459 | if (err) |
| 3432 | allocated = ext4_ext_get_actual_len(&newex); | 3460 | allocated = ext4_ext_get_actual_len(&newex); |
| 3433 | else | 3461 | else |
| 3434 | allocated = max_blocks; | 3462 | allocated = map->m_len; |
| 3435 | 3463 | ||
| 3436 | /* allocate new block */ | 3464 | /* allocate new block */ |
| 3437 | ar.inode = inode; | 3465 | ar.inode = inode; |
| 3438 | ar.goal = ext4_ext_find_goal(inode, path, iblock); | 3466 | ar.goal = ext4_ext_find_goal(inode, path, map->m_lblk); |
| 3439 | ar.logical = iblock; | 3467 | ar.logical = map->m_lblk; |
| 3440 | ar.len = allocated; | 3468 | ar.len = allocated; |
| 3441 | if (S_ISREG(inode->i_mode)) | 3469 | if (S_ISREG(inode->i_mode)) |
| 3442 | ar.flags = EXT4_MB_HINT_DATA; | 3470 | ar.flags = EXT4_MB_HINT_DATA; |
| @@ -3470,21 +3498,33 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | |||
| 3470 | EXT4_STATE_DIO_UNWRITTEN); | 3498 | EXT4_STATE_DIO_UNWRITTEN); |
| 3471 | } | 3499 | } |
| 3472 | if (ext4_should_dioread_nolock(inode)) | 3500 | if (ext4_should_dioread_nolock(inode)) |
| 3473 | set_buffer_uninit(bh_result); | 3501 | map->m_flags |= EXT4_MAP_UNINIT; |
| 3474 | } | 3502 | } |
| 3475 | 3503 | ||
| 3476 | if (unlikely(EXT4_I(inode)->i_flags & EXT4_EOFBLOCKS_FL)) { | 3504 | if (unlikely(ext4_test_inode_flag(inode, EXT4_INODE_EOFBLOCKS))) { |
| 3477 | if (unlikely(!eh->eh_entries)) { | 3505 | if (unlikely(!eh->eh_entries)) { |
| 3478 | EXT4_ERROR_INODE(inode, | 3506 | EXT4_ERROR_INODE(inode, |
| 3479 | "eh->eh_entries == 0 ee_block %d", | 3507 | "eh->eh_entries == 0 and " |
| 3480 | ex->ee_block); | 3508 | "EOFBLOCKS_FL set"); |
| 3481 | err = -EIO; | 3509 | err = -EIO; |
| 3482 | goto out2; | 3510 | goto out2; |
| 3483 | } | 3511 | } |
| 3484 | last_ex = EXT_LAST_EXTENT(eh); | 3512 | last_ex = EXT_LAST_EXTENT(eh); |
| 3485 | if (iblock + ar.len > le32_to_cpu(last_ex->ee_block) | 3513 | /* |
| 3486 | + ext4_ext_get_actual_len(last_ex)) | 3514 | * If the current leaf block was reached by looking at |
| 3487 | EXT4_I(inode)->i_flags &= ~EXT4_EOFBLOCKS_FL; | 3515 | * the last index block all the way down the tree, and |
| 3516 | * we are extending the inode beyond the last extent | ||
| 3517 | * in the current leaf block, then clear the | ||
| 3518 | * EOFBLOCKS_FL flag. | ||
| 3519 | */ | ||
| 3520 | for (i = depth-1; i >= 0; i--) { | ||
| 3521 | if (path[i].p_idx != EXT_LAST_INDEX(path[i].p_hdr)) | ||
| 3522 | break; | ||
| 3523 | } | ||
| 3524 | if ((i < 0) && | ||
| 3525 | (map->m_lblk + ar.len > le32_to_cpu(last_ex->ee_block) + | ||
| 3526 | ext4_ext_get_actual_len(last_ex))) | ||
| 3527 | ext4_clear_inode_flag(inode, EXT4_INODE_EOFBLOCKS); | ||
| 3488 | } | 3528 | } |
| 3489 | err = ext4_ext_insert_extent(handle, inode, path, &newex, flags); | 3529 | err = ext4_ext_insert_extent(handle, inode, path, &newex, flags); |
| 3490 | if (err) { | 3530 | if (err) { |
| @@ -3500,9 +3540,9 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | |||
| 3500 | /* previous routine could use block we allocated */ | 3540 | /* previous routine could use block we allocated */ |
| 3501 | newblock = ext_pblock(&newex); | 3541 | newblock = ext_pblock(&newex); |
| 3502 | allocated = ext4_ext_get_actual_len(&newex); | 3542 | allocated = ext4_ext_get_actual_len(&newex); |
| 3503 | if (allocated > max_blocks) | 3543 | if (allocated > map->m_len) |
| 3504 | allocated = max_blocks; | 3544 | allocated = map->m_len; |
| 3505 | set_buffer_new(bh_result); | 3545 | map->m_flags |= EXT4_MAP_NEW; |
| 3506 | 3546 | ||
| 3507 | /* | 3547 | /* |
| 3508 | * Update reserved blocks/metadata blocks after successful | 3548 | * Update reserved blocks/metadata blocks after successful |
| @@ -3516,18 +3556,18 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | |||
| 3516 | * when it is _not_ an uninitialized extent. | 3556 | * when it is _not_ an uninitialized extent. |
| 3517 | */ | 3557 | */ |
| 3518 | if ((flags & EXT4_GET_BLOCKS_UNINIT_EXT) == 0) { | 3558 | if ((flags & EXT4_GET_BLOCKS_UNINIT_EXT) == 0) { |
| 3519 | ext4_ext_put_in_cache(inode, iblock, allocated, newblock, | 3559 | ext4_ext_put_in_cache(inode, map->m_lblk, allocated, newblock, |
| 3520 | EXT4_EXT_CACHE_EXTENT); | 3560 | EXT4_EXT_CACHE_EXTENT); |
| 3521 | ext4_update_inode_fsync_trans(handle, inode, 1); | 3561 | ext4_update_inode_fsync_trans(handle, inode, 1); |
| 3522 | } else | 3562 | } else |
| 3523 | ext4_update_inode_fsync_trans(handle, inode, 0); | 3563 | ext4_update_inode_fsync_trans(handle, inode, 0); |
| 3524 | out: | 3564 | out: |
| 3525 | if (allocated > max_blocks) | 3565 | if (allocated > map->m_len) |
| 3526 | allocated = max_blocks; | 3566 | allocated = map->m_len; |
| 3527 | ext4_ext_show_leaf(inode, path); | 3567 | ext4_ext_show_leaf(inode, path); |
| 3528 | set_buffer_mapped(bh_result); | 3568 | map->m_flags |= EXT4_MAP_MAPPED; |
| 3529 | bh_result->b_bdev = inode->i_sb->s_bdev; | 3569 | map->m_pblk = newblock; |
| 3530 | bh_result->b_blocknr = newblock; | 3570 | map->m_len = allocated; |
| 3531 | out2: | 3571 | out2: |
| 3532 | if (path) { | 3572 | if (path) { |
| 3533 | ext4_ext_drop_refs(path); | 3573 | ext4_ext_drop_refs(path); |
| @@ -3625,7 +3665,7 @@ static void ext4_falloc_update_inode(struct inode *inode, | |||
| 3625 | * can proceed even if the new size is the same as i_size. | 3665 | * can proceed even if the new size is the same as i_size. |
| 3626 | */ | 3666 | */ |
| 3627 | if (new_size > i_size_read(inode)) | 3667 | if (new_size > i_size_read(inode)) |
| 3628 | EXT4_I(inode)->i_flags |= EXT4_EOFBLOCKS_FL; | 3668 | ext4_set_inode_flag(inode, EXT4_INODE_EOFBLOCKS); |
| 3629 | } | 3669 | } |
| 3630 | 3670 | ||
| 3631 | } | 3671 | } |
| @@ -3640,55 +3680,57 @@ static void ext4_falloc_update_inode(struct inode *inode, | |||
| 3640 | long ext4_fallocate(struct inode *inode, int mode, loff_t offset, loff_t len) | 3680 | long ext4_fallocate(struct inode *inode, int mode, loff_t offset, loff_t len) |
| 3641 | { | 3681 | { |
| 3642 | handle_t *handle; | 3682 | handle_t *handle; |
| 3643 | ext4_lblk_t block; | ||
| 3644 | loff_t new_size; | 3683 | loff_t new_size; |
| 3645 | unsigned int max_blocks; | 3684 | unsigned int max_blocks; |
| 3646 | int ret = 0; | 3685 | int ret = 0; |
| 3647 | int ret2 = 0; | 3686 | int ret2 = 0; |
| 3648 | int retries = 0; | 3687 | int retries = 0; |
| 3649 | struct buffer_head map_bh; | 3688 | struct ext4_map_blocks map; |
| 3650 | unsigned int credits, blkbits = inode->i_blkbits; | 3689 | unsigned int credits, blkbits = inode->i_blkbits; |
| 3651 | 3690 | ||
| 3652 | /* | 3691 | /* |
| 3653 | * currently supporting (pre)allocate mode for extent-based | 3692 | * currently supporting (pre)allocate mode for extent-based |
| 3654 | * files _only_ | 3693 | * files _only_ |
| 3655 | */ | 3694 | */ |
| 3656 | if (!(EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL)) | 3695 | if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) |
| 3657 | return -EOPNOTSUPP; | 3696 | return -EOPNOTSUPP; |
| 3658 | 3697 | ||
| 3659 | /* preallocation to directories is currently not supported */ | 3698 | /* preallocation to directories is currently not supported */ |
| 3660 | if (S_ISDIR(inode->i_mode)) | 3699 | if (S_ISDIR(inode->i_mode)) |
| 3661 | return -ENODEV; | 3700 | return -ENODEV; |
| 3662 | 3701 | ||
| 3663 | block = offset >> blkbits; | 3702 | map.m_lblk = offset >> blkbits; |
| 3664 | /* | 3703 | /* |
| 3665 | * We can't just convert len to max_blocks because | 3704 | * We can't just convert len to max_blocks because |
| 3666 | * If blocksize = 4096 offset = 3072 and len = 2048 | 3705 | * If blocksize = 4096 offset = 3072 and len = 2048 |
| 3667 | */ | 3706 | */ |
| 3668 | max_blocks = (EXT4_BLOCK_ALIGN(len + offset, blkbits) >> blkbits) | 3707 | max_blocks = (EXT4_BLOCK_ALIGN(len + offset, blkbits) >> blkbits) |
| 3669 | - block; | 3708 | - map.m_lblk; |
| 3670 | /* | 3709 | /* |
| 3671 | * credits to insert 1 extent into extent tree | 3710 | * credits to insert 1 extent into extent tree |
| 3672 | */ | 3711 | */ |
| 3673 | credits = ext4_chunk_trans_blocks(inode, max_blocks); | 3712 | credits = ext4_chunk_trans_blocks(inode, max_blocks); |
| 3674 | mutex_lock(&inode->i_mutex); | 3713 | mutex_lock(&inode->i_mutex); |
| 3714 | ret = inode_newsize_ok(inode, (len + offset)); | ||
| 3715 | if (ret) { | ||
| 3716 | mutex_unlock(&inode->i_mutex); | ||
| 3717 | return ret; | ||
| 3718 | } | ||
| 3675 | retry: | 3719 | retry: |
| 3676 | while (ret >= 0 && ret < max_blocks) { | 3720 | while (ret >= 0 && ret < max_blocks) { |
| 3677 | block = block + ret; | 3721 | map.m_lblk = map.m_lblk + ret; |
| 3678 | max_blocks = max_blocks - ret; | 3722 | map.m_len = max_blocks = max_blocks - ret; |
| 3679 | handle = ext4_journal_start(inode, credits); | 3723 | handle = ext4_journal_start(inode, credits); |
| 3680 | if (IS_ERR(handle)) { | 3724 | if (IS_ERR(handle)) { |
| 3681 | ret = PTR_ERR(handle); | 3725 | ret = PTR_ERR(handle); |
| 3682 | break; | 3726 | break; |
| 3683 | } | 3727 | } |
| 3684 | map_bh.b_state = 0; | 3728 | ret = ext4_map_blocks(handle, inode, &map, |
| 3685 | ret = ext4_get_blocks(handle, inode, block, | ||
| 3686 | max_blocks, &map_bh, | ||
| 3687 | EXT4_GET_BLOCKS_CREATE_UNINIT_EXT); | 3729 | EXT4_GET_BLOCKS_CREATE_UNINIT_EXT); |
| 3688 | if (ret <= 0) { | 3730 | if (ret <= 0) { |
| 3689 | #ifdef EXT4FS_DEBUG | 3731 | #ifdef EXT4FS_DEBUG |
| 3690 | WARN_ON(ret <= 0); | 3732 | WARN_ON(ret <= 0); |
| 3691 | printk(KERN_ERR "%s: ext4_ext_get_blocks " | 3733 | printk(KERN_ERR "%s: ext4_ext_map_blocks " |
| 3692 | "returned error inode#%lu, block=%u, " | 3734 | "returned error inode#%lu, block=%u, " |
| 3693 | "max_blocks=%u", __func__, | 3735 | "max_blocks=%u", __func__, |
| 3694 | inode->i_ino, block, max_blocks); | 3736 | inode->i_ino, block, max_blocks); |
| @@ -3697,14 +3739,14 @@ retry: | |||
| 3697 | ret2 = ext4_journal_stop(handle); | 3739 | ret2 = ext4_journal_stop(handle); |
| 3698 | break; | 3740 | break; |
| 3699 | } | 3741 | } |
| 3700 | if ((block + ret) >= (EXT4_BLOCK_ALIGN(offset + len, | 3742 | if ((map.m_lblk + ret) >= (EXT4_BLOCK_ALIGN(offset + len, |
| 3701 | blkbits) >> blkbits)) | 3743 | blkbits) >> blkbits)) |
| 3702 | new_size = offset + len; | 3744 | new_size = offset + len; |
| 3703 | else | 3745 | else |
| 3704 | new_size = (block + ret) << blkbits; | 3746 | new_size = (map.m_lblk + ret) << blkbits; |
| 3705 | 3747 | ||
| 3706 | ext4_falloc_update_inode(inode, mode, new_size, | 3748 | ext4_falloc_update_inode(inode, mode, new_size, |
| 3707 | buffer_new(&map_bh)); | 3749 | (map.m_flags & EXT4_MAP_NEW)); |
| 3708 | ext4_mark_inode_dirty(handle, inode); | 3750 | ext4_mark_inode_dirty(handle, inode); |
| 3709 | ret2 = ext4_journal_stop(handle); | 3751 | ret2 = ext4_journal_stop(handle); |
| 3710 | if (ret2) | 3752 | if (ret2) |
| @@ -3733,42 +3775,39 @@ int ext4_convert_unwritten_extents(struct inode *inode, loff_t offset, | |||
| 3733 | ssize_t len) | 3775 | ssize_t len) |
| 3734 | { | 3776 | { |
| 3735 | handle_t *handle; | 3777 | handle_t *handle; |
| 3736 | ext4_lblk_t block; | ||
| 3737 | unsigned int max_blocks; | 3778 | unsigned int max_blocks; |
| 3738 | int ret = 0; | 3779 | int ret = 0; |
| 3739 | int ret2 = 0; | 3780 | int ret2 = 0; |
| 3740 | struct buffer_head map_bh; | 3781 | struct ext4_map_blocks map; |
| 3741 | unsigned int credits, blkbits = inode->i_blkbits; | 3782 | unsigned int credits, blkbits = inode->i_blkbits; |
| 3742 | 3783 | ||
| 3743 | block = offset >> blkbits; | 3784 | map.m_lblk = offset >> blkbits; |
| 3744 | /* | 3785 | /* |
| 3745 | * We can't just convert len to max_blocks because | 3786 | * We can't just convert len to max_blocks because |
| 3746 | * If blocksize = 4096 offset = 3072 and len = 2048 | 3787 | * If blocksize = 4096 offset = 3072 and len = 2048 |
| 3747 | */ | 3788 | */ |
| 3748 | max_blocks = (EXT4_BLOCK_ALIGN(len + offset, blkbits) >> blkbits) | 3789 | max_blocks = ((EXT4_BLOCK_ALIGN(len + offset, blkbits) >> blkbits) - |
| 3749 | - block; | 3790 | map.m_lblk); |
| 3750 | /* | 3791 | /* |
| 3751 | * credits to insert 1 extent into extent tree | 3792 | * credits to insert 1 extent into extent tree |
| 3752 | */ | 3793 | */ |
| 3753 | credits = ext4_chunk_trans_blocks(inode, max_blocks); | 3794 | credits = ext4_chunk_trans_blocks(inode, max_blocks); |
| 3754 | while (ret >= 0 && ret < max_blocks) { | 3795 | while (ret >= 0 && ret < max_blocks) { |
| 3755 | block = block + ret; | 3796 | map.m_lblk += ret; |
| 3756 | max_blocks = max_blocks - ret; | 3797 | map.m_len = (max_blocks -= ret); |
| 3757 | handle = ext4_journal_start(inode, credits); | 3798 | handle = ext4_journal_start(inode, credits); |
| 3758 | if (IS_ERR(handle)) { | 3799 | if (IS_ERR(handle)) { |
| 3759 | ret = PTR_ERR(handle); | 3800 | ret = PTR_ERR(handle); |
| 3760 | break; | 3801 | break; |
| 3761 | } | 3802 | } |
| 3762 | map_bh.b_state = 0; | 3803 | ret = ext4_map_blocks(handle, inode, &map, |
| 3763 | ret = ext4_get_blocks(handle, inode, block, | ||
| 3764 | max_blocks, &map_bh, | ||
| 3765 | EXT4_GET_BLOCKS_IO_CONVERT_EXT); | 3804 | EXT4_GET_BLOCKS_IO_CONVERT_EXT); |
| 3766 | if (ret <= 0) { | 3805 | if (ret <= 0) { |
| 3767 | WARN_ON(ret <= 0); | 3806 | WARN_ON(ret <= 0); |
| 3768 | printk(KERN_ERR "%s: ext4_ext_get_blocks " | 3807 | printk(KERN_ERR "%s: ext4_ext_map_blocks " |
| 3769 | "returned error inode#%lu, block=%u, " | 3808 | "returned error inode#%lu, block=%u, " |
| 3770 | "max_blocks=%u", __func__, | 3809 | "max_blocks=%u", __func__, |
| 3771 | inode->i_ino, block, max_blocks); | 3810 | inode->i_ino, map.m_lblk, map.m_len); |
| 3772 | } | 3811 | } |
| 3773 | ext4_mark_inode_dirty(handle, inode); | 3812 | ext4_mark_inode_dirty(handle, inode); |
| 3774 | ret2 = ext4_journal_stop(handle); | 3813 | ret2 = ext4_journal_stop(handle); |
| @@ -3898,7 +3937,7 @@ int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, | |||
| 3898 | int error = 0; | 3937 | int error = 0; |
| 3899 | 3938 | ||
| 3900 | /* fallback to generic here if not in extents fmt */ | 3939 | /* fallback to generic here if not in extents fmt */ |
| 3901 | if (!(EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL)) | 3940 | if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) |
| 3902 | return generic_block_fiemap(inode, fieinfo, start, len, | 3941 | return generic_block_fiemap(inode, fieinfo, start, len, |
| 3903 | ext4_get_block); | 3942 | ext4_get_block); |
| 3904 | 3943 | ||
diff --git a/fs/ext4/file.c b/fs/ext4/file.c index d0776e410f34..5313ae4cda2d 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c | |||
| @@ -66,7 +66,7 @@ ext4_file_write(struct kiocb *iocb, const struct iovec *iov, | |||
| 66 | * is smaller than s_maxbytes, which is for extent-mapped files. | 66 | * is smaller than s_maxbytes, which is for extent-mapped files. |
| 67 | */ | 67 | */ |
| 68 | 68 | ||
| 69 | if (!(EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL)) { | 69 | if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) { |
| 70 | struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); | 70 | struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); |
| 71 | size_t length = iov_length(iov, nr_segs); | 71 | size_t length = iov_length(iov, nr_segs); |
| 72 | 72 | ||
diff --git a/fs/ext4/fsync.c b/fs/ext4/fsync.c index ef3d980e67cb..b6a74f991bf4 100644 --- a/fs/ext4/fsync.c +++ b/fs/ext4/fsync.c | |||
| @@ -35,6 +35,29 @@ | |||
| 35 | #include <trace/events/ext4.h> | 35 | #include <trace/events/ext4.h> |
| 36 | 36 | ||
| 37 | /* | 37 | /* |
| 38 | * If we're not journaling and this is a just-created file, we have to | ||
| 39 | * sync our parent directory (if it was freshly created) since | ||
| 40 | * otherwise it will only be written by writeback, leaving a huge | ||
| 41 | * window during which a crash may lose the file. This may apply for | ||
| 42 | * the parent directory's parent as well, and so on recursively, if | ||
| 43 | * they are also freshly created. | ||
| 44 | */ | ||
| 45 | static void ext4_sync_parent(struct inode *inode) | ||
| 46 | { | ||
| 47 | struct dentry *dentry = NULL; | ||
| 48 | |||
| 49 | while (inode && ext4_test_inode_state(inode, EXT4_STATE_NEWENTRY)) { | ||
| 50 | ext4_clear_inode_state(inode, EXT4_STATE_NEWENTRY); | ||
| 51 | dentry = list_entry(inode->i_dentry.next, | ||
| 52 | struct dentry, d_alias); | ||
| 53 | if (!dentry || !dentry->d_parent || !dentry->d_parent->d_inode) | ||
| 54 | break; | ||
| 55 | inode = dentry->d_parent->d_inode; | ||
| 56 | sync_mapping_buffers(inode->i_mapping); | ||
| 57 | } | ||
| 58 | } | ||
| 59 | |||
| 60 | /* | ||
| 38 | * akpm: A new design for ext4_sync_file(). | 61 | * akpm: A new design for ext4_sync_file(). |
| 39 | * | 62 | * |
| 40 | * This is only called from sys_fsync(), sys_fdatasync() and sys_msync(). | 63 | * This is only called from sys_fsync(), sys_fdatasync() and sys_msync(). |
| @@ -66,9 +89,13 @@ int ext4_sync_file(struct file *file, struct dentry *dentry, int datasync) | |||
| 66 | ret = flush_completed_IO(inode); | 89 | ret = flush_completed_IO(inode); |
| 67 | if (ret < 0) | 90 | if (ret < 0) |
| 68 | return ret; | 91 | return ret; |
| 69 | 92 | ||
| 70 | if (!journal) | 93 | if (!journal) { |
| 71 | return simple_fsync(file, dentry, datasync); | 94 | ret = simple_fsync(file, dentry, datasync); |
| 95 | if (!ret && !list_empty(&inode->i_dentry)) | ||
| 96 | ext4_sync_parent(inode); | ||
| 97 | return ret; | ||
| 98 | } | ||
| 72 | 99 | ||
| 73 | /* | 100 | /* |
| 74 | * data=writeback,ordered: | 101 | * data=writeback,ordered: |
| @@ -102,7 +129,7 @@ int ext4_sync_file(struct file *file, struct dentry *dentry, int datasync) | |||
| 102 | (journal->j_flags & JBD2_BARRIER)) | 129 | (journal->j_flags & JBD2_BARRIER)) |
| 103 | blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL, | 130 | blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL, |
| 104 | NULL, BLKDEV_IFL_WAIT); | 131 | NULL, BLKDEV_IFL_WAIT); |
| 105 | jbd2_log_wait_commit(journal, commit_tid); | 132 | ret = jbd2_log_wait_commit(journal, commit_tid); |
| 106 | } else if (journal->j_flags & JBD2_BARRIER) | 133 | } else if (journal->j_flags & JBD2_BARRIER) |
| 107 | blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL, NULL, | 134 | blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL, NULL, |
| 108 | BLKDEV_IFL_WAIT); | 135 | BLKDEV_IFL_WAIT); |
diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c index 1a0e183a2f04..25c4b3173fd9 100644 --- a/fs/ext4/ialloc.c +++ b/fs/ext4/ialloc.c | |||
| @@ -240,56 +240,49 @@ void ext4_free_inode(handle_t *handle, struct inode *inode) | |||
| 240 | if (fatal) | 240 | if (fatal) |
| 241 | goto error_return; | 241 | goto error_return; |
| 242 | 242 | ||
| 243 | /* Ok, now we can actually update the inode bitmaps.. */ | 243 | fatal = -ESRCH; |
| 244 | cleared = ext4_clear_bit_atomic(ext4_group_lock_ptr(sb, block_group), | 244 | gdp = ext4_get_group_desc(sb, block_group, &bh2); |
| 245 | bit, bitmap_bh->b_data); | 245 | if (gdp) { |
| 246 | if (!cleared) | ||
| 247 | ext4_error(sb, "bit already cleared for inode %lu", ino); | ||
| 248 | else { | ||
| 249 | gdp = ext4_get_group_desc(sb, block_group, &bh2); | ||
| 250 | |||
| 251 | BUFFER_TRACE(bh2, "get_write_access"); | 246 | BUFFER_TRACE(bh2, "get_write_access"); |
| 252 | fatal = ext4_journal_get_write_access(handle, bh2); | 247 | fatal = ext4_journal_get_write_access(handle, bh2); |
| 253 | if (fatal) goto error_return; | 248 | } |
| 254 | 249 | ext4_lock_group(sb, block_group); | |
| 255 | if (gdp) { | 250 | cleared = ext4_clear_bit(bit, bitmap_bh->b_data); |
| 256 | ext4_lock_group(sb, block_group); | 251 | if (fatal || !cleared) { |
| 257 | count = ext4_free_inodes_count(sb, gdp) + 1; | 252 | ext4_unlock_group(sb, block_group); |
| 258 | ext4_free_inodes_set(sb, gdp, count); | 253 | goto out; |
| 259 | if (is_directory) { | 254 | } |
| 260 | count = ext4_used_dirs_count(sb, gdp) - 1; | ||
| 261 | ext4_used_dirs_set(sb, gdp, count); | ||
| 262 | if (sbi->s_log_groups_per_flex) { | ||
| 263 | ext4_group_t f; | ||
| 264 | |||
| 265 | f = ext4_flex_group(sbi, block_group); | ||
| 266 | atomic_dec(&sbi->s_flex_groups[f].used_dirs); | ||
| 267 | } | ||
| 268 | 255 | ||
| 269 | } | 256 | count = ext4_free_inodes_count(sb, gdp) + 1; |
| 270 | gdp->bg_checksum = ext4_group_desc_csum(sbi, | 257 | ext4_free_inodes_set(sb, gdp, count); |
| 271 | block_group, gdp); | 258 | if (is_directory) { |
| 272 | ext4_unlock_group(sb, block_group); | 259 | count = ext4_used_dirs_count(sb, gdp) - 1; |
| 273 | percpu_counter_inc(&sbi->s_freeinodes_counter); | 260 | ext4_used_dirs_set(sb, gdp, count); |
| 274 | if (is_directory) | 261 | percpu_counter_dec(&sbi->s_dirs_counter); |
| 275 | percpu_counter_dec(&sbi->s_dirs_counter); | ||
| 276 | |||
| 277 | if (sbi->s_log_groups_per_flex) { | ||
| 278 | ext4_group_t f; | ||
| 279 | |||
| 280 | f = ext4_flex_group(sbi, block_group); | ||
| 281 | atomic_inc(&sbi->s_flex_groups[f].free_inodes); | ||
| 282 | } | ||
| 283 | } | ||
| 284 | BUFFER_TRACE(bh2, "call ext4_handle_dirty_metadata"); | ||
| 285 | err = ext4_handle_dirty_metadata(handle, NULL, bh2); | ||
| 286 | if (!fatal) fatal = err; | ||
| 287 | } | 262 | } |
| 288 | BUFFER_TRACE(bitmap_bh, "call ext4_handle_dirty_metadata"); | 263 | gdp->bg_checksum = ext4_group_desc_csum(sbi, block_group, gdp); |
| 289 | err = ext4_handle_dirty_metadata(handle, NULL, bitmap_bh); | 264 | ext4_unlock_group(sb, block_group); |
| 290 | if (!fatal) | 265 | |
| 291 | fatal = err; | 266 | percpu_counter_inc(&sbi->s_freeinodes_counter); |
| 292 | sb->s_dirt = 1; | 267 | if (sbi->s_log_groups_per_flex) { |
| 268 | ext4_group_t f = ext4_flex_group(sbi, block_group); | ||
| 269 | |||
| 270 | atomic_inc(&sbi->s_flex_groups[f].free_inodes); | ||
| 271 | if (is_directory) | ||
| 272 | atomic_dec(&sbi->s_flex_groups[f].used_dirs); | ||
| 273 | } | ||
| 274 | BUFFER_TRACE(bh2, "call ext4_handle_dirty_metadata"); | ||
| 275 | fatal = ext4_handle_dirty_metadata(handle, NULL, bh2); | ||
| 276 | out: | ||
| 277 | if (cleared) { | ||
| 278 | BUFFER_TRACE(bitmap_bh, "call ext4_handle_dirty_metadata"); | ||
| 279 | err = ext4_handle_dirty_metadata(handle, NULL, bitmap_bh); | ||
| 280 | if (!fatal) | ||
| 281 | fatal = err; | ||
| 282 | sb->s_dirt = 1; | ||
| 283 | } else | ||
| 284 | ext4_error(sb, "bit already cleared for inode %lu", ino); | ||
| 285 | |||
| 293 | error_return: | 286 | error_return: |
| 294 | brelse(bitmap_bh); | 287 | brelse(bitmap_bh); |
| 295 | ext4_std_error(sb, fatal); | 288 | ext4_std_error(sb, fatal); |
| @@ -499,7 +492,7 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent, | |||
| 499 | 492 | ||
| 500 | if (S_ISDIR(mode) && | 493 | if (S_ISDIR(mode) && |
| 501 | ((parent == sb->s_root->d_inode) || | 494 | ((parent == sb->s_root->d_inode) || |
| 502 | (EXT4_I(parent)->i_flags & EXT4_TOPDIR_FL))) { | 495 | (ext4_test_inode_flag(parent, EXT4_INODE_TOPDIR)))) { |
| 503 | int best_ndir = inodes_per_group; | 496 | int best_ndir = inodes_per_group; |
| 504 | int ret = -1; | 497 | int ret = -1; |
| 505 | 498 | ||
| @@ -1041,7 +1034,7 @@ got: | |||
| 1041 | if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_EXTENTS)) { | 1034 | if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_EXTENTS)) { |
| 1042 | /* set extent flag only for directory, file and normal symlink*/ | 1035 | /* set extent flag only for directory, file and normal symlink*/ |
| 1043 | if (S_ISDIR(mode) || S_ISREG(mode) || S_ISLNK(mode)) { | 1036 | if (S_ISDIR(mode) || S_ISREG(mode) || S_ISLNK(mode)) { |
| 1044 | EXT4_I(inode)->i_flags |= EXT4_EXTENTS_FL; | 1037 | ext4_set_inode_flag(inode, EXT4_INODE_EXTENTS); |
| 1045 | ext4_ext_tree_init(handle, inode); | 1038 | ext4_ext_tree_init(handle, inode); |
| 1046 | } | 1039 | } |
| 1047 | } | 1040 | } |
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 3e0f6af9d08d..19df61c321fd 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
| @@ -149,7 +149,7 @@ int ext4_truncate_restart_trans(handle_t *handle, struct inode *inode, | |||
| 149 | int ret; | 149 | int ret; |
| 150 | 150 | ||
| 151 | /* | 151 | /* |
| 152 | * Drop i_data_sem to avoid deadlock with ext4_get_blocks At this | 152 | * Drop i_data_sem to avoid deadlock with ext4_map_blocks. At this |
| 153 | * moment, get_block can be called only for blocks inside i_size since | 153 | * moment, get_block can be called only for blocks inside i_size since |
| 154 | * page cache has been already dropped and writes are blocked by | 154 | * page cache has been already dropped and writes are blocked by |
| 155 | * i_mutex. So we can safely drop the i_data_sem here. | 155 | * i_mutex. So we can safely drop the i_data_sem here. |
| @@ -348,9 +348,8 @@ static int __ext4_check_blockref(const char *function, struct inode *inode, | |||
| 348 | if (blk && | 348 | if (blk && |
| 349 | unlikely(!ext4_data_block_valid(EXT4_SB(inode->i_sb), | 349 | unlikely(!ext4_data_block_valid(EXT4_SB(inode->i_sb), |
| 350 | blk, 1))) { | 350 | blk, 1))) { |
| 351 | __ext4_error(inode->i_sb, function, | 351 | ext4_error_inode(function, inode, |
| 352 | "invalid block reference %u " | 352 | "invalid block reference %u", blk); |
| 353 | "in inode #%lu", blk, inode->i_ino); | ||
| 354 | return -EIO; | 353 | return -EIO; |
| 355 | } | 354 | } |
| 356 | } | 355 | } |
| @@ -785,7 +784,7 @@ failed: | |||
| 785 | /* Allocation failed, free what we already allocated */ | 784 | /* Allocation failed, free what we already allocated */ |
| 786 | ext4_free_blocks(handle, inode, 0, new_blocks[0], 1, 0); | 785 | ext4_free_blocks(handle, inode, 0, new_blocks[0], 1, 0); |
| 787 | for (i = 1; i <= n ; i++) { | 786 | for (i = 1; i <= n ; i++) { |
| 788 | /* | 787 | /* |
| 789 | * branch[i].bh is newly allocated, so there is no | 788 | * branch[i].bh is newly allocated, so there is no |
| 790 | * need to revoke the block, which is why we don't | 789 | * need to revoke the block, which is why we don't |
| 791 | * need to set EXT4_FREE_BLOCKS_METADATA. | 790 | * need to set EXT4_FREE_BLOCKS_METADATA. |
| @@ -875,7 +874,7 @@ static int ext4_splice_branch(handle_t *handle, struct inode *inode, | |||
| 875 | 874 | ||
| 876 | err_out: | 875 | err_out: |
| 877 | for (i = 1; i <= num; i++) { | 876 | for (i = 1; i <= num; i++) { |
| 878 | /* | 877 | /* |
| 879 | * branch[i].bh is newly allocated, so there is no | 878 | * branch[i].bh is newly allocated, so there is no |
| 880 | * need to revoke the block, which is why we don't | 879 | * need to revoke the block, which is why we don't |
| 881 | * need to set EXT4_FREE_BLOCKS_METADATA. | 880 | * need to set EXT4_FREE_BLOCKS_METADATA. |
| @@ -890,9 +889,9 @@ err_out: | |||
| 890 | } | 889 | } |
| 891 | 890 | ||
| 892 | /* | 891 | /* |
| 893 | * The ext4_ind_get_blocks() function handles non-extents inodes | 892 | * The ext4_ind_map_blocks() function handles non-extents inodes |
| 894 | * (i.e., using the traditional indirect/double-indirect i_blocks | 893 | * (i.e., using the traditional indirect/double-indirect i_blocks |
| 895 | * scheme) for ext4_get_blocks(). | 894 | * scheme) for ext4_map_blocks(). |
| 896 | * | 895 | * |
| 897 | * Allocation strategy is simple: if we have to allocate something, we will | 896 | * Allocation strategy is simple: if we have to allocate something, we will |
| 898 | * have to go the whole way to leaf. So let's do it before attaching anything | 897 | * have to go the whole way to leaf. So let's do it before attaching anything |
| @@ -917,9 +916,8 @@ err_out: | |||
| 917 | * down_read(&EXT4_I(inode)->i_data_sem) if not allocating file system | 916 | * down_read(&EXT4_I(inode)->i_data_sem) if not allocating file system |
| 918 | * blocks. | 917 | * blocks. |
| 919 | */ | 918 | */ |
| 920 | static int ext4_ind_get_blocks(handle_t *handle, struct inode *inode, | 919 | static int ext4_ind_map_blocks(handle_t *handle, struct inode *inode, |
| 921 | ext4_lblk_t iblock, unsigned int maxblocks, | 920 | struct ext4_map_blocks *map, |
| 922 | struct buffer_head *bh_result, | ||
| 923 | int flags) | 921 | int flags) |
| 924 | { | 922 | { |
| 925 | int err = -EIO; | 923 | int err = -EIO; |
| @@ -933,9 +931,9 @@ static int ext4_ind_get_blocks(handle_t *handle, struct inode *inode, | |||
| 933 | int count = 0; | 931 | int count = 0; |
| 934 | ext4_fsblk_t first_block = 0; | 932 | ext4_fsblk_t first_block = 0; |
| 935 | 933 | ||
| 936 | J_ASSERT(!(EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL)); | 934 | J_ASSERT(!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))); |
| 937 | J_ASSERT(handle != NULL || (flags & EXT4_GET_BLOCKS_CREATE) == 0); | 935 | J_ASSERT(handle != NULL || (flags & EXT4_GET_BLOCKS_CREATE) == 0); |
| 938 | depth = ext4_block_to_path(inode, iblock, offsets, | 936 | depth = ext4_block_to_path(inode, map->m_lblk, offsets, |
| 939 | &blocks_to_boundary); | 937 | &blocks_to_boundary); |
| 940 | 938 | ||
| 941 | if (depth == 0) | 939 | if (depth == 0) |
| @@ -946,10 +944,9 @@ static int ext4_ind_get_blocks(handle_t *handle, struct inode *inode, | |||
| 946 | /* Simplest case - block found, no allocation needed */ | 944 | /* Simplest case - block found, no allocation needed */ |
| 947 | if (!partial) { | 945 | if (!partial) { |
| 948 | first_block = le32_to_cpu(chain[depth - 1].key); | 946 | first_block = le32_to_cpu(chain[depth - 1].key); |
| 949 | clear_buffer_new(bh_result); | ||
| 950 | count++; | 947 | count++; |
| 951 | /*map more blocks*/ | 948 | /*map more blocks*/ |
| 952 | while (count < maxblocks && count <= blocks_to_boundary) { | 949 | while (count < map->m_len && count <= blocks_to_boundary) { |
| 953 | ext4_fsblk_t blk; | 950 | ext4_fsblk_t blk; |
| 954 | 951 | ||
| 955 | blk = le32_to_cpu(*(chain[depth-1].p + count)); | 952 | blk = le32_to_cpu(*(chain[depth-1].p + count)); |
| @@ -969,7 +966,7 @@ static int ext4_ind_get_blocks(handle_t *handle, struct inode *inode, | |||
| 969 | /* | 966 | /* |
| 970 | * Okay, we need to do block allocation. | 967 | * Okay, we need to do block allocation. |
| 971 | */ | 968 | */ |
| 972 | goal = ext4_find_goal(inode, iblock, partial); | 969 | goal = ext4_find_goal(inode, map->m_lblk, partial); |
| 973 | 970 | ||
| 974 | /* the number of blocks need to allocate for [d,t]indirect blocks */ | 971 | /* the number of blocks need to allocate for [d,t]indirect blocks */ |
| 975 | indirect_blks = (chain + depth) - partial - 1; | 972 | indirect_blks = (chain + depth) - partial - 1; |
| @@ -979,11 +976,11 @@ static int ext4_ind_get_blocks(handle_t *handle, struct inode *inode, | |||
| 979 | * direct blocks to allocate for this branch. | 976 | * direct blocks to allocate for this branch. |
| 980 | */ | 977 | */ |
| 981 | count = ext4_blks_to_allocate(partial, indirect_blks, | 978 | count = ext4_blks_to_allocate(partial, indirect_blks, |
| 982 | maxblocks, blocks_to_boundary); | 979 | map->m_len, blocks_to_boundary); |
| 983 | /* | 980 | /* |
| 984 | * Block out ext4_truncate while we alter the tree | 981 | * Block out ext4_truncate while we alter the tree |
| 985 | */ | 982 | */ |
| 986 | err = ext4_alloc_branch(handle, inode, iblock, indirect_blks, | 983 | err = ext4_alloc_branch(handle, inode, map->m_lblk, indirect_blks, |
| 987 | &count, goal, | 984 | &count, goal, |
| 988 | offsets + (partial - chain), partial); | 985 | offsets + (partial - chain), partial); |
| 989 | 986 | ||
| @@ -995,18 +992,20 @@ static int ext4_ind_get_blocks(handle_t *handle, struct inode *inode, | |||
| 995 | * may need to return -EAGAIN upwards in the worst case. --sct | 992 | * may need to return -EAGAIN upwards in the worst case. --sct |
| 996 | */ | 993 | */ |
| 997 | if (!err) | 994 | if (!err) |
| 998 | err = ext4_splice_branch(handle, inode, iblock, | 995 | err = ext4_splice_branch(handle, inode, map->m_lblk, |
| 999 | partial, indirect_blks, count); | 996 | partial, indirect_blks, count); |
| 1000 | if (err) | 997 | if (err) |
| 1001 | goto cleanup; | 998 | goto cleanup; |
| 1002 | 999 | ||
| 1003 | set_buffer_new(bh_result); | 1000 | map->m_flags |= EXT4_MAP_NEW; |
| 1004 | 1001 | ||
| 1005 | ext4_update_inode_fsync_trans(handle, inode, 1); | 1002 | ext4_update_inode_fsync_trans(handle, inode, 1); |
| 1006 | got_it: | 1003 | got_it: |
| 1007 | map_bh(bh_result, inode->i_sb, le32_to_cpu(chain[depth-1].key)); | 1004 | map->m_flags |= EXT4_MAP_MAPPED; |
| 1005 | map->m_pblk = le32_to_cpu(chain[depth-1].key); | ||
| 1006 | map->m_len = count; | ||
| 1008 | if (count > blocks_to_boundary) | 1007 | if (count > blocks_to_boundary) |
| 1009 | set_buffer_boundary(bh_result); | 1008 | map->m_flags |= EXT4_MAP_BOUNDARY; |
| 1010 | err = count; | 1009 | err = count; |
| 1011 | /* Clean up and exit */ | 1010 | /* Clean up and exit */ |
| 1012 | partial = chain + depth - 1; /* the whole chain */ | 1011 | partial = chain + depth - 1; /* the whole chain */ |
| @@ -1016,7 +1015,6 @@ cleanup: | |||
| 1016 | brelse(partial->bh); | 1015 | brelse(partial->bh); |
| 1017 | partial--; | 1016 | partial--; |
| 1018 | } | 1017 | } |
| 1019 | BUFFER_TRACE(bh_result, "returned"); | ||
| 1020 | out: | 1018 | out: |
| 1021 | return err; | 1019 | return err; |
| 1022 | } | 1020 | } |
| @@ -1061,7 +1059,7 @@ static int ext4_indirect_calc_metadata_amount(struct inode *inode, | |||
| 1061 | */ | 1059 | */ |
| 1062 | static int ext4_calc_metadata_amount(struct inode *inode, sector_t lblock) | 1060 | static int ext4_calc_metadata_amount(struct inode *inode, sector_t lblock) |
| 1063 | { | 1061 | { |
| 1064 | if (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL) | 1062 | if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) |
| 1065 | return ext4_ext_calc_metadata_amount(inode, lblock); | 1063 | return ext4_ext_calc_metadata_amount(inode, lblock); |
| 1066 | 1064 | ||
| 1067 | return ext4_indirect_calc_metadata_amount(inode, lblock); | 1065 | return ext4_indirect_calc_metadata_amount(inode, lblock); |
| @@ -1076,7 +1074,6 @@ void ext4_da_update_reserve_space(struct inode *inode, | |||
| 1076 | { | 1074 | { |
| 1077 | struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); | 1075 | struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); |
| 1078 | struct ext4_inode_info *ei = EXT4_I(inode); | 1076 | struct ext4_inode_info *ei = EXT4_I(inode); |
| 1079 | int mdb_free = 0, allocated_meta_blocks = 0; | ||
| 1080 | 1077 | ||
| 1081 | spin_lock(&ei->i_block_reservation_lock); | 1078 | spin_lock(&ei->i_block_reservation_lock); |
| 1082 | trace_ext4_da_update_reserve_space(inode, used); | 1079 | trace_ext4_da_update_reserve_space(inode, used); |
| @@ -1091,11 +1088,10 @@ void ext4_da_update_reserve_space(struct inode *inode, | |||
| 1091 | 1088 | ||
| 1092 | /* Update per-inode reservations */ | 1089 | /* Update per-inode reservations */ |
| 1093 | ei->i_reserved_data_blocks -= used; | 1090 | ei->i_reserved_data_blocks -= used; |
| 1094 | used += ei->i_allocated_meta_blocks; | ||
| 1095 | ei->i_reserved_meta_blocks -= ei->i_allocated_meta_blocks; | 1091 | ei->i_reserved_meta_blocks -= ei->i_allocated_meta_blocks; |
| 1096 | allocated_meta_blocks = ei->i_allocated_meta_blocks; | 1092 | percpu_counter_sub(&sbi->s_dirtyblocks_counter, |
| 1093 | used + ei->i_allocated_meta_blocks); | ||
| 1097 | ei->i_allocated_meta_blocks = 0; | 1094 | ei->i_allocated_meta_blocks = 0; |
| 1098 | percpu_counter_sub(&sbi->s_dirtyblocks_counter, used); | ||
| 1099 | 1095 | ||
| 1100 | if (ei->i_reserved_data_blocks == 0) { | 1096 | if (ei->i_reserved_data_blocks == 0) { |
| 1101 | /* | 1097 | /* |
| @@ -1103,30 +1099,23 @@ void ext4_da_update_reserve_space(struct inode *inode, | |||
| 1103 | * only when we have written all of the delayed | 1099 | * only when we have written all of the delayed |
| 1104 | * allocation blocks. | 1100 | * allocation blocks. |
| 1105 | */ | 1101 | */ |
| 1106 | mdb_free = ei->i_reserved_meta_blocks; | 1102 | percpu_counter_sub(&sbi->s_dirtyblocks_counter, |
| 1103 | ei->i_reserved_meta_blocks); | ||
| 1107 | ei->i_reserved_meta_blocks = 0; | 1104 | ei->i_reserved_meta_blocks = 0; |
| 1108 | ei->i_da_metadata_calc_len = 0; | 1105 | ei->i_da_metadata_calc_len = 0; |
| 1109 | percpu_counter_sub(&sbi->s_dirtyblocks_counter, mdb_free); | ||
| 1110 | } | 1106 | } |
| 1111 | spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); | 1107 | spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); |
| 1112 | 1108 | ||
| 1113 | /* Update quota subsystem */ | 1109 | /* Update quota subsystem for data blocks */ |
| 1114 | if (quota_claim) { | 1110 | if (quota_claim) |
| 1115 | dquot_claim_block(inode, used); | 1111 | dquot_claim_block(inode, used); |
| 1116 | if (mdb_free) | 1112 | else { |
| 1117 | dquot_release_reservation_block(inode, mdb_free); | ||
| 1118 | } else { | ||
| 1119 | /* | 1113 | /* |
| 1120 | * We did fallocate with an offset that is already delayed | 1114 | * We did fallocate with an offset that is already delayed |
| 1121 | * allocated. So on delayed allocated writeback we should | 1115 | * allocated. So on delayed allocated writeback we should |
| 1122 | * not update the quota for allocated blocks. But then | 1116 | * not re-claim the quota for fallocated blocks. |
| 1123 | * converting an fallocate region to initialized region would | ||
| 1124 | * have caused a metadata allocation. So claim quota for | ||
| 1125 | * that | ||
| 1126 | */ | 1117 | */ |
| 1127 | if (allocated_meta_blocks) | 1118 | dquot_release_reservation_block(inode, used); |
| 1128 | dquot_claim_block(inode, allocated_meta_blocks); | ||
| 1129 | dquot_release_reservation_block(inode, mdb_free + used); | ||
| 1130 | } | 1119 | } |
| 1131 | 1120 | ||
| 1132 | /* | 1121 | /* |
| @@ -1139,15 +1128,15 @@ void ext4_da_update_reserve_space(struct inode *inode, | |||
| 1139 | ext4_discard_preallocations(inode); | 1128 | ext4_discard_preallocations(inode); |
| 1140 | } | 1129 | } |
| 1141 | 1130 | ||
| 1142 | static int check_block_validity(struct inode *inode, const char *msg, | 1131 | static int check_block_validity(struct inode *inode, const char *func, |
| 1143 | sector_t logical, sector_t phys, int len) | 1132 | struct ext4_map_blocks *map) |
| 1144 | { | 1133 | { |
| 1145 | if (!ext4_data_block_valid(EXT4_SB(inode->i_sb), phys, len)) { | 1134 | if (!ext4_data_block_valid(EXT4_SB(inode->i_sb), map->m_pblk, |
| 1146 | __ext4_error(inode->i_sb, msg, | 1135 | map->m_len)) { |
| 1147 | "inode #%lu logical block %llu mapped to %llu " | 1136 | ext4_error_inode(func, inode, |
| 1148 | "(size %d)", inode->i_ino, | 1137 | "lblock %lu mapped to illegal pblock %llu " |
| 1149 | (unsigned long long) logical, | 1138 | "(length %d)", (unsigned long) map->m_lblk, |
| 1150 | (unsigned long long) phys, len); | 1139 | map->m_pblk, map->m_len); |
| 1151 | return -EIO; | 1140 | return -EIO; |
| 1152 | } | 1141 | } |
| 1153 | return 0; | 1142 | return 0; |
| @@ -1212,15 +1201,15 @@ static pgoff_t ext4_num_dirty_pages(struct inode *inode, pgoff_t idx, | |||
| 1212 | } | 1201 | } |
| 1213 | 1202 | ||
| 1214 | /* | 1203 | /* |
| 1215 | * The ext4_get_blocks() function tries to look up the requested blocks, | 1204 | * The ext4_map_blocks() function tries to look up the requested blocks, |
| 1216 | * and returns if the blocks are already mapped. | 1205 | * and returns if the blocks are already mapped. |
| 1217 | * | 1206 | * |
| 1218 | * Otherwise it takes the write lock of the i_data_sem and allocate blocks | 1207 | * Otherwise it takes the write lock of the i_data_sem and allocate blocks |
| 1219 | * and store the allocated blocks in the result buffer head and mark it | 1208 | * and store the allocated blocks in the result buffer head and mark it |
| 1220 | * mapped. | 1209 | * mapped. |
| 1221 | * | 1210 | * |
| 1222 | * If file type is extents based, it will call ext4_ext_get_blocks(), | 1211 | * If file type is extents based, it will call ext4_ext_map_blocks(), |
| 1223 | * Otherwise, call with ext4_ind_get_blocks() to handle indirect mapping | 1212 | * Otherwise, call with ext4_ind_map_blocks() to handle indirect mapping |
| 1224 | * based files | 1213 | * based files |
| 1225 | * | 1214 | * |
| 1226 | * On success, it returns the number of blocks being mapped or allocate. | 1215 | * On success, it returns the number of blocks being mapped or allocate. |
| @@ -1233,35 +1222,29 @@ static pgoff_t ext4_num_dirty_pages(struct inode *inode, pgoff_t idx, | |||
| 1233 | * | 1222 | * |
| 1234 | * It returns the error in case of allocation failure. | 1223 | * It returns the error in case of allocation failure. |
| 1235 | */ | 1224 | */ |
| 1236 | int ext4_get_blocks(handle_t *handle, struct inode *inode, sector_t block, | 1225 | int ext4_map_blocks(handle_t *handle, struct inode *inode, |
| 1237 | unsigned int max_blocks, struct buffer_head *bh, | 1226 | struct ext4_map_blocks *map, int flags) |
| 1238 | int flags) | ||
| 1239 | { | 1227 | { |
| 1240 | int retval; | 1228 | int retval; |
| 1241 | 1229 | ||
| 1242 | clear_buffer_mapped(bh); | 1230 | map->m_flags = 0; |
| 1243 | clear_buffer_unwritten(bh); | 1231 | ext_debug("ext4_map_blocks(): inode %lu, flag %d, max_blocks %u," |
| 1244 | 1232 | "logical block %lu\n", inode->i_ino, flags, map->m_len, | |
| 1245 | ext_debug("ext4_get_blocks(): inode %lu, flag %d, max_blocks %u," | 1233 | (unsigned long) map->m_lblk); |
| 1246 | "logical block %lu\n", inode->i_ino, flags, max_blocks, | ||
| 1247 | (unsigned long)block); | ||
| 1248 | /* | 1234 | /* |
| 1249 | * Try to see if we can get the block without requesting a new | 1235 | * Try to see if we can get the block without requesting a new |
| 1250 | * file system block. | 1236 | * file system block. |
| 1251 | */ | 1237 | */ |
| 1252 | down_read((&EXT4_I(inode)->i_data_sem)); | 1238 | down_read((&EXT4_I(inode)->i_data_sem)); |
| 1253 | if (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL) { | 1239 | if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) { |
| 1254 | retval = ext4_ext_get_blocks(handle, inode, block, max_blocks, | 1240 | retval = ext4_ext_map_blocks(handle, inode, map, 0); |
| 1255 | bh, 0); | ||
| 1256 | } else { | 1241 | } else { |
| 1257 | retval = ext4_ind_get_blocks(handle, inode, block, max_blocks, | 1242 | retval = ext4_ind_map_blocks(handle, inode, map, 0); |
| 1258 | bh, 0); | ||
| 1259 | } | 1243 | } |
| 1260 | up_read((&EXT4_I(inode)->i_data_sem)); | 1244 | up_read((&EXT4_I(inode)->i_data_sem)); |
| 1261 | 1245 | ||
| 1262 | if (retval > 0 && buffer_mapped(bh)) { | 1246 | if (retval > 0 && map->m_flags & EXT4_MAP_MAPPED) { |
| 1263 | int ret = check_block_validity(inode, "file system corruption", | 1247 | int ret = check_block_validity(inode, __func__, map); |
| 1264 | block, bh->b_blocknr, retval); | ||
| 1265 | if (ret != 0) | 1248 | if (ret != 0) |
| 1266 | return ret; | 1249 | return ret; |
| 1267 | } | 1250 | } |
| @@ -1277,7 +1260,7 @@ int ext4_get_blocks(handle_t *handle, struct inode *inode, sector_t block, | |||
| 1277 | * ext4_ext_get_block() returns th create = 0 | 1260 | * ext4_ext_get_block() returns th create = 0 |
| 1278 | * with buffer head unmapped. | 1261 | * with buffer head unmapped. |
| 1279 | */ | 1262 | */ |
| 1280 | if (retval > 0 && buffer_mapped(bh)) | 1263 | if (retval > 0 && map->m_flags & EXT4_MAP_MAPPED) |
| 1281 | return retval; | 1264 | return retval; |
| 1282 | 1265 | ||
| 1283 | /* | 1266 | /* |
| @@ -1290,7 +1273,7 @@ int ext4_get_blocks(handle_t *handle, struct inode *inode, sector_t block, | |||
| 1290 | * of BH_Unwritten and BH_Mapped flags being simultaneously | 1273 | * of BH_Unwritten and BH_Mapped flags being simultaneously |
| 1291 | * set on the buffer_head. | 1274 | * set on the buffer_head. |
| 1292 | */ | 1275 | */ |
| 1293 | clear_buffer_unwritten(bh); | 1276 | map->m_flags &= ~EXT4_MAP_UNWRITTEN; |
| 1294 | 1277 | ||
| 1295 | /* | 1278 | /* |
| 1296 | * New blocks allocate and/or writing to uninitialized extent | 1279 | * New blocks allocate and/or writing to uninitialized extent |
| @@ -1312,14 +1295,12 @@ int ext4_get_blocks(handle_t *handle, struct inode *inode, sector_t block, | |||
| 1312 | * We need to check for EXT4 here because migrate | 1295 | * We need to check for EXT4 here because migrate |
| 1313 | * could have changed the inode type in between | 1296 | * could have changed the inode type in between |
| 1314 | */ | 1297 | */ |
| 1315 | if (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL) { | 1298 | if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) { |
| 1316 | retval = ext4_ext_get_blocks(handle, inode, block, max_blocks, | 1299 | retval = ext4_ext_map_blocks(handle, inode, map, flags); |
| 1317 | bh, flags); | ||
| 1318 | } else { | 1300 | } else { |
| 1319 | retval = ext4_ind_get_blocks(handle, inode, block, | 1301 | retval = ext4_ind_map_blocks(handle, inode, map, flags); |
| 1320 | max_blocks, bh, flags); | ||
| 1321 | 1302 | ||
| 1322 | if (retval > 0 && buffer_new(bh)) { | 1303 | if (retval > 0 && map->m_flags & EXT4_MAP_NEW) { |
| 1323 | /* | 1304 | /* |
| 1324 | * We allocated new blocks which will result in | 1305 | * We allocated new blocks which will result in |
| 1325 | * i_data's format changing. Force the migrate | 1306 | * i_data's format changing. Force the migrate |
| @@ -1342,10 +1323,10 @@ int ext4_get_blocks(handle_t *handle, struct inode *inode, sector_t block, | |||
| 1342 | EXT4_I(inode)->i_delalloc_reserved_flag = 0; | 1323 | EXT4_I(inode)->i_delalloc_reserved_flag = 0; |
| 1343 | 1324 | ||
| 1344 | up_write((&EXT4_I(inode)->i_data_sem)); | 1325 | up_write((&EXT4_I(inode)->i_data_sem)); |
| 1345 | if (retval > 0 && buffer_mapped(bh)) { | 1326 | if (retval > 0 && map->m_flags & EXT4_MAP_MAPPED) { |
| 1346 | int ret = check_block_validity(inode, "file system " | 1327 | int ret = check_block_validity(inode, |
| 1347 | "corruption after allocation", | 1328 | "ext4_map_blocks_after_alloc", |
| 1348 | block, bh->b_blocknr, retval); | 1329 | map); |
| 1349 | if (ret != 0) | 1330 | if (ret != 0) |
| 1350 | return ret; | 1331 | return ret; |
| 1351 | } | 1332 | } |
| @@ -1355,109 +1336,109 @@ int ext4_get_blocks(handle_t *handle, struct inode *inode, sector_t block, | |||
| 1355 | /* Maximum number of blocks we map for direct IO at once. */ | 1336 | /* Maximum number of blocks we map for direct IO at once. */ |
| 1356 | #define DIO_MAX_BLOCKS 4096 | 1337 | #define DIO_MAX_BLOCKS 4096 |
| 1357 | 1338 | ||
| 1358 | int ext4_get_block(struct inode *inode, sector_t iblock, | 1339 | static int _ext4_get_block(struct inode *inode, sector_t iblock, |
| 1359 | struct buffer_head *bh_result, int create) | 1340 | struct buffer_head *bh, int flags) |
| 1360 | { | 1341 | { |
| 1361 | handle_t *handle = ext4_journal_current_handle(); | 1342 | handle_t *handle = ext4_journal_current_handle(); |
| 1343 | struct ext4_map_blocks map; | ||
| 1362 | int ret = 0, started = 0; | 1344 | int ret = 0, started = 0; |
| 1363 | unsigned max_blocks = bh_result->b_size >> inode->i_blkbits; | ||
| 1364 | int dio_credits; | 1345 | int dio_credits; |
| 1365 | 1346 | ||
| 1366 | if (create && !handle) { | 1347 | map.m_lblk = iblock; |
| 1348 | map.m_len = bh->b_size >> inode->i_blkbits; | ||
| 1349 | |||
| 1350 | if (flags && !handle) { | ||
| 1367 | /* Direct IO write... */ | 1351 | /* Direct IO write... */ |
| 1368 | if (max_blocks > DIO_MAX_BLOCKS) | 1352 | if (map.m_len > DIO_MAX_BLOCKS) |
| 1369 | max_blocks = DIO_MAX_BLOCKS; | 1353 | map.m_len = DIO_MAX_BLOCKS; |
| 1370 | dio_credits = ext4_chunk_trans_blocks(inode, max_blocks); | 1354 | dio_credits = ext4_chunk_trans_blocks(inode, map.m_len); |
| 1371 | handle = ext4_journal_start(inode, dio_credits); | 1355 | handle = ext4_journal_start(inode, dio_credits); |
| 1372 | if (IS_ERR(handle)) { | 1356 | if (IS_ERR(handle)) { |
| 1373 | ret = PTR_ERR(handle); | 1357 | ret = PTR_ERR(handle); |
| 1374 | goto out; | 1358 | return ret; |
| 1375 | } | 1359 | } |
| 1376 | started = 1; | 1360 | started = 1; |
| 1377 | } | 1361 | } |
| 1378 | 1362 | ||
| 1379 | ret = ext4_get_blocks(handle, inode, iblock, max_blocks, bh_result, | 1363 | ret = ext4_map_blocks(handle, inode, &map, flags); |
| 1380 | create ? EXT4_GET_BLOCKS_CREATE : 0); | ||
| 1381 | if (ret > 0) { | 1364 | if (ret > 0) { |
| 1382 | bh_result->b_size = (ret << inode->i_blkbits); | 1365 | map_bh(bh, inode->i_sb, map.m_pblk); |
| 1366 | bh->b_state = (bh->b_state & ~EXT4_MAP_FLAGS) | map.m_flags; | ||
| 1367 | bh->b_size = inode->i_sb->s_blocksize * map.m_len; | ||
| 1383 | ret = 0; | 1368 | ret = 0; |
| 1384 | } | 1369 | } |
| 1385 | if (started) | 1370 | if (started) |
| 1386 | ext4_journal_stop(handle); | 1371 | ext4_journal_stop(handle); |
| 1387 | out: | ||
| 1388 | return ret; | 1372 | return ret; |
| 1389 | } | 1373 | } |
| 1390 | 1374 | ||
| 1375 | int ext4_get_block(struct inode *inode, sector_t iblock, | ||
| 1376 | struct buffer_head *bh, int create) | ||
| 1377 | { | ||
| 1378 | return _ext4_get_block(inode, iblock, bh, | ||
| 1379 | create ? EXT4_GET_BLOCKS_CREATE : 0); | ||
| 1380 | } | ||
| 1381 | |||
| 1391 | /* | 1382 | /* |
| 1392 | * `handle' can be NULL if create is zero | 1383 | * `handle' can be NULL if create is zero |
| 1393 | */ | 1384 | */ |
| 1394 | struct buffer_head *ext4_getblk(handle_t *handle, struct inode *inode, | 1385 | struct buffer_head *ext4_getblk(handle_t *handle, struct inode *inode, |
| 1395 | ext4_lblk_t block, int create, int *errp) | 1386 | ext4_lblk_t block, int create, int *errp) |
| 1396 | { | 1387 | { |
| 1397 | struct buffer_head dummy; | 1388 | struct ext4_map_blocks map; |
| 1389 | struct buffer_head *bh; | ||
| 1398 | int fatal = 0, err; | 1390 | int fatal = 0, err; |
| 1399 | int flags = 0; | ||
| 1400 | 1391 | ||
| 1401 | J_ASSERT(handle != NULL || create == 0); | 1392 | J_ASSERT(handle != NULL || create == 0); |
| 1402 | 1393 | ||
| 1403 | dummy.b_state = 0; | 1394 | map.m_lblk = block; |
| 1404 | dummy.b_blocknr = -1000; | 1395 | map.m_len = 1; |
| 1405 | buffer_trace_init(&dummy.b_history); | 1396 | err = ext4_map_blocks(handle, inode, &map, |
| 1406 | if (create) | 1397 | create ? EXT4_GET_BLOCKS_CREATE : 0); |
| 1407 | flags |= EXT4_GET_BLOCKS_CREATE; | 1398 | |
| 1408 | err = ext4_get_blocks(handle, inode, block, 1, &dummy, flags); | 1399 | if (err < 0) |
| 1409 | /* | 1400 | *errp = err; |
| 1410 | * ext4_get_blocks() returns number of blocks mapped. 0 in | 1401 | if (err <= 0) |
| 1411 | * case of a HOLE. | 1402 | return NULL; |
| 1412 | */ | 1403 | *errp = 0; |
| 1413 | if (err > 0) { | 1404 | |
| 1414 | if (err > 1) | 1405 | bh = sb_getblk(inode->i_sb, map.m_pblk); |
| 1415 | WARN_ON(1); | 1406 | if (!bh) { |
| 1416 | err = 0; | 1407 | *errp = -EIO; |
| 1408 | return NULL; | ||
| 1417 | } | 1409 | } |
| 1418 | *errp = err; | 1410 | if (map.m_flags & EXT4_MAP_NEW) { |
| 1419 | if (!err && buffer_mapped(&dummy)) { | 1411 | J_ASSERT(create != 0); |
| 1420 | struct buffer_head *bh; | 1412 | J_ASSERT(handle != NULL); |
| 1421 | bh = sb_getblk(inode->i_sb, dummy.b_blocknr); | ||
| 1422 | if (!bh) { | ||
| 1423 | *errp = -EIO; | ||
| 1424 | goto err; | ||
| 1425 | } | ||
| 1426 | if (buffer_new(&dummy)) { | ||
| 1427 | J_ASSERT(create != 0); | ||
| 1428 | J_ASSERT(handle != NULL); | ||
| 1429 | 1413 | ||
| 1430 | /* | 1414 | /* |
| 1431 | * Now that we do not always journal data, we should | 1415 | * Now that we do not always journal data, we should |
| 1432 | * keep in mind whether this should always journal the | 1416 | * keep in mind whether this should always journal the |
| 1433 | * new buffer as metadata. For now, regular file | 1417 | * new buffer as metadata. For now, regular file |
| 1434 | * writes use ext4_get_block instead, so it's not a | 1418 | * writes use ext4_get_block instead, so it's not a |
| 1435 | * problem. | 1419 | * problem. |
| 1436 | */ | 1420 | */ |
| 1437 | lock_buffer(bh); | 1421 | lock_buffer(bh); |
| 1438 | BUFFER_TRACE(bh, "call get_create_access"); | 1422 | BUFFER_TRACE(bh, "call get_create_access"); |
| 1439 | fatal = ext4_journal_get_create_access(handle, bh); | 1423 | fatal = ext4_journal_get_create_access(handle, bh); |
| 1440 | if (!fatal && !buffer_uptodate(bh)) { | 1424 | if (!fatal && !buffer_uptodate(bh)) { |
| 1441 | memset(bh->b_data, 0, inode->i_sb->s_blocksize); | 1425 | memset(bh->b_data, 0, inode->i_sb->s_blocksize); |
| 1442 | set_buffer_uptodate(bh); | 1426 | set_buffer_uptodate(bh); |
| 1443 | } | ||
| 1444 | unlock_buffer(bh); | ||
| 1445 | BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata"); | ||
| 1446 | err = ext4_handle_dirty_metadata(handle, inode, bh); | ||
| 1447 | if (!fatal) | ||
| 1448 | fatal = err; | ||
| 1449 | } else { | ||
| 1450 | BUFFER_TRACE(bh, "not a new buffer"); | ||
| 1451 | } | ||
| 1452 | if (fatal) { | ||
| 1453 | *errp = fatal; | ||
| 1454 | brelse(bh); | ||
| 1455 | bh = NULL; | ||
| 1456 | } | 1427 | } |
| 1457 | return bh; | 1428 | unlock_buffer(bh); |
| 1429 | BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata"); | ||
| 1430 | err = ext4_handle_dirty_metadata(handle, inode, bh); | ||
| 1431 | if (!fatal) | ||
| 1432 | fatal = err; | ||
| 1433 | } else { | ||
| 1434 | BUFFER_TRACE(bh, "not a new buffer"); | ||
| 1458 | } | 1435 | } |
| 1459 | err: | 1436 | if (fatal) { |
| 1460 | return NULL; | 1437 | *errp = fatal; |
| 1438 | brelse(bh); | ||
| 1439 | bh = NULL; | ||
| 1440 | } | ||
| 1441 | return bh; | ||
| 1461 | } | 1442 | } |
| 1462 | 1443 | ||
| 1463 | struct buffer_head *ext4_bread(handle_t *handle, struct inode *inode, | 1444 | struct buffer_head *ext4_bread(handle_t *handle, struct inode *inode, |
| @@ -1860,7 +1841,7 @@ static int ext4_da_reserve_space(struct inode *inode, sector_t lblock) | |||
| 1860 | int retries = 0; | 1841 | int retries = 0; |
| 1861 | struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); | 1842 | struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); |
| 1862 | struct ext4_inode_info *ei = EXT4_I(inode); | 1843 | struct ext4_inode_info *ei = EXT4_I(inode); |
| 1863 | unsigned long md_needed, md_reserved; | 1844 | unsigned long md_needed; |
| 1864 | int ret; | 1845 | int ret; |
| 1865 | 1846 | ||
| 1866 | /* | 1847 | /* |
| @@ -1870,22 +1851,24 @@ static int ext4_da_reserve_space(struct inode *inode, sector_t lblock) | |||
| 1870 | */ | 1851 | */ |
| 1871 | repeat: | 1852 | repeat: |
| 1872 | spin_lock(&ei->i_block_reservation_lock); | 1853 | spin_lock(&ei->i_block_reservation_lock); |
| 1873 | md_reserved = ei->i_reserved_meta_blocks; | ||
| 1874 | md_needed = ext4_calc_metadata_amount(inode, lblock); | 1854 | md_needed = ext4_calc_metadata_amount(inode, lblock); |
| 1875 | trace_ext4_da_reserve_space(inode, md_needed); | 1855 | trace_ext4_da_reserve_space(inode, md_needed); |
| 1876 | spin_unlock(&ei->i_block_reservation_lock); | 1856 | spin_unlock(&ei->i_block_reservation_lock); |
| 1877 | 1857 | ||
| 1878 | /* | 1858 | /* |
| 1879 | * Make quota reservation here to prevent quota overflow | 1859 | * We will charge metadata quota at writeout time; this saves |
| 1880 | * later. Real quota accounting is done at pages writeout | 1860 | * us from metadata over-estimation, though we may go over by |
| 1881 | * time. | 1861 | * a small amount in the end. Here we just reserve for data. |
| 1882 | */ | 1862 | */ |
| 1883 | ret = dquot_reserve_block(inode, md_needed + 1); | 1863 | ret = dquot_reserve_block(inode, 1); |
| 1884 | if (ret) | 1864 | if (ret) |
| 1885 | return ret; | 1865 | return ret; |
| 1886 | 1866 | /* | |
| 1867 | * We do still charge estimated metadata to the sb though; | ||
| 1868 | * we cannot afford to run out of free blocks. | ||
| 1869 | */ | ||
| 1887 | if (ext4_claim_free_blocks(sbi, md_needed + 1)) { | 1870 | if (ext4_claim_free_blocks(sbi, md_needed + 1)) { |
| 1888 | dquot_release_reservation_block(inode, md_needed + 1); | 1871 | dquot_release_reservation_block(inode, 1); |
| 1889 | if (ext4_should_retry_alloc(inode->i_sb, &retries)) { | 1872 | if (ext4_should_retry_alloc(inode->i_sb, &retries)) { |
| 1890 | yield(); | 1873 | yield(); |
| 1891 | goto repeat; | 1874 | goto repeat; |
| @@ -1910,6 +1893,7 @@ static void ext4_da_release_space(struct inode *inode, int to_free) | |||
| 1910 | 1893 | ||
| 1911 | spin_lock(&EXT4_I(inode)->i_block_reservation_lock); | 1894 | spin_lock(&EXT4_I(inode)->i_block_reservation_lock); |
| 1912 | 1895 | ||
| 1896 | trace_ext4_da_release_space(inode, to_free); | ||
| 1913 | if (unlikely(to_free > ei->i_reserved_data_blocks)) { | 1897 | if (unlikely(to_free > ei->i_reserved_data_blocks)) { |
| 1914 | /* | 1898 | /* |
| 1915 | * if there aren't enough reserved blocks, then the | 1899 | * if there aren't enough reserved blocks, then the |
| @@ -1932,12 +1916,13 @@ static void ext4_da_release_space(struct inode *inode, int to_free) | |||
| 1932 | * only when we have written all of the delayed | 1916 | * only when we have written all of the delayed |
| 1933 | * allocation blocks. | 1917 | * allocation blocks. |
| 1934 | */ | 1918 | */ |
| 1935 | to_free += ei->i_reserved_meta_blocks; | 1919 | percpu_counter_sub(&sbi->s_dirtyblocks_counter, |
| 1920 | ei->i_reserved_meta_blocks); | ||
| 1936 | ei->i_reserved_meta_blocks = 0; | 1921 | ei->i_reserved_meta_blocks = 0; |
| 1937 | ei->i_da_metadata_calc_len = 0; | 1922 | ei->i_da_metadata_calc_len = 0; |
| 1938 | } | 1923 | } |
| 1939 | 1924 | ||
| 1940 | /* update fs dirty blocks counter */ | 1925 | /* update fs dirty data blocks counter */ |
| 1941 | percpu_counter_sub(&sbi->s_dirtyblocks_counter, to_free); | 1926 | percpu_counter_sub(&sbi->s_dirtyblocks_counter, to_free); |
| 1942 | 1927 | ||
| 1943 | spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); | 1928 | spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); |
| @@ -2042,28 +2027,23 @@ static int mpage_da_submit_io(struct mpage_da_data *mpd) | |||
| 2042 | /* | 2027 | /* |
| 2043 | * mpage_put_bnr_to_bhs - walk blocks and assign them actual numbers | 2028 | * mpage_put_bnr_to_bhs - walk blocks and assign them actual numbers |
| 2044 | * | 2029 | * |
| 2045 | * @mpd->inode - inode to walk through | ||
| 2046 | * @exbh->b_blocknr - first block on a disk | ||
| 2047 | * @exbh->b_size - amount of space in bytes | ||
| 2048 | * @logical - first logical block to start assignment with | ||
| 2049 | * | ||
| 2050 | * the function goes through all passed space and put actual disk | 2030 | * the function goes through all passed space and put actual disk |
| 2051 | * block numbers into buffer heads, dropping BH_Delay and BH_Unwritten | 2031 | * block numbers into buffer heads, dropping BH_Delay and BH_Unwritten |
| 2052 | */ | 2032 | */ |
| 2053 | static void mpage_put_bnr_to_bhs(struct mpage_da_data *mpd, sector_t logical, | 2033 | static void mpage_put_bnr_to_bhs(struct mpage_da_data *mpd, |
| 2054 | struct buffer_head *exbh) | 2034 | struct ext4_map_blocks *map) |
| 2055 | { | 2035 | { |
| 2056 | struct inode *inode = mpd->inode; | 2036 | struct inode *inode = mpd->inode; |
| 2057 | struct address_space *mapping = inode->i_mapping; | 2037 | struct address_space *mapping = inode->i_mapping; |
| 2058 | int blocks = exbh->b_size >> inode->i_blkbits; | 2038 | int blocks = map->m_len; |
| 2059 | sector_t pblock = exbh->b_blocknr, cur_logical; | 2039 | sector_t pblock = map->m_pblk, cur_logical; |
| 2060 | struct buffer_head *head, *bh; | 2040 | struct buffer_head *head, *bh; |
| 2061 | pgoff_t index, end; | 2041 | pgoff_t index, end; |
| 2062 | struct pagevec pvec; | 2042 | struct pagevec pvec; |
| 2063 | int nr_pages, i; | 2043 | int nr_pages, i; |
| 2064 | 2044 | ||
| 2065 | index = logical >> (PAGE_CACHE_SHIFT - inode->i_blkbits); | 2045 | index = map->m_lblk >> (PAGE_CACHE_SHIFT - inode->i_blkbits); |
| 2066 | end = (logical + blocks - 1) >> (PAGE_CACHE_SHIFT - inode->i_blkbits); | 2046 | end = (map->m_lblk + blocks - 1) >> (PAGE_CACHE_SHIFT - inode->i_blkbits); |
| 2067 | cur_logical = index << (PAGE_CACHE_SHIFT - inode->i_blkbits); | 2047 | cur_logical = index << (PAGE_CACHE_SHIFT - inode->i_blkbits); |
| 2068 | 2048 | ||
| 2069 | pagevec_init(&pvec, 0); | 2049 | pagevec_init(&pvec, 0); |
| @@ -2090,17 +2070,16 @@ static void mpage_put_bnr_to_bhs(struct mpage_da_data *mpd, sector_t logical, | |||
| 2090 | 2070 | ||
| 2091 | /* skip blocks out of the range */ | 2071 | /* skip blocks out of the range */ |
| 2092 | do { | 2072 | do { |
| 2093 | if (cur_logical >= logical) | 2073 | if (cur_logical >= map->m_lblk) |
| 2094 | break; | 2074 | break; |
| 2095 | cur_logical++; | 2075 | cur_logical++; |
| 2096 | } while ((bh = bh->b_this_page) != head); | 2076 | } while ((bh = bh->b_this_page) != head); |
| 2097 | 2077 | ||
| 2098 | do { | 2078 | do { |
| 2099 | if (cur_logical >= logical + blocks) | 2079 | if (cur_logical >= map->m_lblk + blocks) |
| 2100 | break; | 2080 | break; |
| 2101 | 2081 | ||
| 2102 | if (buffer_delay(bh) || | 2082 | if (buffer_delay(bh) || buffer_unwritten(bh)) { |
| 2103 | buffer_unwritten(bh)) { | ||
| 2104 | 2083 | ||
| 2105 | BUG_ON(bh->b_bdev != inode->i_sb->s_bdev); | 2084 | BUG_ON(bh->b_bdev != inode->i_sb->s_bdev); |
| 2106 | 2085 | ||
| @@ -2119,7 +2098,7 @@ static void mpage_put_bnr_to_bhs(struct mpage_da_data *mpd, sector_t logical, | |||
| 2119 | } else if (buffer_mapped(bh)) | 2098 | } else if (buffer_mapped(bh)) |
| 2120 | BUG_ON(bh->b_blocknr != pblock); | 2099 | BUG_ON(bh->b_blocknr != pblock); |
| 2121 | 2100 | ||
| 2122 | if (buffer_uninit(exbh)) | 2101 | if (map->m_flags & EXT4_MAP_UNINIT) |
| 2123 | set_buffer_uninit(bh); | 2102 | set_buffer_uninit(bh); |
| 2124 | cur_logical++; | 2103 | cur_logical++; |
| 2125 | pblock++; | 2104 | pblock++; |
| @@ -2130,21 +2109,6 @@ static void mpage_put_bnr_to_bhs(struct mpage_da_data *mpd, sector_t logical, | |||
| 2130 | } | 2109 | } |
| 2131 | 2110 | ||
| 2132 | 2111 | ||
| 2133 | /* | ||
| 2134 | * __unmap_underlying_blocks - just a helper function to unmap | ||
| 2135 | * set of blocks described by @bh | ||
| 2136 | */ | ||
| 2137 | static inline void __unmap_underlying_blocks(struct inode *inode, | ||
| 2138 | struct buffer_head *bh) | ||
| 2139 | { | ||
| 2140 | struct block_device *bdev = inode->i_sb->s_bdev; | ||
| 2141 | int blocks, i; | ||
| 2142 | |||
| 2143 | blocks = bh->b_size >> inode->i_blkbits; | ||
| 2144 | for (i = 0; i < blocks; i++) | ||
| 2145 | unmap_underlying_metadata(bdev, bh->b_blocknr + i); | ||
| 2146 | } | ||
| 2147 | |||
| 2148 | static void ext4_da_block_invalidatepages(struct mpage_da_data *mpd, | 2112 | static void ext4_da_block_invalidatepages(struct mpage_da_data *mpd, |
| 2149 | sector_t logical, long blk_cnt) | 2113 | sector_t logical, long blk_cnt) |
| 2150 | { | 2114 | { |
| @@ -2206,7 +2170,7 @@ static void ext4_print_free_blocks(struct inode *inode) | |||
| 2206 | static int mpage_da_map_blocks(struct mpage_da_data *mpd) | 2170 | static int mpage_da_map_blocks(struct mpage_da_data *mpd) |
| 2207 | { | 2171 | { |
| 2208 | int err, blks, get_blocks_flags; | 2172 | int err, blks, get_blocks_flags; |
| 2209 | struct buffer_head new; | 2173 | struct ext4_map_blocks map; |
| 2210 | sector_t next = mpd->b_blocknr; | 2174 | sector_t next = mpd->b_blocknr; |
| 2211 | unsigned max_blocks = mpd->b_size >> mpd->inode->i_blkbits; | 2175 | unsigned max_blocks = mpd->b_size >> mpd->inode->i_blkbits; |
| 2212 | loff_t disksize = EXT4_I(mpd->inode)->i_disksize; | 2176 | loff_t disksize = EXT4_I(mpd->inode)->i_disksize; |
| @@ -2247,15 +2211,15 @@ static int mpage_da_map_blocks(struct mpage_da_data *mpd) | |||
| 2247 | * EXT4_GET_BLOCKS_DELALLOC_RESERVE so the delalloc accounting | 2211 | * EXT4_GET_BLOCKS_DELALLOC_RESERVE so the delalloc accounting |
| 2248 | * variables are updated after the blocks have been allocated. | 2212 | * variables are updated after the blocks have been allocated. |
| 2249 | */ | 2213 | */ |
| 2250 | new.b_state = 0; | 2214 | map.m_lblk = next; |
| 2215 | map.m_len = max_blocks; | ||
| 2251 | get_blocks_flags = EXT4_GET_BLOCKS_CREATE; | 2216 | get_blocks_flags = EXT4_GET_BLOCKS_CREATE; |
| 2252 | if (ext4_should_dioread_nolock(mpd->inode)) | 2217 | if (ext4_should_dioread_nolock(mpd->inode)) |
| 2253 | get_blocks_flags |= EXT4_GET_BLOCKS_IO_CREATE_EXT; | 2218 | get_blocks_flags |= EXT4_GET_BLOCKS_IO_CREATE_EXT; |
| 2254 | if (mpd->b_state & (1 << BH_Delay)) | 2219 | if (mpd->b_state & (1 << BH_Delay)) |
| 2255 | get_blocks_flags |= EXT4_GET_BLOCKS_DELALLOC_RESERVE; | 2220 | get_blocks_flags |= EXT4_GET_BLOCKS_DELALLOC_RESERVE; |
| 2256 | 2221 | ||
| 2257 | blks = ext4_get_blocks(handle, mpd->inode, next, max_blocks, | 2222 | blks = ext4_map_blocks(handle, mpd->inode, &map, get_blocks_flags); |
| 2258 | &new, get_blocks_flags); | ||
| 2259 | if (blks < 0) { | 2223 | if (blks < 0) { |
| 2260 | err = blks; | 2224 | err = blks; |
| 2261 | /* | 2225 | /* |
| @@ -2282,7 +2246,7 @@ static int mpage_da_map_blocks(struct mpage_da_data *mpd) | |||
| 2282 | ext4_msg(mpd->inode->i_sb, KERN_CRIT, | 2246 | ext4_msg(mpd->inode->i_sb, KERN_CRIT, |
| 2283 | "delayed block allocation failed for inode %lu at " | 2247 | "delayed block allocation failed for inode %lu at " |
| 2284 | "logical offset %llu with max blocks %zd with " | 2248 | "logical offset %llu with max blocks %zd with " |
| 2285 | "error %d\n", mpd->inode->i_ino, | 2249 | "error %d", mpd->inode->i_ino, |
| 2286 | (unsigned long long) next, | 2250 | (unsigned long long) next, |
| 2287 | mpd->b_size >> mpd->inode->i_blkbits, err); | 2251 | mpd->b_size >> mpd->inode->i_blkbits, err); |
| 2288 | printk(KERN_CRIT "This should not happen!! " | 2252 | printk(KERN_CRIT "This should not happen!! " |
| @@ -2297,10 +2261,13 @@ static int mpage_da_map_blocks(struct mpage_da_data *mpd) | |||
| 2297 | } | 2261 | } |
| 2298 | BUG_ON(blks == 0); | 2262 | BUG_ON(blks == 0); |
| 2299 | 2263 | ||
| 2300 | new.b_size = (blks << mpd->inode->i_blkbits); | 2264 | if (map.m_flags & EXT4_MAP_NEW) { |
| 2265 | struct block_device *bdev = mpd->inode->i_sb->s_bdev; | ||
| 2266 | int i; | ||
| 2301 | 2267 | ||
| 2302 | if (buffer_new(&new)) | 2268 | for (i = 0; i < map.m_len; i++) |
| 2303 | __unmap_underlying_blocks(mpd->inode, &new); | 2269 | unmap_underlying_metadata(bdev, map.m_pblk + i); |
| 2270 | } | ||
| 2304 | 2271 | ||
| 2305 | /* | 2272 | /* |
| 2306 | * If blocks are delayed marked, we need to | 2273 | * If blocks are delayed marked, we need to |
| @@ -2308,7 +2275,7 @@ static int mpage_da_map_blocks(struct mpage_da_data *mpd) | |||
| 2308 | */ | 2275 | */ |
| 2309 | if ((mpd->b_state & (1 << BH_Delay)) || | 2276 | if ((mpd->b_state & (1 << BH_Delay)) || |
| 2310 | (mpd->b_state & (1 << BH_Unwritten))) | 2277 | (mpd->b_state & (1 << BH_Unwritten))) |
| 2311 | mpage_put_bnr_to_bhs(mpd, next, &new); | 2278 | mpage_put_bnr_to_bhs(mpd, &map); |
| 2312 | 2279 | ||
| 2313 | if (ext4_should_order_data(mpd->inode)) { | 2280 | if (ext4_should_order_data(mpd->inode)) { |
| 2314 | err = ext4_jbd2_file_inode(handle, mpd->inode); | 2281 | err = ext4_jbd2_file_inode(handle, mpd->inode); |
| @@ -2349,8 +2316,17 @@ static void mpage_add_bh_to_extent(struct mpage_da_data *mpd, | |||
| 2349 | sector_t next; | 2316 | sector_t next; |
| 2350 | int nrblocks = mpd->b_size >> mpd->inode->i_blkbits; | 2317 | int nrblocks = mpd->b_size >> mpd->inode->i_blkbits; |
| 2351 | 2318 | ||
| 2319 | /* | ||
| 2320 | * XXX Don't go larger than mballoc is willing to allocate | ||
| 2321 | * This is a stopgap solution. We eventually need to fold | ||
| 2322 | * mpage_da_submit_io() into this function and then call | ||
| 2323 | * ext4_get_blocks() multiple times in a loop | ||
| 2324 | */ | ||
| 2325 | if (nrblocks >= 8*1024*1024/mpd->inode->i_sb->s_blocksize) | ||
| 2326 | goto flush_it; | ||
| 2327 | |||
| 2352 | /* check if thereserved journal credits might overflow */ | 2328 | /* check if thereserved journal credits might overflow */ |
| 2353 | if (!(EXT4_I(mpd->inode)->i_flags & EXT4_EXTENTS_FL)) { | 2329 | if (!(ext4_test_inode_flag(mpd->inode, EXT4_INODE_EXTENTS))) { |
| 2354 | if (nrblocks >= EXT4_MAX_TRANS_DATA) { | 2330 | if (nrblocks >= EXT4_MAX_TRANS_DATA) { |
| 2355 | /* | 2331 | /* |
| 2356 | * With non-extent format we are limited by the journal | 2332 | * With non-extent format we are limited by the journal |
| @@ -2423,17 +2399,6 @@ static int __mpage_da_writepage(struct page *page, | |||
| 2423 | struct buffer_head *bh, *head; | 2399 | struct buffer_head *bh, *head; |
| 2424 | sector_t logical; | 2400 | sector_t logical; |
| 2425 | 2401 | ||
| 2426 | if (mpd->io_done) { | ||
| 2427 | /* | ||
| 2428 | * Rest of the page in the page_vec | ||
| 2429 | * redirty then and skip then. We will | ||
| 2430 | * try to write them again after | ||
| 2431 | * starting a new transaction | ||
| 2432 | */ | ||
| 2433 | redirty_page_for_writepage(wbc, page); | ||
| 2434 | unlock_page(page); | ||
| 2435 | return MPAGE_DA_EXTENT_TAIL; | ||
| 2436 | } | ||
| 2437 | /* | 2402 | /* |
| 2438 | * Can we merge this page to current extent? | 2403 | * Can we merge this page to current extent? |
| 2439 | */ | 2404 | */ |
| @@ -2528,8 +2493,9 @@ static int __mpage_da_writepage(struct page *page, | |||
| 2528 | * initialized properly. | 2493 | * initialized properly. |
| 2529 | */ | 2494 | */ |
| 2530 | static int ext4_da_get_block_prep(struct inode *inode, sector_t iblock, | 2495 | static int ext4_da_get_block_prep(struct inode *inode, sector_t iblock, |
| 2531 | struct buffer_head *bh_result, int create) | 2496 | struct buffer_head *bh, int create) |
| 2532 | { | 2497 | { |
| 2498 | struct ext4_map_blocks map; | ||
| 2533 | int ret = 0; | 2499 | int ret = 0; |
| 2534 | sector_t invalid_block = ~((sector_t) 0xffff); | 2500 | sector_t invalid_block = ~((sector_t) 0xffff); |
| 2535 | 2501 | ||
| @@ -2537,16 +2503,22 @@ static int ext4_da_get_block_prep(struct inode *inode, sector_t iblock, | |||
| 2537 | invalid_block = ~0; | 2503 | invalid_block = ~0; |
| 2538 | 2504 | ||
| 2539 | BUG_ON(create == 0); | 2505 | BUG_ON(create == 0); |
| 2540 | BUG_ON(bh_result->b_size != inode->i_sb->s_blocksize); | 2506 | BUG_ON(bh->b_size != inode->i_sb->s_blocksize); |
| 2507 | |||
| 2508 | map.m_lblk = iblock; | ||
| 2509 | map.m_len = 1; | ||
| 2541 | 2510 | ||
| 2542 | /* | 2511 | /* |
| 2543 | * first, we need to know whether the block is allocated already | 2512 | * first, we need to know whether the block is allocated already |
| 2544 | * preallocated blocks are unmapped but should treated | 2513 | * preallocated blocks are unmapped but should treated |
| 2545 | * the same as allocated blocks. | 2514 | * the same as allocated blocks. |
| 2546 | */ | 2515 | */ |
| 2547 | ret = ext4_get_blocks(NULL, inode, iblock, 1, bh_result, 0); | 2516 | ret = ext4_map_blocks(NULL, inode, &map, 0); |
| 2548 | if ((ret == 0) && !buffer_delay(bh_result)) { | 2517 | if (ret < 0) |
| 2549 | /* the block isn't (pre)allocated yet, let's reserve space */ | 2518 | return ret; |
| 2519 | if (ret == 0) { | ||
| 2520 | if (buffer_delay(bh)) | ||
| 2521 | return 0; /* Not sure this could or should happen */ | ||
| 2550 | /* | 2522 | /* |
| 2551 | * XXX: __block_prepare_write() unmaps passed block, | 2523 | * XXX: __block_prepare_write() unmaps passed block, |
| 2552 | * is it OK? | 2524 | * is it OK? |
| @@ -2556,26 +2528,26 @@ static int ext4_da_get_block_prep(struct inode *inode, sector_t iblock, | |||
| 2556 | /* not enough space to reserve */ | 2528 | /* not enough space to reserve */ |
| 2557 | return ret; | 2529 | return ret; |
| 2558 | 2530 | ||
| 2559 | map_bh(bh_result, inode->i_sb, invalid_block); | 2531 | map_bh(bh, inode->i_sb, invalid_block); |
| 2560 | set_buffer_new(bh_result); | 2532 | set_buffer_new(bh); |
| 2561 | set_buffer_delay(bh_result); | 2533 | set_buffer_delay(bh); |
| 2562 | } else if (ret > 0) { | 2534 | return 0; |
| 2563 | bh_result->b_size = (ret << inode->i_blkbits); | ||
| 2564 | if (buffer_unwritten(bh_result)) { | ||
| 2565 | /* A delayed write to unwritten bh should | ||
| 2566 | * be marked new and mapped. Mapped ensures | ||
| 2567 | * that we don't do get_block multiple times | ||
| 2568 | * when we write to the same offset and new | ||
| 2569 | * ensures that we do proper zero out for | ||
| 2570 | * partial write. | ||
| 2571 | */ | ||
| 2572 | set_buffer_new(bh_result); | ||
| 2573 | set_buffer_mapped(bh_result); | ||
| 2574 | } | ||
| 2575 | ret = 0; | ||
| 2576 | } | 2535 | } |
| 2577 | 2536 | ||
| 2578 | return ret; | 2537 | map_bh(bh, inode->i_sb, map.m_pblk); |
| 2538 | bh->b_state = (bh->b_state & ~EXT4_MAP_FLAGS) | map.m_flags; | ||
| 2539 | |||
| 2540 | if (buffer_unwritten(bh)) { | ||
| 2541 | /* A delayed write to unwritten bh should be marked | ||
| 2542 | * new and mapped. Mapped ensures that we don't do | ||
| 2543 | * get_block multiple times when we write to the same | ||
| 2544 | * offset and new ensures that we do proper zero out | ||
| 2545 | * for partial write. | ||
| 2546 | */ | ||
| 2547 | set_buffer_new(bh); | ||
| 2548 | set_buffer_mapped(bh); | ||
| 2549 | } | ||
| 2550 | return 0; | ||
| 2579 | } | 2551 | } |
| 2580 | 2552 | ||
| 2581 | /* | 2553 | /* |
| @@ -2597,21 +2569,8 @@ static int ext4_da_get_block_prep(struct inode *inode, sector_t iblock, | |||
| 2597 | static int noalloc_get_block_write(struct inode *inode, sector_t iblock, | 2569 | static int noalloc_get_block_write(struct inode *inode, sector_t iblock, |
| 2598 | struct buffer_head *bh_result, int create) | 2570 | struct buffer_head *bh_result, int create) |
| 2599 | { | 2571 | { |
| 2600 | int ret = 0; | ||
| 2601 | unsigned max_blocks = bh_result->b_size >> inode->i_blkbits; | ||
| 2602 | |||
| 2603 | BUG_ON(bh_result->b_size != inode->i_sb->s_blocksize); | 2572 | BUG_ON(bh_result->b_size != inode->i_sb->s_blocksize); |
| 2604 | 2573 | return _ext4_get_block(inode, iblock, bh_result, 0); | |
| 2605 | /* | ||
| 2606 | * we don't want to do block allocation in writepage | ||
| 2607 | * so call get_block_wrap with create = 0 | ||
| 2608 | */ | ||
| 2609 | ret = ext4_get_blocks(NULL, inode, iblock, max_blocks, bh_result, 0); | ||
| 2610 | if (ret > 0) { | ||
| 2611 | bh_result->b_size = (ret << inode->i_blkbits); | ||
| 2612 | ret = 0; | ||
| 2613 | } | ||
| 2614 | return ret; | ||
| 2615 | } | 2574 | } |
| 2616 | 2575 | ||
| 2617 | static int bget_one(handle_t *handle, struct buffer_head *bh) | 2576 | static int bget_one(handle_t *handle, struct buffer_head *bh) |
| @@ -2821,13 +2780,131 @@ static int ext4_da_writepages_trans_blocks(struct inode *inode) | |||
| 2821 | * number of contiguous block. So we will limit | 2780 | * number of contiguous block. So we will limit |
| 2822 | * number of contiguous block to a sane value | 2781 | * number of contiguous block to a sane value |
| 2823 | */ | 2782 | */ |
| 2824 | if (!(EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL) && | 2783 | if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) && |
| 2825 | (max_blocks > EXT4_MAX_TRANS_DATA)) | 2784 | (max_blocks > EXT4_MAX_TRANS_DATA)) |
| 2826 | max_blocks = EXT4_MAX_TRANS_DATA; | 2785 | max_blocks = EXT4_MAX_TRANS_DATA; |
| 2827 | 2786 | ||
| 2828 | return ext4_chunk_trans_blocks(inode, max_blocks); | 2787 | return ext4_chunk_trans_blocks(inode, max_blocks); |
| 2829 | } | 2788 | } |
| 2830 | 2789 | ||
| 2790 | /* | ||
| 2791 | * write_cache_pages_da - walk the list of dirty pages of the given | ||
| 2792 | * address space and call the callback function (which usually writes | ||
| 2793 | * the pages). | ||
| 2794 | * | ||
| 2795 | * This is a forked version of write_cache_pages(). Differences: | ||
| 2796 | * Range cyclic is ignored. | ||
| 2797 | * no_nrwrite_index_update is always presumed true | ||
| 2798 | */ | ||
| 2799 | static int write_cache_pages_da(struct address_space *mapping, | ||
| 2800 | struct writeback_control *wbc, | ||
| 2801 | struct mpage_da_data *mpd) | ||
| 2802 | { | ||
| 2803 | int ret = 0; | ||
| 2804 | int done = 0; | ||
| 2805 | struct pagevec pvec; | ||
| 2806 | int nr_pages; | ||
| 2807 | pgoff_t index; | ||
| 2808 | pgoff_t end; /* Inclusive */ | ||
| 2809 | long nr_to_write = wbc->nr_to_write; | ||
| 2810 | |||
| 2811 | pagevec_init(&pvec, 0); | ||
| 2812 | index = wbc->range_start >> PAGE_CACHE_SHIFT; | ||
| 2813 | end = wbc->range_end >> PAGE_CACHE_SHIFT; | ||
| 2814 | |||
| 2815 | while (!done && (index <= end)) { | ||
| 2816 | int i; | ||
| 2817 | |||
| 2818 | nr_pages = pagevec_lookup_tag(&pvec, mapping, &index, | ||
| 2819 | PAGECACHE_TAG_DIRTY, | ||
| 2820 | min(end - index, (pgoff_t)PAGEVEC_SIZE-1) + 1); | ||
| 2821 | if (nr_pages == 0) | ||
| 2822 | break; | ||
| 2823 | |||
| 2824 | for (i = 0; i < nr_pages; i++) { | ||
| 2825 | struct page *page = pvec.pages[i]; | ||
| 2826 | |||
| 2827 | /* | ||
| 2828 | * At this point, the page may be truncated or | ||
| 2829 | * invalidated (changing page->mapping to NULL), or | ||
| 2830 | * even swizzled back from swapper_space to tmpfs file | ||
| 2831 | * mapping. However, page->index will not change | ||
| 2832 | * because we have a reference on the page. | ||
| 2833 | */ | ||
| 2834 | if (page->index > end) { | ||
| 2835 | done = 1; | ||
| 2836 | break; | ||
| 2837 | } | ||
| 2838 | |||
| 2839 | lock_page(page); | ||
| 2840 | |||
| 2841 | /* | ||
| 2842 | * Page truncated or invalidated. We can freely skip it | ||
| 2843 | * then, even for data integrity operations: the page | ||
| 2844 | * has disappeared concurrently, so there could be no | ||
| 2845 | * real expectation of this data interity operation | ||
| 2846 | * even if there is now a new, dirty page at the same | ||
| 2847 | * pagecache address. | ||
| 2848 | */ | ||
| 2849 | if (unlikely(page->mapping != mapping)) { | ||
| 2850 | continue_unlock: | ||
| 2851 | unlock_page(page); | ||
| 2852 | continue; | ||
| 2853 | } | ||
| 2854 | |||
| 2855 | if (!PageDirty(page)) { | ||
| 2856 | /* someone wrote it for us */ | ||
| 2857 | goto continue_unlock; | ||
| 2858 | } | ||
| 2859 | |||
| 2860 | if (PageWriteback(page)) { | ||
| 2861 | if (wbc->sync_mode != WB_SYNC_NONE) | ||
| 2862 | wait_on_page_writeback(page); | ||
| 2863 | else | ||
| 2864 | goto continue_unlock; | ||
| 2865 | } | ||
| 2866 | |||
| 2867 | BUG_ON(PageWriteback(page)); | ||
| 2868 | if (!clear_page_dirty_for_io(page)) | ||
| 2869 | goto continue_unlock; | ||
| 2870 | |||
| 2871 | ret = __mpage_da_writepage(page, wbc, mpd); | ||
| 2872 | if (unlikely(ret)) { | ||
| 2873 | if (ret == AOP_WRITEPAGE_ACTIVATE) { | ||
| 2874 | unlock_page(page); | ||
| 2875 | ret = 0; | ||
| 2876 | } else { | ||
| 2877 | done = 1; | ||
| 2878 | break; | ||
| 2879 | } | ||
| 2880 | } | ||
| 2881 | |||
| 2882 | if (nr_to_write > 0) { | ||
| 2883 | nr_to_write--; | ||
| 2884 | if (nr_to_write == 0 && | ||
| 2885 | wbc->sync_mode == WB_SYNC_NONE) { | ||
| 2886 | /* | ||
| 2887 | * We stop writing back only if we are | ||
| 2888 | * not doing integrity sync. In case of | ||
| 2889 | * integrity sync we have to keep going | ||
| 2890 | * because someone may be concurrently | ||
| 2891 | * dirtying pages, and we might have | ||
| 2892 | * synced a lot of newly appeared dirty | ||
| 2893 | * pages, but have not synced all of the | ||
| 2894 | * old dirty pages. | ||
| 2895 | */ | ||
| 2896 | done = 1; | ||
| 2897 | break; | ||
| 2898 | } | ||
| 2899 | } | ||
| 2900 | } | ||
| 2901 | pagevec_release(&pvec); | ||
| 2902 | cond_resched(); | ||
| 2903 | } | ||
| 2904 | return ret; | ||
| 2905 | } | ||
| 2906 | |||
| 2907 | |||
| 2831 | static int ext4_da_writepages(struct address_space *mapping, | 2908 | static int ext4_da_writepages(struct address_space *mapping, |
| 2832 | struct writeback_control *wbc) | 2909 | struct writeback_control *wbc) |
| 2833 | { | 2910 | { |
| @@ -2836,7 +2913,6 @@ static int ext4_da_writepages(struct address_space *mapping, | |||
| 2836 | handle_t *handle = NULL; | 2913 | handle_t *handle = NULL; |
| 2837 | struct mpage_da_data mpd; | 2914 | struct mpage_da_data mpd; |
| 2838 | struct inode *inode = mapping->host; | 2915 | struct inode *inode = mapping->host; |
| 2839 | int no_nrwrite_index_update; | ||
| 2840 | int pages_written = 0; | 2916 | int pages_written = 0; |
| 2841 | long pages_skipped; | 2917 | long pages_skipped; |
| 2842 | unsigned int max_pages; | 2918 | unsigned int max_pages; |
| @@ -2916,12 +2992,6 @@ static int ext4_da_writepages(struct address_space *mapping, | |||
| 2916 | mpd.wbc = wbc; | 2992 | mpd.wbc = wbc; |
| 2917 | mpd.inode = mapping->host; | 2993 | mpd.inode = mapping->host; |
| 2918 | 2994 | ||
| 2919 | /* | ||
| 2920 | * we don't want write_cache_pages to update | ||
| 2921 | * nr_to_write and writeback_index | ||
| 2922 | */ | ||
| 2923 | no_nrwrite_index_update = wbc->no_nrwrite_index_update; | ||
| 2924 | wbc->no_nrwrite_index_update = 1; | ||
| 2925 | pages_skipped = wbc->pages_skipped; | 2995 | pages_skipped = wbc->pages_skipped; |
| 2926 | 2996 | ||
| 2927 | retry: | 2997 | retry: |
| @@ -2941,7 +3011,7 @@ retry: | |||
| 2941 | if (IS_ERR(handle)) { | 3011 | if (IS_ERR(handle)) { |
| 2942 | ret = PTR_ERR(handle); | 3012 | ret = PTR_ERR(handle); |
| 2943 | ext4_msg(inode->i_sb, KERN_CRIT, "%s: jbd2_start: " | 3013 | ext4_msg(inode->i_sb, KERN_CRIT, "%s: jbd2_start: " |
| 2944 | "%ld pages, ino %lu; err %d\n", __func__, | 3014 | "%ld pages, ino %lu; err %d", __func__, |
| 2945 | wbc->nr_to_write, inode->i_ino, ret); | 3015 | wbc->nr_to_write, inode->i_ino, ret); |
| 2946 | goto out_writepages; | 3016 | goto out_writepages; |
| 2947 | } | 3017 | } |
| @@ -2963,8 +3033,7 @@ retry: | |||
| 2963 | mpd.io_done = 0; | 3033 | mpd.io_done = 0; |
| 2964 | mpd.pages_written = 0; | 3034 | mpd.pages_written = 0; |
| 2965 | mpd.retval = 0; | 3035 | mpd.retval = 0; |
| 2966 | ret = write_cache_pages(mapping, wbc, __mpage_da_writepage, | 3036 | ret = write_cache_pages_da(mapping, wbc, &mpd); |
| 2967 | &mpd); | ||
| 2968 | /* | 3037 | /* |
| 2969 | * If we have a contiguous extent of pages and we | 3038 | * If we have a contiguous extent of pages and we |
| 2970 | * haven't done the I/O yet, map the blocks and submit | 3039 | * haven't done the I/O yet, map the blocks and submit |
| @@ -3016,7 +3085,7 @@ retry: | |||
| 3016 | if (pages_skipped != wbc->pages_skipped) | 3085 | if (pages_skipped != wbc->pages_skipped) |
| 3017 | ext4_msg(inode->i_sb, KERN_CRIT, | 3086 | ext4_msg(inode->i_sb, KERN_CRIT, |
| 3018 | "This should not happen leaving %s " | 3087 | "This should not happen leaving %s " |
| 3019 | "with nr_to_write = %ld ret = %d\n", | 3088 | "with nr_to_write = %ld ret = %d", |
| 3020 | __func__, wbc->nr_to_write, ret); | 3089 | __func__, wbc->nr_to_write, ret); |
| 3021 | 3090 | ||
| 3022 | /* Update index */ | 3091 | /* Update index */ |
| @@ -3030,8 +3099,6 @@ retry: | |||
| 3030 | mapping->writeback_index = index; | 3099 | mapping->writeback_index = index; |
| 3031 | 3100 | ||
| 3032 | out_writepages: | 3101 | out_writepages: |
| 3033 | if (!no_nrwrite_index_update) | ||
| 3034 | wbc->no_nrwrite_index_update = 0; | ||
| 3035 | wbc->nr_to_write -= nr_to_writebump; | 3102 | wbc->nr_to_write -= nr_to_writebump; |
| 3036 | wbc->range_start = range_start; | 3103 | wbc->range_start = range_start; |
| 3037 | trace_ext4_da_writepages_result(inode, wbc, ret, pages_written); | 3104 | trace_ext4_da_writepages_result(inode, wbc, ret, pages_written); |
| @@ -3076,7 +3143,7 @@ static int ext4_da_write_begin(struct file *file, struct address_space *mapping, | |||
| 3076 | loff_t pos, unsigned len, unsigned flags, | 3143 | loff_t pos, unsigned len, unsigned flags, |
| 3077 | struct page **pagep, void **fsdata) | 3144 | struct page **pagep, void **fsdata) |
| 3078 | { | 3145 | { |
| 3079 | int ret, retries = 0, quota_retries = 0; | 3146 | int ret, retries = 0; |
| 3080 | struct page *page; | 3147 | struct page *page; |
| 3081 | pgoff_t index; | 3148 | pgoff_t index; |
| 3082 | unsigned from, to; | 3149 | unsigned from, to; |
| @@ -3135,22 +3202,6 @@ retry: | |||
| 3135 | 3202 | ||
| 3136 | if (ret == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) | 3203 | if (ret == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) |
| 3137 | goto retry; | 3204 | goto retry; |
| 3138 | |||
| 3139 | if ((ret == -EDQUOT) && | ||
| 3140 | EXT4_I(inode)->i_reserved_meta_blocks && | ||
| 3141 | (quota_retries++ < 3)) { | ||
| 3142 | /* | ||
| 3143 | * Since we often over-estimate the number of meta | ||
| 3144 | * data blocks required, we may sometimes get a | ||
| 3145 | * spurios out of quota error even though there would | ||
| 3146 | * be enough space once we write the data blocks and | ||
| 3147 | * find out how many meta data blocks were _really_ | ||
| 3148 | * required. So try forcing the inode write to see if | ||
| 3149 | * that helps. | ||
| 3150 | */ | ||
| 3151 | write_inode_now(inode, (quota_retries == 3)); | ||
| 3152 | goto retry; | ||
| 3153 | } | ||
| 3154 | out: | 3205 | out: |
| 3155 | return ret; | 3206 | return ret; |
| 3156 | } | 3207 | } |
| @@ -3546,46 +3597,18 @@ out: | |||
| 3546 | return ret; | 3597 | return ret; |
| 3547 | } | 3598 | } |
| 3548 | 3599 | ||
| 3600 | /* | ||
| 3601 | * ext4_get_block used when preparing for a DIO write or buffer write. | ||
| 3602 | * We allocate an uinitialized extent if blocks haven't been allocated. | ||
| 3603 | * The extent will be converted to initialized after the IO is complete. | ||
| 3604 | */ | ||
| 3549 | static int ext4_get_block_write(struct inode *inode, sector_t iblock, | 3605 | static int ext4_get_block_write(struct inode *inode, sector_t iblock, |
| 3550 | struct buffer_head *bh_result, int create) | 3606 | struct buffer_head *bh_result, int create) |
| 3551 | { | 3607 | { |
| 3552 | handle_t *handle = ext4_journal_current_handle(); | ||
| 3553 | int ret = 0; | ||
| 3554 | unsigned max_blocks = bh_result->b_size >> inode->i_blkbits; | ||
| 3555 | int dio_credits; | ||
| 3556 | int started = 0; | ||
| 3557 | |||
| 3558 | ext4_debug("ext4_get_block_write: inode %lu, create flag %d\n", | 3608 | ext4_debug("ext4_get_block_write: inode %lu, create flag %d\n", |
| 3559 | inode->i_ino, create); | 3609 | inode->i_ino, create); |
| 3560 | /* | 3610 | return _ext4_get_block(inode, iblock, bh_result, |
| 3561 | * ext4_get_block in prepare for a DIO write or buffer write. | 3611 | EXT4_GET_BLOCKS_IO_CREATE_EXT); |
| 3562 | * We allocate an uinitialized extent if blocks haven't been allocated. | ||
| 3563 | * The extent will be converted to initialized after IO complete. | ||
| 3564 | */ | ||
| 3565 | create = EXT4_GET_BLOCKS_IO_CREATE_EXT; | ||
| 3566 | |||
| 3567 | if (!handle) { | ||
| 3568 | if (max_blocks > DIO_MAX_BLOCKS) | ||
| 3569 | max_blocks = DIO_MAX_BLOCKS; | ||
| 3570 | dio_credits = ext4_chunk_trans_blocks(inode, max_blocks); | ||
| 3571 | handle = ext4_journal_start(inode, dio_credits); | ||
| 3572 | if (IS_ERR(handle)) { | ||
| 3573 | ret = PTR_ERR(handle); | ||
| 3574 | goto out; | ||
| 3575 | } | ||
| 3576 | started = 1; | ||
| 3577 | } | ||
| 3578 | |||
| 3579 | ret = ext4_get_blocks(handle, inode, iblock, max_blocks, bh_result, | ||
| 3580 | create); | ||
| 3581 | if (ret > 0) { | ||
| 3582 | bh_result->b_size = (ret << inode->i_blkbits); | ||
| 3583 | ret = 0; | ||
| 3584 | } | ||
| 3585 | if (started) | ||
| 3586 | ext4_journal_stop(handle); | ||
| 3587 | out: | ||
| 3588 | return ret; | ||
| 3589 | } | 3612 | } |
| 3590 | 3613 | ||
| 3591 | static void dump_completed_IO(struct inode * inode) | 3614 | static void dump_completed_IO(struct inode * inode) |
| @@ -3973,7 +3996,7 @@ static ssize_t ext4_direct_IO(int rw, struct kiocb *iocb, | |||
| 3973 | struct file *file = iocb->ki_filp; | 3996 | struct file *file = iocb->ki_filp; |
| 3974 | struct inode *inode = file->f_mapping->host; | 3997 | struct inode *inode = file->f_mapping->host; |
| 3975 | 3998 | ||
| 3976 | if (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL) | 3999 | if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) |
| 3977 | return ext4_ext_direct_IO(rw, iocb, iov, offset, nr_segs); | 4000 | return ext4_ext_direct_IO(rw, iocb, iov, offset, nr_segs); |
| 3978 | 4001 | ||
| 3979 | return ext4_ind_direct_IO(rw, iocb, iov, offset, nr_segs); | 4002 | return ext4_ind_direct_IO(rw, iocb, iov, offset, nr_segs); |
| @@ -4302,10 +4325,9 @@ static int ext4_clear_blocks(handle_t *handle, struct inode *inode, | |||
| 4302 | 4325 | ||
| 4303 | if (!ext4_data_block_valid(EXT4_SB(inode->i_sb), block_to_free, | 4326 | if (!ext4_data_block_valid(EXT4_SB(inode->i_sb), block_to_free, |
| 4304 | count)) { | 4327 | count)) { |
| 4305 | ext4_error(inode->i_sb, "inode #%lu: " | 4328 | EXT4_ERROR_INODE(inode, "attempt to clear invalid " |
| 4306 | "attempt to clear blocks %llu len %lu, invalid", | 4329 | "blocks %llu len %lu", |
| 4307 | inode->i_ino, (unsigned long long) block_to_free, | 4330 | (unsigned long long) block_to_free, count); |
| 4308 | count); | ||
| 4309 | return 1; | 4331 | return 1; |
| 4310 | } | 4332 | } |
| 4311 | 4333 | ||
| @@ -4410,11 +4432,10 @@ static void ext4_free_data(handle_t *handle, struct inode *inode, | |||
| 4410 | if ((EXT4_JOURNAL(inode) == NULL) || bh2jh(this_bh)) | 4432 | if ((EXT4_JOURNAL(inode) == NULL) || bh2jh(this_bh)) |
| 4411 | ext4_handle_dirty_metadata(handle, inode, this_bh); | 4433 | ext4_handle_dirty_metadata(handle, inode, this_bh); |
| 4412 | else | 4434 | else |
| 4413 | ext4_error(inode->i_sb, | 4435 | EXT4_ERROR_INODE(inode, |
| 4414 | "circular indirect block detected, " | 4436 | "circular indirect block detected at " |
| 4415 | "inode=%lu, block=%llu", | 4437 | "block %llu", |
| 4416 | inode->i_ino, | 4438 | (unsigned long long) this_bh->b_blocknr); |
| 4417 | (unsigned long long) this_bh->b_blocknr); | ||
| 4418 | } | 4439 | } |
| 4419 | } | 4440 | } |
| 4420 | 4441 | ||
| @@ -4452,11 +4473,10 @@ static void ext4_free_branches(handle_t *handle, struct inode *inode, | |||
| 4452 | 4473 | ||
| 4453 | if (!ext4_data_block_valid(EXT4_SB(inode->i_sb), | 4474 | if (!ext4_data_block_valid(EXT4_SB(inode->i_sb), |
| 4454 | nr, 1)) { | 4475 | nr, 1)) { |
| 4455 | ext4_error(inode->i_sb, | 4476 | EXT4_ERROR_INODE(inode, |
| 4456 | "indirect mapped block in inode " | 4477 | "invalid indirect mapped " |
| 4457 | "#%lu invalid (level %d, blk #%lu)", | 4478 | "block %lu (level %d)", |
| 4458 | inode->i_ino, depth, | 4479 | (unsigned long) nr, depth); |
| 4459 | (unsigned long) nr); | ||
| 4460 | break; | 4480 | break; |
| 4461 | } | 4481 | } |
| 4462 | 4482 | ||
| @@ -4468,9 +4488,9 @@ static void ext4_free_branches(handle_t *handle, struct inode *inode, | |||
| 4468 | * (should be rare). | 4488 | * (should be rare). |
| 4469 | */ | 4489 | */ |
| 4470 | if (!bh) { | 4490 | if (!bh) { |
| 4471 | ext4_error(inode->i_sb, | 4491 | EXT4_ERROR_INODE(inode, |
| 4472 | "Read failure, inode=%lu, block=%llu", | 4492 | "Read failure block=%llu", |
| 4473 | inode->i_ino, nr); | 4493 | (unsigned long long) nr); |
| 4474 | continue; | 4494 | continue; |
| 4475 | } | 4495 | } |
| 4476 | 4496 | ||
| @@ -4612,12 +4632,12 @@ void ext4_truncate(struct inode *inode) | |||
| 4612 | if (!ext4_can_truncate(inode)) | 4632 | if (!ext4_can_truncate(inode)) |
| 4613 | return; | 4633 | return; |
| 4614 | 4634 | ||
| 4615 | EXT4_I(inode)->i_flags &= ~EXT4_EOFBLOCKS_FL; | 4635 | ext4_clear_inode_flag(inode, EXT4_INODE_EOFBLOCKS); |
| 4616 | 4636 | ||
| 4617 | if (inode->i_size == 0 && !test_opt(inode->i_sb, NO_AUTO_DA_ALLOC)) | 4637 | if (inode->i_size == 0 && !test_opt(inode->i_sb, NO_AUTO_DA_ALLOC)) |
| 4618 | ext4_set_inode_state(inode, EXT4_STATE_DA_ALLOC_CLOSE); | 4638 | ext4_set_inode_state(inode, EXT4_STATE_DA_ALLOC_CLOSE); |
| 4619 | 4639 | ||
| 4620 | if (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL) { | 4640 | if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) { |
| 4621 | ext4_ext_truncate(inode); | 4641 | ext4_ext_truncate(inode); |
| 4622 | return; | 4642 | return; |
| 4623 | } | 4643 | } |
| @@ -4785,8 +4805,8 @@ static int __ext4_get_inode_loc(struct inode *inode, | |||
| 4785 | 4805 | ||
| 4786 | bh = sb_getblk(sb, block); | 4806 | bh = sb_getblk(sb, block); |
| 4787 | if (!bh) { | 4807 | if (!bh) { |
| 4788 | ext4_error(sb, "unable to read inode block - " | 4808 | EXT4_ERROR_INODE(inode, "unable to read inode block - " |
| 4789 | "inode=%lu, block=%llu", inode->i_ino, block); | 4809 | "block %llu", block); |
| 4790 | return -EIO; | 4810 | return -EIO; |
| 4791 | } | 4811 | } |
| 4792 | if (!buffer_uptodate(bh)) { | 4812 | if (!buffer_uptodate(bh)) { |
| @@ -4884,8 +4904,8 @@ make_io: | |||
| 4884 | submit_bh(READ_META, bh); | 4904 | submit_bh(READ_META, bh); |
| 4885 | wait_on_buffer(bh); | 4905 | wait_on_buffer(bh); |
| 4886 | if (!buffer_uptodate(bh)) { | 4906 | if (!buffer_uptodate(bh)) { |
| 4887 | ext4_error(sb, "unable to read inode block - inode=%lu," | 4907 | EXT4_ERROR_INODE(inode, "unable to read inode " |
| 4888 | " block=%llu", inode->i_ino, block); | 4908 | "block %llu", block); |
| 4889 | brelse(bh); | 4909 | brelse(bh); |
| 4890 | return -EIO; | 4910 | return -EIO; |
| 4891 | } | 4911 | } |
| @@ -5096,8 +5116,8 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) | |||
| 5096 | ret = 0; | 5116 | ret = 0; |
| 5097 | if (ei->i_file_acl && | 5117 | if (ei->i_file_acl && |
| 5098 | !ext4_data_block_valid(EXT4_SB(sb), ei->i_file_acl, 1)) { | 5118 | !ext4_data_block_valid(EXT4_SB(sb), ei->i_file_acl, 1)) { |
| 5099 | ext4_error(sb, "bad extended attribute block %llu inode #%lu", | 5119 | EXT4_ERROR_INODE(inode, "bad extended attribute block %llu", |
| 5100 | ei->i_file_acl, inode->i_ino); | 5120 | ei->i_file_acl); |
| 5101 | ret = -EIO; | 5121 | ret = -EIO; |
| 5102 | goto bad_inode; | 5122 | goto bad_inode; |
| 5103 | } else if (ei->i_flags & EXT4_EXTENTS_FL) { | 5123 | } else if (ei->i_flags & EXT4_EXTENTS_FL) { |
| @@ -5142,8 +5162,7 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) | |||
| 5142 | new_decode_dev(le32_to_cpu(raw_inode->i_block[1]))); | 5162 | new_decode_dev(le32_to_cpu(raw_inode->i_block[1]))); |
| 5143 | } else { | 5163 | } else { |
| 5144 | ret = -EIO; | 5164 | ret = -EIO; |
| 5145 | ext4_error(inode->i_sb, "bogus i_mode (%o) for inode=%lu", | 5165 | EXT4_ERROR_INODE(inode, "bogus i_mode (%o)", inode->i_mode); |
| 5146 | inode->i_mode, inode->i_ino); | ||
| 5147 | goto bad_inode; | 5166 | goto bad_inode; |
| 5148 | } | 5167 | } |
| 5149 | brelse(iloc.bh); | 5168 | brelse(iloc.bh); |
| @@ -5381,9 +5400,9 @@ int ext4_write_inode(struct inode *inode, struct writeback_control *wbc) | |||
| 5381 | if (wbc->sync_mode == WB_SYNC_ALL) | 5400 | if (wbc->sync_mode == WB_SYNC_ALL) |
| 5382 | sync_dirty_buffer(iloc.bh); | 5401 | sync_dirty_buffer(iloc.bh); |
| 5383 | if (buffer_req(iloc.bh) && !buffer_uptodate(iloc.bh)) { | 5402 | if (buffer_req(iloc.bh) && !buffer_uptodate(iloc.bh)) { |
| 5384 | ext4_error(inode->i_sb, "IO error syncing inode, " | 5403 | EXT4_ERROR_INODE(inode, |
| 5385 | "inode=%lu, block=%llu", inode->i_ino, | 5404 | "IO error syncing inode (block=%llu)", |
| 5386 | (unsigned long long)iloc.bh->b_blocknr); | 5405 | (unsigned long long) iloc.bh->b_blocknr); |
| 5387 | err = -EIO; | 5406 | err = -EIO; |
| 5388 | } | 5407 | } |
| 5389 | brelse(iloc.bh); | 5408 | brelse(iloc.bh); |
| @@ -5455,7 +5474,7 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr) | |||
| 5455 | } | 5474 | } |
| 5456 | 5475 | ||
| 5457 | if (attr->ia_valid & ATTR_SIZE) { | 5476 | if (attr->ia_valid & ATTR_SIZE) { |
| 5458 | if (!(EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL)) { | 5477 | if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) { |
| 5459 | struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); | 5478 | struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); |
| 5460 | 5479 | ||
| 5461 | if (attr->ia_size > sbi->s_bitmap_maxbytes) { | 5480 | if (attr->ia_size > sbi->s_bitmap_maxbytes) { |
| @@ -5468,7 +5487,7 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr) | |||
| 5468 | if (S_ISREG(inode->i_mode) && | 5487 | if (S_ISREG(inode->i_mode) && |
| 5469 | attr->ia_valid & ATTR_SIZE && | 5488 | attr->ia_valid & ATTR_SIZE && |
| 5470 | (attr->ia_size < inode->i_size || | 5489 | (attr->ia_size < inode->i_size || |
| 5471 | (EXT4_I(inode)->i_flags & EXT4_EOFBLOCKS_FL))) { | 5490 | (ext4_test_inode_flag(inode, EXT4_INODE_EOFBLOCKS)))) { |
| 5472 | handle_t *handle; | 5491 | handle_t *handle; |
| 5473 | 5492 | ||
| 5474 | handle = ext4_journal_start(inode, 3); | 5493 | handle = ext4_journal_start(inode, 3); |
| @@ -5500,7 +5519,7 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr) | |||
| 5500 | } | 5519 | } |
| 5501 | } | 5520 | } |
| 5502 | /* ext4_truncate will clear the flag */ | 5521 | /* ext4_truncate will clear the flag */ |
| 5503 | if ((EXT4_I(inode)->i_flags & EXT4_EOFBLOCKS_FL)) | 5522 | if ((ext4_test_inode_flag(inode, EXT4_INODE_EOFBLOCKS))) |
| 5504 | ext4_truncate(inode); | 5523 | ext4_truncate(inode); |
| 5505 | } | 5524 | } |
| 5506 | 5525 | ||
| @@ -5576,7 +5595,7 @@ static int ext4_indirect_trans_blocks(struct inode *inode, int nrblocks, | |||
| 5576 | 5595 | ||
| 5577 | static int ext4_index_trans_blocks(struct inode *inode, int nrblocks, int chunk) | 5596 | static int ext4_index_trans_blocks(struct inode *inode, int nrblocks, int chunk) |
| 5578 | { | 5597 | { |
| 5579 | if (!(EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL)) | 5598 | if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) |
| 5580 | return ext4_indirect_trans_blocks(inode, nrblocks, chunk); | 5599 | return ext4_indirect_trans_blocks(inode, nrblocks, chunk); |
| 5581 | return ext4_ext_index_trans_blocks(inode, nrblocks, chunk); | 5600 | return ext4_ext_index_trans_blocks(inode, nrblocks, chunk); |
| 5582 | } | 5601 | } |
| @@ -5911,9 +5930,9 @@ int ext4_change_inode_journal_flag(struct inode *inode, int val) | |||
| 5911 | */ | 5930 | */ |
| 5912 | 5931 | ||
| 5913 | if (val) | 5932 | if (val) |
| 5914 | EXT4_I(inode)->i_flags |= EXT4_JOURNAL_DATA_FL; | 5933 | ext4_set_inode_flag(inode, EXT4_INODE_JOURNAL_DATA); |
| 5915 | else | 5934 | else |
| 5916 | EXT4_I(inode)->i_flags &= ~EXT4_JOURNAL_DATA_FL; | 5935 | ext4_clear_inode_flag(inode, EXT4_INODE_JOURNAL_DATA); |
| 5917 | ext4_set_aops(inode); | 5936 | ext4_set_aops(inode); |
| 5918 | 5937 | ||
| 5919 | jbd2_journal_unlock_updates(journal); | 5938 | jbd2_journal_unlock_updates(journal); |
diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c index 016d0249294f..bf5ae883b1bd 100644 --- a/fs/ext4/ioctl.c +++ b/fs/ext4/ioctl.c | |||
| @@ -258,7 +258,7 @@ setversion_out: | |||
| 258 | if (me.moved_len > 0) | 258 | if (me.moved_len > 0) |
| 259 | file_remove_suid(donor_filp); | 259 | file_remove_suid(donor_filp); |
| 260 | 260 | ||
| 261 | if (copy_to_user((struct move_extent __user *)arg, | 261 | if (copy_to_user((struct move_extent __user *)arg, |
| 262 | &me, sizeof(me))) | 262 | &me, sizeof(me))) |
| 263 | err = -EFAULT; | 263 | err = -EFAULT; |
| 264 | mext_out: | 264 | mext_out: |
| @@ -373,7 +373,30 @@ long ext4_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
| 373 | case EXT4_IOC32_SETRSVSZ: | 373 | case EXT4_IOC32_SETRSVSZ: |
| 374 | cmd = EXT4_IOC_SETRSVSZ; | 374 | cmd = EXT4_IOC_SETRSVSZ; |
| 375 | break; | 375 | break; |
| 376 | case EXT4_IOC_GROUP_ADD: | 376 | case EXT4_IOC32_GROUP_ADD: { |
| 377 | struct compat_ext4_new_group_input __user *uinput; | ||
| 378 | struct ext4_new_group_input input; | ||
| 379 | mm_segment_t old_fs; | ||
| 380 | int err; | ||
| 381 | |||
| 382 | uinput = compat_ptr(arg); | ||
| 383 | err = get_user(input.group, &uinput->group); | ||
| 384 | err |= get_user(input.block_bitmap, &uinput->block_bitmap); | ||
| 385 | err |= get_user(input.inode_bitmap, &uinput->inode_bitmap); | ||
| 386 | err |= get_user(input.inode_table, &uinput->inode_table); | ||
| 387 | err |= get_user(input.blocks_count, &uinput->blocks_count); | ||
| 388 | err |= get_user(input.reserved_blocks, | ||
| 389 | &uinput->reserved_blocks); | ||
| 390 | if (err) | ||
| 391 | return -EFAULT; | ||
| 392 | old_fs = get_fs(); | ||
| 393 | set_fs(KERNEL_DS); | ||
| 394 | err = ext4_ioctl(file, EXT4_IOC_GROUP_ADD, | ||
| 395 | (unsigned long) &input); | ||
| 396 | set_fs(old_fs); | ||
| 397 | return err; | ||
| 398 | } | ||
| 399 | case EXT4_IOC_MOVE_EXT: | ||
| 377 | break; | 400 | break; |
| 378 | default: | 401 | default: |
| 379 | return -ENOIOCTLCMD; | 402 | return -ENOIOCTLCMD; |
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index b423a364dca3..12b3bc026a68 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c | |||
| @@ -658,6 +658,27 @@ static void ext4_mb_mark_free_simple(struct super_block *sb, | |||
| 658 | } | 658 | } |
| 659 | } | 659 | } |
| 660 | 660 | ||
| 661 | /* | ||
| 662 | * Cache the order of the largest free extent we have available in this block | ||
| 663 | * group. | ||
| 664 | */ | ||
| 665 | static void | ||
| 666 | mb_set_largest_free_order(struct super_block *sb, struct ext4_group_info *grp) | ||
| 667 | { | ||
| 668 | int i; | ||
| 669 | int bits; | ||
| 670 | |||
| 671 | grp->bb_largest_free_order = -1; /* uninit */ | ||
| 672 | |||
| 673 | bits = sb->s_blocksize_bits + 1; | ||
| 674 | for (i = bits; i >= 0; i--) { | ||
| 675 | if (grp->bb_counters[i] > 0) { | ||
| 676 | grp->bb_largest_free_order = i; | ||
| 677 | break; | ||
| 678 | } | ||
| 679 | } | ||
| 680 | } | ||
| 681 | |||
| 661 | static noinline_for_stack | 682 | static noinline_for_stack |
| 662 | void ext4_mb_generate_buddy(struct super_block *sb, | 683 | void ext4_mb_generate_buddy(struct super_block *sb, |
| 663 | void *buddy, void *bitmap, ext4_group_t group) | 684 | void *buddy, void *bitmap, ext4_group_t group) |
| @@ -700,6 +721,7 @@ void ext4_mb_generate_buddy(struct super_block *sb, | |||
| 700 | */ | 721 | */ |
| 701 | grp->bb_free = free; | 722 | grp->bb_free = free; |
| 702 | } | 723 | } |
| 724 | mb_set_largest_free_order(sb, grp); | ||
| 703 | 725 | ||
| 704 | clear_bit(EXT4_GROUP_INFO_NEED_INIT_BIT, &(grp->bb_state)); | 726 | clear_bit(EXT4_GROUP_INFO_NEED_INIT_BIT, &(grp->bb_state)); |
| 705 | 727 | ||
| @@ -725,6 +747,9 @@ void ext4_mb_generate_buddy(struct super_block *sb, | |||
| 725 | * contain blocks_per_page (PAGE_CACHE_SIZE / blocksize) blocks. | 747 | * contain blocks_per_page (PAGE_CACHE_SIZE / blocksize) blocks. |
| 726 | * So it can have information regarding groups_per_page which | 748 | * So it can have information regarding groups_per_page which |
| 727 | * is blocks_per_page/2 | 749 | * is blocks_per_page/2 |
| 750 | * | ||
| 751 | * Locking note: This routine takes the block group lock of all groups | ||
| 752 | * for this page; do not hold this lock when calling this routine! | ||
| 728 | */ | 753 | */ |
| 729 | 754 | ||
| 730 | static int ext4_mb_init_cache(struct page *page, char *incore) | 755 | static int ext4_mb_init_cache(struct page *page, char *incore) |
| @@ -865,6 +890,7 @@ static int ext4_mb_init_cache(struct page *page, char *incore) | |||
| 865 | BUG_ON(incore == NULL); | 890 | BUG_ON(incore == NULL); |
| 866 | mb_debug(1, "put buddy for group %u in page %lu/%x\n", | 891 | mb_debug(1, "put buddy for group %u in page %lu/%x\n", |
| 867 | group, page->index, i * blocksize); | 892 | group, page->index, i * blocksize); |
| 893 | trace_ext4_mb_buddy_bitmap_load(sb, group); | ||
| 868 | grinfo = ext4_get_group_info(sb, group); | 894 | grinfo = ext4_get_group_info(sb, group); |
| 869 | grinfo->bb_fragments = 0; | 895 | grinfo->bb_fragments = 0; |
| 870 | memset(grinfo->bb_counters, 0, | 896 | memset(grinfo->bb_counters, 0, |
| @@ -882,6 +908,7 @@ static int ext4_mb_init_cache(struct page *page, char *incore) | |||
| 882 | BUG_ON(incore != NULL); | 908 | BUG_ON(incore != NULL); |
| 883 | mb_debug(1, "put bitmap for group %u in page %lu/%x\n", | 909 | mb_debug(1, "put bitmap for group %u in page %lu/%x\n", |
| 884 | group, page->index, i * blocksize); | 910 | group, page->index, i * blocksize); |
| 911 | trace_ext4_mb_bitmap_load(sb, group); | ||
| 885 | 912 | ||
| 886 | /* see comments in ext4_mb_put_pa() */ | 913 | /* see comments in ext4_mb_put_pa() */ |
| 887 | ext4_lock_group(sb, group); | 914 | ext4_lock_group(sb, group); |
| @@ -910,6 +937,11 @@ out: | |||
| 910 | return err; | 937 | return err; |
| 911 | } | 938 | } |
| 912 | 939 | ||
| 940 | /* | ||
| 941 | * Locking note: This routine calls ext4_mb_init_cache(), which takes the | ||
| 942 | * block group lock of all groups for this page; do not hold the BG lock when | ||
| 943 | * calling this routine! | ||
| 944 | */ | ||
| 913 | static noinline_for_stack | 945 | static noinline_for_stack |
| 914 | int ext4_mb_init_group(struct super_block *sb, ext4_group_t group) | 946 | int ext4_mb_init_group(struct super_block *sb, ext4_group_t group) |
| 915 | { | 947 | { |
| @@ -1004,6 +1036,11 @@ err: | |||
| 1004 | return ret; | 1036 | return ret; |
| 1005 | } | 1037 | } |
| 1006 | 1038 | ||
| 1039 | /* | ||
| 1040 | * Locking note: This routine calls ext4_mb_init_cache(), which takes the | ||
| 1041 | * block group lock of all groups for this page; do not hold the BG lock when | ||
| 1042 | * calling this routine! | ||
| 1043 | */ | ||
| 1007 | static noinline_for_stack int | 1044 | static noinline_for_stack int |
| 1008 | ext4_mb_load_buddy(struct super_block *sb, ext4_group_t group, | 1045 | ext4_mb_load_buddy(struct super_block *sb, ext4_group_t group, |
| 1009 | struct ext4_buddy *e4b) | 1046 | struct ext4_buddy *e4b) |
| @@ -1150,7 +1187,7 @@ err: | |||
| 1150 | return ret; | 1187 | return ret; |
| 1151 | } | 1188 | } |
| 1152 | 1189 | ||
| 1153 | static void ext4_mb_release_desc(struct ext4_buddy *e4b) | 1190 | static void ext4_mb_unload_buddy(struct ext4_buddy *e4b) |
| 1154 | { | 1191 | { |
| 1155 | if (e4b->bd_bitmap_page) | 1192 | if (e4b->bd_bitmap_page) |
| 1156 | page_cache_release(e4b->bd_bitmap_page); | 1193 | page_cache_release(e4b->bd_bitmap_page); |
| @@ -1299,6 +1336,7 @@ static void mb_free_blocks(struct inode *inode, struct ext4_buddy *e4b, | |||
| 1299 | buddy = buddy2; | 1336 | buddy = buddy2; |
| 1300 | } while (1); | 1337 | } while (1); |
| 1301 | } | 1338 | } |
| 1339 | mb_set_largest_free_order(sb, e4b->bd_info); | ||
| 1302 | mb_check_buddy(e4b); | 1340 | mb_check_buddy(e4b); |
| 1303 | } | 1341 | } |
| 1304 | 1342 | ||
| @@ -1427,6 +1465,7 @@ static int mb_mark_used(struct ext4_buddy *e4b, struct ext4_free_extent *ex) | |||
| 1427 | e4b->bd_info->bb_counters[ord]++; | 1465 | e4b->bd_info->bb_counters[ord]++; |
| 1428 | e4b->bd_info->bb_counters[ord]++; | 1466 | e4b->bd_info->bb_counters[ord]++; |
| 1429 | } | 1467 | } |
| 1468 | mb_set_largest_free_order(e4b->bd_sb, e4b->bd_info); | ||
| 1430 | 1469 | ||
| 1431 | mb_set_bits(EXT4_MB_BITMAP(e4b), ex->fe_start, len0); | 1470 | mb_set_bits(EXT4_MB_BITMAP(e4b), ex->fe_start, len0); |
| 1432 | mb_check_buddy(e4b); | 1471 | mb_check_buddy(e4b); |
| @@ -1617,7 +1656,7 @@ int ext4_mb_try_best_found(struct ext4_allocation_context *ac, | |||
| 1617 | } | 1656 | } |
| 1618 | 1657 | ||
| 1619 | ext4_unlock_group(ac->ac_sb, group); | 1658 | ext4_unlock_group(ac->ac_sb, group); |
| 1620 | ext4_mb_release_desc(e4b); | 1659 | ext4_mb_unload_buddy(e4b); |
| 1621 | 1660 | ||
| 1622 | return 0; | 1661 | return 0; |
| 1623 | } | 1662 | } |
| @@ -1672,7 +1711,7 @@ int ext4_mb_find_by_goal(struct ext4_allocation_context *ac, | |||
| 1672 | ext4_mb_use_best_found(ac, e4b); | 1711 | ext4_mb_use_best_found(ac, e4b); |
| 1673 | } | 1712 | } |
| 1674 | ext4_unlock_group(ac->ac_sb, group); | 1713 | ext4_unlock_group(ac->ac_sb, group); |
| 1675 | ext4_mb_release_desc(e4b); | 1714 | ext4_mb_unload_buddy(e4b); |
| 1676 | 1715 | ||
| 1677 | return 0; | 1716 | return 0; |
| 1678 | } | 1717 | } |
| @@ -1821,16 +1860,22 @@ void ext4_mb_scan_aligned(struct ext4_allocation_context *ac, | |||
| 1821 | } | 1860 | } |
| 1822 | } | 1861 | } |
| 1823 | 1862 | ||
| 1863 | /* This is now called BEFORE we load the buddy bitmap. */ | ||
| 1824 | static int ext4_mb_good_group(struct ext4_allocation_context *ac, | 1864 | static int ext4_mb_good_group(struct ext4_allocation_context *ac, |
| 1825 | ext4_group_t group, int cr) | 1865 | ext4_group_t group, int cr) |
| 1826 | { | 1866 | { |
| 1827 | unsigned free, fragments; | 1867 | unsigned free, fragments; |
| 1828 | unsigned i, bits; | ||
| 1829 | int flex_size = ext4_flex_bg_size(EXT4_SB(ac->ac_sb)); | 1868 | int flex_size = ext4_flex_bg_size(EXT4_SB(ac->ac_sb)); |
| 1830 | struct ext4_group_info *grp = ext4_get_group_info(ac->ac_sb, group); | 1869 | struct ext4_group_info *grp = ext4_get_group_info(ac->ac_sb, group); |
| 1831 | 1870 | ||
| 1832 | BUG_ON(cr < 0 || cr >= 4); | 1871 | BUG_ON(cr < 0 || cr >= 4); |
| 1833 | BUG_ON(EXT4_MB_GRP_NEED_INIT(grp)); | 1872 | |
| 1873 | /* We only do this if the grp has never been initialized */ | ||
| 1874 | if (unlikely(EXT4_MB_GRP_NEED_INIT(grp))) { | ||
| 1875 | int ret = ext4_mb_init_group(ac->ac_sb, group); | ||
| 1876 | if (ret) | ||
| 1877 | return 0; | ||
| 1878 | } | ||
| 1834 | 1879 | ||
| 1835 | free = grp->bb_free; | 1880 | free = grp->bb_free; |
| 1836 | fragments = grp->bb_fragments; | 1881 | fragments = grp->bb_fragments; |
| @@ -1843,17 +1888,16 @@ static int ext4_mb_good_group(struct ext4_allocation_context *ac, | |||
| 1843 | case 0: | 1888 | case 0: |
| 1844 | BUG_ON(ac->ac_2order == 0); | 1889 | BUG_ON(ac->ac_2order == 0); |
| 1845 | 1890 | ||
| 1891 | if (grp->bb_largest_free_order < ac->ac_2order) | ||
| 1892 | return 0; | ||
| 1893 | |||
| 1846 | /* Avoid using the first bg of a flexgroup for data files */ | 1894 | /* Avoid using the first bg of a flexgroup for data files */ |
| 1847 | if ((ac->ac_flags & EXT4_MB_HINT_DATA) && | 1895 | if ((ac->ac_flags & EXT4_MB_HINT_DATA) && |
| 1848 | (flex_size >= EXT4_FLEX_SIZE_DIR_ALLOC_SCHEME) && | 1896 | (flex_size >= EXT4_FLEX_SIZE_DIR_ALLOC_SCHEME) && |
| 1849 | ((group % flex_size) == 0)) | 1897 | ((group % flex_size) == 0)) |
| 1850 | return 0; | 1898 | return 0; |
| 1851 | 1899 | ||
| 1852 | bits = ac->ac_sb->s_blocksize_bits + 1; | 1900 | return 1; |
| 1853 | for (i = ac->ac_2order; i <= bits; i++) | ||
| 1854 | if (grp->bb_counters[i] > 0) | ||
| 1855 | return 1; | ||
| 1856 | break; | ||
| 1857 | case 1: | 1901 | case 1: |
| 1858 | if ((free / fragments) >= ac->ac_g_ex.fe_len) | 1902 | if ((free / fragments) >= ac->ac_g_ex.fe_len) |
| 1859 | return 1; | 1903 | return 1; |
| @@ -1964,7 +2008,7 @@ ext4_mb_regular_allocator(struct ext4_allocation_context *ac) | |||
| 1964 | sbi = EXT4_SB(sb); | 2008 | sbi = EXT4_SB(sb); |
| 1965 | ngroups = ext4_get_groups_count(sb); | 2009 | ngroups = ext4_get_groups_count(sb); |
| 1966 | /* non-extent files are limited to low blocks/groups */ | 2010 | /* non-extent files are limited to low blocks/groups */ |
| 1967 | if (!(EXT4_I(ac->ac_inode)->i_flags & EXT4_EXTENTS_FL)) | 2011 | if (!(ext4_test_inode_flag(ac->ac_inode, EXT4_INODE_EXTENTS))) |
| 1968 | ngroups = sbi->s_blockfile_groups; | 2012 | ngroups = sbi->s_blockfile_groups; |
| 1969 | 2013 | ||
| 1970 | BUG_ON(ac->ac_status == AC_STATUS_FOUND); | 2014 | BUG_ON(ac->ac_status == AC_STATUS_FOUND); |
| @@ -2024,15 +2068,11 @@ repeat: | |||
| 2024 | group = ac->ac_g_ex.fe_group; | 2068 | group = ac->ac_g_ex.fe_group; |
| 2025 | 2069 | ||
| 2026 | for (i = 0; i < ngroups; group++, i++) { | 2070 | for (i = 0; i < ngroups; group++, i++) { |
| 2027 | struct ext4_group_info *grp; | ||
| 2028 | struct ext4_group_desc *desc; | ||
| 2029 | |||
| 2030 | if (group == ngroups) | 2071 | if (group == ngroups) |
| 2031 | group = 0; | 2072 | group = 0; |
| 2032 | 2073 | ||
| 2033 | /* quick check to skip empty groups */ | 2074 | /* This now checks without needing the buddy page */ |
| 2034 | grp = ext4_get_group_info(sb, group); | 2075 | if (!ext4_mb_good_group(ac, group, cr)) |
| 2035 | if (grp->bb_free == 0) | ||
| 2036 | continue; | 2076 | continue; |
| 2037 | 2077 | ||
| 2038 | err = ext4_mb_load_buddy(sb, group, &e4b); | 2078 | err = ext4_mb_load_buddy(sb, group, &e4b); |
| @@ -2040,15 +2080,18 @@ repeat: | |||
| 2040 | goto out; | 2080 | goto out; |
| 2041 | 2081 | ||
| 2042 | ext4_lock_group(sb, group); | 2082 | ext4_lock_group(sb, group); |
| 2083 | |||
| 2084 | /* | ||
| 2085 | * We need to check again after locking the | ||
| 2086 | * block group | ||
| 2087 | */ | ||
| 2043 | if (!ext4_mb_good_group(ac, group, cr)) { | 2088 | if (!ext4_mb_good_group(ac, group, cr)) { |
| 2044 | /* someone did allocation from this group */ | ||
| 2045 | ext4_unlock_group(sb, group); | 2089 | ext4_unlock_group(sb, group); |
| 2046 | ext4_mb_release_desc(&e4b); | 2090 | ext4_mb_unload_buddy(&e4b); |
| 2047 | continue; | 2091 | continue; |
| 2048 | } | 2092 | } |
| 2049 | 2093 | ||
| 2050 | ac->ac_groups_scanned++; | 2094 | ac->ac_groups_scanned++; |
| 2051 | desc = ext4_get_group_desc(sb, group, NULL); | ||
| 2052 | if (cr == 0) | 2095 | if (cr == 0) |
| 2053 | ext4_mb_simple_scan_group(ac, &e4b); | 2096 | ext4_mb_simple_scan_group(ac, &e4b); |
| 2054 | else if (cr == 1 && | 2097 | else if (cr == 1 && |
| @@ -2058,7 +2101,7 @@ repeat: | |||
| 2058 | ext4_mb_complex_scan_group(ac, &e4b); | 2101 | ext4_mb_complex_scan_group(ac, &e4b); |
| 2059 | 2102 | ||
| 2060 | ext4_unlock_group(sb, group); | 2103 | ext4_unlock_group(sb, group); |
| 2061 | ext4_mb_release_desc(&e4b); | 2104 | ext4_mb_unload_buddy(&e4b); |
| 2062 | 2105 | ||
| 2063 | if (ac->ac_status != AC_STATUS_CONTINUE) | 2106 | if (ac->ac_status != AC_STATUS_CONTINUE) |
| 2064 | break; | 2107 | break; |
| @@ -2148,7 +2191,7 @@ static int ext4_mb_seq_groups_show(struct seq_file *seq, void *v) | |||
| 2148 | ext4_lock_group(sb, group); | 2191 | ext4_lock_group(sb, group); |
| 2149 | memcpy(&sg, ext4_get_group_info(sb, group), i); | 2192 | memcpy(&sg, ext4_get_group_info(sb, group), i); |
| 2150 | ext4_unlock_group(sb, group); | 2193 | ext4_unlock_group(sb, group); |
| 2151 | ext4_mb_release_desc(&e4b); | 2194 | ext4_mb_unload_buddy(&e4b); |
| 2152 | 2195 | ||
| 2153 | seq_printf(seq, "#%-5u: %-5u %-5u %-5u [", group, sg.info.bb_free, | 2196 | seq_printf(seq, "#%-5u: %-5u %-5u %-5u [", group, sg.info.bb_free, |
| 2154 | sg.info.bb_fragments, sg.info.bb_first_free); | 2197 | sg.info.bb_fragments, sg.info.bb_first_free); |
| @@ -2255,6 +2298,7 @@ int ext4_mb_add_groupinfo(struct super_block *sb, ext4_group_t group, | |||
| 2255 | INIT_LIST_HEAD(&meta_group_info[i]->bb_prealloc_list); | 2298 | INIT_LIST_HEAD(&meta_group_info[i]->bb_prealloc_list); |
| 2256 | init_rwsem(&meta_group_info[i]->alloc_sem); | 2299 | init_rwsem(&meta_group_info[i]->alloc_sem); |
| 2257 | meta_group_info[i]->bb_free_root = RB_ROOT; | 2300 | meta_group_info[i]->bb_free_root = RB_ROOT; |
| 2301 | meta_group_info[i]->bb_largest_free_order = -1; /* uninit */ | ||
| 2258 | 2302 | ||
| 2259 | #ifdef DOUBLE_CHECK | 2303 | #ifdef DOUBLE_CHECK |
| 2260 | { | 2304 | { |
| @@ -2536,6 +2580,7 @@ static void release_blocks_on_commit(journal_t *journal, transaction_t *txn) | |||
| 2536 | entry->count, entry->group, entry); | 2580 | entry->count, entry->group, entry); |
| 2537 | 2581 | ||
| 2538 | if (test_opt(sb, DISCARD)) { | 2582 | if (test_opt(sb, DISCARD)) { |
| 2583 | int ret; | ||
| 2539 | ext4_fsblk_t discard_block; | 2584 | ext4_fsblk_t discard_block; |
| 2540 | 2585 | ||
| 2541 | discard_block = entry->start_blk + | 2586 | discard_block = entry->start_blk + |
| @@ -2543,7 +2588,12 @@ static void release_blocks_on_commit(journal_t *journal, transaction_t *txn) | |||
| 2543 | trace_ext4_discard_blocks(sb, | 2588 | trace_ext4_discard_blocks(sb, |
| 2544 | (unsigned long long)discard_block, | 2589 | (unsigned long long)discard_block, |
| 2545 | entry->count); | 2590 | entry->count); |
| 2546 | sb_issue_discard(sb, discard_block, entry->count); | 2591 | ret = sb_issue_discard(sb, discard_block, entry->count); |
| 2592 | if (ret == EOPNOTSUPP) { | ||
| 2593 | ext4_warning(sb, | ||
| 2594 | "discard not supported, disabling"); | ||
| 2595 | clear_opt(EXT4_SB(sb)->s_mount_opt, DISCARD); | ||
| 2596 | } | ||
| 2547 | } | 2597 | } |
| 2548 | 2598 | ||
| 2549 | err = ext4_mb_load_buddy(sb, entry->group, &e4b); | 2599 | err = ext4_mb_load_buddy(sb, entry->group, &e4b); |
| @@ -2568,7 +2618,7 @@ static void release_blocks_on_commit(journal_t *journal, transaction_t *txn) | |||
| 2568 | } | 2618 | } |
| 2569 | ext4_unlock_group(sb, entry->group); | 2619 | ext4_unlock_group(sb, entry->group); |
| 2570 | kmem_cache_free(ext4_free_ext_cachep, entry); | 2620 | kmem_cache_free(ext4_free_ext_cachep, entry); |
| 2571 | ext4_mb_release_desc(&e4b); | 2621 | ext4_mb_unload_buddy(&e4b); |
| 2572 | } | 2622 | } |
| 2573 | 2623 | ||
| 2574 | mb_debug(1, "freed %u blocks in %u structures\n", count, count2); | 2624 | mb_debug(1, "freed %u blocks in %u structures\n", count, count2); |
| @@ -2641,7 +2691,7 @@ int __init init_ext4_mballoc(void) | |||
| 2641 | 2691 | ||
| 2642 | void exit_ext4_mballoc(void) | 2692 | void exit_ext4_mballoc(void) |
| 2643 | { | 2693 | { |
| 2644 | /* | 2694 | /* |
| 2645 | * Wait for completion of call_rcu()'s on ext4_pspace_cachep | 2695 | * Wait for completion of call_rcu()'s on ext4_pspace_cachep |
| 2646 | * before destroying the slab cache. | 2696 | * before destroying the slab cache. |
| 2647 | */ | 2697 | */ |
| @@ -2981,7 +3031,7 @@ static void ext4_mb_collect_stats(struct ext4_allocation_context *ac) | |||
| 2981 | if (sbi->s_mb_stats && ac->ac_g_ex.fe_len > 1) { | 3031 | if (sbi->s_mb_stats && ac->ac_g_ex.fe_len > 1) { |
| 2982 | atomic_inc(&sbi->s_bal_reqs); | 3032 | atomic_inc(&sbi->s_bal_reqs); |
| 2983 | atomic_add(ac->ac_b_ex.fe_len, &sbi->s_bal_allocated); | 3033 | atomic_add(ac->ac_b_ex.fe_len, &sbi->s_bal_allocated); |
| 2984 | if (ac->ac_o_ex.fe_len >= ac->ac_g_ex.fe_len) | 3034 | if (ac->ac_b_ex.fe_len >= ac->ac_o_ex.fe_len) |
| 2985 | atomic_inc(&sbi->s_bal_success); | 3035 | atomic_inc(&sbi->s_bal_success); |
| 2986 | atomic_add(ac->ac_found, &sbi->s_bal_ex_scanned); | 3036 | atomic_add(ac->ac_found, &sbi->s_bal_ex_scanned); |
| 2987 | if (ac->ac_g_ex.fe_start == ac->ac_b_ex.fe_start && | 3037 | if (ac->ac_g_ex.fe_start == ac->ac_b_ex.fe_start && |
| @@ -3123,7 +3173,7 @@ ext4_mb_use_preallocated(struct ext4_allocation_context *ac) | |||
| 3123 | continue; | 3173 | continue; |
| 3124 | 3174 | ||
| 3125 | /* non-extent files can't have physical blocks past 2^32 */ | 3175 | /* non-extent files can't have physical blocks past 2^32 */ |
| 3126 | if (!(EXT4_I(ac->ac_inode)->i_flags & EXT4_EXTENTS_FL) && | 3176 | if (!(ext4_test_inode_flag(ac->ac_inode, EXT4_INODE_EXTENTS)) && |
| 3127 | pa->pa_pstart + pa->pa_len > EXT4_MAX_BLOCK_FILE_PHYS) | 3177 | pa->pa_pstart + pa->pa_len > EXT4_MAX_BLOCK_FILE_PHYS) |
| 3128 | continue; | 3178 | continue; |
| 3129 | 3179 | ||
| @@ -3280,7 +3330,7 @@ static void ext4_mb_put_pa(struct ext4_allocation_context *ac, | |||
| 3280 | spin_unlock(&pa->pa_lock); | 3330 | spin_unlock(&pa->pa_lock); |
| 3281 | 3331 | ||
| 3282 | grp_blk = pa->pa_pstart; | 3332 | grp_blk = pa->pa_pstart; |
| 3283 | /* | 3333 | /* |
| 3284 | * If doing group-based preallocation, pa_pstart may be in the | 3334 | * If doing group-based preallocation, pa_pstart may be in the |
| 3285 | * next group when pa is used up | 3335 | * next group when pa is used up |
| 3286 | */ | 3336 | */ |
| @@ -3697,7 +3747,7 @@ out: | |||
| 3697 | ext4_unlock_group(sb, group); | 3747 | ext4_unlock_group(sb, group); |
| 3698 | if (ac) | 3748 | if (ac) |
| 3699 | kmem_cache_free(ext4_ac_cachep, ac); | 3749 | kmem_cache_free(ext4_ac_cachep, ac); |
| 3700 | ext4_mb_release_desc(&e4b); | 3750 | ext4_mb_unload_buddy(&e4b); |
| 3701 | put_bh(bitmap_bh); | 3751 | put_bh(bitmap_bh); |
| 3702 | return free; | 3752 | return free; |
| 3703 | } | 3753 | } |
| @@ -3801,7 +3851,7 @@ repeat: | |||
| 3801 | if (bitmap_bh == NULL) { | 3851 | if (bitmap_bh == NULL) { |
| 3802 | ext4_error(sb, "Error reading block bitmap for %u", | 3852 | ext4_error(sb, "Error reading block bitmap for %u", |
| 3803 | group); | 3853 | group); |
| 3804 | ext4_mb_release_desc(&e4b); | 3854 | ext4_mb_unload_buddy(&e4b); |
| 3805 | continue; | 3855 | continue; |
| 3806 | } | 3856 | } |
| 3807 | 3857 | ||
| @@ -3810,7 +3860,7 @@ repeat: | |||
| 3810 | ext4_mb_release_inode_pa(&e4b, bitmap_bh, pa, ac); | 3860 | ext4_mb_release_inode_pa(&e4b, bitmap_bh, pa, ac); |
| 3811 | ext4_unlock_group(sb, group); | 3861 | ext4_unlock_group(sb, group); |
| 3812 | 3862 | ||
| 3813 | ext4_mb_release_desc(&e4b); | 3863 | ext4_mb_unload_buddy(&e4b); |
| 3814 | put_bh(bitmap_bh); | 3864 | put_bh(bitmap_bh); |
| 3815 | 3865 | ||
| 3816 | list_del(&pa->u.pa_tmp_list); | 3866 | list_del(&pa->u.pa_tmp_list); |
| @@ -4074,7 +4124,7 @@ ext4_mb_discard_lg_preallocations(struct super_block *sb, | |||
| 4074 | ext4_mb_release_group_pa(&e4b, pa, ac); | 4124 | ext4_mb_release_group_pa(&e4b, pa, ac); |
| 4075 | ext4_unlock_group(sb, group); | 4125 | ext4_unlock_group(sb, group); |
| 4076 | 4126 | ||
| 4077 | ext4_mb_release_desc(&e4b); | 4127 | ext4_mb_unload_buddy(&e4b); |
| 4078 | list_del(&pa->u.pa_tmp_list); | 4128 | list_del(&pa->u.pa_tmp_list); |
| 4079 | call_rcu(&(pa)->u.pa_rcu, ext4_mb_pa_callback); | 4129 | call_rcu(&(pa)->u.pa_rcu, ext4_mb_pa_callback); |
| 4080 | } | 4130 | } |
| @@ -4484,12 +4534,12 @@ void ext4_free_blocks(handle_t *handle, struct inode *inode, | |||
| 4484 | if (!bh) | 4534 | if (!bh) |
| 4485 | tbh = sb_find_get_block(inode->i_sb, | 4535 | tbh = sb_find_get_block(inode->i_sb, |
| 4486 | block + i); | 4536 | block + i); |
| 4487 | ext4_forget(handle, flags & EXT4_FREE_BLOCKS_METADATA, | 4537 | ext4_forget(handle, flags & EXT4_FREE_BLOCKS_METADATA, |
| 4488 | inode, tbh, block + i); | 4538 | inode, tbh, block + i); |
| 4489 | } | 4539 | } |
| 4490 | } | 4540 | } |
| 4491 | 4541 | ||
| 4492 | /* | 4542 | /* |
| 4493 | * We need to make sure we don't reuse the freed block until | 4543 | * We need to make sure we don't reuse the freed block until |
| 4494 | * after the transaction is committed, which we can do by | 4544 | * after the transaction is committed, which we can do by |
| 4495 | * treating the block as metadata, below. We make an | 4545 | * treating the block as metadata, below. We make an |
| @@ -4610,7 +4660,7 @@ do_more: | |||
| 4610 | atomic_add(count, &sbi->s_flex_groups[flex_group].free_blocks); | 4660 | atomic_add(count, &sbi->s_flex_groups[flex_group].free_blocks); |
| 4611 | } | 4661 | } |
| 4612 | 4662 | ||
| 4613 | ext4_mb_release_desc(&e4b); | 4663 | ext4_mb_unload_buddy(&e4b); |
| 4614 | 4664 | ||
| 4615 | freed += count; | 4665 | freed += count; |
| 4616 | 4666 | ||
diff --git a/fs/ext4/migrate.c b/fs/ext4/migrate.c index 34dcfc52ef44..6f3a27ec30bf 100644 --- a/fs/ext4/migrate.c +++ b/fs/ext4/migrate.c | |||
| @@ -475,7 +475,7 @@ int ext4_ext_migrate(struct inode *inode) | |||
| 475 | */ | 475 | */ |
| 476 | if (!EXT4_HAS_INCOMPAT_FEATURE(inode->i_sb, | 476 | if (!EXT4_HAS_INCOMPAT_FEATURE(inode->i_sb, |
| 477 | EXT4_FEATURE_INCOMPAT_EXTENTS) || | 477 | EXT4_FEATURE_INCOMPAT_EXTENTS) || |
| 478 | (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL)) | 478 | (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) |
| 479 | return -EINVAL; | 479 | return -EINVAL; |
| 480 | 480 | ||
| 481 | if (S_ISLNK(inode->i_mode) && inode->i_blocks == 0) | 481 | if (S_ISLNK(inode->i_mode) && inode->i_blocks == 0) |
diff --git a/fs/ext4/move_extent.c b/fs/ext4/move_extent.c index d1fc662cc311..3a6c92ac131c 100644 --- a/fs/ext4/move_extent.c +++ b/fs/ext4/move_extent.c | |||
| @@ -482,6 +482,7 @@ mext_leaf_block(handle_t *handle, struct inode *orig_inode, | |||
| 482 | int depth = ext_depth(orig_inode); | 482 | int depth = ext_depth(orig_inode); |
| 483 | int ret; | 483 | int ret; |
| 484 | 484 | ||
| 485 | start_ext.ee_block = end_ext.ee_block = 0; | ||
| 485 | o_start = o_end = oext = orig_path[depth].p_ext; | 486 | o_start = o_end = oext = orig_path[depth].p_ext; |
| 486 | oext_alen = ext4_ext_get_actual_len(oext); | 487 | oext_alen = ext4_ext_get_actual_len(oext); |
| 487 | start_ext.ee_len = end_ext.ee_len = 0; | 488 | start_ext.ee_len = end_ext.ee_len = 0; |
| @@ -529,7 +530,7 @@ mext_leaf_block(handle_t *handle, struct inode *orig_inode, | |||
| 529 | * new_ext |-------| | 530 | * new_ext |-------| |
| 530 | */ | 531 | */ |
| 531 | if (le32_to_cpu(oext->ee_block) + oext_alen - 1 < new_ext_end) { | 532 | if (le32_to_cpu(oext->ee_block) + oext_alen - 1 < new_ext_end) { |
| 532 | ext4_error(orig_inode->i_sb, | 533 | EXT4_ERROR_INODE(orig_inode, |
| 533 | "new_ext_end(%u) should be less than or equal to " | 534 | "new_ext_end(%u) should be less than or equal to " |
| 534 | "oext->ee_block(%u) + oext_alen(%d) - 1", | 535 | "oext->ee_block(%u) + oext_alen(%d) - 1", |
| 535 | new_ext_end, le32_to_cpu(oext->ee_block), | 536 | new_ext_end, le32_to_cpu(oext->ee_block), |
| @@ -692,12 +693,12 @@ mext_replace_branches(handle_t *handle, struct inode *orig_inode, | |||
| 692 | while (1) { | 693 | while (1) { |
| 693 | /* The extent for donor must be found. */ | 694 | /* The extent for donor must be found. */ |
| 694 | if (!dext) { | 695 | if (!dext) { |
| 695 | ext4_error(donor_inode->i_sb, | 696 | EXT4_ERROR_INODE(donor_inode, |
| 696 | "The extent for donor must be found"); | 697 | "The extent for donor must be found"); |
| 697 | *err = -EIO; | 698 | *err = -EIO; |
| 698 | goto out; | 699 | goto out; |
| 699 | } else if (donor_off != le32_to_cpu(tmp_dext.ee_block)) { | 700 | } else if (donor_off != le32_to_cpu(tmp_dext.ee_block)) { |
| 700 | ext4_error(donor_inode->i_sb, | 701 | EXT4_ERROR_INODE(donor_inode, |
| 701 | "Donor offset(%u) and the first block of donor " | 702 | "Donor offset(%u) and the first block of donor " |
| 702 | "extent(%u) should be equal", | 703 | "extent(%u) should be equal", |
| 703 | donor_off, | 704 | donor_off, |
| @@ -976,11 +977,11 @@ mext_check_arguments(struct inode *orig_inode, | |||
| 976 | } | 977 | } |
| 977 | 978 | ||
| 978 | /* Ext4 move extent supports only extent based file */ | 979 | /* Ext4 move extent supports only extent based file */ |
| 979 | if (!(EXT4_I(orig_inode)->i_flags & EXT4_EXTENTS_FL)) { | 980 | if (!(ext4_test_inode_flag(orig_inode, EXT4_INODE_EXTENTS))) { |
| 980 | ext4_debug("ext4 move extent: orig file is not extents " | 981 | ext4_debug("ext4 move extent: orig file is not extents " |
| 981 | "based file [ino:orig %lu]\n", orig_inode->i_ino); | 982 | "based file [ino:orig %lu]\n", orig_inode->i_ino); |
| 982 | return -EOPNOTSUPP; | 983 | return -EOPNOTSUPP; |
| 983 | } else if (!(EXT4_I(donor_inode)->i_flags & EXT4_EXTENTS_FL)) { | 984 | } else if (!(ext4_test_inode_flag(donor_inode, EXT4_INODE_EXTENTS))) { |
| 984 | ext4_debug("ext4 move extent: donor file is not extents " | 985 | ext4_debug("ext4 move extent: donor file is not extents " |
| 985 | "based file [ino:donor %lu]\n", donor_inode->i_ino); | 986 | "based file [ino:donor %lu]\n", donor_inode->i_ino); |
| 986 | return -EOPNOTSUPP; | 987 | return -EOPNOTSUPP; |
| @@ -1354,7 +1355,7 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, | |||
| 1354 | if (ret1 < 0) | 1355 | if (ret1 < 0) |
| 1355 | break; | 1356 | break; |
| 1356 | if (*moved_len > len) { | 1357 | if (*moved_len > len) { |
| 1357 | ext4_error(orig_inode->i_sb, | 1358 | EXT4_ERROR_INODE(orig_inode, |
| 1358 | "We replaced blocks too much! " | 1359 | "We replaced blocks too much! " |
| 1359 | "sum of replaced: %llu requested: %llu", | 1360 | "sum of replaced: %llu requested: %llu", |
| 1360 | *moved_len, len); | 1361 | *moved_len, len); |
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index 0c070fabd108..a43e6617b351 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c | |||
| @@ -187,7 +187,7 @@ unsigned int ext4_rec_len_from_disk(__le16 dlen, unsigned blocksize) | |||
| 187 | return blocksize; | 187 | return blocksize; |
| 188 | return (len & 65532) | ((len & 3) << 16); | 188 | return (len & 65532) | ((len & 3) << 16); |
| 189 | } | 189 | } |
| 190 | 190 | ||
| 191 | __le16 ext4_rec_len_to_disk(unsigned len, unsigned blocksize) | 191 | __le16 ext4_rec_len_to_disk(unsigned len, unsigned blocksize) |
| 192 | { | 192 | { |
| 193 | if ((len > blocksize) || (blocksize > (1 << 18)) || (len & 3)) | 193 | if ((len > blocksize) || (blocksize > (1 << 18)) || (len & 3)) |
| @@ -197,7 +197,7 @@ __le16 ext4_rec_len_to_disk(unsigned len, unsigned blocksize) | |||
| 197 | if (len == blocksize) { | 197 | if (len == blocksize) { |
| 198 | if (blocksize == 65536) | 198 | if (blocksize == 65536) |
| 199 | return cpu_to_le16(EXT4_MAX_REC_LEN); | 199 | return cpu_to_le16(EXT4_MAX_REC_LEN); |
| 200 | else | 200 | else |
| 201 | return cpu_to_le16(0); | 201 | return cpu_to_le16(0); |
| 202 | } | 202 | } |
| 203 | return cpu_to_le16((len & 65532) | ((len >> 16) & 3)); | 203 | return cpu_to_le16((len & 65532) | ((len >> 16) & 3)); |
| @@ -349,7 +349,7 @@ struct stats dx_show_entries(struct dx_hash_info *hinfo, struct inode *dir, | |||
| 349 | brelse(bh); | 349 | brelse(bh); |
| 350 | } | 350 | } |
| 351 | if (bcount) | 351 | if (bcount) |
| 352 | printk(KERN_DEBUG "%snames %u, fullness %u (%u%%)\n", | 352 | printk(KERN_DEBUG "%snames %u, fullness %u (%u%%)\n", |
| 353 | levels ? "" : " ", names, space/bcount, | 353 | levels ? "" : " ", names, space/bcount, |
| 354 | (space/bcount)*100/blocksize); | 354 | (space/bcount)*100/blocksize); |
| 355 | return (struct stats) { names, space, bcount}; | 355 | return (struct stats) { names, space, bcount}; |
| @@ -653,10 +653,10 @@ int ext4_htree_fill_tree(struct file *dir_file, __u32 start_hash, | |||
| 653 | int ret, err; | 653 | int ret, err; |
| 654 | __u32 hashval; | 654 | __u32 hashval; |
| 655 | 655 | ||
| 656 | dxtrace(printk(KERN_DEBUG "In htree_fill_tree, start hash: %x:%x\n", | 656 | dxtrace(printk(KERN_DEBUG "In htree_fill_tree, start hash: %x:%x\n", |
| 657 | start_hash, start_minor_hash)); | 657 | start_hash, start_minor_hash)); |
| 658 | dir = dir_file->f_path.dentry->d_inode; | 658 | dir = dir_file->f_path.dentry->d_inode; |
| 659 | if (!(EXT4_I(dir)->i_flags & EXT4_INDEX_FL)) { | 659 | if (!(ext4_test_inode_flag(dir, EXT4_INODE_INDEX))) { |
| 660 | hinfo.hash_version = EXT4_SB(dir->i_sb)->s_def_hash_version; | 660 | hinfo.hash_version = EXT4_SB(dir->i_sb)->s_def_hash_version; |
| 661 | if (hinfo.hash_version <= DX_HASH_TEA) | 661 | if (hinfo.hash_version <= DX_HASH_TEA) |
| 662 | hinfo.hash_version += | 662 | hinfo.hash_version += |
| @@ -801,7 +801,7 @@ static void ext4_update_dx_flag(struct inode *inode) | |||
| 801 | { | 801 | { |
| 802 | if (!EXT4_HAS_COMPAT_FEATURE(inode->i_sb, | 802 | if (!EXT4_HAS_COMPAT_FEATURE(inode->i_sb, |
| 803 | EXT4_FEATURE_COMPAT_DIR_INDEX)) | 803 | EXT4_FEATURE_COMPAT_DIR_INDEX)) |
| 804 | EXT4_I(inode)->i_flags &= ~EXT4_INDEX_FL; | 804 | ext4_clear_inode_flag(inode, EXT4_INODE_INDEX); |
| 805 | } | 805 | } |
| 806 | 806 | ||
| 807 | /* | 807 | /* |
| @@ -943,8 +943,8 @@ restart: | |||
| 943 | wait_on_buffer(bh); | 943 | wait_on_buffer(bh); |
| 944 | if (!buffer_uptodate(bh)) { | 944 | if (!buffer_uptodate(bh)) { |
| 945 | /* read error, skip block & hope for the best */ | 945 | /* read error, skip block & hope for the best */ |
| 946 | ext4_error(sb, "reading directory #%lu offset %lu", | 946 | EXT4_ERROR_INODE(dir, "reading directory lblock %lu", |
| 947 | dir->i_ino, (unsigned long)block); | 947 | (unsigned long) block); |
| 948 | brelse(bh); | 948 | brelse(bh); |
| 949 | goto next; | 949 | goto next; |
| 950 | } | 950 | } |
| @@ -1066,15 +1066,15 @@ static struct dentry *ext4_lookup(struct inode *dir, struct dentry *dentry, stru | |||
| 1066 | __u32 ino = le32_to_cpu(de->inode); | 1066 | __u32 ino = le32_to_cpu(de->inode); |
| 1067 | brelse(bh); | 1067 | brelse(bh); |
| 1068 | if (!ext4_valid_inum(dir->i_sb, ino)) { | 1068 | if (!ext4_valid_inum(dir->i_sb, ino)) { |
| 1069 | ext4_error(dir->i_sb, "bad inode number: %u", ino); | 1069 | EXT4_ERROR_INODE(dir, "bad inode number: %u", ino); |
| 1070 | return ERR_PTR(-EIO); | 1070 | return ERR_PTR(-EIO); |
| 1071 | } | 1071 | } |
| 1072 | inode = ext4_iget(dir->i_sb, ino); | 1072 | inode = ext4_iget(dir->i_sb, ino); |
| 1073 | if (unlikely(IS_ERR(inode))) { | 1073 | if (unlikely(IS_ERR(inode))) { |
| 1074 | if (PTR_ERR(inode) == -ESTALE) { | 1074 | if (PTR_ERR(inode) == -ESTALE) { |
| 1075 | ext4_error(dir->i_sb, | 1075 | EXT4_ERROR_INODE(dir, |
| 1076 | "deleted inode referenced: %u", | 1076 | "deleted inode referenced: %u", |
| 1077 | ino); | 1077 | ino); |
| 1078 | return ERR_PTR(-EIO); | 1078 | return ERR_PTR(-EIO); |
| 1079 | } else { | 1079 | } else { |
| 1080 | return ERR_CAST(inode); | 1080 | return ERR_CAST(inode); |
| @@ -1104,8 +1104,8 @@ struct dentry *ext4_get_parent(struct dentry *child) | |||
| 1104 | brelse(bh); | 1104 | brelse(bh); |
| 1105 | 1105 | ||
| 1106 | if (!ext4_valid_inum(child->d_inode->i_sb, ino)) { | 1106 | if (!ext4_valid_inum(child->d_inode->i_sb, ino)) { |
| 1107 | ext4_error(child->d_inode->i_sb, | 1107 | EXT4_ERROR_INODE(child->d_inode, |
| 1108 | "bad inode number: %u", ino); | 1108 | "bad parent inode number: %u", ino); |
| 1109 | return ERR_PTR(-EIO); | 1109 | return ERR_PTR(-EIO); |
| 1110 | } | 1110 | } |
| 1111 | 1111 | ||
| @@ -1141,7 +1141,7 @@ dx_move_dirents(char *from, char *to, struct dx_map_entry *map, int count, | |||
| 1141 | unsigned rec_len = 0; | 1141 | unsigned rec_len = 0; |
| 1142 | 1142 | ||
| 1143 | while (count--) { | 1143 | while (count--) { |
| 1144 | struct ext4_dir_entry_2 *de = (struct ext4_dir_entry_2 *) | 1144 | struct ext4_dir_entry_2 *de = (struct ext4_dir_entry_2 *) |
| 1145 | (from + (map->offs<<2)); | 1145 | (from + (map->offs<<2)); |
| 1146 | rec_len = EXT4_DIR_REC_LEN(de->name_len); | 1146 | rec_len = EXT4_DIR_REC_LEN(de->name_len); |
| 1147 | memcpy (to, de, rec_len); | 1147 | memcpy (to, de, rec_len); |
| @@ -1404,9 +1404,7 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry, | |||
| 1404 | de = (struct ext4_dir_entry_2 *)((char *)fde + | 1404 | de = (struct ext4_dir_entry_2 *)((char *)fde + |
| 1405 | ext4_rec_len_from_disk(fde->rec_len, blocksize)); | 1405 | ext4_rec_len_from_disk(fde->rec_len, blocksize)); |
| 1406 | if ((char *) de >= (((char *) root) + blocksize)) { | 1406 | if ((char *) de >= (((char *) root) + blocksize)) { |
| 1407 | ext4_error(dir->i_sb, | 1407 | EXT4_ERROR_INODE(dir, "invalid rec_len for '..'"); |
| 1408 | "invalid rec_len for '..' in inode %lu", | ||
| 1409 | dir->i_ino); | ||
| 1410 | brelse(bh); | 1408 | brelse(bh); |
| 1411 | return -EIO; | 1409 | return -EIO; |
| 1412 | } | 1410 | } |
| @@ -1418,7 +1416,7 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry, | |||
| 1418 | brelse(bh); | 1416 | brelse(bh); |
| 1419 | return retval; | 1417 | return retval; |
| 1420 | } | 1418 | } |
| 1421 | EXT4_I(dir)->i_flags |= EXT4_INDEX_FL; | 1419 | ext4_set_inode_flag(dir, EXT4_INODE_INDEX); |
| 1422 | data1 = bh2->b_data; | 1420 | data1 = bh2->b_data; |
| 1423 | 1421 | ||
| 1424 | memcpy (data1, de, len); | 1422 | memcpy (data1, de, len); |
| @@ -1491,7 +1489,7 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry, | |||
| 1491 | retval = ext4_dx_add_entry(handle, dentry, inode); | 1489 | retval = ext4_dx_add_entry(handle, dentry, inode); |
| 1492 | if (!retval || (retval != ERR_BAD_DX_DIR)) | 1490 | if (!retval || (retval != ERR_BAD_DX_DIR)) |
| 1493 | return retval; | 1491 | return retval; |
| 1494 | EXT4_I(dir)->i_flags &= ~EXT4_INDEX_FL; | 1492 | ext4_clear_inode_flag(dir, EXT4_INODE_INDEX); |
| 1495 | dx_fallback++; | 1493 | dx_fallback++; |
| 1496 | ext4_mark_inode_dirty(handle, dir); | 1494 | ext4_mark_inode_dirty(handle, dir); |
| 1497 | } | 1495 | } |
| @@ -1519,6 +1517,8 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry, | |||
| 1519 | de->rec_len = ext4_rec_len_to_disk(blocksize, blocksize); | 1517 | de->rec_len = ext4_rec_len_to_disk(blocksize, blocksize); |
| 1520 | retval = add_dirent_to_buf(handle, dentry, inode, de, bh); | 1518 | retval = add_dirent_to_buf(handle, dentry, inode, de, bh); |
| 1521 | brelse(bh); | 1519 | brelse(bh); |
| 1520 | if (retval == 0) | ||
| 1521 | ext4_set_inode_state(inode, EXT4_STATE_NEWENTRY); | ||
| 1522 | return retval; | 1522 | return retval; |
| 1523 | } | 1523 | } |
| 1524 | 1524 | ||
| @@ -1915,9 +1915,8 @@ static int empty_dir(struct inode *inode) | |||
| 1915 | if (inode->i_size < EXT4_DIR_REC_LEN(1) + EXT4_DIR_REC_LEN(2) || | 1915 | if (inode->i_size < EXT4_DIR_REC_LEN(1) + EXT4_DIR_REC_LEN(2) || |
| 1916 | !(bh = ext4_bread(NULL, inode, 0, 0, &err))) { | 1916 | !(bh = ext4_bread(NULL, inode, 0, 0, &err))) { |
| 1917 | if (err) | 1917 | if (err) |
| 1918 | ext4_error(inode->i_sb, | 1918 | EXT4_ERROR_INODE(inode, |
| 1919 | "error %d reading directory #%lu offset 0", | 1919 | "error %d reading directory lblock 0", err); |
| 1920 | err, inode->i_ino); | ||
| 1921 | else | 1920 | else |
| 1922 | ext4_warning(inode->i_sb, | 1921 | ext4_warning(inode->i_sb, |
| 1923 | "bad directory (dir #%lu) - no data block", | 1922 | "bad directory (dir #%lu) - no data block", |
| @@ -1941,17 +1940,17 @@ static int empty_dir(struct inode *inode) | |||
| 1941 | de = ext4_next_entry(de1, sb->s_blocksize); | 1940 | de = ext4_next_entry(de1, sb->s_blocksize); |
| 1942 | while (offset < inode->i_size) { | 1941 | while (offset < inode->i_size) { |
| 1943 | if (!bh || | 1942 | if (!bh || |
| 1944 | (void *) de >= (void *) (bh->b_data+sb->s_blocksize)) { | 1943 | (void *) de >= (void *) (bh->b_data+sb->s_blocksize)) { |
| 1944 | unsigned int lblock; | ||
| 1945 | err = 0; | 1945 | err = 0; |
| 1946 | brelse(bh); | 1946 | brelse(bh); |
| 1947 | bh = ext4_bread(NULL, inode, | 1947 | lblock = offset >> EXT4_BLOCK_SIZE_BITS(sb); |
| 1948 | offset >> EXT4_BLOCK_SIZE_BITS(sb), 0, &err); | 1948 | bh = ext4_bread(NULL, inode, lblock, 0, &err); |
| 1949 | if (!bh) { | 1949 | if (!bh) { |
| 1950 | if (err) | 1950 | if (err) |
| 1951 | ext4_error(sb, | 1951 | EXT4_ERROR_INODE(inode, |
| 1952 | "error %d reading directory" | 1952 | "error %d reading directory " |
| 1953 | " #%lu offset %u", | 1953 | "lblock %u", err, lblock); |
| 1954 | err, inode->i_ino, offset); | ||
| 1955 | offset += sb->s_blocksize; | 1954 | offset += sb->s_blocksize; |
| 1956 | continue; | 1955 | continue; |
| 1957 | } | 1956 | } |
| @@ -2297,7 +2296,7 @@ retry: | |||
| 2297 | } | 2296 | } |
| 2298 | } else { | 2297 | } else { |
| 2299 | /* clear the extent format for fast symlink */ | 2298 | /* clear the extent format for fast symlink */ |
| 2300 | EXT4_I(inode)->i_flags &= ~EXT4_EXTENTS_FL; | 2299 | ext4_clear_inode_flag(inode, EXT4_INODE_EXTENTS); |
| 2301 | inode->i_op = &ext4_fast_symlink_inode_operations; | 2300 | inode->i_op = &ext4_fast_symlink_inode_operations; |
| 2302 | memcpy((char *)&EXT4_I(inode)->i_data, symname, l); | 2301 | memcpy((char *)&EXT4_I(inode)->i_data, symname, l); |
| 2303 | inode->i_size = l-1; | 2302 | inode->i_size = l-1; |
diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c index 5692c48754a0..6df797eb9aeb 100644 --- a/fs/ext4/resize.c +++ b/fs/ext4/resize.c | |||
| @@ -911,7 +911,8 @@ int ext4_group_add(struct super_block *sb, struct ext4_new_group_data *input) | |||
| 911 | percpu_counter_add(&sbi->s_freeinodes_counter, | 911 | percpu_counter_add(&sbi->s_freeinodes_counter, |
| 912 | EXT4_INODES_PER_GROUP(sb)); | 912 | EXT4_INODES_PER_GROUP(sb)); |
| 913 | 913 | ||
| 914 | if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_FLEX_BG)) { | 914 | if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_FLEX_BG) && |
| 915 | sbi->s_log_groups_per_flex) { | ||
| 915 | ext4_group_t flex_group; | 916 | ext4_group_t flex_group; |
| 916 | flex_group = ext4_flex_group(sbi, input->group); | 917 | flex_group = ext4_flex_group(sbi, input->group); |
| 917 | atomic_add(input->free_blocks_count, | 918 | atomic_add(input->free_blocks_count, |
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index e14d22c170d5..49d88c0597c4 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
| @@ -241,6 +241,7 @@ handle_t *ext4_journal_start_sb(struct super_block *sb, int nblocks) | |||
| 241 | if (sb->s_flags & MS_RDONLY) | 241 | if (sb->s_flags & MS_RDONLY) |
| 242 | return ERR_PTR(-EROFS); | 242 | return ERR_PTR(-EROFS); |
| 243 | 243 | ||
| 244 | vfs_check_frozen(sb, SB_FREEZE_WRITE); | ||
| 244 | /* Special case here: if the journal has aborted behind our | 245 | /* Special case here: if the journal has aborted behind our |
| 245 | * backs (eg. EIO in the commit thread), then we still need to | 246 | * backs (eg. EIO in the commit thread), then we still need to |
| 246 | * take the FS itself readonly cleanly. */ | 247 | * take the FS itself readonly cleanly. */ |
| @@ -941,6 +942,8 @@ static int ext4_show_options(struct seq_file *seq, struct vfsmount *vfs) | |||
| 941 | seq_puts(seq, test_opt(sb, BARRIER) ? "1" : "0"); | 942 | seq_puts(seq, test_opt(sb, BARRIER) ? "1" : "0"); |
| 942 | if (test_opt(sb, JOURNAL_ASYNC_COMMIT)) | 943 | if (test_opt(sb, JOURNAL_ASYNC_COMMIT)) |
| 943 | seq_puts(seq, ",journal_async_commit"); | 944 | seq_puts(seq, ",journal_async_commit"); |
| 945 | else if (test_opt(sb, JOURNAL_CHECKSUM)) | ||
| 946 | seq_puts(seq, ",journal_checksum"); | ||
| 944 | if (test_opt(sb, NOBH)) | 947 | if (test_opt(sb, NOBH)) |
| 945 | seq_puts(seq, ",nobh"); | 948 | seq_puts(seq, ",nobh"); |
| 946 | if (test_opt(sb, I_VERSION)) | 949 | if (test_opt(sb, I_VERSION)) |
| @@ -2213,7 +2216,7 @@ static unsigned long ext4_get_stripe_size(struct ext4_sb_info *sbi) | |||
| 2213 | struct ext4_attr { | 2216 | struct ext4_attr { |
| 2214 | struct attribute attr; | 2217 | struct attribute attr; |
| 2215 | ssize_t (*show)(struct ext4_attr *, struct ext4_sb_info *, char *); | 2218 | ssize_t (*show)(struct ext4_attr *, struct ext4_sb_info *, char *); |
| 2216 | ssize_t (*store)(struct ext4_attr *, struct ext4_sb_info *, | 2219 | ssize_t (*store)(struct ext4_attr *, struct ext4_sb_info *, |
| 2217 | const char *, size_t); | 2220 | const char *, size_t); |
| 2218 | int offset; | 2221 | int offset; |
| 2219 | }; | 2222 | }; |
| @@ -2430,6 +2433,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
| 2430 | __releases(kernel_lock) | 2433 | __releases(kernel_lock) |
| 2431 | __acquires(kernel_lock) | 2434 | __acquires(kernel_lock) |
| 2432 | { | 2435 | { |
| 2436 | char *orig_data = kstrdup(data, GFP_KERNEL); | ||
| 2433 | struct buffer_head *bh; | 2437 | struct buffer_head *bh; |
| 2434 | struct ext4_super_block *es = NULL; | 2438 | struct ext4_super_block *es = NULL; |
| 2435 | struct ext4_sb_info *sbi; | 2439 | struct ext4_sb_info *sbi; |
| @@ -2793,24 +2797,6 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
| 2793 | get_random_bytes(&sbi->s_next_generation, sizeof(u32)); | 2797 | get_random_bytes(&sbi->s_next_generation, sizeof(u32)); |
| 2794 | spin_lock_init(&sbi->s_next_gen_lock); | 2798 | spin_lock_init(&sbi->s_next_gen_lock); |
| 2795 | 2799 | ||
| 2796 | err = percpu_counter_init(&sbi->s_freeblocks_counter, | ||
| 2797 | ext4_count_free_blocks(sb)); | ||
| 2798 | if (!err) { | ||
| 2799 | err = percpu_counter_init(&sbi->s_freeinodes_counter, | ||
| 2800 | ext4_count_free_inodes(sb)); | ||
| 2801 | } | ||
| 2802 | if (!err) { | ||
| 2803 | err = percpu_counter_init(&sbi->s_dirs_counter, | ||
| 2804 | ext4_count_dirs(sb)); | ||
| 2805 | } | ||
| 2806 | if (!err) { | ||
| 2807 | err = percpu_counter_init(&sbi->s_dirtyblocks_counter, 0); | ||
| 2808 | } | ||
| 2809 | if (err) { | ||
| 2810 | ext4_msg(sb, KERN_ERR, "insufficient memory"); | ||
| 2811 | goto failed_mount3; | ||
| 2812 | } | ||
| 2813 | |||
| 2814 | sbi->s_stripe = ext4_get_stripe_size(sbi); | 2800 | sbi->s_stripe = ext4_get_stripe_size(sbi); |
| 2815 | sbi->s_max_writeback_mb_bump = 128; | 2801 | sbi->s_max_writeback_mb_bump = 128; |
| 2816 | 2802 | ||
| @@ -2910,6 +2896,20 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
| 2910 | set_task_ioprio(sbi->s_journal->j_task, journal_ioprio); | 2896 | set_task_ioprio(sbi->s_journal->j_task, journal_ioprio); |
| 2911 | 2897 | ||
| 2912 | no_journal: | 2898 | no_journal: |
| 2899 | err = percpu_counter_init(&sbi->s_freeblocks_counter, | ||
| 2900 | ext4_count_free_blocks(sb)); | ||
| 2901 | if (!err) | ||
| 2902 | err = percpu_counter_init(&sbi->s_freeinodes_counter, | ||
| 2903 | ext4_count_free_inodes(sb)); | ||
| 2904 | if (!err) | ||
| 2905 | err = percpu_counter_init(&sbi->s_dirs_counter, | ||
| 2906 | ext4_count_dirs(sb)); | ||
| 2907 | if (!err) | ||
| 2908 | err = percpu_counter_init(&sbi->s_dirtyblocks_counter, 0); | ||
| 2909 | if (err) { | ||
| 2910 | ext4_msg(sb, KERN_ERR, "insufficient memory"); | ||
| 2911 | goto failed_mount_wq; | ||
| 2912 | } | ||
| 2913 | if (test_opt(sb, NOBH)) { | 2913 | if (test_opt(sb, NOBH)) { |
| 2914 | if (!(test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_WRITEBACK_DATA)) { | 2914 | if (!(test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_WRITEBACK_DATA)) { |
| 2915 | ext4_msg(sb, KERN_WARNING, "Ignoring nobh option - " | 2915 | ext4_msg(sb, KERN_WARNING, "Ignoring nobh option - " |
| @@ -3001,7 +3001,7 @@ no_journal: | |||
| 3001 | err = ext4_setup_system_zone(sb); | 3001 | err = ext4_setup_system_zone(sb); |
| 3002 | if (err) { | 3002 | if (err) { |
| 3003 | ext4_msg(sb, KERN_ERR, "failed to initialize system " | 3003 | ext4_msg(sb, KERN_ERR, "failed to initialize system " |
| 3004 | "zone (%d)\n", err); | 3004 | "zone (%d)", err); |
| 3005 | goto failed_mount4; | 3005 | goto failed_mount4; |
| 3006 | } | 3006 | } |
| 3007 | 3007 | ||
| @@ -3040,9 +3040,11 @@ no_journal: | |||
| 3040 | } else | 3040 | } else |
| 3041 | descr = "out journal"; | 3041 | descr = "out journal"; |
| 3042 | 3042 | ||
| 3043 | ext4_msg(sb, KERN_INFO, "mounted filesystem with%s", descr); | 3043 | ext4_msg(sb, KERN_INFO, "mounted filesystem with%s. " |
| 3044 | "Opts: %s", descr, orig_data); | ||
| 3044 | 3045 | ||
| 3045 | lock_kernel(); | 3046 | lock_kernel(); |
| 3047 | kfree(orig_data); | ||
| 3046 | return 0; | 3048 | return 0; |
| 3047 | 3049 | ||
| 3048 | cantfind_ext4: | 3050 | cantfind_ext4: |
| @@ -3059,6 +3061,10 @@ failed_mount_wq: | |||
| 3059 | jbd2_journal_destroy(sbi->s_journal); | 3061 | jbd2_journal_destroy(sbi->s_journal); |
| 3060 | sbi->s_journal = NULL; | 3062 | sbi->s_journal = NULL; |
| 3061 | } | 3063 | } |
| 3064 | percpu_counter_destroy(&sbi->s_freeblocks_counter); | ||
| 3065 | percpu_counter_destroy(&sbi->s_freeinodes_counter); | ||
| 3066 | percpu_counter_destroy(&sbi->s_dirs_counter); | ||
| 3067 | percpu_counter_destroy(&sbi->s_dirtyblocks_counter); | ||
| 3062 | failed_mount3: | 3068 | failed_mount3: |
| 3063 | if (sbi->s_flex_groups) { | 3069 | if (sbi->s_flex_groups) { |
| 3064 | if (is_vmalloc_addr(sbi->s_flex_groups)) | 3070 | if (is_vmalloc_addr(sbi->s_flex_groups)) |
| @@ -3066,10 +3072,6 @@ failed_mount3: | |||
| 3066 | else | 3072 | else |
| 3067 | kfree(sbi->s_flex_groups); | 3073 | kfree(sbi->s_flex_groups); |
| 3068 | } | 3074 | } |
| 3069 | percpu_counter_destroy(&sbi->s_freeblocks_counter); | ||
| 3070 | percpu_counter_destroy(&sbi->s_freeinodes_counter); | ||
| 3071 | percpu_counter_destroy(&sbi->s_dirs_counter); | ||
| 3072 | percpu_counter_destroy(&sbi->s_dirtyblocks_counter); | ||
| 3073 | failed_mount2: | 3075 | failed_mount2: |
| 3074 | for (i = 0; i < db_count; i++) | 3076 | for (i = 0; i < db_count; i++) |
| 3075 | brelse(sbi->s_group_desc[i]); | 3077 | brelse(sbi->s_group_desc[i]); |
| @@ -3089,6 +3091,7 @@ out_fail: | |||
| 3089 | kfree(sbi->s_blockgroup_lock); | 3091 | kfree(sbi->s_blockgroup_lock); |
| 3090 | kfree(sbi); | 3092 | kfree(sbi); |
| 3091 | lock_kernel(); | 3093 | lock_kernel(); |
| 3094 | kfree(orig_data); | ||
| 3092 | return ret; | 3095 | return ret; |
| 3093 | } | 3096 | } |
| 3094 | 3097 | ||
| @@ -3380,7 +3383,7 @@ static int ext4_commit_super(struct super_block *sb, int sync) | |||
| 3380 | if (!(sb->s_flags & MS_RDONLY)) | 3383 | if (!(sb->s_flags & MS_RDONLY)) |
| 3381 | es->s_wtime = cpu_to_le32(get_seconds()); | 3384 | es->s_wtime = cpu_to_le32(get_seconds()); |
| 3382 | es->s_kbytes_written = | 3385 | es->s_kbytes_written = |
| 3383 | cpu_to_le64(EXT4_SB(sb)->s_kbytes_written + | 3386 | cpu_to_le64(EXT4_SB(sb)->s_kbytes_written + |
| 3384 | ((part_stat_read(sb->s_bdev->bd_part, sectors[1]) - | 3387 | ((part_stat_read(sb->s_bdev->bd_part, sectors[1]) - |
| 3385 | EXT4_SB(sb)->s_sectors_written_start) >> 1)); | 3388 | EXT4_SB(sb)->s_sectors_written_start) >> 1)); |
| 3386 | ext4_free_blocks_count_set(es, percpu_counter_sum_positive( | 3389 | ext4_free_blocks_count_set(es, percpu_counter_sum_positive( |
| @@ -3485,8 +3488,10 @@ int ext4_force_commit(struct super_block *sb) | |||
| 3485 | return 0; | 3488 | return 0; |
| 3486 | 3489 | ||
| 3487 | journal = EXT4_SB(sb)->s_journal; | 3490 | journal = EXT4_SB(sb)->s_journal; |
| 3488 | if (journal) | 3491 | if (journal) { |
| 3492 | vfs_check_frozen(sb, SB_FREEZE_WRITE); | ||
| 3489 | ret = ext4_journal_force_commit(journal); | 3493 | ret = ext4_journal_force_commit(journal); |
| 3494 | } | ||
| 3490 | 3495 | ||
| 3491 | return ret; | 3496 | return ret; |
| 3492 | } | 3497 | } |
| @@ -3535,18 +3540,16 @@ static int ext4_freeze(struct super_block *sb) | |||
| 3535 | * the journal. | 3540 | * the journal. |
| 3536 | */ | 3541 | */ |
| 3537 | error = jbd2_journal_flush(journal); | 3542 | error = jbd2_journal_flush(journal); |
| 3538 | if (error < 0) { | 3543 | if (error < 0) |
| 3539 | out: | 3544 | goto out; |
| 3540 | jbd2_journal_unlock_updates(journal); | ||
| 3541 | return error; | ||
| 3542 | } | ||
| 3543 | 3545 | ||
| 3544 | /* Journal blocked and flushed, clear needs_recovery flag. */ | 3546 | /* Journal blocked and flushed, clear needs_recovery flag. */ |
| 3545 | EXT4_CLEAR_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER); | 3547 | EXT4_CLEAR_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER); |
| 3546 | error = ext4_commit_super(sb, 1); | 3548 | error = ext4_commit_super(sb, 1); |
| 3547 | if (error) | 3549 | out: |
| 3548 | goto out; | 3550 | /* we rely on s_frozen to stop further updates */ |
| 3549 | return 0; | 3551 | jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal); |
| 3552 | return error; | ||
| 3550 | } | 3553 | } |
| 3551 | 3554 | ||
| 3552 | /* | 3555 | /* |
| @@ -3563,7 +3566,6 @@ static int ext4_unfreeze(struct super_block *sb) | |||
| 3563 | EXT4_SET_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER); | 3566 | EXT4_SET_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER); |
| 3564 | ext4_commit_super(sb, 1); | 3567 | ext4_commit_super(sb, 1); |
| 3565 | unlock_super(sb); | 3568 | unlock_super(sb); |
| 3566 | jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal); | ||
| 3567 | return 0; | 3569 | return 0; |
| 3568 | } | 3570 | } |
| 3569 | 3571 | ||
| @@ -3580,6 +3582,7 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) | |||
| 3580 | #ifdef CONFIG_QUOTA | 3582 | #ifdef CONFIG_QUOTA |
| 3581 | int i; | 3583 | int i; |
| 3582 | #endif | 3584 | #endif |
| 3585 | char *orig_data = kstrdup(data, GFP_KERNEL); | ||
| 3583 | 3586 | ||
| 3584 | lock_kernel(); | 3587 | lock_kernel(); |
| 3585 | 3588 | ||
| @@ -3713,6 +3716,9 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) | |||
| 3713 | #endif | 3716 | #endif |
| 3714 | unlock_super(sb); | 3717 | unlock_super(sb); |
| 3715 | unlock_kernel(); | 3718 | unlock_kernel(); |
| 3719 | |||
| 3720 | ext4_msg(sb, KERN_INFO, "re-mounted. Opts: %s", orig_data); | ||
| 3721 | kfree(orig_data); | ||
| 3716 | return 0; | 3722 | return 0; |
| 3717 | 3723 | ||
| 3718 | restore_opts: | 3724 | restore_opts: |
| @@ -3734,6 +3740,7 @@ restore_opts: | |||
| 3734 | #endif | 3740 | #endif |
| 3735 | unlock_super(sb); | 3741 | unlock_super(sb); |
| 3736 | unlock_kernel(); | 3742 | unlock_kernel(); |
| 3743 | kfree(orig_data); | ||
| 3737 | return err; | 3744 | return err; |
| 3738 | } | 3745 | } |
| 3739 | 3746 | ||
| @@ -4141,6 +4148,7 @@ static int __init init_ext4_fs(void) | |||
| 4141 | { | 4148 | { |
| 4142 | int err; | 4149 | int err; |
| 4143 | 4150 | ||
| 4151 | ext4_check_flag_values(); | ||
| 4144 | err = init_ext4_system_zone(); | 4152 | err = init_ext4_system_zone(); |
| 4145 | if (err) | 4153 | if (err) |
| 4146 | return err; | 4154 | return err; |
diff --git a/fs/ext4/symlink.c b/fs/ext4/symlink.c index 00740cb32be3..ed9354aff279 100644 --- a/fs/ext4/symlink.c +++ b/fs/ext4/symlink.c | |||
| @@ -34,6 +34,7 @@ const struct inode_operations ext4_symlink_inode_operations = { | |||
| 34 | .readlink = generic_readlink, | 34 | .readlink = generic_readlink, |
| 35 | .follow_link = page_follow_link_light, | 35 | .follow_link = page_follow_link_light, |
| 36 | .put_link = page_put_link, | 36 | .put_link = page_put_link, |
| 37 | .setattr = ext4_setattr, | ||
| 37 | #ifdef CONFIG_EXT4_FS_XATTR | 38 | #ifdef CONFIG_EXT4_FS_XATTR |
| 38 | .setxattr = generic_setxattr, | 39 | .setxattr = generic_setxattr, |
| 39 | .getxattr = generic_getxattr, | 40 | .getxattr = generic_getxattr, |
| @@ -45,6 +46,7 @@ const struct inode_operations ext4_symlink_inode_operations = { | |||
| 45 | const struct inode_operations ext4_fast_symlink_inode_operations = { | 46 | const struct inode_operations ext4_fast_symlink_inode_operations = { |
| 46 | .readlink = generic_readlink, | 47 | .readlink = generic_readlink, |
| 47 | .follow_link = ext4_follow_link, | 48 | .follow_link = ext4_follow_link, |
| 49 | .setattr = ext4_setattr, | ||
| 48 | #ifdef CONFIG_EXT4_FS_XATTR | 50 | #ifdef CONFIG_EXT4_FS_XATTR |
| 49 | .setxattr = generic_setxattr, | 51 | .setxattr = generic_setxattr, |
| 50 | .getxattr = generic_getxattr, | 52 | .getxattr = generic_getxattr, |
diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c index 2de0e9515089..04338009793a 100644 --- a/fs/ext4/xattr.c +++ b/fs/ext4/xattr.c | |||
| @@ -228,9 +228,8 @@ ext4_xattr_block_get(struct inode *inode, int name_index, const char *name, | |||
| 228 | atomic_read(&(bh->b_count)), le32_to_cpu(BHDR(bh)->h_refcount)); | 228 | atomic_read(&(bh->b_count)), le32_to_cpu(BHDR(bh)->h_refcount)); |
| 229 | if (ext4_xattr_check_block(bh)) { | 229 | if (ext4_xattr_check_block(bh)) { |
| 230 | bad_block: | 230 | bad_block: |
| 231 | ext4_error(inode->i_sb, | 231 | EXT4_ERROR_INODE(inode, "bad block %llu", |
| 232 | "inode %lu: bad block %llu", inode->i_ino, | 232 | EXT4_I(inode)->i_file_acl); |
| 233 | EXT4_I(inode)->i_file_acl); | ||
| 234 | error = -EIO; | 233 | error = -EIO; |
| 235 | goto cleanup; | 234 | goto cleanup; |
| 236 | } | 235 | } |
| @@ -372,9 +371,8 @@ ext4_xattr_block_list(struct dentry *dentry, char *buffer, size_t buffer_size) | |||
| 372 | ea_bdebug(bh, "b_count=%d, refcount=%d", | 371 | ea_bdebug(bh, "b_count=%d, refcount=%d", |
| 373 | atomic_read(&(bh->b_count)), le32_to_cpu(BHDR(bh)->h_refcount)); | 372 | atomic_read(&(bh->b_count)), le32_to_cpu(BHDR(bh)->h_refcount)); |
| 374 | if (ext4_xattr_check_block(bh)) { | 373 | if (ext4_xattr_check_block(bh)) { |
| 375 | ext4_error(inode->i_sb, | 374 | EXT4_ERROR_INODE(inode, "bad block %llu", |
| 376 | "inode %lu: bad block %llu", inode->i_ino, | 375 | EXT4_I(inode)->i_file_acl); |
| 377 | EXT4_I(inode)->i_file_acl); | ||
| 378 | error = -EIO; | 376 | error = -EIO; |
| 379 | goto cleanup; | 377 | goto cleanup; |
| 380 | } | 378 | } |
| @@ -666,8 +664,8 @@ ext4_xattr_block_find(struct inode *inode, struct ext4_xattr_info *i, | |||
| 666 | atomic_read(&(bs->bh->b_count)), | 664 | atomic_read(&(bs->bh->b_count)), |
| 667 | le32_to_cpu(BHDR(bs->bh)->h_refcount)); | 665 | le32_to_cpu(BHDR(bs->bh)->h_refcount)); |
| 668 | if (ext4_xattr_check_block(bs->bh)) { | 666 | if (ext4_xattr_check_block(bs->bh)) { |
| 669 | ext4_error(sb, "inode %lu: bad block %llu", | 667 | EXT4_ERROR_INODE(inode, "bad block %llu", |
| 670 | inode->i_ino, EXT4_I(inode)->i_file_acl); | 668 | EXT4_I(inode)->i_file_acl); |
| 671 | error = -EIO; | 669 | error = -EIO; |
| 672 | goto cleanup; | 670 | goto cleanup; |
| 673 | } | 671 | } |
| @@ -820,7 +818,7 @@ inserted: | |||
| 820 | EXT4_I(inode)->i_block_group); | 818 | EXT4_I(inode)->i_block_group); |
| 821 | 819 | ||
| 822 | /* non-extent files can't have physical blocks past 2^32 */ | 820 | /* non-extent files can't have physical blocks past 2^32 */ |
| 823 | if (!(EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL)) | 821 | if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) |
| 824 | goal = goal & EXT4_MAX_BLOCK_FILE_PHYS; | 822 | goal = goal & EXT4_MAX_BLOCK_FILE_PHYS; |
| 825 | 823 | ||
| 826 | block = ext4_new_meta_blocks(handle, inode, | 824 | block = ext4_new_meta_blocks(handle, inode, |
| @@ -828,7 +826,7 @@ inserted: | |||
| 828 | if (error) | 826 | if (error) |
| 829 | goto cleanup; | 827 | goto cleanup; |
| 830 | 828 | ||
| 831 | if (!(EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL)) | 829 | if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) |
| 832 | BUG_ON(block > EXT4_MAX_BLOCK_FILE_PHYS); | 830 | BUG_ON(block > EXT4_MAX_BLOCK_FILE_PHYS); |
| 833 | 831 | ||
| 834 | ea_idebug(inode, "creating block %d", block); | 832 | ea_idebug(inode, "creating block %d", block); |
| @@ -880,8 +878,8 @@ cleanup_dquot: | |||
| 880 | goto cleanup; | 878 | goto cleanup; |
| 881 | 879 | ||
| 882 | bad_block: | 880 | bad_block: |
| 883 | ext4_error(inode->i_sb, "inode %lu: bad block %llu", | 881 | EXT4_ERROR_INODE(inode, "bad block %llu", |
| 884 | inode->i_ino, EXT4_I(inode)->i_file_acl); | 882 | EXT4_I(inode)->i_file_acl); |
| 885 | goto cleanup; | 883 | goto cleanup; |
| 886 | 884 | ||
| 887 | #undef header | 885 | #undef header |
| @@ -1194,8 +1192,8 @@ retry: | |||
| 1194 | if (!bh) | 1192 | if (!bh) |
| 1195 | goto cleanup; | 1193 | goto cleanup; |
| 1196 | if (ext4_xattr_check_block(bh)) { | 1194 | if (ext4_xattr_check_block(bh)) { |
| 1197 | ext4_error(inode->i_sb, "inode %lu: bad block %llu", | 1195 | EXT4_ERROR_INODE(inode, "bad block %llu", |
| 1198 | inode->i_ino, EXT4_I(inode)->i_file_acl); | 1196 | EXT4_I(inode)->i_file_acl); |
| 1199 | error = -EIO; | 1197 | error = -EIO; |
| 1200 | goto cleanup; | 1198 | goto cleanup; |
| 1201 | } | 1199 | } |
| @@ -1372,14 +1370,14 @@ ext4_xattr_delete_inode(handle_t *handle, struct inode *inode) | |||
| 1372 | goto cleanup; | 1370 | goto cleanup; |
| 1373 | bh = sb_bread(inode->i_sb, EXT4_I(inode)->i_file_acl); | 1371 | bh = sb_bread(inode->i_sb, EXT4_I(inode)->i_file_acl); |
| 1374 | if (!bh) { | 1372 | if (!bh) { |
| 1375 | ext4_error(inode->i_sb, "inode %lu: block %llu read error", | 1373 | EXT4_ERROR_INODE(inode, "block %llu read error", |
| 1376 | inode->i_ino, EXT4_I(inode)->i_file_acl); | 1374 | EXT4_I(inode)->i_file_acl); |
| 1377 | goto cleanup; | 1375 | goto cleanup; |
| 1378 | } | 1376 | } |
| 1379 | if (BHDR(bh)->h_magic != cpu_to_le32(EXT4_XATTR_MAGIC) || | 1377 | if (BHDR(bh)->h_magic != cpu_to_le32(EXT4_XATTR_MAGIC) || |
| 1380 | BHDR(bh)->h_blocks != cpu_to_le32(1)) { | 1378 | BHDR(bh)->h_blocks != cpu_to_le32(1)) { |
| 1381 | ext4_error(inode->i_sb, "inode %lu: bad block %llu", | 1379 | EXT4_ERROR_INODE(inode, "bad block %llu", |
| 1382 | inode->i_ino, EXT4_I(inode)->i_file_acl); | 1380 | EXT4_I(inode)->i_file_acl); |
| 1383 | goto cleanup; | 1381 | goto cleanup; |
| 1384 | } | 1382 | } |
| 1385 | ext4_xattr_release_block(handle, inode, bh); | 1383 | ext4_xattr_release_block(handle, inode, bh); |
| @@ -1504,9 +1502,8 @@ again: | |||
| 1504 | } | 1502 | } |
| 1505 | bh = sb_bread(inode->i_sb, ce->e_block); | 1503 | bh = sb_bread(inode->i_sb, ce->e_block); |
| 1506 | if (!bh) { | 1504 | if (!bh) { |
| 1507 | ext4_error(inode->i_sb, | 1505 | EXT4_ERROR_INODE(inode, "block %lu read error", |
| 1508 | "inode %lu: block %lu read error", | 1506 | (unsigned long) ce->e_block); |
| 1509 | inode->i_ino, (unsigned long) ce->e_block); | ||
| 1510 | } else if (le32_to_cpu(BHDR(bh)->h_refcount) >= | 1507 | } else if (le32_to_cpu(BHDR(bh)->h_refcount) >= |
| 1511 | EXT4_XATTR_REFCOUNT_MAX) { | 1508 | EXT4_XATTR_REFCOUNT_MAX) { |
| 1512 | ea_idebug(inode, "block %lu refcount %d>=%d", | 1509 | ea_idebug(inode, "block %lu refcount %d>=%d", |
diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c index bfc70f57900f..e214d68620ac 100644 --- a/fs/jbd2/transaction.c +++ b/fs/jbd2/transaction.c | |||
| @@ -1311,7 +1311,6 @@ int jbd2_journal_stop(handle_t *handle) | |||
| 1311 | if (handle->h_sync) | 1311 | if (handle->h_sync) |
| 1312 | transaction->t_synchronous_commit = 1; | 1312 | transaction->t_synchronous_commit = 1; |
| 1313 | current->journal_info = NULL; | 1313 | current->journal_info = NULL; |
| 1314 | spin_lock(&journal->j_state_lock); | ||
| 1315 | spin_lock(&transaction->t_handle_lock); | 1314 | spin_lock(&transaction->t_handle_lock); |
| 1316 | transaction->t_outstanding_credits -= handle->h_buffer_credits; | 1315 | transaction->t_outstanding_credits -= handle->h_buffer_credits; |
| 1317 | transaction->t_updates--; | 1316 | transaction->t_updates--; |
| @@ -1340,8 +1339,7 @@ int jbd2_journal_stop(handle_t *handle) | |||
| 1340 | jbd_debug(2, "transaction too old, requesting commit for " | 1339 | jbd_debug(2, "transaction too old, requesting commit for " |
| 1341 | "handle %p\n", handle); | 1340 | "handle %p\n", handle); |
| 1342 | /* This is non-blocking */ | 1341 | /* This is non-blocking */ |
| 1343 | __jbd2_log_start_commit(journal, transaction->t_tid); | 1342 | jbd2_log_start_commit(journal, transaction->t_tid); |
| 1344 | spin_unlock(&journal->j_state_lock); | ||
| 1345 | 1343 | ||
| 1346 | /* | 1344 | /* |
| 1347 | * Special case: JBD2_SYNC synchronous updates require us | 1345 | * Special case: JBD2_SYNC synchronous updates require us |
| @@ -1351,7 +1349,6 @@ int jbd2_journal_stop(handle_t *handle) | |||
| 1351 | err = jbd2_log_wait_commit(journal, tid); | 1349 | err = jbd2_log_wait_commit(journal, tid); |
| 1352 | } else { | 1350 | } else { |
| 1353 | spin_unlock(&transaction->t_handle_lock); | 1351 | spin_unlock(&transaction->t_handle_lock); |
| 1354 | spin_unlock(&journal->j_state_lock); | ||
| 1355 | } | 1352 | } |
| 1356 | 1353 | ||
| 1357 | lock_map_release(&handle->h_lockdep_map); | 1354 | lock_map_release(&handle->h_lockdep_map); |
diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 655a4c52b8c3..1ad8bf076cfc 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c | |||
| @@ -1514,11 +1514,13 @@ static void inode_decr_space(struct inode *inode, qsize_t number, int reserve) | |||
| 1514 | /* | 1514 | /* |
| 1515 | * This operation can block, but only after everything is updated | 1515 | * This operation can block, but only after everything is updated |
| 1516 | */ | 1516 | */ |
| 1517 | int __dquot_alloc_space(struct inode *inode, qsize_t number, | 1517 | int __dquot_alloc_space(struct inode *inode, qsize_t number, int flags) |
| 1518 | int warn, int reserve) | ||
| 1519 | { | 1518 | { |
| 1520 | int cnt, ret = 0; | 1519 | int cnt, ret = 0; |
| 1521 | char warntype[MAXQUOTAS]; | 1520 | char warntype[MAXQUOTAS]; |
| 1521 | int warn = flags & DQUOT_SPACE_WARN; | ||
| 1522 | int reserve = flags & DQUOT_SPACE_RESERVE; | ||
| 1523 | int nofail = flags & DQUOT_SPACE_NOFAIL; | ||
| 1522 | 1524 | ||
| 1523 | /* | 1525 | /* |
| 1524 | * First test before acquiring mutex - solves deadlocks when we | 1526 | * First test before acquiring mutex - solves deadlocks when we |
| @@ -1539,7 +1541,7 @@ int __dquot_alloc_space(struct inode *inode, qsize_t number, | |||
| 1539 | continue; | 1541 | continue; |
| 1540 | ret = check_bdq(inode->i_dquot[cnt], number, !warn, | 1542 | ret = check_bdq(inode->i_dquot[cnt], number, !warn, |
| 1541 | warntype+cnt); | 1543 | warntype+cnt); |
| 1542 | if (ret) { | 1544 | if (ret && !nofail) { |
| 1543 | spin_unlock(&dq_data_lock); | 1545 | spin_unlock(&dq_data_lock); |
| 1544 | goto out_flush_warn; | 1546 | goto out_flush_warn; |
| 1545 | } | 1547 | } |
| @@ -1638,10 +1640,11 @@ EXPORT_SYMBOL(dquot_claim_space_nodirty); | |||
| 1638 | /* | 1640 | /* |
| 1639 | * This operation can block, but only after everything is updated | 1641 | * This operation can block, but only after everything is updated |
| 1640 | */ | 1642 | */ |
| 1641 | void __dquot_free_space(struct inode *inode, qsize_t number, int reserve) | 1643 | void __dquot_free_space(struct inode *inode, qsize_t number, int flags) |
| 1642 | { | 1644 | { |
| 1643 | unsigned int cnt; | 1645 | unsigned int cnt; |
| 1644 | char warntype[MAXQUOTAS]; | 1646 | char warntype[MAXQUOTAS]; |
| 1647 | int reserve = flags & DQUOT_SPACE_RESERVE; | ||
| 1645 | 1648 | ||
| 1646 | /* First test before acquiring mutex - solves deadlocks when we | 1649 | /* First test before acquiring mutex - solves deadlocks when we |
| 1647 | * re-enter the quota code and are already holding the mutex */ | 1650 | * re-enter the quota code and are already holding the mutex */ |
diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h index 370abb1e99cb..e38ae53f3529 100644 --- a/include/linux/quotaops.h +++ b/include/linux/quotaops.h | |||
| @@ -9,6 +9,10 @@ | |||
| 9 | 9 | ||
| 10 | #include <linux/fs.h> | 10 | #include <linux/fs.h> |
| 11 | 11 | ||
| 12 | #define DQUOT_SPACE_WARN 0x1 | ||
| 13 | #define DQUOT_SPACE_RESERVE 0x2 | ||
| 14 | #define DQUOT_SPACE_NOFAIL 0x4 | ||
| 15 | |||
| 12 | static inline struct quota_info *sb_dqopt(struct super_block *sb) | 16 | static inline struct quota_info *sb_dqopt(struct super_block *sb) |
| 13 | { | 17 | { |
| 14 | return &sb->s_dquot; | 18 | return &sb->s_dquot; |
| @@ -41,9 +45,8 @@ int dquot_scan_active(struct super_block *sb, | |||
| 41 | struct dquot *dquot_alloc(struct super_block *sb, int type); | 45 | struct dquot *dquot_alloc(struct super_block *sb, int type); |
| 42 | void dquot_destroy(struct dquot *dquot); | 46 | void dquot_destroy(struct dquot *dquot); |
| 43 | 47 | ||
| 44 | int __dquot_alloc_space(struct inode *inode, qsize_t number, | 48 | int __dquot_alloc_space(struct inode *inode, qsize_t number, int flags); |
| 45 | int warn, int reserve); | 49 | void __dquot_free_space(struct inode *inode, qsize_t number, int flags); |
| 46 | void __dquot_free_space(struct inode *inode, qsize_t number, int reserve); | ||
| 47 | 50 | ||
| 48 | int dquot_alloc_inode(const struct inode *inode); | 51 | int dquot_alloc_inode(const struct inode *inode); |
| 49 | 52 | ||
| @@ -242,17 +245,17 @@ static inline int dquot_transfer(struct inode *inode, struct iattr *iattr) | |||
| 242 | } | 245 | } |
| 243 | 246 | ||
| 244 | static inline int __dquot_alloc_space(struct inode *inode, qsize_t number, | 247 | static inline int __dquot_alloc_space(struct inode *inode, qsize_t number, |
| 245 | int warn, int reserve) | 248 | int flags) |
| 246 | { | 249 | { |
| 247 | if (!reserve) | 250 | if (!(flags & DQUOT_SPACE_RESERVE)) |
| 248 | inode_add_bytes(inode, number); | 251 | inode_add_bytes(inode, number); |
| 249 | return 0; | 252 | return 0; |
| 250 | } | 253 | } |
| 251 | 254 | ||
| 252 | static inline void __dquot_free_space(struct inode *inode, qsize_t number, | 255 | static inline void __dquot_free_space(struct inode *inode, qsize_t number, |
| 253 | int reserve) | 256 | int flags) |
| 254 | { | 257 | { |
| 255 | if (!reserve) | 258 | if (!(flags & DQUOT_SPACE_RESERVE)) |
| 256 | inode_sub_bytes(inode, number); | 259 | inode_sub_bytes(inode, number); |
| 257 | } | 260 | } |
| 258 | 261 | ||
| @@ -268,7 +271,13 @@ static inline int dquot_claim_space_nodirty(struct inode *inode, qsize_t number) | |||
| 268 | 271 | ||
| 269 | static inline int dquot_alloc_space_nodirty(struct inode *inode, qsize_t nr) | 272 | static inline int dquot_alloc_space_nodirty(struct inode *inode, qsize_t nr) |
| 270 | { | 273 | { |
| 271 | return __dquot_alloc_space(inode, nr, 1, 0); | 274 | return __dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN); |
| 275 | } | ||
| 276 | |||
| 277 | static inline void dquot_alloc_space_nofail(struct inode *inode, qsize_t nr) | ||
| 278 | { | ||
| 279 | __dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN|DQUOT_SPACE_NOFAIL); | ||
| 280 | mark_inode_dirty(inode); | ||
| 272 | } | 281 | } |
| 273 | 282 | ||
| 274 | static inline int dquot_alloc_space(struct inode *inode, qsize_t nr) | 283 | static inline int dquot_alloc_space(struct inode *inode, qsize_t nr) |
| @@ -286,6 +295,11 @@ static inline int dquot_alloc_block_nodirty(struct inode *inode, qsize_t nr) | |||
| 286 | return dquot_alloc_space_nodirty(inode, nr << inode->i_blkbits); | 295 | return dquot_alloc_space_nodirty(inode, nr << inode->i_blkbits); |
| 287 | } | 296 | } |
| 288 | 297 | ||
| 298 | static inline void dquot_alloc_block_nofail(struct inode *inode, qsize_t nr) | ||
| 299 | { | ||
| 300 | dquot_alloc_space_nofail(inode, nr << inode->i_blkbits); | ||
| 301 | } | ||
| 302 | |||
| 289 | static inline int dquot_alloc_block(struct inode *inode, qsize_t nr) | 303 | static inline int dquot_alloc_block(struct inode *inode, qsize_t nr) |
| 290 | { | 304 | { |
| 291 | return dquot_alloc_space(inode, nr << inode->i_blkbits); | 305 | return dquot_alloc_space(inode, nr << inode->i_blkbits); |
| @@ -293,7 +307,7 @@ static inline int dquot_alloc_block(struct inode *inode, qsize_t nr) | |||
| 293 | 307 | ||
| 294 | static inline int dquot_prealloc_block_nodirty(struct inode *inode, qsize_t nr) | 308 | static inline int dquot_prealloc_block_nodirty(struct inode *inode, qsize_t nr) |
| 295 | { | 309 | { |
| 296 | return __dquot_alloc_space(inode, nr << inode->i_blkbits, 0, 0); | 310 | return __dquot_alloc_space(inode, nr << inode->i_blkbits, 0); |
| 297 | } | 311 | } |
| 298 | 312 | ||
| 299 | static inline int dquot_prealloc_block(struct inode *inode, qsize_t nr) | 313 | static inline int dquot_prealloc_block(struct inode *inode, qsize_t nr) |
| @@ -308,7 +322,8 @@ static inline int dquot_prealloc_block(struct inode *inode, qsize_t nr) | |||
| 308 | 322 | ||
| 309 | static inline int dquot_reserve_block(struct inode *inode, qsize_t nr) | 323 | static inline int dquot_reserve_block(struct inode *inode, qsize_t nr) |
| 310 | { | 324 | { |
| 311 | return __dquot_alloc_space(inode, nr << inode->i_blkbits, 1, 1); | 325 | return __dquot_alloc_space(inode, nr << inode->i_blkbits, |
| 326 | DQUOT_SPACE_WARN|DQUOT_SPACE_RESERVE); | ||
| 312 | } | 327 | } |
| 313 | 328 | ||
| 314 | static inline int dquot_claim_block(struct inode *inode, qsize_t nr) | 329 | static inline int dquot_claim_block(struct inode *inode, qsize_t nr) |
| @@ -345,7 +360,7 @@ static inline void dquot_free_block(struct inode *inode, qsize_t nr) | |||
| 345 | static inline void dquot_release_reservation_block(struct inode *inode, | 360 | static inline void dquot_release_reservation_block(struct inode *inode, |
| 346 | qsize_t nr) | 361 | qsize_t nr) |
| 347 | { | 362 | { |
| 348 | __dquot_free_space(inode, nr << inode->i_blkbits, 1); | 363 | __dquot_free_space(inode, nr << inode->i_blkbits, DQUOT_SPACE_RESERVE); |
| 349 | } | 364 | } |
| 350 | 365 | ||
| 351 | #endif /* _LINUX_QUOTAOPS_ */ | 366 | #endif /* _LINUX_QUOTAOPS_ */ |
diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h index 2aa6aa3e8f61..5d60ad4ebf78 100644 --- a/include/trace/events/ext4.h +++ b/include/trace/events/ext4.h | |||
| @@ -353,7 +353,7 @@ TRACE_EVENT(ext4_discard_blocks, | |||
| 353 | jbd2_dev_to_name(__entry->dev), __entry->blk, __entry->count) | 353 | jbd2_dev_to_name(__entry->dev), __entry->blk, __entry->count) |
| 354 | ); | 354 | ); |
| 355 | 355 | ||
| 356 | TRACE_EVENT(ext4_mb_new_inode_pa, | 356 | DECLARE_EVENT_CLASS(ext4__mb_new_pa, |
| 357 | TP_PROTO(struct ext4_allocation_context *ac, | 357 | TP_PROTO(struct ext4_allocation_context *ac, |
| 358 | struct ext4_prealloc_space *pa), | 358 | struct ext4_prealloc_space *pa), |
| 359 | 359 | ||
| @@ -381,32 +381,20 @@ TRACE_EVENT(ext4_mb_new_inode_pa, | |||
| 381 | __entry->pa_pstart, __entry->pa_len, __entry->pa_lstart) | 381 | __entry->pa_pstart, __entry->pa_len, __entry->pa_lstart) |
| 382 | ); | 382 | ); |
| 383 | 383 | ||
| 384 | TRACE_EVENT(ext4_mb_new_group_pa, | 384 | DEFINE_EVENT(ext4__mb_new_pa, ext4_mb_new_inode_pa, |
| 385 | |||
| 385 | TP_PROTO(struct ext4_allocation_context *ac, | 386 | TP_PROTO(struct ext4_allocation_context *ac, |
| 386 | struct ext4_prealloc_space *pa), | 387 | struct ext4_prealloc_space *pa), |
| 387 | 388 | ||
| 388 | TP_ARGS(ac, pa), | 389 | TP_ARGS(ac, pa) |
| 389 | 390 | ); | |
| 390 | TP_STRUCT__entry( | ||
| 391 | __field( dev_t, dev ) | ||
| 392 | __field( ino_t, ino ) | ||
| 393 | __field( __u64, pa_pstart ) | ||
| 394 | __field( __u32, pa_len ) | ||
| 395 | __field( __u64, pa_lstart ) | ||
| 396 | 391 | ||
| 397 | ), | 392 | DEFINE_EVENT(ext4__mb_new_pa, ext4_mb_new_group_pa, |
| 398 | 393 | ||
| 399 | TP_fast_assign( | 394 | TP_PROTO(struct ext4_allocation_context *ac, |
| 400 | __entry->dev = ac->ac_sb->s_dev; | 395 | struct ext4_prealloc_space *pa), |
| 401 | __entry->ino = ac->ac_inode->i_ino; | ||
| 402 | __entry->pa_pstart = pa->pa_pstart; | ||
| 403 | __entry->pa_len = pa->pa_len; | ||
| 404 | __entry->pa_lstart = pa->pa_lstart; | ||
| 405 | ), | ||
| 406 | 396 | ||
| 407 | TP_printk("dev %s ino %lu pstart %llu len %u lstart %llu", | 397 | TP_ARGS(ac, pa) |
| 408 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, | ||
| 409 | __entry->pa_pstart, __entry->pa_len, __entry->pa_lstart) | ||
| 410 | ); | 398 | ); |
| 411 | 399 | ||
| 412 | TRACE_EVENT(ext4_mb_release_inode_pa, | 400 | TRACE_EVENT(ext4_mb_release_inode_pa, |
| @@ -790,7 +778,7 @@ TRACE_EVENT(ext4_mballoc_prealloc, | |||
| 790 | __entry->result_len, __entry->result_logical) | 778 | __entry->result_len, __entry->result_logical) |
| 791 | ); | 779 | ); |
| 792 | 780 | ||
| 793 | TRACE_EVENT(ext4_mballoc_discard, | 781 | DECLARE_EVENT_CLASS(ext4__mballoc, |
| 794 | TP_PROTO(struct ext4_allocation_context *ac), | 782 | TP_PROTO(struct ext4_allocation_context *ac), |
| 795 | 783 | ||
| 796 | TP_ARGS(ac), | 784 | TP_ARGS(ac), |
| @@ -819,33 +807,18 @@ TRACE_EVENT(ext4_mballoc_discard, | |||
| 819 | __entry->result_len, __entry->result_logical) | 807 | __entry->result_len, __entry->result_logical) |
| 820 | ); | 808 | ); |
| 821 | 809 | ||
| 822 | TRACE_EVENT(ext4_mballoc_free, | 810 | DEFINE_EVENT(ext4__mballoc, ext4_mballoc_discard, |
| 811 | |||
| 823 | TP_PROTO(struct ext4_allocation_context *ac), | 812 | TP_PROTO(struct ext4_allocation_context *ac), |
| 824 | 813 | ||
| 825 | TP_ARGS(ac), | 814 | TP_ARGS(ac) |
| 815 | ); | ||
| 826 | 816 | ||
| 827 | TP_STRUCT__entry( | 817 | DEFINE_EVENT(ext4__mballoc, ext4_mballoc_free, |
| 828 | __field( dev_t, dev ) | ||
| 829 | __field( ino_t, ino ) | ||
| 830 | __field( __u32, result_logical ) | ||
| 831 | __field( int, result_start ) | ||
| 832 | __field( __u32, result_group ) | ||
| 833 | __field( int, result_len ) | ||
| 834 | ), | ||
| 835 | 818 | ||
| 836 | TP_fast_assign( | 819 | TP_PROTO(struct ext4_allocation_context *ac), |
| 837 | __entry->dev = ac->ac_inode->i_sb->s_dev; | ||
| 838 | __entry->ino = ac->ac_inode->i_ino; | ||
| 839 | __entry->result_logical = ac->ac_b_ex.fe_logical; | ||
| 840 | __entry->result_start = ac->ac_b_ex.fe_start; | ||
| 841 | __entry->result_group = ac->ac_b_ex.fe_group; | ||
| 842 | __entry->result_len = ac->ac_b_ex.fe_len; | ||
| 843 | ), | ||
| 844 | 820 | ||
| 845 | TP_printk("dev %s inode %lu extent %u/%d/%u@%u ", | 821 | TP_ARGS(ac) |
| 846 | jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, | ||
| 847 | __entry->result_group, __entry->result_start, | ||
| 848 | __entry->result_len, __entry->result_logical) | ||
| 849 | ); | 822 | ); |
| 850 | 823 | ||
| 851 | TRACE_EVENT(ext4_forget, | 824 | TRACE_EVENT(ext4_forget, |
| @@ -974,6 +947,39 @@ TRACE_EVENT(ext4_da_release_space, | |||
| 974 | __entry->reserved_meta_blocks, __entry->allocated_meta_blocks) | 947 | __entry->reserved_meta_blocks, __entry->allocated_meta_blocks) |
| 975 | ); | 948 | ); |
| 976 | 949 | ||
| 950 | DECLARE_EVENT_CLASS(ext4__bitmap_load, | ||
| 951 | TP_PROTO(struct super_block *sb, unsigned long group), | ||
| 952 | |||
| 953 | TP_ARGS(sb, group), | ||
| 954 | |||
| 955 | TP_STRUCT__entry( | ||
| 956 | __field( dev_t, dev ) | ||
| 957 | __field( __u32, group ) | ||
| 958 | |||
| 959 | ), | ||
| 960 | |||
| 961 | TP_fast_assign( | ||
| 962 | __entry->dev = sb->s_dev; | ||
| 963 | __entry->group = group; | ||
| 964 | ), | ||
| 965 | |||
| 966 | TP_printk("dev %s group %u", | ||
| 967 | jbd2_dev_to_name(__entry->dev), __entry->group) | ||
| 968 | ); | ||
| 969 | |||
| 970 | DEFINE_EVENT(ext4__bitmap_load, ext4_mb_bitmap_load, | ||
| 971 | |||
| 972 | TP_PROTO(struct super_block *sb, unsigned long group), | ||
| 973 | |||
| 974 | TP_ARGS(sb, group) | ||
| 975 | ); | ||
| 976 | |||
| 977 | DEFINE_EVENT(ext4__bitmap_load, ext4_mb_buddy_bitmap_load, | ||
| 978 | |||
| 979 | TP_PROTO(struct super_block *sb, unsigned long group), | ||
| 980 | |||
| 981 | TP_ARGS(sb, group) | ||
| 982 | ); | ||
| 977 | 983 | ||
| 978 | #endif /* _TRACE_EXT4_H */ | 984 | #endif /* _TRACE_EXT4_H */ |
| 979 | 985 | ||
