diff options
| -rw-r--r-- | fs/ext4/extents.c | 9 | ||||
| -rw-r--r-- | fs/ext4/file.c | 2 | ||||
| -rw-r--r-- | fs/ext4/ialloc.c | 4 | ||||
| -rw-r--r-- | fs/ext4/inode.c | 7 | ||||
| -rw-r--r-- | fs/ext4/namei.c | 28 | ||||
| -rw-r--r-- | fs/ext4/resize.c | 2 | ||||
| -rw-r--r-- | fs/ext4/super.c | 17 | ||||
| -rw-r--r-- | fs/jbd2/revoke.c | 10 |
8 files changed, 51 insertions, 28 deletions
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 37043d0b2be8..0b16fb4c06d3 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c | |||
| @@ -3603,11 +3603,10 @@ static int ext4_ext_convert_to_initialized(handle_t *handle, | |||
| 3603 | } | 3603 | } |
| 3604 | } | 3604 | } |
| 3605 | 3605 | ||
| 3606 | allocated = ext4_split_extent(handle, inode, ppath, | 3606 | err = ext4_split_extent(handle, inode, ppath, &split_map, split_flag, |
| 3607 | &split_map, split_flag, flags); | 3607 | flags); |
| 3608 | if (allocated < 0) | 3608 | if (err > 0) |
| 3609 | err = allocated; | 3609 | err = 0; |
| 3610 | |||
| 3611 | out: | 3610 | out: |
| 3612 | /* If we have gotten a failure, don't zero out status tree */ | 3611 | /* If we have gotten a failure, don't zero out status tree */ |
| 3613 | if (!err) | 3612 | if (!err) |
diff --git a/fs/ext4/file.c b/fs/ext4/file.c index aca7b24a4432..8131be8c0af3 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c | |||
| @@ -137,10 +137,10 @@ ext4_file_write_iter(struct kiocb *iocb, struct iov_iter *from) | |||
| 137 | iov_iter_truncate(from, sbi->s_bitmap_maxbytes - pos); | 137 | iov_iter_truncate(from, sbi->s_bitmap_maxbytes - pos); |
| 138 | } | 138 | } |
| 139 | 139 | ||
| 140 | iocb->private = &overwrite; | ||
| 140 | if (o_direct) { | 141 | if (o_direct) { |
| 141 | blk_start_plug(&plug); | 142 | blk_start_plug(&plug); |
| 142 | 143 | ||
| 143 | iocb->private = &overwrite; | ||
| 144 | 144 | ||
| 145 | /* check whether we do a DIO overwrite or not */ | 145 | /* check whether we do a DIO overwrite or not */ |
| 146 | if (ext4_should_dioread_nolock(inode) && !aio_mutex && | 146 | if (ext4_should_dioread_nolock(inode) && !aio_mutex && |
diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c index 8012a5daf401..ac644c31ca67 100644 --- a/fs/ext4/ialloc.c +++ b/fs/ext4/ialloc.c | |||
| @@ -887,6 +887,10 @@ got: | |||
| 887 | struct buffer_head *block_bitmap_bh; | 887 | struct buffer_head *block_bitmap_bh; |
| 888 | 888 | ||
| 889 | block_bitmap_bh = ext4_read_block_bitmap(sb, group); | 889 | block_bitmap_bh = ext4_read_block_bitmap(sb, group); |
| 890 | if (!block_bitmap_bh) { | ||
| 891 | err = -EIO; | ||
| 892 | goto out; | ||
| 893 | } | ||
| 890 | BUFFER_TRACE(block_bitmap_bh, "get block bitmap access"); | 894 | BUFFER_TRACE(block_bitmap_bh, "get block bitmap access"); |
| 891 | err = ext4_journal_get_write_access(handle, block_bitmap_bh); | 895 | err = ext4_journal_get_write_access(handle, block_bitmap_bh); |
| 892 | if (err) { | 896 | if (err) { |
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index e9777f93cf05..3356ab5395f4 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
| @@ -4959,7 +4959,12 @@ int ext4_change_inode_journal_flag(struct inode *inode, int val) | |||
| 4959 | if (val) | 4959 | if (val) |
| 4960 | ext4_set_inode_flag(inode, EXT4_INODE_JOURNAL_DATA); | 4960 | ext4_set_inode_flag(inode, EXT4_INODE_JOURNAL_DATA); |
| 4961 | else { | 4961 | else { |
| 4962 | jbd2_journal_flush(journal); | 4962 | err = jbd2_journal_flush(journal); |
| 4963 | if (err < 0) { | ||
| 4964 | jbd2_journal_unlock_updates(journal); | ||
| 4965 | ext4_inode_resume_unlocked_dio(inode); | ||
| 4966 | return err; | ||
| 4967 | } | ||
| 4963 | ext4_clear_inode_flag(inode, EXT4_INODE_JOURNAL_DATA); | 4968 | ext4_clear_inode_flag(inode, EXT4_INODE_JOURNAL_DATA); |
| 4964 | } | 4969 | } |
| 4965 | ext4_set_aops(inode); | 4970 | ext4_set_aops(inode); |
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index 123798c5ac31..426211882f72 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c | |||
| @@ -1816,31 +1816,39 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry, | |||
| 1816 | hinfo.hash_version += EXT4_SB(dir->i_sb)->s_hash_unsigned; | 1816 | hinfo.hash_version += EXT4_SB(dir->i_sb)->s_hash_unsigned; |
| 1817 | hinfo.seed = EXT4_SB(dir->i_sb)->s_hash_seed; | 1817 | hinfo.seed = EXT4_SB(dir->i_sb)->s_hash_seed; |
| 1818 | ext4fs_dirhash(name, namelen, &hinfo); | 1818 | ext4fs_dirhash(name, namelen, &hinfo); |
| 1819 | memset(frames, 0, sizeof(frames)); | ||
| 1819 | frame = frames; | 1820 | frame = frames; |
| 1820 | frame->entries = entries; | 1821 | frame->entries = entries; |
| 1821 | frame->at = entries; | 1822 | frame->at = entries; |
| 1822 | frame->bh = bh; | 1823 | frame->bh = bh; |
| 1823 | bh = bh2; | 1824 | bh = bh2; |
| 1824 | 1825 | ||
| 1825 | ext4_handle_dirty_dx_node(handle, dir, frame->bh); | 1826 | retval = ext4_handle_dirty_dx_node(handle, dir, frame->bh); |
| 1826 | ext4_handle_dirty_dirent_node(handle, dir, bh); | 1827 | if (retval) |
| 1828 | goto out_frames; | ||
| 1829 | retval = ext4_handle_dirty_dirent_node(handle, dir, bh); | ||
| 1830 | if (retval) | ||
| 1831 | goto out_frames; | ||
| 1827 | 1832 | ||
| 1828 | de = do_split(handle,dir, &bh, frame, &hinfo); | 1833 | de = do_split(handle,dir, &bh, frame, &hinfo); |
| 1829 | if (IS_ERR(de)) { | 1834 | if (IS_ERR(de)) { |
| 1830 | /* | 1835 | retval = PTR_ERR(de); |
| 1831 | * Even if the block split failed, we have to properly write | 1836 | goto out_frames; |
| 1832 | * out all the changes we did so far. Otherwise we can end up | ||
| 1833 | * with corrupted filesystem. | ||
| 1834 | */ | ||
| 1835 | ext4_mark_inode_dirty(handle, dir); | ||
| 1836 | dx_release(frames); | ||
| 1837 | return PTR_ERR(de); | ||
| 1838 | } | 1837 | } |
| 1839 | dx_release(frames); | 1838 | dx_release(frames); |
| 1840 | 1839 | ||
| 1841 | retval = add_dirent_to_buf(handle, dentry, inode, de, bh); | 1840 | retval = add_dirent_to_buf(handle, dentry, inode, de, bh); |
| 1842 | brelse(bh); | 1841 | brelse(bh); |
| 1843 | return retval; | 1842 | return retval; |
| 1843 | out_frames: | ||
| 1844 | /* | ||
| 1845 | * Even if the block split failed, we have to properly write | ||
| 1846 | * out all the changes we did so far. Otherwise we can end up | ||
| 1847 | * with corrupted filesystem. | ||
| 1848 | */ | ||
| 1849 | ext4_mark_inode_dirty(handle, dir); | ||
| 1850 | dx_release(frames); | ||
| 1851 | return retval; | ||
| 1844 | } | 1852 | } |
| 1845 | 1853 | ||
| 1846 | /* | 1854 | /* |
diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c index f298c60f907d..ca4588388fc3 100644 --- a/fs/ext4/resize.c +++ b/fs/ext4/resize.c | |||
| @@ -1081,7 +1081,7 @@ static void update_backups(struct super_block *sb, int blk_off, char *data, | |||
| 1081 | break; | 1081 | break; |
| 1082 | 1082 | ||
| 1083 | if (meta_bg == 0) | 1083 | if (meta_bg == 0) |
| 1084 | backup_block = group * bpg + blk_off; | 1084 | backup_block = ((ext4_fsblk_t)group) * bpg + blk_off; |
| 1085 | else | 1085 | else |
| 1086 | backup_block = (ext4_group_first_block_no(sb, group) + | 1086 | backup_block = (ext4_group_first_block_no(sb, group) + |
| 1087 | ext4_bg_has_super(sb, group)); | 1087 | ext4_bg_has_super(sb, group)); |
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 1eda6ab0ef9d..2c9e6864abd9 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
| @@ -3526,6 +3526,10 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
| 3526 | #ifdef CONFIG_EXT4_FS_POSIX_ACL | 3526 | #ifdef CONFIG_EXT4_FS_POSIX_ACL |
| 3527 | set_opt(sb, POSIX_ACL); | 3527 | set_opt(sb, POSIX_ACL); |
| 3528 | #endif | 3528 | #endif |
| 3529 | /* don't forget to enable journal_csum when metadata_csum is enabled. */ | ||
| 3530 | if (ext4_has_metadata_csum(sb)) | ||
| 3531 | set_opt(sb, JOURNAL_CHECKSUM); | ||
| 3532 | |||
| 3529 | if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_DATA) | 3533 | if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_DATA) |
| 3530 | set_opt(sb, JOURNAL_DATA); | 3534 | set_opt(sb, JOURNAL_DATA); |
| 3531 | else if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_ORDERED) | 3535 | else if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_ORDERED) |
| @@ -3943,7 +3947,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
| 3943 | if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_MMP) && | 3947 | if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_MMP) && |
| 3944 | !(sb->s_flags & MS_RDONLY)) | 3948 | !(sb->s_flags & MS_RDONLY)) |
| 3945 | if (ext4_multi_mount_protect(sb, le64_to_cpu(es->s_mmp_block))) | 3949 | if (ext4_multi_mount_protect(sb, le64_to_cpu(es->s_mmp_block))) |
| 3946 | goto failed_mount3; | 3950 | goto failed_mount3a; |
| 3947 | 3951 | ||
| 3948 | /* | 3952 | /* |
| 3949 | * The first inode we look at is the journal inode. Don't try | 3953 | * The first inode we look at is the journal inode. Don't try |
| @@ -3952,7 +3956,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
| 3952 | if (!test_opt(sb, NOLOAD) && | 3956 | if (!test_opt(sb, NOLOAD) && |
| 3953 | EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_HAS_JOURNAL)) { | 3957 | EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_HAS_JOURNAL)) { |
| 3954 | if (ext4_load_journal(sb, es, journal_devnum)) | 3958 | if (ext4_load_journal(sb, es, journal_devnum)) |
| 3955 | goto failed_mount3; | 3959 | goto failed_mount3a; |
| 3956 | } else if (test_opt(sb, NOLOAD) && !(sb->s_flags & MS_RDONLY) && | 3960 | } else if (test_opt(sb, NOLOAD) && !(sb->s_flags & MS_RDONLY) && |
| 3957 | EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER)) { | 3961 | EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER)) { |
| 3958 | ext4_msg(sb, KERN_ERR, "required journal recovery " | 3962 | ext4_msg(sb, KERN_ERR, "required journal recovery " |
| @@ -4240,6 +4244,7 @@ failed_mount_wq: | |||
| 4240 | jbd2_journal_destroy(sbi->s_journal); | 4244 | jbd2_journal_destroy(sbi->s_journal); |
| 4241 | sbi->s_journal = NULL; | 4245 | sbi->s_journal = NULL; |
| 4242 | } | 4246 | } |
| 4247 | failed_mount3a: | ||
| 4243 | ext4_es_unregister_shrinker(sbi); | 4248 | ext4_es_unregister_shrinker(sbi); |
| 4244 | failed_mount3: | 4249 | failed_mount3: |
| 4245 | del_timer_sync(&sbi->s_err_report); | 4250 | del_timer_sync(&sbi->s_err_report); |
| @@ -4841,6 +4846,14 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) | |||
| 4841 | goto restore_opts; | 4846 | goto restore_opts; |
| 4842 | } | 4847 | } |
| 4843 | 4848 | ||
| 4849 | if ((old_opts.s_mount_opt & EXT4_MOUNT_JOURNAL_CHECKSUM) ^ | ||
| 4850 | test_opt(sb, JOURNAL_CHECKSUM)) { | ||
| 4851 | ext4_msg(sb, KERN_ERR, "changing journal_checksum " | ||
| 4852 | "during remount not supported"); | ||
| 4853 | err = -EINVAL; | ||
| 4854 | goto restore_opts; | ||
| 4855 | } | ||
| 4856 | |||
| 4844 | if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) { | 4857 | if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) { |
| 4845 | if (test_opt2(sb, EXPLICIT_DELALLOC)) { | 4858 | if (test_opt2(sb, EXPLICIT_DELALLOC)) { |
| 4846 | ext4_msg(sb, KERN_ERR, "can't mount with " | 4859 | ext4_msg(sb, KERN_ERR, "can't mount with " |
diff --git a/fs/jbd2/revoke.c b/fs/jbd2/revoke.c index d5e95a175c92..c6cbaef2bda1 100644 --- a/fs/jbd2/revoke.c +++ b/fs/jbd2/revoke.c | |||
| @@ -92,6 +92,7 @@ | |||
| 92 | #include <linux/init.h> | 92 | #include <linux/init.h> |
| 93 | #include <linux/bio.h> | 93 | #include <linux/bio.h> |
| 94 | #include <linux/log2.h> | 94 | #include <linux/log2.h> |
| 95 | #include <linux/hash.h> | ||
| 95 | #endif | 96 | #endif |
| 96 | 97 | ||
| 97 | static struct kmem_cache *jbd2_revoke_record_cache; | 98 | static struct kmem_cache *jbd2_revoke_record_cache; |
| @@ -130,16 +131,9 @@ static void flush_descriptor(journal_t *, struct buffer_head *, int, int); | |||
| 130 | 131 | ||
| 131 | /* Utility functions to maintain the revoke table */ | 132 | /* Utility functions to maintain the revoke table */ |
| 132 | 133 | ||
| 133 | /* Borrowed from buffer.c: this is a tried and tested block hash function */ | ||
| 134 | static inline int hash(journal_t *journal, unsigned long long block) | 134 | static inline int hash(journal_t *journal, unsigned long long block) |
| 135 | { | 135 | { |
| 136 | struct jbd2_revoke_table_s *table = journal->j_revoke; | 136 | return hash_64(block, journal->j_revoke->hash_shift); |
| 137 | int hash_shift = table->hash_shift; | ||
| 138 | int hash = (int)block ^ (int)((block >> 31) >> 1); | ||
| 139 | |||
| 140 | return ((hash << (hash_shift - 6)) ^ | ||
| 141 | (hash >> 13) ^ | ||
| 142 | (hash << (hash_shift - 12))) & (table->hash_size - 1); | ||
| 143 | } | 137 | } |
| 144 | 138 | ||
| 145 | static int insert_revoke_hash(journal_t *journal, unsigned long long blocknr, | 139 | static int insert_revoke_hash(journal_t *journal, unsigned long long blocknr, |
