diff options
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 557 |
1 files changed, 364 insertions, 193 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 512c3d1da083..fcd66b6a8086 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -50,6 +50,7 @@ | |||
50 | #include "tree-log.h" | 50 | #include "tree-log.h" |
51 | #include "compression.h" | 51 | #include "compression.h" |
52 | #include "locking.h" | 52 | #include "locking.h" |
53 | #include "free-space-cache.h" | ||
53 | 54 | ||
54 | struct btrfs_iget_args { | 55 | struct btrfs_iget_args { |
55 | u64 ino; | 56 | u64 ino; |
@@ -70,6 +71,7 @@ static struct kmem_cache *btrfs_inode_cachep; | |||
70 | struct kmem_cache *btrfs_trans_handle_cachep; | 71 | struct kmem_cache *btrfs_trans_handle_cachep; |
71 | struct kmem_cache *btrfs_transaction_cachep; | 72 | struct kmem_cache *btrfs_transaction_cachep; |
72 | struct kmem_cache *btrfs_path_cachep; | 73 | struct kmem_cache *btrfs_path_cachep; |
74 | struct kmem_cache *btrfs_free_space_cachep; | ||
73 | 75 | ||
74 | #define S_SHIFT 12 | 76 | #define S_SHIFT 12 |
75 | static unsigned char btrfs_type_by_mode[S_IFMT >> S_SHIFT] = { | 77 | static unsigned char btrfs_type_by_mode[S_IFMT >> S_SHIFT] = { |
@@ -82,7 +84,8 @@ static unsigned char btrfs_type_by_mode[S_IFMT >> S_SHIFT] = { | |||
82 | [S_IFLNK >> S_SHIFT] = BTRFS_FT_SYMLINK, | 84 | [S_IFLNK >> S_SHIFT] = BTRFS_FT_SYMLINK, |
83 | }; | 85 | }; |
84 | 86 | ||
85 | static void btrfs_truncate(struct inode *inode); | 87 | static int btrfs_setsize(struct inode *inode, loff_t newsize); |
88 | static int btrfs_truncate(struct inode *inode); | ||
86 | static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end); | 89 | static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end); |
87 | static noinline int cow_file_range(struct inode *inode, | 90 | static noinline int cow_file_range(struct inode *inode, |
88 | struct page *locked_page, | 91 | struct page *locked_page, |
@@ -109,6 +112,7 @@ static int btrfs_init_inode_security(struct btrfs_trans_handle *trans, | |||
109 | static noinline int insert_inline_extent(struct btrfs_trans_handle *trans, | 112 | static noinline int insert_inline_extent(struct btrfs_trans_handle *trans, |
110 | struct btrfs_root *root, struct inode *inode, | 113 | struct btrfs_root *root, struct inode *inode, |
111 | u64 start, size_t size, size_t compressed_size, | 114 | u64 start, size_t size, size_t compressed_size, |
115 | int compress_type, | ||
112 | struct page **compressed_pages) | 116 | struct page **compressed_pages) |
113 | { | 117 | { |
114 | struct btrfs_key key; | 118 | struct btrfs_key key; |
@@ -123,12 +127,9 @@ static noinline int insert_inline_extent(struct btrfs_trans_handle *trans, | |||
123 | size_t cur_size = size; | 127 | size_t cur_size = size; |
124 | size_t datasize; | 128 | size_t datasize; |
125 | unsigned long offset; | 129 | unsigned long offset; |
126 | int compress_type = BTRFS_COMPRESS_NONE; | ||
127 | 130 | ||
128 | if (compressed_size && compressed_pages) { | 131 | if (compressed_size && compressed_pages) |
129 | compress_type = root->fs_info->compress_type; | ||
130 | cur_size = compressed_size; | 132 | cur_size = compressed_size; |
131 | } | ||
132 | 133 | ||
133 | path = btrfs_alloc_path(); | 134 | path = btrfs_alloc_path(); |
134 | if (!path) | 135 | if (!path) |
@@ -218,7 +219,7 @@ fail: | |||
218 | static noinline int cow_file_range_inline(struct btrfs_trans_handle *trans, | 219 | static noinline int cow_file_range_inline(struct btrfs_trans_handle *trans, |
219 | struct btrfs_root *root, | 220 | struct btrfs_root *root, |
220 | struct inode *inode, u64 start, u64 end, | 221 | struct inode *inode, u64 start, u64 end, |
221 | size_t compressed_size, | 222 | size_t compressed_size, int compress_type, |
222 | struct page **compressed_pages) | 223 | struct page **compressed_pages) |
223 | { | 224 | { |
224 | u64 isize = i_size_read(inode); | 225 | u64 isize = i_size_read(inode); |
@@ -251,7 +252,7 @@ static noinline int cow_file_range_inline(struct btrfs_trans_handle *trans, | |||
251 | inline_len = min_t(u64, isize, actual_end); | 252 | inline_len = min_t(u64, isize, actual_end); |
252 | ret = insert_inline_extent(trans, root, inode, start, | 253 | ret = insert_inline_extent(trans, root, inode, start, |
253 | inline_len, compressed_size, | 254 | inline_len, compressed_size, |
254 | compressed_pages); | 255 | compress_type, compressed_pages); |
255 | BUG_ON(ret); | 256 | BUG_ON(ret); |
256 | btrfs_delalloc_release_metadata(inode, end + 1 - start); | 257 | btrfs_delalloc_release_metadata(inode, end + 1 - start); |
257 | btrfs_drop_extent_cache(inode, start, aligned_end - 1, 0); | 258 | btrfs_drop_extent_cache(inode, start, aligned_end - 1, 0); |
@@ -288,6 +289,7 @@ static noinline int add_async_extent(struct async_cow *cow, | |||
288 | struct async_extent *async_extent; | 289 | struct async_extent *async_extent; |
289 | 290 | ||
290 | async_extent = kmalloc(sizeof(*async_extent), GFP_NOFS); | 291 | async_extent = kmalloc(sizeof(*async_extent), GFP_NOFS); |
292 | BUG_ON(!async_extent); | ||
291 | async_extent->start = start; | 293 | async_extent->start = start; |
292 | async_extent->ram_size = ram_size; | 294 | async_extent->ram_size = ram_size; |
293 | async_extent->compressed_size = compressed_size; | 295 | async_extent->compressed_size = compressed_size; |
@@ -382,9 +384,11 @@ again: | |||
382 | */ | 384 | */ |
383 | if (!(BTRFS_I(inode)->flags & BTRFS_INODE_NOCOMPRESS) && | 385 | if (!(BTRFS_I(inode)->flags & BTRFS_INODE_NOCOMPRESS) && |
384 | (btrfs_test_opt(root, COMPRESS) || | 386 | (btrfs_test_opt(root, COMPRESS) || |
385 | (BTRFS_I(inode)->force_compress))) { | 387 | (BTRFS_I(inode)->force_compress) || |
388 | (BTRFS_I(inode)->flags & BTRFS_INODE_COMPRESS))) { | ||
386 | WARN_ON(pages); | 389 | WARN_ON(pages); |
387 | pages = kzalloc(sizeof(struct page *) * nr_pages, GFP_NOFS); | 390 | pages = kzalloc(sizeof(struct page *) * nr_pages, GFP_NOFS); |
391 | BUG_ON(!pages); | ||
388 | 392 | ||
389 | if (BTRFS_I(inode)->force_compress) | 393 | if (BTRFS_I(inode)->force_compress) |
390 | compress_type = BTRFS_I(inode)->force_compress; | 394 | compress_type = BTRFS_I(inode)->force_compress; |
@@ -427,12 +431,13 @@ again: | |||
427 | * to make an uncompressed inline extent. | 431 | * to make an uncompressed inline extent. |
428 | */ | 432 | */ |
429 | ret = cow_file_range_inline(trans, root, inode, | 433 | ret = cow_file_range_inline(trans, root, inode, |
430 | start, end, 0, NULL); | 434 | start, end, 0, 0, NULL); |
431 | } else { | 435 | } else { |
432 | /* try making a compressed inline extent */ | 436 | /* try making a compressed inline extent */ |
433 | ret = cow_file_range_inline(trans, root, inode, | 437 | ret = cow_file_range_inline(trans, root, inode, |
434 | start, end, | 438 | start, end, |
435 | total_compressed, pages); | 439 | total_compressed, |
440 | compress_type, pages); | ||
436 | } | 441 | } |
437 | if (ret == 0) { | 442 | if (ret == 0) { |
438 | /* | 443 | /* |
@@ -786,7 +791,7 @@ static noinline int cow_file_range(struct inode *inode, | |||
786 | if (start == 0) { | 791 | if (start == 0) { |
787 | /* lets try to make an inline extent */ | 792 | /* lets try to make an inline extent */ |
788 | ret = cow_file_range_inline(trans, root, inode, | 793 | ret = cow_file_range_inline(trans, root, inode, |
789 | start, end, 0, NULL); | 794 | start, end, 0, 0, NULL); |
790 | if (ret == 0) { | 795 | if (ret == 0) { |
791 | extent_clear_unlock_delalloc(inode, | 796 | extent_clear_unlock_delalloc(inode, |
792 | &BTRFS_I(inode)->io_tree, | 797 | &BTRFS_I(inode)->io_tree, |
@@ -1254,7 +1259,8 @@ static int run_delalloc_range(struct inode *inode, struct page *locked_page, | |||
1254 | ret = run_delalloc_nocow(inode, locked_page, start, end, | 1259 | ret = run_delalloc_nocow(inode, locked_page, start, end, |
1255 | page_started, 0, nr_written); | 1260 | page_started, 0, nr_written); |
1256 | else if (!btrfs_test_opt(root, COMPRESS) && | 1261 | else if (!btrfs_test_opt(root, COMPRESS) && |
1257 | !(BTRFS_I(inode)->force_compress)) | 1262 | !(BTRFS_I(inode)->force_compress) && |
1263 | !(BTRFS_I(inode)->flags & BTRFS_INODE_COMPRESS)) | ||
1258 | ret = cow_file_range(inode, locked_page, start, end, | 1264 | ret = cow_file_range(inode, locked_page, start, end, |
1259 | page_started, nr_written, 1); | 1265 | page_started, nr_written, 1); |
1260 | else | 1266 | else |
@@ -1461,8 +1467,11 @@ static int btrfs_submit_bio_hook(struct inode *inode, int rw, struct bio *bio, | |||
1461 | if (bio_flags & EXTENT_BIO_COMPRESSED) { | 1467 | if (bio_flags & EXTENT_BIO_COMPRESSED) { |
1462 | return btrfs_submit_compressed_read(inode, bio, | 1468 | return btrfs_submit_compressed_read(inode, bio, |
1463 | mirror_num, bio_flags); | 1469 | mirror_num, bio_flags); |
1464 | } else if (!skip_sum) | 1470 | } else if (!skip_sum) { |
1465 | btrfs_lookup_bio_sums(root, inode, bio, NULL); | 1471 | ret = btrfs_lookup_bio_sums(root, inode, bio, NULL); |
1472 | if (ret) | ||
1473 | return ret; | ||
1474 | } | ||
1466 | goto mapit; | 1475 | goto mapit; |
1467 | } else if (!skip_sum) { | 1476 | } else if (!skip_sum) { |
1468 | /* csum items have already been cloned */ | 1477 | /* csum items have already been cloned */ |
@@ -1761,9 +1770,12 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
1761 | add_pending_csums(trans, inode, ordered_extent->file_offset, | 1770 | add_pending_csums(trans, inode, ordered_extent->file_offset, |
1762 | &ordered_extent->list); | 1771 | &ordered_extent->list); |
1763 | 1772 | ||
1764 | btrfs_ordered_update_i_size(inode, 0, ordered_extent); | 1773 | ret = btrfs_ordered_update_i_size(inode, 0, ordered_extent); |
1765 | ret = btrfs_update_inode(trans, root, inode); | 1774 | if (!ret) { |
1766 | BUG_ON(ret); | 1775 | ret = btrfs_update_inode(trans, root, inode); |
1776 | BUG_ON(ret); | ||
1777 | } | ||
1778 | ret = 0; | ||
1767 | out: | 1779 | out: |
1768 | if (nolock) { | 1780 | if (nolock) { |
1769 | if (trans) | 1781 | if (trans) |
@@ -1785,6 +1797,8 @@ out: | |||
1785 | static int btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end, | 1797 | static int btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end, |
1786 | struct extent_state *state, int uptodate) | 1798 | struct extent_state *state, int uptodate) |
1787 | { | 1799 | { |
1800 | trace_btrfs_writepage_end_io_hook(page, start, end, uptodate); | ||
1801 | |||
1788 | ClearPagePrivate2(page); | 1802 | ClearPagePrivate2(page); |
1789 | return btrfs_finish_ordered_io(page->mapping->host, start, end); | 1803 | return btrfs_finish_ordered_io(page->mapping->host, start, end); |
1790 | } | 1804 | } |
@@ -1895,10 +1909,10 @@ static int btrfs_io_failed_hook(struct bio *failed_bio, | |||
1895 | else | 1909 | else |
1896 | rw = READ; | 1910 | rw = READ; |
1897 | 1911 | ||
1898 | BTRFS_I(inode)->io_tree.ops->submit_bio_hook(inode, rw, bio, | 1912 | ret = BTRFS_I(inode)->io_tree.ops->submit_bio_hook(inode, rw, bio, |
1899 | failrec->last_mirror, | 1913 | failrec->last_mirror, |
1900 | failrec->bio_flags, 0); | 1914 | failrec->bio_flags, 0); |
1901 | return 0; | 1915 | return ret; |
1902 | } | 1916 | } |
1903 | 1917 | ||
1904 | /* | 1918 | /* |
@@ -2210,8 +2224,6 @@ int btrfs_orphan_add(struct btrfs_trans_handle *trans, struct inode *inode) | |||
2210 | insert = 1; | 2224 | insert = 1; |
2211 | #endif | 2225 | #endif |
2212 | insert = 1; | 2226 | insert = 1; |
2213 | } else { | ||
2214 | WARN_ON(!BTRFS_I(inode)->orphan_meta_reserved); | ||
2215 | } | 2227 | } |
2216 | 2228 | ||
2217 | if (!BTRFS_I(inode)->orphan_meta_reserved) { | 2229 | if (!BTRFS_I(inode)->orphan_meta_reserved) { |
@@ -2282,7 +2294,7 @@ int btrfs_orphan_del(struct btrfs_trans_handle *trans, struct inode *inode) | |||
2282 | * this cleans up any orphans that may be left on the list from the last use | 2294 | * this cleans up any orphans that may be left on the list from the last use |
2283 | * of this root. | 2295 | * of this root. |
2284 | */ | 2296 | */ |
2285 | void btrfs_orphan_cleanup(struct btrfs_root *root) | 2297 | int btrfs_orphan_cleanup(struct btrfs_root *root) |
2286 | { | 2298 | { |
2287 | struct btrfs_path *path; | 2299 | struct btrfs_path *path; |
2288 | struct extent_buffer *leaf; | 2300 | struct extent_buffer *leaf; |
@@ -2292,10 +2304,13 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2292 | int ret = 0, nr_unlink = 0, nr_truncate = 0; | 2304 | int ret = 0, nr_unlink = 0, nr_truncate = 0; |
2293 | 2305 | ||
2294 | if (cmpxchg(&root->orphan_cleanup_state, 0, ORPHAN_CLEANUP_STARTED)) | 2306 | if (cmpxchg(&root->orphan_cleanup_state, 0, ORPHAN_CLEANUP_STARTED)) |
2295 | return; | 2307 | return 0; |
2296 | 2308 | ||
2297 | path = btrfs_alloc_path(); | 2309 | path = btrfs_alloc_path(); |
2298 | BUG_ON(!path); | 2310 | if (!path) { |
2311 | ret = -ENOMEM; | ||
2312 | goto out; | ||
2313 | } | ||
2299 | path->reada = -1; | 2314 | path->reada = -1; |
2300 | 2315 | ||
2301 | key.objectid = BTRFS_ORPHAN_OBJECTID; | 2316 | key.objectid = BTRFS_ORPHAN_OBJECTID; |
@@ -2304,18 +2319,16 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2304 | 2319 | ||
2305 | while (1) { | 2320 | while (1) { |
2306 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); | 2321 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); |
2307 | if (ret < 0) { | 2322 | if (ret < 0) |
2308 | printk(KERN_ERR "Error searching slot for orphan: %d" | 2323 | goto out; |
2309 | "\n", ret); | ||
2310 | break; | ||
2311 | } | ||
2312 | 2324 | ||
2313 | /* | 2325 | /* |
2314 | * if ret == 0 means we found what we were searching for, which | 2326 | * if ret == 0 means we found what we were searching for, which |
2315 | * is weird, but possible, so only screw with path if we didnt | 2327 | * is weird, but possible, so only screw with path if we didn't |
2316 | * find the key and see if we have stuff that matches | 2328 | * find the key and see if we have stuff that matches |
2317 | */ | 2329 | */ |
2318 | if (ret > 0) { | 2330 | if (ret > 0) { |
2331 | ret = 0; | ||
2319 | if (path->slots[0] == 0) | 2332 | if (path->slots[0] == 0) |
2320 | break; | 2333 | break; |
2321 | path->slots[0]--; | 2334 | path->slots[0]--; |
@@ -2343,7 +2356,10 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2343 | found_key.type = BTRFS_INODE_ITEM_KEY; | 2356 | found_key.type = BTRFS_INODE_ITEM_KEY; |
2344 | found_key.offset = 0; | 2357 | found_key.offset = 0; |
2345 | inode = btrfs_iget(root->fs_info->sb, &found_key, root, NULL); | 2358 | inode = btrfs_iget(root->fs_info->sb, &found_key, root, NULL); |
2346 | BUG_ON(IS_ERR(inode)); | 2359 | if (IS_ERR(inode)) { |
2360 | ret = PTR_ERR(inode); | ||
2361 | goto out; | ||
2362 | } | ||
2347 | 2363 | ||
2348 | /* | 2364 | /* |
2349 | * add this inode to the orphan list so btrfs_orphan_del does | 2365 | * add this inode to the orphan list so btrfs_orphan_del does |
@@ -2361,7 +2377,10 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2361 | */ | 2377 | */ |
2362 | if (is_bad_inode(inode)) { | 2378 | if (is_bad_inode(inode)) { |
2363 | trans = btrfs_start_transaction(root, 0); | 2379 | trans = btrfs_start_transaction(root, 0); |
2364 | BUG_ON(IS_ERR(trans)); | 2380 | if (IS_ERR(trans)) { |
2381 | ret = PTR_ERR(trans); | ||
2382 | goto out; | ||
2383 | } | ||
2365 | btrfs_orphan_del(trans, inode); | 2384 | btrfs_orphan_del(trans, inode); |
2366 | btrfs_end_transaction(trans, root); | 2385 | btrfs_end_transaction(trans, root); |
2367 | iput(inode); | 2386 | iput(inode); |
@@ -2370,17 +2389,22 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2370 | 2389 | ||
2371 | /* if we have links, this was a truncate, lets do that */ | 2390 | /* if we have links, this was a truncate, lets do that */ |
2372 | if (inode->i_nlink) { | 2391 | if (inode->i_nlink) { |
2392 | if (!S_ISREG(inode->i_mode)) { | ||
2393 | WARN_ON(1); | ||
2394 | iput(inode); | ||
2395 | continue; | ||
2396 | } | ||
2373 | nr_truncate++; | 2397 | nr_truncate++; |
2374 | btrfs_truncate(inode); | 2398 | ret = btrfs_truncate(inode); |
2375 | } else { | 2399 | } else { |
2376 | nr_unlink++; | 2400 | nr_unlink++; |
2377 | } | 2401 | } |
2378 | 2402 | ||
2379 | /* this will do delete_inode and everything for us */ | 2403 | /* this will do delete_inode and everything for us */ |
2380 | iput(inode); | 2404 | iput(inode); |
2405 | if (ret) | ||
2406 | goto out; | ||
2381 | } | 2407 | } |
2382 | btrfs_free_path(path); | ||
2383 | |||
2384 | root->orphan_cleanup_state = ORPHAN_CLEANUP_DONE; | 2408 | root->orphan_cleanup_state = ORPHAN_CLEANUP_DONE; |
2385 | 2409 | ||
2386 | if (root->orphan_block_rsv) | 2410 | if (root->orphan_block_rsv) |
@@ -2389,14 +2413,20 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2389 | 2413 | ||
2390 | if (root->orphan_block_rsv || root->orphan_item_inserted) { | 2414 | if (root->orphan_block_rsv || root->orphan_item_inserted) { |
2391 | trans = btrfs_join_transaction(root, 1); | 2415 | trans = btrfs_join_transaction(root, 1); |
2392 | BUG_ON(IS_ERR(trans)); | 2416 | if (!IS_ERR(trans)) |
2393 | btrfs_end_transaction(trans, root); | 2417 | btrfs_end_transaction(trans, root); |
2394 | } | 2418 | } |
2395 | 2419 | ||
2396 | if (nr_unlink) | 2420 | if (nr_unlink) |
2397 | printk(KERN_INFO "btrfs: unlinked %d orphans\n", nr_unlink); | 2421 | printk(KERN_INFO "btrfs: unlinked %d orphans\n", nr_unlink); |
2398 | if (nr_truncate) | 2422 | if (nr_truncate) |
2399 | printk(KERN_INFO "btrfs: truncated %d orphans\n", nr_truncate); | 2423 | printk(KERN_INFO "btrfs: truncated %d orphans\n", nr_truncate); |
2424 | |||
2425 | out: | ||
2426 | if (ret) | ||
2427 | printk(KERN_CRIT "btrfs: could not do orphan cleanup %d\n", ret); | ||
2428 | btrfs_free_path(path); | ||
2429 | return ret; | ||
2400 | } | 2430 | } |
2401 | 2431 | ||
2402 | /* | 2432 | /* |
@@ -2563,6 +2593,13 @@ static void fill_inode_item(struct btrfs_trans_handle *trans, | |||
2563 | struct btrfs_inode_item *item, | 2593 | struct btrfs_inode_item *item, |
2564 | struct inode *inode) | 2594 | struct inode *inode) |
2565 | { | 2595 | { |
2596 | if (!leaf->map_token) | ||
2597 | map_private_extent_buffer(leaf, (unsigned long)item, | ||
2598 | sizeof(struct btrfs_inode_item), | ||
2599 | &leaf->map_token, &leaf->kaddr, | ||
2600 | &leaf->map_start, &leaf->map_len, | ||
2601 | KM_USER1); | ||
2602 | |||
2566 | btrfs_set_inode_uid(leaf, item, inode->i_uid); | 2603 | btrfs_set_inode_uid(leaf, item, inode->i_uid); |
2567 | btrfs_set_inode_gid(leaf, item, inode->i_gid); | 2604 | btrfs_set_inode_gid(leaf, item, inode->i_gid); |
2568 | btrfs_set_inode_size(leaf, item, BTRFS_I(inode)->disk_i_size); | 2605 | btrfs_set_inode_size(leaf, item, BTRFS_I(inode)->disk_i_size); |
@@ -2591,6 +2628,11 @@ static void fill_inode_item(struct btrfs_trans_handle *trans, | |||
2591 | btrfs_set_inode_rdev(leaf, item, inode->i_rdev); | 2628 | btrfs_set_inode_rdev(leaf, item, inode->i_rdev); |
2592 | btrfs_set_inode_flags(leaf, item, BTRFS_I(inode)->flags); | 2629 | btrfs_set_inode_flags(leaf, item, BTRFS_I(inode)->flags); |
2593 | btrfs_set_inode_block_group(leaf, item, BTRFS_I(inode)->block_group); | 2630 | btrfs_set_inode_block_group(leaf, item, BTRFS_I(inode)->block_group); |
2631 | |||
2632 | if (leaf->map_token) { | ||
2633 | unmap_extent_buffer(leaf, leaf->map_token, KM_USER1); | ||
2634 | leaf->map_token = NULL; | ||
2635 | } | ||
2594 | } | 2636 | } |
2595 | 2637 | ||
2596 | /* | 2638 | /* |
@@ -2635,10 +2677,10 @@ failed: | |||
2635 | * recovery code. It remove a link in a directory with a given name, and | 2677 | * recovery code. It remove a link in a directory with a given name, and |
2636 | * also drops the back refs in the inode to the directory | 2678 | * also drops the back refs in the inode to the directory |
2637 | */ | 2679 | */ |
2638 | int btrfs_unlink_inode(struct btrfs_trans_handle *trans, | 2680 | static int __btrfs_unlink_inode(struct btrfs_trans_handle *trans, |
2639 | struct btrfs_root *root, | 2681 | struct btrfs_root *root, |
2640 | struct inode *dir, struct inode *inode, | 2682 | struct inode *dir, struct inode *inode, |
2641 | const char *name, int name_len) | 2683 | const char *name, int name_len) |
2642 | { | 2684 | { |
2643 | struct btrfs_path *path; | 2685 | struct btrfs_path *path; |
2644 | int ret = 0; | 2686 | int ret = 0; |
@@ -2710,12 +2752,25 @@ err: | |||
2710 | btrfs_i_size_write(dir, dir->i_size - name_len * 2); | 2752 | btrfs_i_size_write(dir, dir->i_size - name_len * 2); |
2711 | inode->i_ctime = dir->i_mtime = dir->i_ctime = CURRENT_TIME; | 2753 | inode->i_ctime = dir->i_mtime = dir->i_ctime = CURRENT_TIME; |
2712 | btrfs_update_inode(trans, root, dir); | 2754 | btrfs_update_inode(trans, root, dir); |
2713 | btrfs_drop_nlink(inode); | ||
2714 | ret = btrfs_update_inode(trans, root, inode); | ||
2715 | out: | 2755 | out: |
2716 | return ret; | 2756 | return ret; |
2717 | } | 2757 | } |
2718 | 2758 | ||
2759 | int btrfs_unlink_inode(struct btrfs_trans_handle *trans, | ||
2760 | struct btrfs_root *root, | ||
2761 | struct inode *dir, struct inode *inode, | ||
2762 | const char *name, int name_len) | ||
2763 | { | ||
2764 | int ret; | ||
2765 | ret = __btrfs_unlink_inode(trans, root, dir, inode, name, name_len); | ||
2766 | if (!ret) { | ||
2767 | btrfs_drop_nlink(inode); | ||
2768 | ret = btrfs_update_inode(trans, root, inode); | ||
2769 | } | ||
2770 | return ret; | ||
2771 | } | ||
2772 | |||
2773 | |||
2719 | /* helper to check if there is any shared block in the path */ | 2774 | /* helper to check if there is any shared block in the path */ |
2720 | static int check_path_shared(struct btrfs_root *root, | 2775 | static int check_path_shared(struct btrfs_root *root, |
2721 | struct btrfs_path *path) | 2776 | struct btrfs_path *path) |
@@ -3537,7 +3592,13 @@ out: | |||
3537 | return ret; | 3592 | return ret; |
3538 | } | 3593 | } |
3539 | 3594 | ||
3540 | int btrfs_cont_expand(struct inode *inode, loff_t size) | 3595 | /* |
3596 | * This function puts in dummy file extents for the area we're creating a hole | ||
3597 | * for. So if we are truncating this file to a larger size we need to insert | ||
3598 | * these file extents so that btrfs_get_extent will return a EXTENT_MAP_HOLE for | ||
3599 | * the range between oldsize and size | ||
3600 | */ | ||
3601 | int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size) | ||
3541 | { | 3602 | { |
3542 | struct btrfs_trans_handle *trans; | 3603 | struct btrfs_trans_handle *trans; |
3543 | struct btrfs_root *root = BTRFS_I(inode)->root; | 3604 | struct btrfs_root *root = BTRFS_I(inode)->root; |
@@ -3545,7 +3606,7 @@ int btrfs_cont_expand(struct inode *inode, loff_t size) | |||
3545 | struct extent_map *em = NULL; | 3606 | struct extent_map *em = NULL; |
3546 | struct extent_state *cached_state = NULL; | 3607 | struct extent_state *cached_state = NULL; |
3547 | u64 mask = root->sectorsize - 1; | 3608 | u64 mask = root->sectorsize - 1; |
3548 | u64 hole_start = (inode->i_size + mask) & ~mask; | 3609 | u64 hole_start = (oldsize + mask) & ~mask; |
3549 | u64 block_end = (size + mask) & ~mask; | 3610 | u64 block_end = (size + mask) & ~mask; |
3550 | u64 last_byte; | 3611 | u64 last_byte; |
3551 | u64 cur_offset; | 3612 | u64 cur_offset; |
@@ -3590,13 +3651,15 @@ int btrfs_cont_expand(struct inode *inode, loff_t size) | |||
3590 | err = btrfs_drop_extents(trans, inode, cur_offset, | 3651 | err = btrfs_drop_extents(trans, inode, cur_offset, |
3591 | cur_offset + hole_size, | 3652 | cur_offset + hole_size, |
3592 | &hint_byte, 1); | 3653 | &hint_byte, 1); |
3593 | BUG_ON(err); | 3654 | if (err) |
3655 | break; | ||
3594 | 3656 | ||
3595 | err = btrfs_insert_file_extent(trans, root, | 3657 | err = btrfs_insert_file_extent(trans, root, |
3596 | inode->i_ino, cur_offset, 0, | 3658 | inode->i_ino, cur_offset, 0, |
3597 | 0, hole_size, 0, hole_size, | 3659 | 0, hole_size, 0, hole_size, |
3598 | 0, 0, 0); | 3660 | 0, 0, 0); |
3599 | BUG_ON(err); | 3661 | if (err) |
3662 | break; | ||
3600 | 3663 | ||
3601 | btrfs_drop_extent_cache(inode, hole_start, | 3664 | btrfs_drop_extent_cache(inode, hole_start, |
3602 | last_byte - 1, 0); | 3665 | last_byte - 1, 0); |
@@ -3616,81 +3679,41 @@ int btrfs_cont_expand(struct inode *inode, loff_t size) | |||
3616 | return err; | 3679 | return err; |
3617 | } | 3680 | } |
3618 | 3681 | ||
3619 | static int btrfs_setattr_size(struct inode *inode, struct iattr *attr) | 3682 | static int btrfs_setsize(struct inode *inode, loff_t newsize) |
3620 | { | 3683 | { |
3621 | struct btrfs_root *root = BTRFS_I(inode)->root; | 3684 | loff_t oldsize = i_size_read(inode); |
3622 | struct btrfs_trans_handle *trans; | ||
3623 | unsigned long nr; | ||
3624 | int ret; | 3685 | int ret; |
3625 | 3686 | ||
3626 | if (attr->ia_size == inode->i_size) | 3687 | if (newsize == oldsize) |
3627 | return 0; | 3688 | return 0; |
3628 | 3689 | ||
3629 | if (attr->ia_size > inode->i_size) { | 3690 | if (newsize > oldsize) { |
3630 | unsigned long limit; | 3691 | i_size_write(inode, newsize); |
3631 | limit = current->signal->rlim[RLIMIT_FSIZE].rlim_cur; | 3692 | btrfs_ordered_update_i_size(inode, i_size_read(inode), NULL); |
3632 | if (attr->ia_size > inode->i_sb->s_maxbytes) | 3693 | truncate_pagecache(inode, oldsize, newsize); |
3633 | return -EFBIG; | 3694 | ret = btrfs_cont_expand(inode, oldsize, newsize); |
3634 | if (limit != RLIM_INFINITY && attr->ia_size > limit) { | ||
3635 | send_sig(SIGXFSZ, current, 0); | ||
3636 | return -EFBIG; | ||
3637 | } | ||
3638 | } | ||
3639 | |||
3640 | trans = btrfs_start_transaction(root, 5); | ||
3641 | if (IS_ERR(trans)) | ||
3642 | return PTR_ERR(trans); | ||
3643 | |||
3644 | btrfs_set_trans_block_group(trans, inode); | ||
3645 | |||
3646 | ret = btrfs_orphan_add(trans, inode); | ||
3647 | BUG_ON(ret); | ||
3648 | |||
3649 | nr = trans->blocks_used; | ||
3650 | btrfs_end_transaction(trans, root); | ||
3651 | btrfs_btree_balance_dirty(root, nr); | ||
3652 | |||
3653 | if (attr->ia_size > inode->i_size) { | ||
3654 | ret = btrfs_cont_expand(inode, attr->ia_size); | ||
3655 | if (ret) { | 3695 | if (ret) { |
3656 | btrfs_truncate(inode); | 3696 | btrfs_setsize(inode, oldsize); |
3657 | return ret; | 3697 | return ret; |
3658 | } | 3698 | } |
3659 | 3699 | ||
3660 | i_size_write(inode, attr->ia_size); | 3700 | mark_inode_dirty(inode); |
3661 | btrfs_ordered_update_i_size(inode, inode->i_size, NULL); | 3701 | } else { |
3662 | 3702 | ||
3663 | trans = btrfs_start_transaction(root, 0); | 3703 | /* |
3664 | BUG_ON(IS_ERR(trans)); | 3704 | * We're truncating a file that used to have good data down to |
3665 | btrfs_set_trans_block_group(trans, inode); | 3705 | * zero. Make sure it gets into the ordered flush list so that |
3666 | trans->block_rsv = root->orphan_block_rsv; | 3706 | * any new writes get down to disk quickly. |
3667 | BUG_ON(!trans->block_rsv); | 3707 | */ |
3708 | if (newsize == 0) | ||
3709 | BTRFS_I(inode)->ordered_data_close = 1; | ||
3668 | 3710 | ||
3669 | ret = btrfs_update_inode(trans, root, inode); | 3711 | /* we don't support swapfiles, so vmtruncate shouldn't fail */ |
3670 | BUG_ON(ret); | 3712 | truncate_setsize(inode, newsize); |
3671 | if (inode->i_nlink > 0) { | 3713 | ret = btrfs_truncate(inode); |
3672 | ret = btrfs_orphan_del(trans, inode); | ||
3673 | BUG_ON(ret); | ||
3674 | } | ||
3675 | nr = trans->blocks_used; | ||
3676 | btrfs_end_transaction(trans, root); | ||
3677 | btrfs_btree_balance_dirty(root, nr); | ||
3678 | return 0; | ||
3679 | } | 3714 | } |
3680 | 3715 | ||
3681 | /* | 3716 | return ret; |
3682 | * We're truncating a file that used to have good data down to | ||
3683 | * zero. Make sure it gets into the ordered flush list so that | ||
3684 | * any new writes get down to disk quickly. | ||
3685 | */ | ||
3686 | if (attr->ia_size == 0) | ||
3687 | BTRFS_I(inode)->ordered_data_close = 1; | ||
3688 | |||
3689 | /* we don't support swapfiles, so vmtruncate shouldn't fail */ | ||
3690 | ret = vmtruncate(inode, attr->ia_size); | ||
3691 | BUG_ON(ret); | ||
3692 | |||
3693 | return 0; | ||
3694 | } | 3717 | } |
3695 | 3718 | ||
3696 | static int btrfs_setattr(struct dentry *dentry, struct iattr *attr) | 3719 | static int btrfs_setattr(struct dentry *dentry, struct iattr *attr) |
@@ -3707,7 +3730,7 @@ static int btrfs_setattr(struct dentry *dentry, struct iattr *attr) | |||
3707 | return err; | 3730 | return err; |
3708 | 3731 | ||
3709 | if (S_ISREG(inode->i_mode) && (attr->ia_valid & ATTR_SIZE)) { | 3732 | if (S_ISREG(inode->i_mode) && (attr->ia_valid & ATTR_SIZE)) { |
3710 | err = btrfs_setattr_size(inode, attr); | 3733 | err = btrfs_setsize(inode, attr->ia_size); |
3711 | if (err) | 3734 | if (err) |
3712 | return err; | 3735 | return err; |
3713 | } | 3736 | } |
@@ -3730,6 +3753,8 @@ void btrfs_evict_inode(struct inode *inode) | |||
3730 | unsigned long nr; | 3753 | unsigned long nr; |
3731 | int ret; | 3754 | int ret; |
3732 | 3755 | ||
3756 | trace_btrfs_inode_evict(inode); | ||
3757 | |||
3733 | truncate_inode_pages(&inode->i_data, 0); | 3758 | truncate_inode_pages(&inode->i_data, 0); |
3734 | if (inode->i_nlink && (btrfs_root_refs(&root->root_item) != 0 || | 3759 | if (inode->i_nlink && (btrfs_root_refs(&root->root_item) != 0 || |
3735 | root == root->fs_info->tree_root)) | 3760 | root == root->fs_info->tree_root)) |
@@ -4072,7 +4097,6 @@ struct inode *btrfs_iget(struct super_block *s, struct btrfs_key *location, | |||
4072 | BTRFS_I(inode)->root = root; | 4097 | BTRFS_I(inode)->root = root; |
4073 | memcpy(&BTRFS_I(inode)->location, location, sizeof(*location)); | 4098 | memcpy(&BTRFS_I(inode)->location, location, sizeof(*location)); |
4074 | btrfs_read_locked_inode(inode); | 4099 | btrfs_read_locked_inode(inode); |
4075 | |||
4076 | inode_tree_add(inode); | 4100 | inode_tree_add(inode); |
4077 | unlock_new_inode(inode); | 4101 | unlock_new_inode(inode); |
4078 | if (new) | 4102 | if (new) |
@@ -4147,8 +4171,10 @@ struct inode *btrfs_lookup_dentry(struct inode *dir, struct dentry *dentry) | |||
4147 | if (!IS_ERR(inode) && root != sub_root) { | 4171 | if (!IS_ERR(inode) && root != sub_root) { |
4148 | down_read(&root->fs_info->cleanup_work_sem); | 4172 | down_read(&root->fs_info->cleanup_work_sem); |
4149 | if (!(inode->i_sb->s_flags & MS_RDONLY)) | 4173 | if (!(inode->i_sb->s_flags & MS_RDONLY)) |
4150 | btrfs_orphan_cleanup(sub_root); | 4174 | ret = btrfs_orphan_cleanup(sub_root); |
4151 | up_read(&root->fs_info->cleanup_work_sem); | 4175 | up_read(&root->fs_info->cleanup_work_sem); |
4176 | if (ret) | ||
4177 | inode = ERR_PTR(ret); | ||
4152 | } | 4178 | } |
4153 | 4179 | ||
4154 | return inode; | 4180 | return inode; |
@@ -4196,10 +4222,8 @@ static int btrfs_real_readdir(struct file *filp, void *dirent, | |||
4196 | struct btrfs_key found_key; | 4222 | struct btrfs_key found_key; |
4197 | struct btrfs_path *path; | 4223 | struct btrfs_path *path; |
4198 | int ret; | 4224 | int ret; |
4199 | u32 nritems; | ||
4200 | struct extent_buffer *leaf; | 4225 | struct extent_buffer *leaf; |
4201 | int slot; | 4226 | int slot; |
4202 | int advance; | ||
4203 | unsigned char d_type; | 4227 | unsigned char d_type; |
4204 | int over = 0; | 4228 | int over = 0; |
4205 | u32 di_cur; | 4229 | u32 di_cur; |
@@ -4242,27 +4266,19 @@ static int btrfs_real_readdir(struct file *filp, void *dirent, | |||
4242 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); | 4266 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); |
4243 | if (ret < 0) | 4267 | if (ret < 0) |
4244 | goto err; | 4268 | goto err; |
4245 | advance = 0; | ||
4246 | 4269 | ||
4247 | while (1) { | 4270 | while (1) { |
4248 | leaf = path->nodes[0]; | 4271 | leaf = path->nodes[0]; |
4249 | nritems = btrfs_header_nritems(leaf); | ||
4250 | slot = path->slots[0]; | 4272 | slot = path->slots[0]; |
4251 | if (advance || slot >= nritems) { | 4273 | if (slot >= btrfs_header_nritems(leaf)) { |
4252 | if (slot >= nritems - 1) { | 4274 | ret = btrfs_next_leaf(root, path); |
4253 | ret = btrfs_next_leaf(root, path); | 4275 | if (ret < 0) |
4254 | if (ret) | 4276 | goto err; |
4255 | break; | 4277 | else if (ret > 0) |
4256 | leaf = path->nodes[0]; | 4278 | break; |
4257 | nritems = btrfs_header_nritems(leaf); | 4279 | continue; |
4258 | slot = path->slots[0]; | ||
4259 | } else { | ||
4260 | slot++; | ||
4261 | path->slots[0]++; | ||
4262 | } | ||
4263 | } | 4280 | } |
4264 | 4281 | ||
4265 | advance = 1; | ||
4266 | item = btrfs_item_nr(leaf, slot); | 4282 | item = btrfs_item_nr(leaf, slot); |
4267 | btrfs_item_key_to_cpu(leaf, &found_key, slot); | 4283 | btrfs_item_key_to_cpu(leaf, &found_key, slot); |
4268 | 4284 | ||
@@ -4271,7 +4287,7 @@ static int btrfs_real_readdir(struct file *filp, void *dirent, | |||
4271 | if (btrfs_key_type(&found_key) != key_type) | 4287 | if (btrfs_key_type(&found_key) != key_type) |
4272 | break; | 4288 | break; |
4273 | if (found_key.offset < filp->f_pos) | 4289 | if (found_key.offset < filp->f_pos) |
4274 | continue; | 4290 | goto next; |
4275 | 4291 | ||
4276 | filp->f_pos = found_key.offset; | 4292 | filp->f_pos = found_key.offset; |
4277 | 4293 | ||
@@ -4282,6 +4298,9 @@ static int btrfs_real_readdir(struct file *filp, void *dirent, | |||
4282 | while (di_cur < di_total) { | 4298 | while (di_cur < di_total) { |
4283 | struct btrfs_key location; | 4299 | struct btrfs_key location; |
4284 | 4300 | ||
4301 | if (verify_dir_item(root, leaf, di)) | ||
4302 | break; | ||
4303 | |||
4285 | name_len = btrfs_dir_name_len(leaf, di); | 4304 | name_len = btrfs_dir_name_len(leaf, di); |
4286 | if (name_len <= sizeof(tmp_name)) { | 4305 | if (name_len <= sizeof(tmp_name)) { |
4287 | name_ptr = tmp_name; | 4306 | name_ptr = tmp_name; |
@@ -4321,6 +4340,8 @@ skip: | |||
4321 | di_cur += di_len; | 4340 | di_cur += di_len; |
4322 | di = (struct btrfs_dir_item *)((char *)di + di_len); | 4341 | di = (struct btrfs_dir_item *)((char *)di + di_len); |
4323 | } | 4342 | } |
4343 | next: | ||
4344 | path->slots[0]++; | ||
4324 | } | 4345 | } |
4325 | 4346 | ||
4326 | /* Reached end of directory/root. Bump pos past the last item. */ | 4347 | /* Reached end of directory/root. Bump pos past the last item. */ |
@@ -4513,12 +4534,17 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, | |||
4513 | BUG_ON(!path); | 4534 | BUG_ON(!path); |
4514 | 4535 | ||
4515 | inode = new_inode(root->fs_info->sb); | 4536 | inode = new_inode(root->fs_info->sb); |
4516 | if (!inode) | 4537 | if (!inode) { |
4538 | btrfs_free_path(path); | ||
4517 | return ERR_PTR(-ENOMEM); | 4539 | return ERR_PTR(-ENOMEM); |
4540 | } | ||
4518 | 4541 | ||
4519 | if (dir) { | 4542 | if (dir) { |
4543 | trace_btrfs_inode_request(dir); | ||
4544 | |||
4520 | ret = btrfs_set_inode_index(dir, index); | 4545 | ret = btrfs_set_inode_index(dir, index); |
4521 | if (ret) { | 4546 | if (ret) { |
4547 | btrfs_free_path(path); | ||
4522 | iput(inode); | 4548 | iput(inode); |
4523 | return ERR_PTR(ret); | 4549 | return ERR_PTR(ret); |
4524 | } | 4550 | } |
@@ -4585,12 +4611,16 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, | |||
4585 | if ((mode & S_IFREG)) { | 4611 | if ((mode & S_IFREG)) { |
4586 | if (btrfs_test_opt(root, NODATASUM)) | 4612 | if (btrfs_test_opt(root, NODATASUM)) |
4587 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATASUM; | 4613 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATASUM; |
4588 | if (btrfs_test_opt(root, NODATACOW)) | 4614 | if (btrfs_test_opt(root, NODATACOW) || |
4615 | (BTRFS_I(dir)->flags & BTRFS_INODE_NODATACOW)) | ||
4589 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATACOW; | 4616 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATACOW; |
4590 | } | 4617 | } |
4591 | 4618 | ||
4592 | insert_inode_hash(inode); | 4619 | insert_inode_hash(inode); |
4593 | inode_tree_add(inode); | 4620 | inode_tree_add(inode); |
4621 | |||
4622 | trace_btrfs_inode_new(inode); | ||
4623 | |||
4594 | return inode; | 4624 | return inode; |
4595 | fail: | 4625 | fail: |
4596 | if (dir) | 4626 | if (dir) |
@@ -4809,10 +4839,10 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, | |||
4809 | 4839 | ||
4810 | /* do not allow sys_link's with other subvols of the same device */ | 4840 | /* do not allow sys_link's with other subvols of the same device */ |
4811 | if (root->objectid != BTRFS_I(inode)->root->objectid) | 4841 | if (root->objectid != BTRFS_I(inode)->root->objectid) |
4812 | return -EPERM; | 4842 | return -EXDEV; |
4813 | 4843 | ||
4814 | btrfs_inc_nlink(inode); | 4844 | if (inode->i_nlink == ~0U) |
4815 | inode->i_ctime = CURRENT_TIME; | 4845 | return -EMLINK; |
4816 | 4846 | ||
4817 | err = btrfs_set_inode_index(dir, &index); | 4847 | err = btrfs_set_inode_index(dir, &index); |
4818 | if (err) | 4848 | if (err) |
@@ -4829,6 +4859,9 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, | |||
4829 | goto fail; | 4859 | goto fail; |
4830 | } | 4860 | } |
4831 | 4861 | ||
4862 | btrfs_inc_nlink(inode); | ||
4863 | inode->i_ctime = CURRENT_TIME; | ||
4864 | |||
4832 | btrfs_set_trans_block_group(trans, dir); | 4865 | btrfs_set_trans_block_group(trans, dir); |
4833 | ihold(inode); | 4866 | ihold(inode); |
4834 | 4867 | ||
@@ -5198,7 +5231,7 @@ again: | |||
5198 | btrfs_mark_buffer_dirty(leaf); | 5231 | btrfs_mark_buffer_dirty(leaf); |
5199 | } | 5232 | } |
5200 | set_extent_uptodate(io_tree, em->start, | 5233 | set_extent_uptodate(io_tree, em->start, |
5201 | extent_map_end(em) - 1, GFP_NOFS); | 5234 | extent_map_end(em) - 1, NULL, GFP_NOFS); |
5202 | goto insert; | 5235 | goto insert; |
5203 | } else { | 5236 | } else { |
5204 | printk(KERN_ERR "btrfs unknown found_type %d\n", found_type); | 5237 | printk(KERN_ERR "btrfs unknown found_type %d\n", found_type); |
@@ -5265,6 +5298,9 @@ insert: | |||
5265 | } | 5298 | } |
5266 | write_unlock(&em_tree->lock); | 5299 | write_unlock(&em_tree->lock); |
5267 | out: | 5300 | out: |
5301 | |||
5302 | trace_btrfs_get_extent(root, em); | ||
5303 | |||
5268 | if (path) | 5304 | if (path) |
5269 | btrfs_free_path(path); | 5305 | btrfs_free_path(path); |
5270 | if (trans) { | 5306 | if (trans) { |
@@ -5402,17 +5438,30 @@ out: | |||
5402 | } | 5438 | } |
5403 | 5439 | ||
5404 | static struct extent_map *btrfs_new_extent_direct(struct inode *inode, | 5440 | static struct extent_map *btrfs_new_extent_direct(struct inode *inode, |
5441 | struct extent_map *em, | ||
5405 | u64 start, u64 len) | 5442 | u64 start, u64 len) |
5406 | { | 5443 | { |
5407 | struct btrfs_root *root = BTRFS_I(inode)->root; | 5444 | struct btrfs_root *root = BTRFS_I(inode)->root; |
5408 | struct btrfs_trans_handle *trans; | 5445 | struct btrfs_trans_handle *trans; |
5409 | struct extent_map *em; | ||
5410 | struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; | 5446 | struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; |
5411 | struct btrfs_key ins; | 5447 | struct btrfs_key ins; |
5412 | u64 alloc_hint; | 5448 | u64 alloc_hint; |
5413 | int ret; | 5449 | int ret; |
5450 | bool insert = false; | ||
5414 | 5451 | ||
5415 | btrfs_drop_extent_cache(inode, start, start + len - 1, 0); | 5452 | /* |
5453 | * Ok if the extent map we looked up is a hole and is for the exact | ||
5454 | * range we want, there is no reason to allocate a new one, however if | ||
5455 | * it is not right then we need to free this one and drop the cache for | ||
5456 | * our range. | ||
5457 | */ | ||
5458 | if (em->block_start != EXTENT_MAP_HOLE || em->start != start || | ||
5459 | em->len != len) { | ||
5460 | free_extent_map(em); | ||
5461 | em = NULL; | ||
5462 | insert = true; | ||
5463 | btrfs_drop_extent_cache(inode, start, start + len - 1, 0); | ||
5464 | } | ||
5416 | 5465 | ||
5417 | trans = btrfs_join_transaction(root, 0); | 5466 | trans = btrfs_join_transaction(root, 0); |
5418 | if (IS_ERR(trans)) | 5467 | if (IS_ERR(trans)) |
@@ -5428,10 +5477,12 @@ static struct extent_map *btrfs_new_extent_direct(struct inode *inode, | |||
5428 | goto out; | 5477 | goto out; |
5429 | } | 5478 | } |
5430 | 5479 | ||
5431 | em = alloc_extent_map(GFP_NOFS); | ||
5432 | if (!em) { | 5480 | if (!em) { |
5433 | em = ERR_PTR(-ENOMEM); | 5481 | em = alloc_extent_map(GFP_NOFS); |
5434 | goto out; | 5482 | if (!em) { |
5483 | em = ERR_PTR(-ENOMEM); | ||
5484 | goto out; | ||
5485 | } | ||
5435 | } | 5486 | } |
5436 | 5487 | ||
5437 | em->start = start; | 5488 | em->start = start; |
@@ -5441,9 +5492,15 @@ static struct extent_map *btrfs_new_extent_direct(struct inode *inode, | |||
5441 | em->block_start = ins.objectid; | 5492 | em->block_start = ins.objectid; |
5442 | em->block_len = ins.offset; | 5493 | em->block_len = ins.offset; |
5443 | em->bdev = root->fs_info->fs_devices->latest_bdev; | 5494 | em->bdev = root->fs_info->fs_devices->latest_bdev; |
5495 | |||
5496 | /* | ||
5497 | * We need to do this because if we're using the original em we searched | ||
5498 | * for, we could have EXTENT_FLAG_VACANCY set, and we don't want that. | ||
5499 | */ | ||
5500 | em->flags = 0; | ||
5444 | set_bit(EXTENT_FLAG_PINNED, &em->flags); | 5501 | set_bit(EXTENT_FLAG_PINNED, &em->flags); |
5445 | 5502 | ||
5446 | while (1) { | 5503 | while (insert) { |
5447 | write_lock(&em_tree->lock); | 5504 | write_lock(&em_tree->lock); |
5448 | ret = add_extent_mapping(em_tree, em); | 5505 | ret = add_extent_mapping(em_tree, em); |
5449 | write_unlock(&em_tree->lock); | 5506 | write_unlock(&em_tree->lock); |
@@ -5661,8 +5718,7 @@ must_cow: | |||
5661 | * it above | 5718 | * it above |
5662 | */ | 5719 | */ |
5663 | len = bh_result->b_size; | 5720 | len = bh_result->b_size; |
5664 | free_extent_map(em); | 5721 | em = btrfs_new_extent_direct(inode, em, start, len); |
5665 | em = btrfs_new_extent_direct(inode, start, len); | ||
5666 | if (IS_ERR(em)) | 5722 | if (IS_ERR(em)) |
5667 | return PTR_ERR(em); | 5723 | return PTR_ERR(em); |
5668 | len = min(len, em->len - (start - em->start)); | 5724 | len = min(len, em->len - (start - em->start)); |
@@ -5748,6 +5804,10 @@ static void btrfs_endio_direct_read(struct bio *bio, int err) | |||
5748 | 5804 | ||
5749 | kfree(dip->csums); | 5805 | kfree(dip->csums); |
5750 | kfree(dip); | 5806 | kfree(dip); |
5807 | |||
5808 | /* If we had a csum failure make sure to clear the uptodate flag */ | ||
5809 | if (err) | ||
5810 | clear_bit(BIO_UPTODATE, &bio->bi_flags); | ||
5751 | dio_end_io(bio, err); | 5811 | dio_end_io(bio, err); |
5752 | } | 5812 | } |
5753 | 5813 | ||
@@ -5821,8 +5881,10 @@ again: | |||
5821 | } | 5881 | } |
5822 | 5882 | ||
5823 | add_pending_csums(trans, inode, ordered->file_offset, &ordered->list); | 5883 | add_pending_csums(trans, inode, ordered->file_offset, &ordered->list); |
5824 | btrfs_ordered_update_i_size(inode, 0, ordered); | 5884 | ret = btrfs_ordered_update_i_size(inode, 0, ordered); |
5825 | btrfs_update_inode(trans, root, inode); | 5885 | if (!ret) |
5886 | btrfs_update_inode(trans, root, inode); | ||
5887 | ret = 0; | ||
5826 | out_unlock: | 5888 | out_unlock: |
5827 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, ordered->file_offset, | 5889 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, ordered->file_offset, |
5828 | ordered->file_offset + ordered->len - 1, | 5890 | ordered->file_offset + ordered->len - 1, |
@@ -5849,6 +5911,10 @@ out_done: | |||
5849 | 5911 | ||
5850 | kfree(dip->csums); | 5912 | kfree(dip->csums); |
5851 | kfree(dip); | 5913 | kfree(dip); |
5914 | |||
5915 | /* If we had an error make sure to clear the uptodate flag */ | ||
5916 | if (err) | ||
5917 | clear_bit(BIO_UPTODATE, &bio->bi_flags); | ||
5852 | dio_end_io(bio, err); | 5918 | dio_end_io(bio, err); |
5853 | } | 5919 | } |
5854 | 5920 | ||
@@ -5904,7 +5970,7 @@ static struct bio *btrfs_dio_bio_alloc(struct block_device *bdev, | |||
5904 | 5970 | ||
5905 | static inline int __btrfs_submit_dio_bio(struct bio *bio, struct inode *inode, | 5971 | static inline int __btrfs_submit_dio_bio(struct bio *bio, struct inode *inode, |
5906 | int rw, u64 file_offset, int skip_sum, | 5972 | int rw, u64 file_offset, int skip_sum, |
5907 | u32 *csums) | 5973 | u32 *csums, int async_submit) |
5908 | { | 5974 | { |
5909 | int write = rw & REQ_WRITE; | 5975 | int write = rw & REQ_WRITE; |
5910 | struct btrfs_root *root = BTRFS_I(inode)->root; | 5976 | struct btrfs_root *root = BTRFS_I(inode)->root; |
@@ -5915,18 +5981,33 @@ static inline int __btrfs_submit_dio_bio(struct bio *bio, struct inode *inode, | |||
5915 | if (ret) | 5981 | if (ret) |
5916 | goto err; | 5982 | goto err; |
5917 | 5983 | ||
5918 | if (write && !skip_sum) { | 5984 | if (skip_sum) |
5985 | goto map; | ||
5986 | |||
5987 | if (write && async_submit) { | ||
5919 | ret = btrfs_wq_submit_bio(root->fs_info, | 5988 | ret = btrfs_wq_submit_bio(root->fs_info, |
5920 | inode, rw, bio, 0, 0, | 5989 | inode, rw, bio, 0, 0, |
5921 | file_offset, | 5990 | file_offset, |
5922 | __btrfs_submit_bio_start_direct_io, | 5991 | __btrfs_submit_bio_start_direct_io, |
5923 | __btrfs_submit_bio_done); | 5992 | __btrfs_submit_bio_done); |
5924 | goto err; | 5993 | goto err; |
5925 | } else if (!skip_sum) | 5994 | } else if (write) { |
5926 | btrfs_lookup_bio_sums_dio(root, inode, bio, | 5995 | /* |
5996 | * If we aren't doing async submit, calculate the csum of the | ||
5997 | * bio now. | ||
5998 | */ | ||
5999 | ret = btrfs_csum_one_bio(root, inode, bio, file_offset, 1); | ||
6000 | if (ret) | ||
6001 | goto err; | ||
6002 | } else if (!skip_sum) { | ||
6003 | ret = btrfs_lookup_bio_sums_dio(root, inode, bio, | ||
5927 | file_offset, csums); | 6004 | file_offset, csums); |
6005 | if (ret) | ||
6006 | goto err; | ||
6007 | } | ||
5928 | 6008 | ||
5929 | ret = btrfs_map_bio(root, rw, bio, 0, 1); | 6009 | map: |
6010 | ret = btrfs_map_bio(root, rw, bio, 0, async_submit); | ||
5930 | err: | 6011 | err: |
5931 | bio_put(bio); | 6012 | bio_put(bio); |
5932 | return ret; | 6013 | return ret; |
@@ -5948,13 +6029,8 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, | |||
5948 | int nr_pages = 0; | 6029 | int nr_pages = 0; |
5949 | u32 *csums = dip->csums; | 6030 | u32 *csums = dip->csums; |
5950 | int ret = 0; | 6031 | int ret = 0; |
5951 | 6032 | int async_submit = 0; | |
5952 | bio = btrfs_dio_bio_alloc(orig_bio->bi_bdev, start_sector, GFP_NOFS); | 6033 | int write = rw & REQ_WRITE; |
5953 | if (!bio) | ||
5954 | return -ENOMEM; | ||
5955 | bio->bi_private = dip; | ||
5956 | bio->bi_end_io = btrfs_end_dio_bio; | ||
5957 | atomic_inc(&dip->pending_bios); | ||
5958 | 6034 | ||
5959 | map_length = orig_bio->bi_size; | 6035 | map_length = orig_bio->bi_size; |
5960 | ret = btrfs_map_block(map_tree, READ, start_sector << 9, | 6036 | ret = btrfs_map_block(map_tree, READ, start_sector << 9, |
@@ -5964,6 +6040,19 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, | |||
5964 | return -EIO; | 6040 | return -EIO; |
5965 | } | 6041 | } |
5966 | 6042 | ||
6043 | if (map_length >= orig_bio->bi_size) { | ||
6044 | bio = orig_bio; | ||
6045 | goto submit; | ||
6046 | } | ||
6047 | |||
6048 | async_submit = 1; | ||
6049 | bio = btrfs_dio_bio_alloc(orig_bio->bi_bdev, start_sector, GFP_NOFS); | ||
6050 | if (!bio) | ||
6051 | return -ENOMEM; | ||
6052 | bio->bi_private = dip; | ||
6053 | bio->bi_end_io = btrfs_end_dio_bio; | ||
6054 | atomic_inc(&dip->pending_bios); | ||
6055 | |||
5967 | while (bvec <= (orig_bio->bi_io_vec + orig_bio->bi_vcnt - 1)) { | 6056 | while (bvec <= (orig_bio->bi_io_vec + orig_bio->bi_vcnt - 1)) { |
5968 | if (unlikely(map_length < submit_len + bvec->bv_len || | 6057 | if (unlikely(map_length < submit_len + bvec->bv_len || |
5969 | bio_add_page(bio, bvec->bv_page, bvec->bv_len, | 6058 | bio_add_page(bio, bvec->bv_page, bvec->bv_len, |
@@ -5977,14 +6066,15 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, | |||
5977 | atomic_inc(&dip->pending_bios); | 6066 | atomic_inc(&dip->pending_bios); |
5978 | ret = __btrfs_submit_dio_bio(bio, inode, rw, | 6067 | ret = __btrfs_submit_dio_bio(bio, inode, rw, |
5979 | file_offset, skip_sum, | 6068 | file_offset, skip_sum, |
5980 | csums); | 6069 | csums, async_submit); |
5981 | if (ret) { | 6070 | if (ret) { |
5982 | bio_put(bio); | 6071 | bio_put(bio); |
5983 | atomic_dec(&dip->pending_bios); | 6072 | atomic_dec(&dip->pending_bios); |
5984 | goto out_err; | 6073 | goto out_err; |
5985 | } | 6074 | } |
5986 | 6075 | ||
5987 | if (!skip_sum) | 6076 | /* Write's use the ordered csums */ |
6077 | if (!write && !skip_sum) | ||
5988 | csums = csums + nr_pages; | 6078 | csums = csums + nr_pages; |
5989 | start_sector += submit_len >> 9; | 6079 | start_sector += submit_len >> 9; |
5990 | file_offset += submit_len; | 6080 | file_offset += submit_len; |
@@ -6013,8 +6103,9 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, | |||
6013 | } | 6103 | } |
6014 | } | 6104 | } |
6015 | 6105 | ||
6106 | submit: | ||
6016 | ret = __btrfs_submit_dio_bio(bio, inode, rw, file_offset, skip_sum, | 6107 | ret = __btrfs_submit_dio_bio(bio, inode, rw, file_offset, skip_sum, |
6017 | csums); | 6108 | csums, async_submit); |
6018 | if (!ret) | 6109 | if (!ret) |
6019 | return 0; | 6110 | return 0; |
6020 | 6111 | ||
@@ -6052,7 +6143,8 @@ static void btrfs_submit_direct(int rw, struct bio *bio, struct inode *inode, | |||
6052 | } | 6143 | } |
6053 | dip->csums = NULL; | 6144 | dip->csums = NULL; |
6054 | 6145 | ||
6055 | if (!skip_sum) { | 6146 | /* Write's use the ordered csum stuff, so we don't need dip->csums */ |
6147 | if (!write && !skip_sum) { | ||
6056 | dip->csums = kmalloc(sizeof(u32) * bio->bi_vcnt, GFP_NOFS); | 6148 | dip->csums = kmalloc(sizeof(u32) * bio->bi_vcnt, GFP_NOFS); |
6057 | if (!dip->csums) { | 6149 | if (!dip->csums) { |
6058 | kfree(dip); | 6150 | kfree(dip); |
@@ -6108,6 +6200,7 @@ static ssize_t check_direct_IO(struct btrfs_root *root, int rw, struct kiocb *io | |||
6108 | unsigned long nr_segs) | 6200 | unsigned long nr_segs) |
6109 | { | 6201 | { |
6110 | int seg; | 6202 | int seg; |
6203 | int i; | ||
6111 | size_t size; | 6204 | size_t size; |
6112 | unsigned long addr; | 6205 | unsigned long addr; |
6113 | unsigned blocksize_mask = root->sectorsize - 1; | 6206 | unsigned blocksize_mask = root->sectorsize - 1; |
@@ -6122,8 +6215,22 @@ static ssize_t check_direct_IO(struct btrfs_root *root, int rw, struct kiocb *io | |||
6122 | addr = (unsigned long)iov[seg].iov_base; | 6215 | addr = (unsigned long)iov[seg].iov_base; |
6123 | size = iov[seg].iov_len; | 6216 | size = iov[seg].iov_len; |
6124 | end += size; | 6217 | end += size; |
6125 | if ((addr & blocksize_mask) || (size & blocksize_mask)) | 6218 | if ((addr & blocksize_mask) || (size & blocksize_mask)) |
6126 | goto out; | 6219 | goto out; |
6220 | |||
6221 | /* If this is a write we don't need to check anymore */ | ||
6222 | if (rw & WRITE) | ||
6223 | continue; | ||
6224 | |||
6225 | /* | ||
6226 | * Check to make sure we don't have duplicate iov_base's in this | ||
6227 | * iovec, if so return EINVAL, otherwise we'll get csum errors | ||
6228 | * when reading back. | ||
6229 | */ | ||
6230 | for (i = seg + 1; i < nr_segs; i++) { | ||
6231 | if (iov[seg].iov_base == iov[i].iov_base) | ||
6232 | goto out; | ||
6233 | } | ||
6127 | } | 6234 | } |
6128 | retval = 0; | 6235 | retval = 0; |
6129 | out: | 6236 | out: |
@@ -6474,28 +6581,42 @@ out: | |||
6474 | return ret; | 6581 | return ret; |
6475 | } | 6582 | } |
6476 | 6583 | ||
6477 | static void btrfs_truncate(struct inode *inode) | 6584 | static int btrfs_truncate(struct inode *inode) |
6478 | { | 6585 | { |
6479 | struct btrfs_root *root = BTRFS_I(inode)->root; | 6586 | struct btrfs_root *root = BTRFS_I(inode)->root; |
6480 | int ret; | 6587 | int ret; |
6588 | int err = 0; | ||
6481 | struct btrfs_trans_handle *trans; | 6589 | struct btrfs_trans_handle *trans; |
6482 | unsigned long nr; | 6590 | unsigned long nr; |
6483 | u64 mask = root->sectorsize - 1; | 6591 | u64 mask = root->sectorsize - 1; |
6484 | 6592 | ||
6485 | if (!S_ISREG(inode->i_mode)) { | ||
6486 | WARN_ON(1); | ||
6487 | return; | ||
6488 | } | ||
6489 | |||
6490 | ret = btrfs_truncate_page(inode->i_mapping, inode->i_size); | 6593 | ret = btrfs_truncate_page(inode->i_mapping, inode->i_size); |
6491 | if (ret) | 6594 | if (ret) |
6492 | return; | 6595 | return ret; |
6493 | 6596 | ||
6494 | btrfs_wait_ordered_range(inode, inode->i_size & (~mask), (u64)-1); | 6597 | btrfs_wait_ordered_range(inode, inode->i_size & (~mask), (u64)-1); |
6495 | btrfs_ordered_update_i_size(inode, inode->i_size, NULL); | 6598 | btrfs_ordered_update_i_size(inode, inode->i_size, NULL); |
6496 | 6599 | ||
6600 | trans = btrfs_start_transaction(root, 5); | ||
6601 | if (IS_ERR(trans)) | ||
6602 | return PTR_ERR(trans); | ||
6603 | |||
6604 | btrfs_set_trans_block_group(trans, inode); | ||
6605 | |||
6606 | ret = btrfs_orphan_add(trans, inode); | ||
6607 | if (ret) { | ||
6608 | btrfs_end_transaction(trans, root); | ||
6609 | return ret; | ||
6610 | } | ||
6611 | |||
6612 | nr = trans->blocks_used; | ||
6613 | btrfs_end_transaction(trans, root); | ||
6614 | btrfs_btree_balance_dirty(root, nr); | ||
6615 | |||
6616 | /* Now start a transaction for the truncate */ | ||
6497 | trans = btrfs_start_transaction(root, 0); | 6617 | trans = btrfs_start_transaction(root, 0); |
6498 | BUG_ON(IS_ERR(trans)); | 6618 | if (IS_ERR(trans)) |
6619 | return PTR_ERR(trans); | ||
6499 | btrfs_set_trans_block_group(trans, inode); | 6620 | btrfs_set_trans_block_group(trans, inode); |
6500 | trans->block_rsv = root->orphan_block_rsv; | 6621 | trans->block_rsv = root->orphan_block_rsv; |
6501 | 6622 | ||
@@ -6522,29 +6643,38 @@ static void btrfs_truncate(struct inode *inode) | |||
6522 | while (1) { | 6643 | while (1) { |
6523 | if (!trans) { | 6644 | if (!trans) { |
6524 | trans = btrfs_start_transaction(root, 0); | 6645 | trans = btrfs_start_transaction(root, 0); |
6525 | BUG_ON(IS_ERR(trans)); | 6646 | if (IS_ERR(trans)) |
6647 | return PTR_ERR(trans); | ||
6526 | btrfs_set_trans_block_group(trans, inode); | 6648 | btrfs_set_trans_block_group(trans, inode); |
6527 | trans->block_rsv = root->orphan_block_rsv; | 6649 | trans->block_rsv = root->orphan_block_rsv; |
6528 | } | 6650 | } |
6529 | 6651 | ||
6530 | ret = btrfs_block_rsv_check(trans, root, | 6652 | ret = btrfs_block_rsv_check(trans, root, |
6531 | root->orphan_block_rsv, 0, 5); | 6653 | root->orphan_block_rsv, 0, 5); |
6532 | if (ret) { | 6654 | if (ret == -EAGAIN) { |
6533 | BUG_ON(ret != -EAGAIN); | ||
6534 | ret = btrfs_commit_transaction(trans, root); | 6655 | ret = btrfs_commit_transaction(trans, root); |
6535 | BUG_ON(ret); | 6656 | if (ret) |
6657 | return ret; | ||
6536 | trans = NULL; | 6658 | trans = NULL; |
6537 | continue; | 6659 | continue; |
6660 | } else if (ret) { | ||
6661 | err = ret; | ||
6662 | break; | ||
6538 | } | 6663 | } |
6539 | 6664 | ||
6540 | ret = btrfs_truncate_inode_items(trans, root, inode, | 6665 | ret = btrfs_truncate_inode_items(trans, root, inode, |
6541 | inode->i_size, | 6666 | inode->i_size, |
6542 | BTRFS_EXTENT_DATA_KEY); | 6667 | BTRFS_EXTENT_DATA_KEY); |
6543 | if (ret != -EAGAIN) | 6668 | if (ret != -EAGAIN) { |
6669 | err = ret; | ||
6544 | break; | 6670 | break; |
6671 | } | ||
6545 | 6672 | ||
6546 | ret = btrfs_update_inode(trans, root, inode); | 6673 | ret = btrfs_update_inode(trans, root, inode); |
6547 | BUG_ON(ret); | 6674 | if (ret) { |
6675 | err = ret; | ||
6676 | break; | ||
6677 | } | ||
6548 | 6678 | ||
6549 | nr = trans->blocks_used; | 6679 | nr = trans->blocks_used; |
6550 | btrfs_end_transaction(trans, root); | 6680 | btrfs_end_transaction(trans, root); |
@@ -6554,16 +6684,27 @@ static void btrfs_truncate(struct inode *inode) | |||
6554 | 6684 | ||
6555 | if (ret == 0 && inode->i_nlink > 0) { | 6685 | if (ret == 0 && inode->i_nlink > 0) { |
6556 | ret = btrfs_orphan_del(trans, inode); | 6686 | ret = btrfs_orphan_del(trans, inode); |
6557 | BUG_ON(ret); | 6687 | if (ret) |
6688 | err = ret; | ||
6689 | } else if (ret && inode->i_nlink > 0) { | ||
6690 | /* | ||
6691 | * Failed to do the truncate, remove us from the in memory | ||
6692 | * orphan list. | ||
6693 | */ | ||
6694 | ret = btrfs_orphan_del(NULL, inode); | ||
6558 | } | 6695 | } |
6559 | 6696 | ||
6560 | ret = btrfs_update_inode(trans, root, inode); | 6697 | ret = btrfs_update_inode(trans, root, inode); |
6561 | BUG_ON(ret); | 6698 | if (ret && !err) |
6699 | err = ret; | ||
6562 | 6700 | ||
6563 | nr = trans->blocks_used; | 6701 | nr = trans->blocks_used; |
6564 | ret = btrfs_end_transaction_throttle(trans, root); | 6702 | ret = btrfs_end_transaction_throttle(trans, root); |
6565 | BUG_ON(ret); | 6703 | if (ret && !err) |
6704 | err = ret; | ||
6566 | btrfs_btree_balance_dirty(root, nr); | 6705 | btrfs_btree_balance_dirty(root, nr); |
6706 | |||
6707 | return err; | ||
6567 | } | 6708 | } |
6568 | 6709 | ||
6569 | /* | 6710 | /* |
@@ -6630,9 +6771,8 @@ struct inode *btrfs_alloc_inode(struct super_block *sb) | |||
6630 | ei->index_cnt = (u64)-1; | 6771 | ei->index_cnt = (u64)-1; |
6631 | ei->last_unlink_trans = 0; | 6772 | ei->last_unlink_trans = 0; |
6632 | 6773 | ||
6633 | spin_lock_init(&ei->accounting_lock); | ||
6634 | atomic_set(&ei->outstanding_extents, 0); | 6774 | atomic_set(&ei->outstanding_extents, 0); |
6635 | ei->reserved_extents = 0; | 6775 | atomic_set(&ei->reserved_extents, 0); |
6636 | 6776 | ||
6637 | ei->ordered_data_close = 0; | 6777 | ei->ordered_data_close = 0; |
6638 | ei->orphan_meta_reserved = 0; | 6778 | ei->orphan_meta_reserved = 0; |
@@ -6668,7 +6808,7 @@ void btrfs_destroy_inode(struct inode *inode) | |||
6668 | WARN_ON(!list_empty(&inode->i_dentry)); | 6808 | WARN_ON(!list_empty(&inode->i_dentry)); |
6669 | WARN_ON(inode->i_data.nrpages); | 6809 | WARN_ON(inode->i_data.nrpages); |
6670 | WARN_ON(atomic_read(&BTRFS_I(inode)->outstanding_extents)); | 6810 | WARN_ON(atomic_read(&BTRFS_I(inode)->outstanding_extents)); |
6671 | WARN_ON(BTRFS_I(inode)->reserved_extents); | 6811 | WARN_ON(atomic_read(&BTRFS_I(inode)->reserved_extents)); |
6672 | 6812 | ||
6673 | /* | 6813 | /* |
6674 | * This can happen where we create an inode, but somebody else also | 6814 | * This can happen where we create an inode, but somebody else also |
@@ -6760,6 +6900,8 @@ void btrfs_destroy_cachep(void) | |||
6760 | kmem_cache_destroy(btrfs_transaction_cachep); | 6900 | kmem_cache_destroy(btrfs_transaction_cachep); |
6761 | if (btrfs_path_cachep) | 6901 | if (btrfs_path_cachep) |
6762 | kmem_cache_destroy(btrfs_path_cachep); | 6902 | kmem_cache_destroy(btrfs_path_cachep); |
6903 | if (btrfs_free_space_cachep) | ||
6904 | kmem_cache_destroy(btrfs_free_space_cachep); | ||
6763 | } | 6905 | } |
6764 | 6906 | ||
6765 | int btrfs_init_cachep(void) | 6907 | int btrfs_init_cachep(void) |
@@ -6788,6 +6930,12 @@ int btrfs_init_cachep(void) | |||
6788 | if (!btrfs_path_cachep) | 6930 | if (!btrfs_path_cachep) |
6789 | goto fail; | 6931 | goto fail; |
6790 | 6932 | ||
6933 | btrfs_free_space_cachep = kmem_cache_create("btrfs_free_space_cache", | ||
6934 | sizeof(struct btrfs_free_space), 0, | ||
6935 | SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD, NULL); | ||
6936 | if (!btrfs_free_space_cachep) | ||
6937 | goto fail; | ||
6938 | |||
6791 | return 0; | 6939 | return 0; |
6792 | fail: | 6940 | fail: |
6793 | btrfs_destroy_cachep(); | 6941 | btrfs_destroy_cachep(); |
@@ -6806,6 +6954,26 @@ static int btrfs_getattr(struct vfsmount *mnt, | |||
6806 | return 0; | 6954 | return 0; |
6807 | } | 6955 | } |
6808 | 6956 | ||
6957 | /* | ||
6958 | * If a file is moved, it will inherit the cow and compression flags of the new | ||
6959 | * directory. | ||
6960 | */ | ||
6961 | static void fixup_inode_flags(struct inode *dir, struct inode *inode) | ||
6962 | { | ||
6963 | struct btrfs_inode *b_dir = BTRFS_I(dir); | ||
6964 | struct btrfs_inode *b_inode = BTRFS_I(inode); | ||
6965 | |||
6966 | if (b_dir->flags & BTRFS_INODE_NODATACOW) | ||
6967 | b_inode->flags |= BTRFS_INODE_NODATACOW; | ||
6968 | else | ||
6969 | b_inode->flags &= ~BTRFS_INODE_NODATACOW; | ||
6970 | |||
6971 | if (b_dir->flags & BTRFS_INODE_COMPRESS) | ||
6972 | b_inode->flags |= BTRFS_INODE_COMPRESS; | ||
6973 | else | ||
6974 | b_inode->flags &= ~BTRFS_INODE_COMPRESS; | ||
6975 | } | ||
6976 | |||
6809 | static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | 6977 | static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, |
6810 | struct inode *new_dir, struct dentry *new_dentry) | 6978 | struct inode *new_dir, struct dentry *new_dentry) |
6811 | { | 6979 | { |
@@ -6854,8 +7022,10 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
6854 | * should cover the worst case number of items we'll modify. | 7022 | * should cover the worst case number of items we'll modify. |
6855 | */ | 7023 | */ |
6856 | trans = btrfs_start_transaction(root, 20); | 7024 | trans = btrfs_start_transaction(root, 20); |
6857 | if (IS_ERR(trans)) | 7025 | if (IS_ERR(trans)) { |
6858 | return PTR_ERR(trans); | 7026 | ret = PTR_ERR(trans); |
7027 | goto out_notrans; | ||
7028 | } | ||
6859 | 7029 | ||
6860 | btrfs_set_trans_block_group(trans, new_dir); | 7030 | btrfs_set_trans_block_group(trans, new_dir); |
6861 | 7031 | ||
@@ -6908,11 +7078,12 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
6908 | old_dentry->d_name.name, | 7078 | old_dentry->d_name.name, |
6909 | old_dentry->d_name.len); | 7079 | old_dentry->d_name.len); |
6910 | } else { | 7080 | } else { |
6911 | btrfs_inc_nlink(old_dentry->d_inode); | 7081 | ret = __btrfs_unlink_inode(trans, root, old_dir, |
6912 | ret = btrfs_unlink_inode(trans, root, old_dir, | 7082 | old_dentry->d_inode, |
6913 | old_dentry->d_inode, | 7083 | old_dentry->d_name.name, |
6914 | old_dentry->d_name.name, | 7084 | old_dentry->d_name.len); |
6915 | old_dentry->d_name.len); | 7085 | if (!ret) |
7086 | ret = btrfs_update_inode(trans, root, old_inode); | ||
6916 | } | 7087 | } |
6917 | BUG_ON(ret); | 7088 | BUG_ON(ret); |
6918 | 7089 | ||
@@ -6939,6 +7110,8 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
6939 | } | 7110 | } |
6940 | } | 7111 | } |
6941 | 7112 | ||
7113 | fixup_inode_flags(new_dir, old_inode); | ||
7114 | |||
6942 | ret = btrfs_add_link(trans, new_dir, old_inode, | 7115 | ret = btrfs_add_link(trans, new_dir, old_inode, |
6943 | new_dentry->d_name.name, | 7116 | new_dentry->d_name.name, |
6944 | new_dentry->d_name.len, 0, index); | 7117 | new_dentry->d_name.len, 0, index); |
@@ -6952,7 +7125,7 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
6952 | } | 7125 | } |
6953 | out_fail: | 7126 | out_fail: |
6954 | btrfs_end_transaction_throttle(trans, root); | 7127 | btrfs_end_transaction_throttle(trans, root); |
6955 | 7128 | out_notrans: | |
6956 | if (old_inode->i_ino == BTRFS_FIRST_FREE_OBJECTID) | 7129 | if (old_inode->i_ino == BTRFS_FIRST_FREE_OBJECTID) |
6957 | up_read(&root->fs_info->subvol_sem); | 7130 | up_read(&root->fs_info->subvol_sem); |
6958 | 7131 | ||
@@ -7340,7 +7513,6 @@ static const struct address_space_operations btrfs_aops = { | |||
7340 | .writepage = btrfs_writepage, | 7513 | .writepage = btrfs_writepage, |
7341 | .writepages = btrfs_writepages, | 7514 | .writepages = btrfs_writepages, |
7342 | .readpages = btrfs_readpages, | 7515 | .readpages = btrfs_readpages, |
7343 | .sync_page = block_sync_page, | ||
7344 | .direct_IO = btrfs_direct_IO, | 7516 | .direct_IO = btrfs_direct_IO, |
7345 | .invalidatepage = btrfs_invalidatepage, | 7517 | .invalidatepage = btrfs_invalidatepage, |
7346 | .releasepage = btrfs_releasepage, | 7518 | .releasepage = btrfs_releasepage, |
@@ -7356,7 +7528,6 @@ static const struct address_space_operations btrfs_symlink_aops = { | |||
7356 | }; | 7528 | }; |
7357 | 7529 | ||
7358 | static const struct inode_operations btrfs_file_inode_operations = { | 7530 | static const struct inode_operations btrfs_file_inode_operations = { |
7359 | .truncate = btrfs_truncate, | ||
7360 | .getattr = btrfs_getattr, | 7531 | .getattr = btrfs_getattr, |
7361 | .setattr = btrfs_setattr, | 7532 | .setattr = btrfs_setattr, |
7362 | .setxattr = btrfs_setxattr, | 7533 | .setxattr = btrfs_setxattr, |