diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-10-03 14:24:19 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-10-03 14:24:19 -0400 |
| commit | 9117703fabe4141dae566d683eeb728f638c9e49 (patch) | |
| tree | efe85f18c6fe5f7d1513d19b01183d050a6b130f | |
| parent | a037a79dceaf717409fbf42f4ad209b9c15f435c (diff) | |
| parent | fbbf69456619de5d251cb9f1df609069178c62d5 (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:
[PATCH] ext4: retry failed direct IO allocations
ext4: Fix build warning in ext4_dirty_inode()
ext4: drop ext4dev compat
ext4: fix a BUG_ON crash by checking that page has buffers attached to it
| -rw-r--r-- | fs/ext4/Kconfig | 14 | ||||
| -rw-r--r-- | fs/ext4/inode.c | 28 | ||||
| -rw-r--r-- | fs/ext4/super.c | 31 |
3 files changed, 15 insertions, 58 deletions
diff --git a/fs/ext4/Kconfig b/fs/ext4/Kconfig index d5c0ea2e8f2d..9f2d45d75b1a 100644 --- a/fs/ext4/Kconfig +++ b/fs/ext4/Kconfig | |||
| @@ -26,20 +26,6 @@ config EXT4_FS | |||
| 26 | 26 | ||
| 27 | If unsure, say N. | 27 | If unsure, say N. |
| 28 | 28 | ||
| 29 | config EXT4DEV_COMPAT | ||
| 30 | bool "Enable ext4dev compatibility" | ||
| 31 | depends on EXT4_FS | ||
| 32 | help | ||
| 33 | Starting with 2.6.28, the name of the ext4 filesystem was | ||
| 34 | renamed from ext4dev to ext4. Unfortunately there are some | ||
| 35 | legacy userspace programs (such as klibc's fstype) have | ||
| 36 | "ext4dev" hardcoded. | ||
| 37 | |||
| 38 | To enable backwards compatibility so that systems that are | ||
| 39 | still expecting to mount ext4 filesystems using ext4dev, | ||
| 40 | choose Y here. This feature will go away by 2.6.31, so | ||
| 41 | please arrange to get your userspace programs fixed! | ||
| 42 | |||
| 43 | config EXT4_FS_XATTR | 29 | config EXT4_FS_XATTR |
| 44 | bool "Ext4 extended attributes" | 30 | bool "Ext4 extended attributes" |
| 45 | depends on EXT4_FS | 31 | depends on EXT4_FS |
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index ec367bce7215..5c5bc5dafff8 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
| @@ -1146,8 +1146,8 @@ static int check_block_validity(struct inode *inode, const char *msg, | |||
| 1146 | } | 1146 | } |
| 1147 | 1147 | ||
| 1148 | /* | 1148 | /* |
| 1149 | * Return the number of dirty pages in the given inode starting at | 1149 | * Return the number of contiguous dirty pages in a given inode |
| 1150 | * page frame idx. | 1150 | * starting at page frame idx. |
| 1151 | */ | 1151 | */ |
| 1152 | static pgoff_t ext4_num_dirty_pages(struct inode *inode, pgoff_t idx, | 1152 | static pgoff_t ext4_num_dirty_pages(struct inode *inode, pgoff_t idx, |
| 1153 | unsigned int max_pages) | 1153 | unsigned int max_pages) |
| @@ -1181,15 +1181,15 @@ static pgoff_t ext4_num_dirty_pages(struct inode *inode, pgoff_t idx, | |||
| 1181 | unlock_page(page); | 1181 | unlock_page(page); |
| 1182 | break; | 1182 | break; |
| 1183 | } | 1183 | } |
| 1184 | head = page_buffers(page); | 1184 | if (page_has_buffers(page)) { |
| 1185 | bh = head; | 1185 | bh = head = page_buffers(page); |
| 1186 | do { | 1186 | do { |
| 1187 | if (!buffer_delay(bh) && | 1187 | if (!buffer_delay(bh) && |
| 1188 | !buffer_unwritten(bh)) { | 1188 | !buffer_unwritten(bh)) |
| 1189 | done = 1; | 1189 | done = 1; |
| 1190 | break; | 1190 | bh = bh->b_this_page; |
| 1191 | } | 1191 | } while (!done && (bh != head)); |
| 1192 | } while ((bh = bh->b_this_page) != head); | 1192 | } |
| 1193 | unlock_page(page); | 1193 | unlock_page(page); |
| 1194 | if (done) | 1194 | if (done) |
| 1195 | break; | 1195 | break; |
| @@ -3378,6 +3378,7 @@ static ssize_t ext4_ind_direct_IO(int rw, struct kiocb *iocb, | |||
| 3378 | ssize_t ret; | 3378 | ssize_t ret; |
| 3379 | int orphan = 0; | 3379 | int orphan = 0; |
| 3380 | size_t count = iov_length(iov, nr_segs); | 3380 | size_t count = iov_length(iov, nr_segs); |
| 3381 | int retries = 0; | ||
| 3381 | 3382 | ||
| 3382 | if (rw == WRITE) { | 3383 | if (rw == WRITE) { |
| 3383 | loff_t final_size = offset + count; | 3384 | loff_t final_size = offset + count; |
| @@ -3400,9 +3401,12 @@ static ssize_t ext4_ind_direct_IO(int rw, struct kiocb *iocb, | |||
| 3400 | } | 3401 | } |
| 3401 | } | 3402 | } |
| 3402 | 3403 | ||
| 3404 | retry: | ||
| 3403 | ret = blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov, | 3405 | ret = blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov, |
| 3404 | offset, nr_segs, | 3406 | offset, nr_segs, |
| 3405 | ext4_get_block, NULL); | 3407 | ext4_get_block, NULL); |
| 3408 | if (ret == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) | ||
| 3409 | goto retry; | ||
| 3406 | 3410 | ||
| 3407 | if (orphan) { | 3411 | if (orphan) { |
| 3408 | int err; | 3412 | int err; |
| @@ -5612,14 +5616,12 @@ int ext4_mark_inode_dirty(handle_t *handle, struct inode *inode) | |||
| 5612 | */ | 5616 | */ |
| 5613 | void ext4_dirty_inode(struct inode *inode) | 5617 | void ext4_dirty_inode(struct inode *inode) |
| 5614 | { | 5618 | { |
| 5615 | handle_t *current_handle = ext4_journal_current_handle(); | ||
| 5616 | handle_t *handle; | 5619 | handle_t *handle; |
| 5617 | 5620 | ||
| 5618 | handle = ext4_journal_start(inode, 2); | 5621 | handle = ext4_journal_start(inode, 2); |
| 5619 | if (IS_ERR(handle)) | 5622 | if (IS_ERR(handle)) |
| 5620 | goto out; | 5623 | goto out; |
| 5621 | 5624 | ||
| 5622 | jbd_debug(5, "marking dirty. outer handle=%p\n", current_handle); | ||
| 5623 | ext4_mark_inode_dirty(handle, inode); | 5625 | ext4_mark_inode_dirty(handle, inode); |
| 5624 | 5626 | ||
| 5625 | ext4_journal_stop(handle); | 5627 | ext4_journal_stop(handle); |
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 12e726a7073f..312211ee05af 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
| @@ -3966,27 +3966,6 @@ static struct file_system_type ext4_fs_type = { | |||
| 3966 | .fs_flags = FS_REQUIRES_DEV, | 3966 | .fs_flags = FS_REQUIRES_DEV, |
| 3967 | }; | 3967 | }; |
| 3968 | 3968 | ||
| 3969 | #ifdef CONFIG_EXT4DEV_COMPAT | ||
| 3970 | static int ext4dev_get_sb(struct file_system_type *fs_type, int flags, | ||
| 3971 | const char *dev_name, void *data,struct vfsmount *mnt) | ||
| 3972 | { | ||
| 3973 | printk(KERN_WARNING "EXT4-fs (%s): Update your userspace programs " | ||
| 3974 | "to mount using ext4\n", dev_name); | ||
| 3975 | printk(KERN_WARNING "EXT4-fs (%s): ext4dev backwards compatibility " | ||
| 3976 | "will go away by 2.6.31\n", dev_name); | ||
| 3977 | return get_sb_bdev(fs_type, flags, dev_name, data, ext4_fill_super,mnt); | ||
| 3978 | } | ||
| 3979 | |||
| 3980 | static struct file_system_type ext4dev_fs_type = { | ||
| 3981 | .owner = THIS_MODULE, | ||
| 3982 | .name = "ext4dev", | ||
| 3983 | .get_sb = ext4dev_get_sb, | ||
| 3984 | .kill_sb = kill_block_super, | ||
| 3985 | .fs_flags = FS_REQUIRES_DEV, | ||
| 3986 | }; | ||
| 3987 | MODULE_ALIAS("ext4dev"); | ||
| 3988 | #endif | ||
| 3989 | |||
| 3990 | static int __init init_ext4_fs(void) | 3969 | static int __init init_ext4_fs(void) |
| 3991 | { | 3970 | { |
| 3992 | int err; | 3971 | int err; |
| @@ -4011,13 +3990,6 @@ static int __init init_ext4_fs(void) | |||
| 4011 | err = register_filesystem(&ext4_fs_type); | 3990 | err = register_filesystem(&ext4_fs_type); |
| 4012 | if (err) | 3991 | if (err) |
| 4013 | goto out; | 3992 | goto out; |
| 4014 | #ifdef CONFIG_EXT4DEV_COMPAT | ||
| 4015 | err = register_filesystem(&ext4dev_fs_type); | ||
| 4016 | if (err) { | ||
| 4017 | unregister_filesystem(&ext4_fs_type); | ||
| 4018 | goto out; | ||
| 4019 | } | ||
| 4020 | #endif | ||
| 4021 | return 0; | 3993 | return 0; |
| 4022 | out: | 3994 | out: |
| 4023 | destroy_inodecache(); | 3995 | destroy_inodecache(); |
| @@ -4036,9 +4008,6 @@ out4: | |||
| 4036 | static void __exit exit_ext4_fs(void) | 4008 | static void __exit exit_ext4_fs(void) |
| 4037 | { | 4009 | { |
| 4038 | unregister_filesystem(&ext4_fs_type); | 4010 | unregister_filesystem(&ext4_fs_type); |
| 4039 | #ifdef CONFIG_EXT4DEV_COMPAT | ||
| 4040 | unregister_filesystem(&ext4dev_fs_type); | ||
| 4041 | #endif | ||
| 4042 | destroy_inodecache(); | 4011 | destroy_inodecache(); |
| 4043 | exit_ext4_xattr(); | 4012 | exit_ext4_xattr(); |
| 4044 | exit_ext4_mballoc(); | 4013 | exit_ext4_mballoc(); |
