diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-07-13 19:39:25 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-07-13 19:39:25 -0400 |
| commit | 1cf29683f4414296dc772a87caa207cab16c310c (patch) | |
| tree | 90d05ba531c5ad48d8d171d5b78038a7df7728e7 | |
| parent | 4a390e07fc53ce9dd615d7b788e9ecc73f87ad94 (diff) | |
| parent | 96577c43827697ca1af5982fa256a34786d0c720 (diff) | |
Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4
* 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4:
jbd2: fix race between write_metadata_buffer and get_write_access
ext4: Fix ext4_mb_initialize_context() to initialize all fields
ext4: fix null handler of ioctls in no journal mode
ext4: Fix buffer head reference leak in no-journal mode
ext4: Move __ext4_journalled_writepage() to avoid forward declaration
ext4: Fix mmap/truncate race when blocksize < pagesize && !nodellaoc
ext4: Fix mmap/truncate race when blocksize < pagesize && delayed allocation
ext4: Don't look at buffer_heads outside i_size.
ext4: Fix goal inum check in the inode allocator
ext4: fix no journal corruption with locale-gen
ext4: Calculate required journal credits for inserting an extent properly
ext4: Fix truncation of symlinks after failed write
jbd2: Fix a race between checkpointing code and journal_get_write_access()
ext4: Use rcu_barrier() on module unload.
ext4: naturally align struct ext4_allocation_request
ext4: mark several more functions in mballoc.c as noinline
ext4: Fix potential reclaim deadlock when truncating partial block
jbd2: Remove GFP_ATOMIC kmalloc from inside spinlock critical region
ext4: Fix type warning on 64-bit platforms in tracing events header
| -rw-r--r-- | fs/ext4/ext4.h | 14 | ||||
| -rw-r--r-- | fs/ext4/ext4_jbd2.c | 4 | ||||
| -rw-r--r-- | fs/ext4/ext4_jbd2.h | 6 | ||||
| -rw-r--r-- | fs/ext4/extents.c | 1 | ||||
| -rw-r--r-- | fs/ext4/ialloc.c | 2 | ||||
| -rw-r--r-- | fs/ext4/inode.c | 384 | ||||
| -rw-r--r-- | fs/ext4/ioctl.c | 20 | ||||
| -rw-r--r-- | fs/ext4/mballoc.c | 50 | ||||
| -rw-r--r-- | fs/jbd2/journal.c | 31 | ||||
| -rw-r--r-- | fs/jbd2/transaction.c | 68 | ||||
| -rw-r--r-- | include/trace/events/ext4.h | 48 |
11 files changed, 235 insertions, 393 deletions
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 0ddf7e55abe1..9714db393efe 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h | |||
| @@ -93,20 +93,20 @@ typedef unsigned int ext4_group_t; | |||
| 93 | struct ext4_allocation_request { | 93 | struct ext4_allocation_request { |
| 94 | /* target inode for block we're allocating */ | 94 | /* target inode for block we're allocating */ |
| 95 | struct inode *inode; | 95 | struct inode *inode; |
| 96 | /* how many blocks we want to allocate */ | ||
| 97 | unsigned int len; | ||
| 96 | /* logical block in target inode */ | 98 | /* logical block in target inode */ |
| 97 | ext4_lblk_t logical; | 99 | ext4_lblk_t logical; |
| 98 | /* phys. target (a hint) */ | ||
| 99 | ext4_fsblk_t goal; | ||
| 100 | /* the closest logical allocated block to the left */ | 100 | /* the closest logical allocated block to the left */ |
| 101 | ext4_lblk_t lleft; | 101 | ext4_lblk_t lleft; |
| 102 | /* phys. block for ^^^ */ | ||
| 103 | ext4_fsblk_t pleft; | ||
| 104 | /* the closest logical allocated block to the right */ | 102 | /* the closest logical allocated block to the right */ |
| 105 | ext4_lblk_t lright; | 103 | ext4_lblk_t lright; |
| 106 | /* phys. block for ^^^ */ | 104 | /* phys. target (a hint) */ |
| 105 | ext4_fsblk_t goal; | ||
| 106 | /* phys. block for the closest logical allocated block to the left */ | ||
| 107 | ext4_fsblk_t pleft; | ||
| 108 | /* phys. block for the closest logical allocated block to the right */ | ||
| 107 | ext4_fsblk_t pright; | 109 | ext4_fsblk_t pright; |
| 108 | /* how many blocks we want to allocate */ | ||
| 109 | unsigned int len; | ||
| 110 | /* flags. see above EXT4_MB_HINT_* */ | 110 | /* flags. see above EXT4_MB_HINT_* */ |
| 111 | unsigned int flags; | 111 | unsigned int flags; |
| 112 | }; | 112 | }; |
diff --git a/fs/ext4/ext4_jbd2.c b/fs/ext4/ext4_jbd2.c index ad13a84644e1..eb27fd0f2ee8 100644 --- a/fs/ext4/ext4_jbd2.c +++ b/fs/ext4/ext4_jbd2.c | |||
| @@ -43,6 +43,8 @@ int __ext4_journal_forget(const char *where, handle_t *handle, | |||
| 43 | ext4_journal_abort_handle(where, __func__, bh, | 43 | ext4_journal_abort_handle(where, __func__, bh, |
| 44 | handle, err); | 44 | handle, err); |
| 45 | } | 45 | } |
| 46 | else | ||
| 47 | brelse(bh); | ||
| 46 | return err; | 48 | return err; |
| 47 | } | 49 | } |
| 48 | 50 | ||
| @@ -57,6 +59,8 @@ int __ext4_journal_revoke(const char *where, handle_t *handle, | |||
| 57 | ext4_journal_abort_handle(where, __func__, bh, | 59 | ext4_journal_abort_handle(where, __func__, bh, |
| 58 | handle, err); | 60 | handle, err); |
| 59 | } | 61 | } |
| 62 | else | ||
| 63 | brelse(bh); | ||
| 60 | return err; | 64 | return err; |
| 61 | } | 65 | } |
| 62 | 66 | ||
diff --git a/fs/ext4/ext4_jbd2.h b/fs/ext4/ext4_jbd2.h index be2f426f6805..139fb8cb87e4 100644 --- a/fs/ext4/ext4_jbd2.h +++ b/fs/ext4/ext4_jbd2.h | |||
| @@ -131,9 +131,11 @@ int __ext4_journal_get_undo_access(const char *where, handle_t *handle, | |||
| 131 | int __ext4_journal_get_write_access(const char *where, handle_t *handle, | 131 | int __ext4_journal_get_write_access(const char *where, handle_t *handle, |
| 132 | struct buffer_head *bh); | 132 | struct buffer_head *bh); |
| 133 | 133 | ||
| 134 | /* When called with an invalid handle, this will still do a put on the BH */ | ||
| 134 | int __ext4_journal_forget(const char *where, handle_t *handle, | 135 | int __ext4_journal_forget(const char *where, handle_t *handle, |
| 135 | struct buffer_head *bh); | 136 | struct buffer_head *bh); |
| 136 | 137 | ||
| 138 | /* When called with an invalid handle, this will still do a put on the BH */ | ||
| 137 | int __ext4_journal_revoke(const char *where, handle_t *handle, | 139 | int __ext4_journal_revoke(const char *where, handle_t *handle, |
| 138 | ext4_fsblk_t blocknr, struct buffer_head *bh); | 140 | ext4_fsblk_t blocknr, struct buffer_head *bh); |
| 139 | 141 | ||
| @@ -281,10 +283,10 @@ static inline int ext4_should_order_data(struct inode *inode) | |||
| 281 | 283 | ||
| 282 | static inline int ext4_should_writeback_data(struct inode *inode) | 284 | static inline int ext4_should_writeback_data(struct inode *inode) |
| 283 | { | 285 | { |
| 284 | if (EXT4_JOURNAL(inode) == NULL) | ||
| 285 | return 0; | ||
| 286 | if (!S_ISREG(inode->i_mode)) | 286 | if (!S_ISREG(inode->i_mode)) |
| 287 | return 0; | 287 | return 0; |
| 288 | if (EXT4_JOURNAL(inode) == NULL) | ||
| 289 | return 1; | ||
| 288 | if (EXT4_I(inode)->i_flags & EXT4_JOURNAL_DATA_FL) | 290 | if (EXT4_I(inode)->i_flags & EXT4_JOURNAL_DATA_FL) |
| 289 | return 0; | 291 | return 0; |
| 290 | if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_WRITEBACK_DATA) | 292 | if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_WRITEBACK_DATA) |
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 50322a09bd01..73ebfb44ad75 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c | |||
| @@ -1977,6 +1977,7 @@ int ext4_ext_calc_credits_for_single_extent(struct inode *inode, int nrblocks, | |||
| 1977 | */ | 1977 | */ |
| 1978 | /* 1 bitmap, 1 block group descriptor */ | 1978 | /* 1 bitmap, 1 block group descriptor */ |
| 1979 | ret = 2 + EXT4_META_TRANS_BLOCKS(inode->i_sb); | 1979 | ret = 2 + EXT4_META_TRANS_BLOCKS(inode->i_sb); |
| 1980 | return ret; | ||
| 1980 | } | 1981 | } |
| 1981 | } | 1982 | } |
| 1982 | 1983 | ||
diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c index 2f645732e3b7..29e6dc7299b8 100644 --- a/fs/ext4/ialloc.c +++ b/fs/ext4/ialloc.c | |||
| @@ -833,7 +833,7 @@ struct inode *ext4_new_inode(handle_t *handle, struct inode *dir, int mode, | |||
| 833 | if (!goal) | 833 | if (!goal) |
| 834 | goal = sbi->s_inode_goal; | 834 | goal = sbi->s_inode_goal; |
| 835 | 835 | ||
| 836 | if (goal && goal < le32_to_cpu(sbi->s_es->s_inodes_count)) { | 836 | if (goal && goal <= le32_to_cpu(sbi->s_es->s_inodes_count)) { |
| 837 | group = (goal - 1) / EXT4_INODES_PER_GROUP(sb); | 837 | group = (goal - 1) / EXT4_INODES_PER_GROUP(sb); |
| 838 | ino = (goal - 1) % EXT4_INODES_PER_GROUP(sb); | 838 | ino = (goal - 1) % EXT4_INODES_PER_GROUP(sb); |
| 839 | ret2 = 0; | 839 | ret2 = 0; |
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 60a26f3a6f8b..f9c642b22efa 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
| @@ -78,16 +78,14 @@ static int ext4_inode_is_fast_symlink(struct inode *inode) | |||
| 78 | * but there may still be a record of it in the journal, and that record | 78 | * but there may still be a record of it in the journal, and that record |
| 79 | * still needs to be revoked. | 79 | * still needs to be revoked. |
| 80 | * | 80 | * |
| 81 | * If the handle isn't valid we're not journaling so there's nothing to do. | 81 | * If the handle isn't valid we're not journaling, but we still need to |
| 82 | * call into ext4_journal_revoke() to put the buffer head. | ||
| 82 | */ | 83 | */ |
| 83 | int ext4_forget(handle_t *handle, int is_metadata, struct inode *inode, | 84 | int ext4_forget(handle_t *handle, int is_metadata, struct inode *inode, |
| 84 | struct buffer_head *bh, ext4_fsblk_t blocknr) | 85 | struct buffer_head *bh, ext4_fsblk_t blocknr) |
| 85 | { | 86 | { |
| 86 | int err; | 87 | int err; |
| 87 | 88 | ||
| 88 | if (!ext4_handle_valid(handle)) | ||
| 89 | return 0; | ||
| 90 | |||
| 91 | might_sleep(); | 89 | might_sleep(); |
| 92 | 90 | ||
| 93 | BUFFER_TRACE(bh, "enter"); | 91 | BUFFER_TRACE(bh, "enter"); |
| @@ -1513,14 +1511,14 @@ retry: | |||
| 1513 | * Add inode to orphan list in case we crash before | 1511 | * Add inode to orphan list in case we crash before |
| 1514 | * truncate finishes | 1512 | * truncate finishes |
| 1515 | */ | 1513 | */ |
| 1516 | if (pos + len > inode->i_size) | 1514 | if (pos + len > inode->i_size && ext4_can_truncate(inode)) |
| 1517 | ext4_orphan_add(handle, inode); | 1515 | ext4_orphan_add(handle, inode); |
| 1518 | 1516 | ||
| 1519 | ext4_journal_stop(handle); | 1517 | ext4_journal_stop(handle); |
| 1520 | if (pos + len > inode->i_size) { | 1518 | if (pos + len > inode->i_size) { |
| 1521 | vmtruncate(inode, inode->i_size); | 1519 | ext4_truncate(inode); |
| 1522 | /* | 1520 | /* |
| 1523 | * If vmtruncate failed early the inode might | 1521 | * If truncate failed early the inode might |
| 1524 | * still be on the orphan list; we need to | 1522 | * still be on the orphan list; we need to |
| 1525 | * make sure the inode is removed from the | 1523 | * make sure the inode is removed from the |
| 1526 | * orphan list in that case. | 1524 | * orphan list in that case. |
| @@ -1614,7 +1612,7 @@ static int ext4_ordered_write_end(struct file *file, | |||
| 1614 | ret2 = ext4_generic_write_end(file, mapping, pos, len, copied, | 1612 | ret2 = ext4_generic_write_end(file, mapping, pos, len, copied, |
| 1615 | page, fsdata); | 1613 | page, fsdata); |
| 1616 | copied = ret2; | 1614 | copied = ret2; |
| 1617 | if (pos + len > inode->i_size) | 1615 | if (pos + len > inode->i_size && ext4_can_truncate(inode)) |
