diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-08 20:14:59 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-08 20:14:59 -0500 |
commit | 2150edc6c5cf00f7adb54538b9ea2a3e9cedca3f (patch) | |
tree | f72a0d85e66f500b4cead348a231e3d3b9f357bc /fs/ext4/extents.c | |
parent | cd764695b67386a81964f68e9c66efd9f13f4d29 (diff) | |
parent | 4b905671d2ea09fd48fed72c581df17e40823f39 (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: (57 commits)
jbd2: Fix oops in jbd2_journal_init_inode() on corrupted fs
ext4: Remove "extents" mount option
block: Add Kconfig help which notes that ext4 needs CONFIG_LBD
ext4: Make printk's consistently prefixed with "EXT4-fs: "
ext4: Add sanity checks for the superblock before mounting the filesystem
ext4: Add mount option to set kjournald's I/O priority
jbd2: Submit writes to the journal using WRITE_SYNC
jbd2: Add pid and journal device name to the "kjournald2 starting" message
ext4: Add markers for better debuggability
ext4: Remove code to create the journal inode
ext4: provide function to release metadata pages under memory pressure
ext3: provide function to release metadata pages under memory pressure
add releasepage hooks to block devices which can be used by file systems
ext4: Fix s_dirty_blocks_counter if block allocation failed with nodelalloc
ext4: Init the complete page while building buddy cache
ext4: Don't allow new groups to be added during block allocation
ext4: mark the blocks/inode bitmap beyond end of group as used
ext4: Use new buffer_head flag to check uninit group bitmaps initialization
ext4: Fix the race between read_inode_bitmap() and ext4_new_inode()
ext4: code cleanup
...
Diffstat (limited to 'fs/ext4/extents.c')
-rw-r--r-- | fs/ext4/extents.c | 60 |
1 files changed, 29 insertions, 31 deletions
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 3f54db31cdc2..54bf0623a9ae 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c | |||
@@ -97,6 +97,8 @@ static int ext4_ext_journal_restart(handle_t *handle, int needed) | |||
97 | { | 97 | { |
98 | int err; | 98 | int err; |
99 | 99 | ||
100 | if (!ext4_handle_valid(handle)) | ||
101 | return 0; | ||
100 | if (handle->h_buffer_credits > needed) | 102 | if (handle->h_buffer_credits > needed) |
101 | return 0; | 103 | return 0; |
102 | err = ext4_journal_extend(handle, needed); | 104 | err = ext4_journal_extend(handle, needed); |
@@ -134,7 +136,7 @@ static int ext4_ext_dirty(handle_t *handle, struct inode *inode, | |||
134 | int err; | 136 | int err; |
135 | if (path->p_bh) { | 137 | if (path->p_bh) { |
136 | /* path points to block */ | 138 | /* path points to block */ |
137 | err = ext4_journal_dirty_metadata(handle, path->p_bh); | 139 | err = ext4_handle_dirty_metadata(handle, inode, path->p_bh); |
138 | } else { | 140 | } else { |
139 | /* path points to leaf/index in inode body */ | 141 | /* path points to leaf/index in inode body */ |
140 | err = ext4_mark_inode_dirty(handle, inode); | 142 | err = ext4_mark_inode_dirty(handle, inode); |
@@ -191,7 +193,7 @@ ext4_ext_new_meta_block(handle_t *handle, struct inode *inode, | |||
191 | ext4_fsblk_t goal, newblock; | 193 | ext4_fsblk_t goal, newblock; |
192 | 194 | ||
193 | goal = ext4_ext_find_goal(inode, path, le32_to_cpu(ex->ee_block)); | 195 | goal = ext4_ext_find_goal(inode, path, le32_to_cpu(ex->ee_block)); |
194 | newblock = ext4_new_meta_block(handle, inode, goal, err); | 196 | newblock = ext4_new_meta_blocks(handle, inode, goal, NULL, err); |
195 | return newblock; | 197 | return newblock; |
196 | } | 198 | } |
197 | 199 | ||
@@ -780,7 +782,7 @@ static int ext4_ext_split(handle_t *handle, struct inode *inode, | |||
780 | set_buffer_uptodate(bh); | 782 | set_buffer_uptodate(bh); |
781 | unlock_buffer(bh); | 783 | unlock_buffer(bh); |
782 | 784 | ||
783 | err = ext4_journal_dirty_metadata(handle, bh); | 785 | err = ext4_handle_dirty_metadata(handle, inode, bh); |
784 | if (err) | 786 | if (err) |
785 | goto cleanup; | 787 | goto cleanup; |
786 | brelse(bh); | 788 | brelse(bh); |
@@ -859,7 +861,7 @@ static int ext4_ext_split(handle_t *handle, struct inode *inode, | |||
859 | set_buffer_uptodate(bh); | 861 | set_buffer_uptodate(bh); |
860 | unlock_buffer(bh); | 862 | unlock_buffer(bh); |
861 | 863 | ||
862 | err = ext4_journal_dirty_metadata(handle, bh); | 864 | err = ext4_handle_dirty_metadata(handle, inode, bh); |
863 | if (err) | 865 | if (err) |
864 | goto cleanup; | 866 | goto cleanup; |
865 | brelse(bh); | 867 | brelse(bh); |
@@ -955,7 +957,7 @@ static int ext4_ext_grow_indepth(handle_t *handle, struct inode *inode, | |||
955 | set_buffer_uptodate(bh); | 957 | set_buffer_uptodate(bh); |
956 | unlock_buffer(bh); | 958 | unlock_buffer(bh); |
957 | 959 | ||
958 | err = ext4_journal_dirty_metadata(handle, bh); | 960 | err = ext4_handle_dirty_metadata(handle, inode, bh); |
959 | if (err) | 961 | if (err) |
960 | goto out; | 962 | goto out; |
961 | 963 | ||
@@ -1160,15 +1162,13 @@ ext4_ext_search_right(struct inode *inode, struct ext4_ext_path *path, | |||
1160 | while (--depth >= 0) { | 1162 | while (--depth >= 0) { |
1161 | ix = path[depth].p_idx; | 1163 | ix = path[depth].p_idx; |
1162 | if (ix != EXT_LAST_INDEX(path[depth].p_hdr)) | 1164 | if (ix != EXT_LAST_INDEX(path[depth].p_hdr)) |
1163 | break; | 1165 | goto got_index; |
1164 | } | 1166 | } |
1165 | 1167 | ||
1166 | if (depth < 0) { | 1168 | /* we've gone up to the root and found no index to the right */ |
1167 | /* we've gone up to the root and | 1169 | return 0; |
1168 | * found no index to the right */ | ||
1169 | return 0; | ||
1170 | } | ||
1171 | 1170 | ||
1171 | got_index: | ||
1172 | /* we've found index to the right, let's | 1172 | /* we've found index to the right, let's |
1173 | * follow it and find the closest allocated | 1173 | * follow it and find the closest allocated |
1174 | * block to the right */ | 1174 | * block to the right */ |
@@ -1201,7 +1201,6 @@ ext4_ext_search_right(struct inode *inode, struct ext4_ext_path *path, | |||
1201 | *phys = ext_pblock(ex); | 1201 | *phys = ext_pblock(ex); |
1202 | put_bh(bh); | 1202 | put_bh(bh); |
1203 | return 0; | 1203 | return 0; |
1204 | |||
1205 | } | 1204 | } |
1206 | 1205 | ||
1207 | /* | 1206 | /* |
@@ -1622,7 +1621,6 @@ cleanup: | |||
1622 | ext4_ext_drop_refs(npath); | 1621 | ext4_ext_drop_refs(npath); |
1623 | kfree(npath); | 1622 | kfree(npath); |
1624 | } | 1623 | } |
1625 | ext4_ext_tree_changed(inode); | ||
1626 | ext4_ext_invalidate_cache(inode); | 1624 | ext4_ext_invalidate_cache(inode); |
1627 | return err; | 1625 | return err; |
1628 | } | 1626 | } |
@@ -2233,7 +2231,6 @@ static int ext4_ext_remove_space(struct inode *inode, ext4_lblk_t start) | |||
2233 | } | 2231 | } |
2234 | } | 2232 | } |
2235 | out: | 2233 | out: |
2236 | ext4_ext_tree_changed(inode); | ||
2237 | ext4_ext_drop_refs(path); | 2234 | ext4_ext_drop_refs(path); |
2238 | kfree(path); | 2235 | kfree(path); |
2239 | ext4_journal_stop(handle); | 2236 | ext4_journal_stop(handle); |
@@ -2250,7 +2247,7 @@ void ext4_ext_init(struct super_block *sb) | |||
2250 | * possible initialization would be here | 2247 | * possible initialization would be here |
2251 | */ | 2248 | */ |
2252 | 2249 | ||
2253 | if (test_opt(sb, EXTENTS)) { | 2250 | if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_EXTENTS)) { |
2254 | printk(KERN_INFO "EXT4-fs: file extents enabled"); | 2251 | printk(KERN_INFO "EXT4-fs: file extents enabled"); |
2255 | #ifdef AGGRESSIVE_TEST | 2252 | #ifdef AGGRESSIVE_TEST |
2256 | printk(", aggressive tests"); | 2253 | printk(", aggressive tests"); |
@@ -2275,7 +2272,7 @@ void ext4_ext_init(struct super_block *sb) | |||
2275 | */ | 2272 | */ |
2276 | void ext4_ext_release(struct super_block *sb) | 2273 | void ext4_ext_release(struct super_block *sb) |
2277 | { | 2274 | { |
2278 | if (!test_opt(sb, EXTENTS)) | 2275 | if (!EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_EXTENTS)) |
2279 | return; | 2276 | return; |
2280 | 2277 | ||
2281 | #ifdef EXTENTS_STATS | 2278 | #ifdef EXTENTS_STATS |
@@ -2380,7 +2377,7 @@ static int ext4_ext_convert_to_initialized(handle_t *handle, | |||
2380 | struct inode *inode, | 2377 | struct inode *inode, |
2381 | struct ext4_ext_path *path, | 2378 | struct ext4_ext_path *path, |
2382 | ext4_lblk_t iblock, | 2379 | ext4_lblk_t iblock, |
2383 | unsigned long max_blocks) | 2380 | unsigned int max_blocks) |
2384 | { | 2381 | { |
2385 | struct ext4_extent *ex, newex, orig_ex; | 2382 | struct ext4_extent *ex, newex, orig_ex; |
2386 | struct ext4_extent *ex1 = NULL; | 2383 | struct ext4_extent *ex1 = NULL; |
@@ -2678,26 +2675,26 @@ fix_extent_len: | |||
2678 | */ | 2675 | */ |
2679 | int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | 2676 | int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, |
2680 | ext4_lblk_t iblock, | 2677 | ext4_lblk_t iblock, |
2681 | unsigned long max_blocks, struct buffer_head *bh_result, | 2678 | unsigned int max_blocks, struct buffer_head *bh_result, |
2682 | int create, int extend_disksize) | 2679 | int create, int extend_disksize) |
2683 | { | 2680 | { |
2684 | struct ext4_ext_path *path = NULL; | 2681 | struct ext4_ext_path *path = NULL; |
2685 | struct ext4_extent_header *eh; | 2682 | struct ext4_extent_header *eh; |
2686 | struct ext4_extent newex, *ex; | 2683 | struct ext4_extent newex, *ex; |
2687 | ext4_fsblk_t goal, newblock; | 2684 | ext4_fsblk_t newblock; |
2688 | int err = 0, depth, ret; | 2685 | int err = 0, depth, ret, cache_type; |
2689 | unsigned long allocated = 0; | 2686 | unsigned int allocated = 0; |
2690 | struct ext4_allocation_request ar; | 2687 | struct ext4_allocation_request ar; |
2691 | loff_t disksize; | 2688 | loff_t disksize; |
2692 | 2689 | ||
2693 | __clear_bit(BH_New, &bh_result->b_state); | 2690 | __clear_bit(BH_New, &bh_result->b_state); |
2694 | ext_debug("blocks %u/%lu requested for inode %u\n", | 2691 | ext_debug("blocks %u/%u requested for inode %u\n", |
2695 | iblock, max_blocks, inode->i_ino); | 2692 | iblock, max_blocks, inode->i_ino); |
2696 | 2693 | ||
2697 | /* check in cache */ | 2694 | /* check in cache */ |
2698 | goal = ext4_ext_in_cache(inode, iblock, &newex); | 2695 | cache_type = ext4_ext_in_cache(inode, iblock, &newex); |
2699 | if (goal) { | 2696 | if (cache_type) { |
2700 | if (goal == EXT4_EXT_CACHE_GAP) { | 2697 | if (cache_type == EXT4_EXT_CACHE_GAP) { |
2701 | if (!create) { | 2698 | if (!create) { |
2702 | /* | 2699 | /* |
2703 | * block isn't allocated yet and | 2700 | * block isn't allocated yet and |
@@ -2706,7 +2703,7 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | |||
2706 | goto out2; | 2703 | goto out2; |
2707 | } | 2704 | } |
2708 | /* we should allocate requested block */ | 2705 | /* we should allocate requested block */ |
2709 | } else if (goal == EXT4_EXT_CACHE_EXTENT) { | 2706 | } else if (cache_type == EXT4_EXT_CACHE_EXTENT) { |
2710 | /* block is already allocated */ | 2707 | /* block is already allocated */ |
2711 | newblock = iblock | 2708 | newblock = iblock |
2712 | - le32_to_cpu(newex.ee_block) | 2709 | - le32_to_cpu(newex.ee_block) |
@@ -2854,7 +2851,7 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | |||
2854 | if (!newblock) | 2851 | if (!newblock) |
2855 | goto out2; | 2852 | goto out2; |
2856 | ext_debug("allocate new block: goal %llu, found %llu/%lu\n", | 2853 | ext_debug("allocate new block: goal %llu, found %llu/%lu\n", |
2857 | goal, newblock, allocated); | 2854 | ar.goal, newblock, allocated); |
2858 | 2855 | ||
2859 | /* try to insert new extent into found leaf and return */ | 2856 | /* try to insert new extent into found leaf and return */ |
2860 | ext4_ext_store_pblock(&newex, newblock); | 2857 | ext4_ext_store_pblock(&newex, newblock); |
@@ -2950,7 +2947,7 @@ void ext4_ext_truncate(struct inode *inode) | |||
2950 | * transaction synchronous. | 2947 | * transaction synchronous. |
2951 | */ | 2948 | */ |
2952 | if (IS_SYNC(inode)) | 2949 | if (IS_SYNC(inode)) |
2953 | handle->h_sync = 1; | 2950 | ext4_handle_sync(handle); |
2954 | 2951 | ||
2955 | out_stop: | 2952 | out_stop: |
2956 | up_write(&EXT4_I(inode)->i_data_sem); | 2953 | up_write(&EXT4_I(inode)->i_data_sem); |
@@ -3004,7 +3001,7 @@ long ext4_fallocate(struct inode *inode, int mode, loff_t offset, loff_t len) | |||
3004 | handle_t *handle; | 3001 | handle_t *handle; |
3005 | ext4_lblk_t block; | 3002 | ext4_lblk_t block; |
3006 | loff_t new_size; | 3003 | loff_t new_size; |
3007 | unsigned long max_blocks; | 3004 | unsigned int max_blocks; |
3008 | int ret = 0; | 3005 | int ret = 0; |
3009 | int ret2 = 0; | 3006 | int ret2 = 0; |
3010 | int retries = 0; | 3007 | int retries = 0; |
@@ -3083,7 +3080,7 @@ retry: | |||
3083 | /* | 3080 | /* |
3084 | * Callback function called for each extent to gather FIEMAP information. | 3081 | * Callback function called for each extent to gather FIEMAP information. |
3085 | */ | 3082 | */ |
3086 | int ext4_ext_fiemap_cb(struct inode *inode, struct ext4_ext_path *path, | 3083 | static int ext4_ext_fiemap_cb(struct inode *inode, struct ext4_ext_path *path, |
3087 | struct ext4_ext_cache *newex, struct ext4_extent *ex, | 3084 | struct ext4_ext_cache *newex, struct ext4_extent *ex, |
3088 | void *data) | 3085 | void *data) |
3089 | { | 3086 | { |
@@ -3152,7 +3149,8 @@ int ext4_ext_fiemap_cb(struct inode *inode, struct ext4_ext_path *path, | |||
3152 | /* fiemap flags we can handle specified here */ | 3149 | /* fiemap flags we can handle specified here */ |
3153 | #define EXT4_FIEMAP_FLAGS (FIEMAP_FLAG_SYNC|FIEMAP_FLAG_XATTR) | 3150 | #define EXT4_FIEMAP_FLAGS (FIEMAP_FLAG_SYNC|FIEMAP_FLAG_XATTR) |
3154 | 3151 | ||
3155 | int ext4_xattr_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo) | 3152 | static int ext4_xattr_fiemap(struct inode *inode, |
3153 | struct fiemap_extent_info *fieinfo) | ||
3156 | { | 3154 | { |
3157 | __u64 physical = 0; | 3155 | __u64 physical = 0; |
3158 | __u64 length; | 3156 | __u64 length; |