diff options
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 577 |
1 files changed, 377 insertions, 200 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 512c3d1da083..7cd8ab0ef04d 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, |
@@ -949,6 +954,7 @@ static int cow_file_range_async(struct inode *inode, struct page *locked_page, | |||
949 | 1, 0, NULL, GFP_NOFS); | 954 | 1, 0, NULL, GFP_NOFS); |
950 | while (start < end) { | 955 | while (start < end) { |
951 | async_cow = kmalloc(sizeof(*async_cow), GFP_NOFS); | 956 | async_cow = kmalloc(sizeof(*async_cow), GFP_NOFS); |
957 | BUG_ON(!async_cow); | ||
952 | async_cow->inode = inode; | 958 | async_cow->inode = inode; |
953 | async_cow->root = root; | 959 | async_cow->root = root; |
954 | async_cow->locked_page = locked_page; | 960 | async_cow->locked_page = locked_page; |
@@ -1254,7 +1260,8 @@ static int run_delalloc_range(struct inode *inode, struct page *locked_page, | |||
1254 | ret = run_delalloc_nocow(inode, locked_page, start, end, | 1260 | ret = run_delalloc_nocow(inode, locked_page, start, end, |
1255 | page_started, 0, nr_written); | 1261 | page_started, 0, nr_written); |
1256 | else if (!btrfs_test_opt(root, COMPRESS) && | 1262 | else if (!btrfs_test_opt(root, COMPRESS) && |
1257 | !(BTRFS_I(inode)->force_compress)) | 1263 | !(BTRFS_I(inode)->force_compress) && |
1264 | !(BTRFS_I(inode)->flags & BTRFS_INODE_COMPRESS)) | ||
1258 | ret = cow_file_range(inode, locked_page, start, end, | 1265 | ret = cow_file_range(inode, locked_page, start, end, |
1259 | page_started, nr_written, 1); | 1266 | page_started, nr_written, 1); |
1260 | else | 1267 | else |
@@ -1461,8 +1468,11 @@ static int btrfs_submit_bio_hook(struct inode *inode, int rw, struct bio *bio, | |||
1461 | if (bio_flags & EXTENT_BIO_COMPRESSED) { | 1468 | if (bio_flags & EXTENT_BIO_COMPRESSED) { |
1462 | return btrfs_submit_compressed_read(inode, bio, | 1469 | return btrfs_submit_compressed_read(inode, bio, |
1463 | mirror_num, bio_flags); | 1470 | mirror_num, bio_flags); |
1464 | } else if (!skip_sum) | 1471 | } else if (!skip_sum) { |
1465 | btrfs_lookup_bio_sums(root, inode, bio, NULL); | 1472 | ret = btrfs_lookup_bio_sums(root, inode, bio, NULL); |
1473 | if (ret) | ||
1474 | return ret; | ||
1475 | } | ||
1466 | goto mapit; | 1476 | goto mapit; |
1467 | } else if (!skip_sum) { | 1477 | } else if (!skip_sum) { |
1468 | /* csum items have already been cloned */ | 1478 | /* csum items have already been cloned */ |
@@ -1761,9 +1771,12 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
1761 | add_pending_csums(trans, inode, ordered_extent->file_offset, | 1771 | add_pending_csums(trans, inode, ordered_extent->file_offset, |
1762 | &ordered_extent->list); | 1772 | &ordered_extent->list); |
1763 | 1773 | ||
1764 | btrfs_ordered_update_i_size(inode, 0, ordered_extent); | 1774 | ret = btrfs_ordered_update_i_size(inode, 0, ordered_extent); |
1765 | ret = btrfs_update_inode(trans, root, inode); | 1775 | if (!ret) { |
1766 | BUG_ON(ret); | 1776 | ret = btrfs_update_inode(trans, root, inode); |
1777 | BUG_ON(ret); | ||
1778 | } | ||
1779 | ret = 0; | ||
1767 | out: | 1780 | out: |
1768 | if (nolock) { | 1781 | if (nolock) { |
1769 | if (trans) | 1782 | if (trans) |
@@ -1785,6 +1798,8 @@ out: | |||
1785 | static int btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end, | 1798 | static int btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end, |
1786 | struct extent_state *state, int uptodate) | 1799 | struct extent_state *state, int uptodate) |
1787 | { | 1800 | { |
1801 | trace_btrfs_writepage_end_io_hook(page, start, end, uptodate); | ||
1802 | |||
1788 | ClearPagePrivate2(page); | 1803 | ClearPagePrivate2(page); |
1789 | return btrfs_finish_ordered_io(page->mapping->host, start, end); | 1804 | return btrfs_finish_ordered_io(page->mapping->host, start, end); |
1790 | } | 1805 | } |
@@ -1895,10 +1910,10 @@ static int btrfs_io_failed_hook(struct bio *failed_bio, | |||
1895 | else | 1910 | else |
1896 | rw = READ; | 1911 | rw = READ; |
1897 | 1912 | ||
1898 | BTRFS_I(inode)->io_tree.ops->submit_bio_hook(inode, rw, bio, | 1913 | ret = BTRFS_I(inode)->io_tree.ops->submit_bio_hook(inode, rw, bio, |
1899 | failrec->last_mirror, | 1914 | failrec->last_mirror, |
1900 | failrec->bio_flags, 0); | 1915 | failrec->bio_flags, 0); |
1901 | return 0; | 1916 | return ret; |
1902 | } | 1917 | } |
1903 | 1918 | ||
1904 | /* | 1919 | /* |
@@ -2210,8 +2225,6 @@ int btrfs_orphan_add(struct btrfs_trans_handle *trans, struct inode *inode) | |||
2210 | insert = 1; | 2225 | insert = 1; |
2211 | #endif | 2226 | #endif |
2212 | insert = 1; | 2227 | insert = 1; |
2213 | } else { | ||
2214 | WARN_ON(!BTRFS_I(inode)->orphan_meta_reserved); | ||
2215 | } | 2228 | } |
2216 | 2229 | ||
2217 | if (!BTRFS_I(inode)->orphan_meta_reserved) { | 2230 | if (!BTRFS_I(inode)->orphan_meta_reserved) { |
@@ -2282,7 +2295,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 | 2295 | * this cleans up any orphans that may be left on the list from the last use |
2283 | * of this root. | 2296 | * of this root. |
2284 | */ | 2297 | */ |
2285 | void btrfs_orphan_cleanup(struct btrfs_root *root) | 2298 | int btrfs_orphan_cleanup(struct btrfs_root *root) |
2286 | { | 2299 | { |
2287 | struct btrfs_path *path; | 2300 | struct btrfs_path *path; |
2288 | struct extent_buffer *leaf; | 2301 | struct extent_buffer *leaf; |
@@ -2292,10 +2305,13 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2292 | int ret = 0, nr_unlink = 0, nr_truncate = 0; | 2305 | int ret = 0, nr_unlink = 0, nr_truncate = 0; |
2293 | 2306 | ||
2294 | if (cmpxchg(&root->orphan_cleanup_state, 0, ORPHAN_CLEANUP_STARTED)) | 2307 | if (cmpxchg(&root->orphan_cleanup_state, 0, ORPHAN_CLEANUP_STARTED)) |
2295 | return; | 2308 | return 0; |
2296 | 2309 | ||
2297 | path = btrfs_alloc_path(); | 2310 | path = btrfs_alloc_path(); |
2298 | BUG_ON(!path); | 2311 | if (!path) { |
2312 | ret = -ENOMEM; | ||
2313 | goto out; | ||
2314 | } | ||
2299 | path->reada = -1; | 2315 | path->reada = -1; |
2300 | 2316 | ||
2301 | key.objectid = BTRFS_ORPHAN_OBJECTID; | 2317 | key.objectid = BTRFS_ORPHAN_OBJECTID; |
@@ -2304,18 +2320,16 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2304 | 2320 | ||
2305 | while (1) { | 2321 | while (1) { |
2306 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); | 2322 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); |
2307 | if (ret < 0) { | 2323 | if (ret < 0) |
2308 | printk(KERN_ERR "Error searching slot for orphan: %d" | 2324 | goto out; |
2309 | "\n", ret); | ||
2310 | break; | ||
2311 | } | ||
2312 | 2325 | ||
2313 | /* | 2326 | /* |
2314 | * if ret == 0 means we found what we were searching for, which | 2327 | * 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 | 2328 | * 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 | 2329 | * find the key and see if we have stuff that matches |
2317 | */ | 2330 | */ |
2318 | if (ret > 0) { | 2331 | if (ret > 0) { |
2332 | ret = 0; | ||
2319 | if (path->slots[0] == 0) | 2333 | if (path->slots[0] == 0) |
2320 | break; | 2334 | break; |
2321 | path->slots[0]--; | 2335 | path->slots[0]--; |
@@ -2343,7 +2357,10 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2343 | found_key.type = BTRFS_INODE_ITEM_KEY; | 2357 | found_key.type = BTRFS_INODE_ITEM_KEY; |
2344 | found_key.offset = 0; | 2358 | found_key.offset = 0; |
2345 | inode = btrfs_iget(root->fs_info->sb, &found_key, root, NULL); | 2359 | inode = btrfs_iget(root->fs_info->sb, &found_key, root, NULL); |
2346 | BUG_ON(IS_ERR(inode)); | 2360 | if (IS_ERR(inode)) { |
2361 | ret = PTR_ERR(inode); | ||
2362 | goto out; | ||
2363 | } | ||
2347 | 2364 | ||
2348 | /* | 2365 | /* |
2349 | * add this inode to the orphan list so btrfs_orphan_del does | 2366 | * add this inode to the orphan list so btrfs_orphan_del does |
@@ -2361,7 +2378,10 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2361 | */ | 2378 | */ |
2362 | if (is_bad_inode(inode)) { | 2379 | if (is_bad_inode(inode)) { |
2363 | trans = btrfs_start_transaction(root, 0); | 2380 | trans = btrfs_start_transaction(root, 0); |
2364 | BUG_ON(IS_ERR(trans)); | 2381 | if (IS_ERR(trans)) { |
2382 | ret = PTR_ERR(trans); | ||
2383 | goto out; | ||
2384 | } | ||
2365 | btrfs_orphan_del(trans, inode); | 2385 | btrfs_orphan_del(trans, inode); |
2366 | btrfs_end_transaction(trans, root); | 2386 | btrfs_end_transaction(trans, root); |
2367 | iput(inode); | 2387 | iput(inode); |
@@ -2370,17 +2390,22 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2370 | 2390 | ||
2371 | /* if we have links, this was a truncate, lets do that */ | 2391 | /* if we have links, this was a truncate, lets do that */ |
2372 | if (inode->i_nlink) { | 2392 | if (inode->i_nlink) { |
2393 | if (!S_ISREG(inode->i_mode)) { | ||
2394 | WARN_ON(1); | ||
2395 | iput(inode); | ||
2396 | continue; | ||
2397 | } | ||
2373 | nr_truncate++; | 2398 | nr_truncate++; |
2374 | btrfs_truncate(inode); | 2399 | ret = btrfs_truncate(inode); |
2375 | } else { | 2400 | } else { |
2376 | nr_unlink++; | 2401 | nr_unlink++; |
2377 | } | 2402 | } |
2378 | 2403 | ||
2379 | /* this will do delete_inode and everything for us */ | 2404 | /* this will do delete_inode and everything for us */ |
2380 | iput(inode); | 2405 | iput(inode); |
2406 | if (ret) | ||
2407 | goto out; | ||
2381 | } | 2408 | } |
2382 | btrfs_free_path(path); | ||
2383 | |||
2384 | root->orphan_cleanup_state = ORPHAN_CLEANUP_DONE; | 2409 | root->orphan_cleanup_state = ORPHAN_CLEANUP_DONE; |
2385 | 2410 | ||
2386 | if (root->orphan_block_rsv) | 2411 | if (root->orphan_block_rsv) |
@@ -2389,14 +2414,20 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2389 | 2414 | ||
2390 | if (root->orphan_block_rsv || root->orphan_item_inserted) { | 2415 | if (root->orphan_block_rsv || root->orphan_item_inserted) { |
2391 | trans = btrfs_join_transaction(root, 1); | 2416 | trans = btrfs_join_transaction(root, 1); |
2392 | BUG_ON(IS_ERR(trans)); | 2417 | if (!IS_ERR(trans)) |
2393 | btrfs_end_transaction(trans, root); | 2418 | btrfs_end_transaction(trans, root); |
2394 | } | 2419 | } |
2395 | 2420 | ||
2396 | if (nr_unlink) | 2421 | if (nr_unlink) |
2397 | printk(KERN_INFO "btrfs: unlinked %d orphans\n", nr_unlink); | 2422 | printk(KERN_INFO "btrfs: unlinked %d orphans\n", nr_unlink); |
2398 | if (nr_truncate) | 2423 | if (nr_truncate) |
2399 | printk(KERN_INFO "btrfs: truncated %d orphans\n", nr_truncate); | 2424 | printk(KERN_INFO "btrfs: truncated %d orphans\n", nr_truncate); |
2425 | |||
2426 | out: | ||
2427 | if (ret) | ||
2428 | printk(KERN_CRIT "btrfs: could not do orphan cleanup %d\n", ret); | ||
2429 | btrfs_free_path(path); | ||
2430 | return ret; | ||
2400 | } | 2431 | } |
2401 | 2432 | ||
2402 | /* | 2433 | /* |
@@ -2563,6 +2594,13 @@ static void fill_inode_item(struct btrfs_trans_handle *trans, | |||
2563 | struct btrfs_inode_item *item, | 2594 | struct btrfs_inode_item *item, |
2564 | struct inode *inode) | 2595 | struct inode *inode) |
2565 | { | 2596 | { |
2597 | if (!leaf->map_token) | ||
2598 | map_private_extent_buffer(leaf, (unsigned long)item, | ||
2599 | sizeof(struct btrfs_inode_item), | ||
2600 | &leaf->map_token, &leaf->kaddr, | ||
2601 | &leaf->map_start, &leaf->map_len, | ||
2602 | KM_USER1); | ||
2603 | |||
2566 | btrfs_set_inode_uid(leaf, item, inode->i_uid); | 2604 | btrfs_set_inode_uid(leaf, item, inode->i_uid); |
2567 | btrfs_set_inode_gid(leaf, item, inode->i_gid); | 2605 | btrfs_set_inode_gid(leaf, item, inode->i_gid); |
2568 | btrfs_set_inode_size(leaf, item, BTRFS_I(inode)->disk_i_size); | 2606 | btrfs_set_inode_size(leaf, item, BTRFS_I(inode)->disk_i_size); |
@@ -2591,6 +2629,11 @@ static void fill_inode_item(struct btrfs_trans_handle *trans, | |||
2591 | btrfs_set_inode_rdev(leaf, item, inode->i_rdev); | 2629 | btrfs_set_inode_rdev(leaf, item, inode->i_rdev); |
2592 | btrfs_set_inode_flags(leaf, item, BTRFS_I(inode)->flags); | 2630 | btrfs_set_inode_flags(leaf, item, BTRFS_I(inode)->flags); |
2593 | btrfs_set_inode_block_group(leaf, item, BTRFS_I(inode)->block_group); | 2631 | btrfs_set_inode_block_group(leaf, item, BTRFS_I(inode)->block_group); |
2632 | |||
2633 | if (leaf->map_token) { | ||
2634 | unmap_extent_buffer(leaf, leaf->map_token, KM_USER1); | ||
2635 | leaf->map_token = NULL; | ||
2636 | } | ||
2594 | } | 2637 | } |
2595 | 2638 | ||
2596 | /* | 2639 | /* |
@@ -2635,10 +2678,10 @@ failed: | |||
2635 | * recovery code. It remove a link in a directory with a given name, and | 2678 | * 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 | 2679 | * also drops the back refs in the inode to the directory |
2637 | */ | 2680 | */ |
2638 | int btrfs_unlink_inode(struct btrfs_trans_handle *trans, | 2681 | static int __btrfs_unlink_inode(struct btrfs_trans_handle *trans, |
2639 | struct btrfs_root *root, | 2682 | struct btrfs_root *root, |
2640 | struct inode *dir, struct inode *inode, | 2683 | struct inode *dir, struct inode *inode, |
2641 | const char *name, int name_len) | 2684 | const char *name, int name_len) |
2642 | { | 2685 | { |
2643 | struct btrfs_path *path; | 2686 | struct btrfs_path *path; |
2644 | int ret = 0; | 2687 | int ret = 0; |
@@ -2710,12 +2753,25 @@ err: | |||
2710 | btrfs_i_size_write(dir, dir->i_size - name_len * 2); | 2753 | btrfs_i_size_write(dir, dir->i_size - name_len * 2); |
2711 | inode->i_ctime = dir->i_mtime = dir->i_ctime = CURRENT_TIME; | 2754 | inode->i_ctime = dir->i_mtime = dir->i_ctime = CURRENT_TIME; |
2712 | btrfs_update_inode(trans, root, dir); | 2755 | btrfs_update_inode(trans, root, dir); |
2713 | btrfs_drop_nlink(inode); | ||
2714 | ret = btrfs_update_inode(trans, root, inode); | ||
2715 | out: | 2756 | out: |
2716 | return ret; | 2757 | return ret; |
2717 | } | 2758 | } |
2718 | 2759 | ||
2760 | int btrfs_unlink_inode(struct btrfs_trans_handle *trans, | ||
2761 | struct btrfs_root *root, | ||
2762 | struct inode *dir, struct inode *inode, | ||
2763 | const char *name, int name_len) | ||
2764 | { | ||
2765 | int ret; | ||
2766 | ret = __btrfs_unlink_inode(trans, root, dir, inode, name, name_len); | ||
2767 | if (!ret) { | ||
2768 | btrfs_drop_nlink(inode); | ||
2769 | ret = btrfs_update_inode(trans, root, inode); | ||
2770 | } | ||
2771 | return ret; | ||
2772 | } | ||
2773 | |||
2774 | |||
2719 | /* helper to check if there is any shared block in the path */ | 2775 | /* helper to check if there is any shared block in the path */ |
2720 | static int check_path_shared(struct btrfs_root *root, | 2776 | static int check_path_shared(struct btrfs_root *root, |
2721 | struct btrfs_path *path) | 2777 | struct btrfs_path *path) |
@@ -3537,7 +3593,13 @@ out: | |||
3537 | return ret; | 3593 | return ret; |
3538 | } | 3594 | } |
3539 | 3595 | ||
3540 | int btrfs_cont_expand(struct inode *inode, loff_t size) | 3596 | /* |
3597 | * This function puts in dummy file extents for the area we're creating a hole | ||
3598 | * for. So if we are truncating this file to a larger size we need to insert | ||
3599 | * these file extents so that btrfs_get_extent will return a EXTENT_MAP_HOLE for | ||
3600 | * the range between oldsize and size | ||
3601 | */ | ||
3602 | int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size) | ||
3541 | { | 3603 | { |
3542 | struct btrfs_trans_handle *trans; | 3604 | struct btrfs_trans_handle *trans; |
3543 | struct btrfs_root *root = BTRFS_I(inode)->root; | 3605 | struct btrfs_root *root = BTRFS_I(inode)->root; |
@@ -3545,7 +3607,7 @@ int btrfs_cont_expand(struct inode *inode, loff_t size) | |||
3545 | struct extent_map *em = NULL; | 3607 | struct extent_map *em = NULL; |
3546 | struct extent_state *cached_state = NULL; | 3608 | struct extent_state *cached_state = NULL; |
3547 | u64 mask = root->sectorsize - 1; | 3609 | u64 mask = root->sectorsize - 1; |
3548 | u64 hole_start = (inode->i_size + mask) & ~mask; | 3610 | u64 hole_start = (oldsize + mask) & ~mask; |
3549 | u64 block_end = (size + mask) & ~mask; | 3611 | u64 block_end = (size + mask) & ~mask; |
3550 | u64 last_byte; | 3612 | u64 last_byte; |
3551 | u64 cur_offset; | 3613 | u64 cur_offset; |
@@ -3590,13 +3652,15 @@ int btrfs_cont_expand(struct inode *inode, loff_t size) | |||
3590 | err = btrfs_drop_extents(trans, inode, cur_offset, | 3652 | err = btrfs_drop_extents(trans, inode, cur_offset, |
3591 | cur_offset + hole_size, | 3653 | cur_offset + hole_size, |
3592 | &hint_byte, 1); | 3654 | &hint_byte, 1); |
3593 | BUG_ON(err); | 3655 | if (err) |
3656 | break; | ||
3594 | 3657 | ||
3595 | err = btrfs_insert_file_extent(trans, root, | 3658 | err = btrfs_insert_file_extent(trans, root, |
3596 | inode->i_ino, cur_offset, 0, | 3659 | inode->i_ino, cur_offset, 0, |
3597 | 0, hole_size, 0, hole_size, | 3660 | 0, hole_size, 0, hole_size, |
3598 | 0, 0, 0); | 3661 | 0, 0, 0); |
3599 | BUG_ON(err); | 3662 | if (err) |
3663 | break; | ||
3600 | 3664 | ||
3601 | btrfs_drop_extent_cache(inode, hole_start, | 3665 | btrfs_drop_extent_cache(inode, hole_start, |
3602 | last_byte - 1, 0); | 3666 | last_byte - 1, 0); |
@@ -3616,81 +3680,41 @@ int btrfs_cont_expand(struct inode *inode, loff_t size) | |||
3616 | return err; | 3680 | return err; |
3617 | } | 3681 | } |
3618 | 3682 | ||
3619 | static int btrfs_setattr_size(struct inode *inode, struct iattr *attr) | 3683 | static int btrfs_setsize(struct inode *inode, loff_t newsize) |
3620 | { | 3684 | { |
3621 | struct btrfs_root *root = BTRFS_I(inode)->root; | 3685 | loff_t oldsize = i_size_read(inode); |
3622 | struct btrfs_trans_handle *trans; | ||
3623 | unsigned long nr; | ||
3624 | int ret; | 3686 | int ret; |
3625 | 3687 | ||
3626 | if (attr->ia_size == inode->i_size) | 3688 | if (newsize == oldsize) |
3627 | return 0; | 3689 | return 0; |
3628 | 3690 | ||
3629 | if (attr->ia_size > inode->i_size) { | 3691 | if (newsize > oldsize) { |
3630 | unsigned long limit; | 3692 | i_size_write(inode, newsize); |
3631 | limit = current->signal->rlim[RLIMIT_FSIZE].rlim_cur; | 3693 | btrfs_ordered_update_i_size(inode, i_size_read(inode), NULL); |
3632 | if (attr->ia_size > inode->i_sb->s_maxbytes) | 3694 | truncate_pagecache(inode, oldsize, newsize); |
3633 | return -EFBIG; | 3695 | 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) { | 3696 | if (ret) { |
3656 | btrfs_truncate(inode); | 3697 | btrfs_setsize(inode, oldsize); |
3657 | return ret; | 3698 | return ret; |
3658 | } | 3699 | } |
3659 | 3700 | ||
3660 | i_size_write(inode, attr->ia_size); | 3701 | mark_inode_dirty(inode); |
3661 | btrfs_ordered_update_i_size(inode, inode->i_size, NULL); | 3702 | } else { |
3662 | 3703 | ||
3663 | trans = btrfs_start_transaction(root, 0); | 3704 | /* |
3664 | BUG_ON(IS_ERR(trans)); | 3705 | * We're truncating a file that used to have good data down to |
3665 | btrfs_set_trans_block_group(trans, inode); | 3706 | * zero. Make sure it gets into the ordered flush list so that |
3666 | trans->block_rsv = root->orphan_block_rsv; | 3707 | * any new writes get down to disk quickly. |
3667 | BUG_ON(!trans->block_rsv); | 3708 | */ |
3709 | if (newsize == 0) | ||
3710 | BTRFS_I(inode)->ordered_data_close = 1; | ||
3668 | 3711 | ||
3669 | ret = btrfs_update_inode(trans, root, inode); | 3712 | /* we don't support swapfiles, so vmtruncate shouldn't fail */ |
3670 | BUG_ON(ret); | 3713 | truncate_setsize(inode, newsize); |
3671 | if (inode->i_nlink > 0) { | 3714 | 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 | } | 3715 | } |
3680 | 3716 | ||
3681 | /* | 3717 | 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 | } | 3718 | } |
3695 | 3719 | ||
3696 | static int btrfs_setattr(struct dentry *dentry, struct iattr *attr) | 3720 | static int btrfs_setattr(struct dentry *dentry, struct iattr *attr) |
@@ -3707,7 +3731,7 @@ static int btrfs_setattr(struct dentry *dentry, struct iattr *attr) | |||
3707 | return err; | 3731 | return err; |
3708 | 3732 | ||
3709 | if (S_ISREG(inode->i_mode) && (attr->ia_valid & ATTR_SIZE)) { | 3733 | if (S_ISREG(inode->i_mode) && (attr->ia_valid & ATTR_SIZE)) { |
3710 | err = btrfs_setattr_size(inode, attr); | 3734 | err = btrfs_setsize(inode, attr->ia_size); |
3711 | if (err) | 3735 | if (err) |
3712 | return err; | 3736 | return err; |
3713 | } | 3737 | } |
@@ -3730,6 +3754,8 @@ void btrfs_evict_inode(struct inode *inode) | |||
3730 | unsigned long nr; | 3754 | unsigned long nr; |
3731 | int ret; | 3755 | int ret; |
3732 | 3756 | ||
3757 | trace_btrfs_inode_evict(inode); | ||
3758 | |||
3733 | truncate_inode_pages(&inode->i_data, 0); | 3759 | truncate_inode_pages(&inode->i_data, 0); |
3734 | if (inode->i_nlink && (btrfs_root_refs(&root->root_item) != 0 || | 3760 | if (inode->i_nlink && (btrfs_root_refs(&root->root_item) != 0 || |
3735 | root == root->fs_info->tree_root)) | 3761 | root == root->fs_info->tree_root)) |
@@ -4072,7 +4098,6 @@ struct inode *btrfs_iget(struct super_block *s, struct btrfs_key *location, | |||
4072 | BTRFS_I(inode)->root = root; | 4098 | BTRFS_I(inode)->root = root; |
4073 | memcpy(&BTRFS_I(inode)->location, location, sizeof(*location)); | 4099 | memcpy(&BTRFS_I(inode)->location, location, sizeof(*location)); |
4074 | btrfs_read_locked_inode(inode); | 4100 | btrfs_read_locked_inode(inode); |
4075 | |||
4076 | inode_tree_add(inode); | 4101 | inode_tree_add(inode); |
4077 | unlock_new_inode(inode); | 4102 | unlock_new_inode(inode); |
4078 | if (new) | 4103 | if (new) |
@@ -4147,8 +4172,10 @@ struct inode *btrfs_lookup_dentry(struct inode *dir, struct dentry *dentry) | |||
4147 | if (!IS_ERR(inode) && root != sub_root) { | 4172 | if (!IS_ERR(inode) && root != sub_root) { |
4148 | down_read(&root->fs_info->cleanup_work_sem); | 4173 | down_read(&root->fs_info->cleanup_work_sem); |
4149 | if (!(inode->i_sb->s_flags & MS_RDONLY)) | 4174 | if (!(inode->i_sb->s_flags & MS_RDONLY)) |
4150 | btrfs_orphan_cleanup(sub_root); | 4175 | ret = btrfs_orphan_cleanup(sub_root); |
4151 | up_read(&root->fs_info->cleanup_work_sem); | 4176 | up_read(&root->fs_info->cleanup_work_sem); |
4177 | if (ret) | ||
4178 | inode = ERR_PTR(ret); | ||
4152 | } | 4179 | } |
4153 | 4180 | ||
4154 | return inode; | 4181 | return inode; |
@@ -4196,10 +4223,8 @@ static int btrfs_real_readdir(struct file *filp, void *dirent, | |||
4196 | struct btrfs_key found_key; | 4223 | struct btrfs_key found_key; |
4197 | struct btrfs_path *path; | 4224 | struct btrfs_path *path; |
4198 | int ret; | 4225 | int ret; |
4199 | u32 nritems; | ||
4200 | struct extent_buffer *leaf; | 4226 | struct extent_buffer *leaf; |
4201 | int slot; | 4227 | int slot; |
4202 | int advance; | ||
4203 | unsigned char d_type; | 4228 | unsigned char d_type; |
4204 | int over = 0; | 4229 | int over = 0; |
4205 | u32 di_cur; | 4230 | u32 di_cur; |
@@ -4242,27 +4267,19 @@ static int btrfs_real_readdir(struct file *filp, void *dirent, | |||
4242 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); | 4267 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); |
4243 | if (ret < 0) | 4268 | if (ret < 0) |
4244 | goto err; | 4269 | goto err; |
4245 | advance = 0; | ||
4246 | 4270 | ||
4247 | while (1) { | 4271 | while (1) { |
4248 | leaf = path->nodes[0]; | 4272 | leaf = path->nodes[0]; |
4249 | nritems = btrfs_header_nritems(leaf); | ||
4250 | slot = path->slots[0]; | 4273 | slot = path->slots[0]; |
4251 | if (advance || slot >= nritems) { | 4274 | if (slot >= btrfs_header_nritems(leaf)) { |
4252 | if (slot >= nritems - 1) { | 4275 | ret = btrfs_next_leaf(root, path); |
4253 | ret = btrfs_next_leaf(root, path); | 4276 | if (ret < 0) |
4254 | if (ret) | 4277 | goto err; |
4255 | break; | 4278 | else if (ret > 0) |
4256 | leaf = path->nodes[0]; | 4279 | break; |
4257 | nritems = btrfs_header_nritems(leaf); | 4280 | continue; |
4258 | slot = path->slots[0]; | ||
4259 | } else { | ||
4260 | slot++; | ||
4261 | path->slots[0]++; | ||
4262 | } | ||
4263 | } | 4281 | } |
4264 | 4282 | ||
4265 | advance = 1; | ||
4266 | item = btrfs_item_nr(leaf, slot); | 4283 | item = btrfs_item_nr(leaf, slot); |
4267 | btrfs_item_key_to_cpu(leaf, &found_key, slot); | 4284 | btrfs_item_key_to_cpu(leaf, &found_key, slot); |
4268 | 4285 | ||
@@ -4271,7 +4288,7 @@ static int btrfs_real_readdir(struct file *filp, void *dirent, | |||
4271 | if (btrfs_key_type(&found_key) != key_type) | 4288 | if (btrfs_key_type(&found_key) != key_type) |
4272 | break; | 4289 | break; |
4273 | if (found_key.offset < filp->f_pos) | 4290 | if (found_key.offset < filp->f_pos) |
4274 | continue; | 4291 | goto next; |
4275 | 4292 | ||
4276 | filp->f_pos = found_key.offset; | 4293 | filp->f_pos = found_key.offset; |
4277 | 4294 | ||
@@ -4282,6 +4299,9 @@ static int btrfs_real_readdir(struct file *filp, void *dirent, | |||
4282 | while (di_cur < di_total) { | 4299 | while (di_cur < di_total) { |
4283 | struct btrfs_key location; | 4300 | struct btrfs_key location; |
4284 | 4301 | ||
4302 | if (verify_dir_item(root, leaf, di)) | ||
4303 | break; | ||
4304 | |||
4285 | name_len = btrfs_dir_name_len(leaf, di); | 4305 | name_len = btrfs_dir_name_len(leaf, di); |
4286 | if (name_len <= sizeof(tmp_name)) { | 4306 | if (name_len <= sizeof(tmp_name)) { |
4287 | name_ptr = tmp_name; | 4307 | name_ptr = tmp_name; |
@@ -4321,6 +4341,8 @@ skip: | |||
4321 | di_cur += di_len; | 4341 | di_cur += di_len; |
4322 | di = (struct btrfs_dir_item *)((char *)di + di_len); | 4342 | di = (struct btrfs_dir_item *)((char *)di + di_len); |
4323 | } | 4343 | } |
4344 | next: | ||
4345 | path->slots[0]++; | ||
4324 | } | 4346 | } |
4325 | 4347 | ||
4326 | /* Reached end of directory/root. Bump pos past the last item. */ | 4348 | /* Reached end of directory/root. Bump pos past the last item. */ |
@@ -4513,12 +4535,17 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, | |||
4513 | BUG_ON(!path); | 4535 | BUG_ON(!path); |
4514 | 4536 | ||
4515 | inode = new_inode(root->fs_info->sb); | 4537 | inode = new_inode(root->fs_info->sb); |
4516 | if (!inode) | 4538 | if (!inode) { |
4539 | btrfs_free_path(path); | ||
4517 | return ERR_PTR(-ENOMEM); | 4540 | return ERR_PTR(-ENOMEM); |
4541 | } | ||
4518 | 4542 | ||
4519 | if (dir) { | 4543 | if (dir) { |
4544 | trace_btrfs_inode_request(dir); | ||
4545 | |||
4520 | ret = btrfs_set_inode_index(dir, index); | 4546 | ret = btrfs_set_inode_index(dir, index); |
4521 | if (ret) { | 4547 | if (ret) { |
4548 | btrfs_free_path(path); | ||
4522 | iput(inode); | 4549 | iput(inode); |
4523 | return ERR_PTR(ret); | 4550 | return ERR_PTR(ret); |
4524 | } | 4551 | } |
@@ -4585,12 +4612,16 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, | |||
4585 | if ((mode & S_IFREG)) { | 4612 | if ((mode & S_IFREG)) { |
4586 | if (btrfs_test_opt(root, NODATASUM)) | 4613 | if (btrfs_test_opt(root, NODATASUM)) |
4587 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATASUM; | 4614 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATASUM; |
4588 | if (btrfs_test_opt(root, NODATACOW)) | 4615 | if (btrfs_test_opt(root, NODATACOW) || |
4616 | (BTRFS_I(dir)->flags & BTRFS_INODE_NODATACOW)) | ||
4589 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATACOW; | 4617 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATACOW; |
4590 | } | 4618 | } |
4591 | 4619 | ||
4592 | insert_inode_hash(inode); | 4620 | insert_inode_hash(inode); |
4593 | inode_tree_add(inode); | 4621 | inode_tree_add(inode); |
4622 | |||
4623 | trace_btrfs_inode_new(inode); | ||
4624 | |||
4594 | return inode; | 4625 | return inode; |
4595 | fail: | 4626 | fail: |
4596 | if (dir) | 4627 | if (dir) |
@@ -4701,9 +4732,10 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry, | |||
4701 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, | 4732 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, |
4702 | dentry->d_name.len, dir->i_ino, objectid, | 4733 | dentry->d_name.len, dir->i_ino, objectid, |
4703 | BTRFS_I(dir)->block_group, mode, &index); | 4734 | BTRFS_I(dir)->block_group, mode, &index); |
4704 | err = PTR_ERR(inode); | 4735 | if (IS_ERR(inode)) { |
4705 | if (IS_ERR(inode)) | 4736 | err = PTR_ERR(inode); |
4706 | goto out_unlock; | 4737 | goto out_unlock; |
4738 | } | ||
4707 | 4739 | ||
4708 | err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); | 4740 | err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); |
4709 | if (err) { | 4741 | if (err) { |
@@ -4762,9 +4794,10 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry, | |||
4762 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, | 4794 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, |
4763 | dentry->d_name.len, dir->i_ino, objectid, | 4795 | dentry->d_name.len, dir->i_ino, objectid, |
4764 | BTRFS_I(dir)->block_group, mode, &index); | 4796 | BTRFS_I(dir)->block_group, mode, &index); |
4765 | err = PTR_ERR(inode); | 4797 | if (IS_ERR(inode)) { |
4766 | if (IS_ERR(inode)) | 4798 | err = PTR_ERR(inode); |
4767 | goto out_unlock; | 4799 | goto out_unlock; |
4800 | } | ||
4768 | 4801 | ||
4769 | err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); | 4802 | err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); |
4770 | if (err) { | 4803 | if (err) { |
@@ -4809,10 +4842,10 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, | |||
4809 | 4842 | ||
4810 | /* do not allow sys_link's with other subvols of the same device */ | 4843 | /* do not allow sys_link's with other subvols of the same device */ |
4811 | if (root->objectid != BTRFS_I(inode)->root->objectid) | 4844 | if (root->objectid != BTRFS_I(inode)->root->objectid) |
4812 | return -EPERM; | 4845 | return -EXDEV; |
4813 | 4846 | ||
4814 | btrfs_inc_nlink(inode); | 4847 | if (inode->i_nlink == ~0U) |
4815 | inode->i_ctime = CURRENT_TIME; | 4848 | return -EMLINK; |
4816 | 4849 | ||
4817 | err = btrfs_set_inode_index(dir, &index); | 4850 | err = btrfs_set_inode_index(dir, &index); |
4818 | if (err) | 4851 | if (err) |
@@ -4829,6 +4862,9 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, | |||
4829 | goto fail; | 4862 | goto fail; |
4830 | } | 4863 | } |
4831 | 4864 | ||
4865 | btrfs_inc_nlink(inode); | ||
4866 | inode->i_ctime = CURRENT_TIME; | ||
4867 | |||
4832 | btrfs_set_trans_block_group(trans, dir); | 4868 | btrfs_set_trans_block_group(trans, dir); |
4833 | ihold(inode); | 4869 | ihold(inode); |
4834 | 4870 | ||
@@ -4966,6 +5002,8 @@ static noinline int uncompress_inline(struct btrfs_path *path, | |||
4966 | inline_size = btrfs_file_extent_inline_item_len(leaf, | 5002 | inline_size = btrfs_file_extent_inline_item_len(leaf, |
4967 | btrfs_item_nr(leaf, path->slots[0])); | 5003 | btrfs_item_nr(leaf, path->slots[0])); |
4968 | tmp = kmalloc(inline_size, GFP_NOFS); | 5004 | tmp = kmalloc(inline_size, GFP_NOFS); |
5005 | if (!tmp) | ||
5006 | return -ENOMEM; | ||
4969 | ptr = btrfs_file_extent_inline_start(item); | 5007 | ptr = btrfs_file_extent_inline_start(item); |
4970 | 5008 | ||
4971 | read_extent_buffer(leaf, tmp, ptr, inline_size); | 5009 | read_extent_buffer(leaf, tmp, ptr, inline_size); |
@@ -5198,7 +5236,7 @@ again: | |||
5198 | btrfs_mark_buffer_dirty(leaf); | 5236 | btrfs_mark_buffer_dirty(leaf); |
5199 | } | 5237 | } |
5200 | set_extent_uptodate(io_tree, em->start, | 5238 | set_extent_uptodate(io_tree, em->start, |
5201 | extent_map_end(em) - 1, GFP_NOFS); | 5239 | extent_map_end(em) - 1, NULL, GFP_NOFS); |
5202 | goto insert; | 5240 | goto insert; |
5203 | } else { | 5241 | } else { |
5204 | printk(KERN_ERR "btrfs unknown found_type %d\n", found_type); | 5242 | printk(KERN_ERR "btrfs unknown found_type %d\n", found_type); |
@@ -5265,6 +5303,9 @@ insert: | |||
5265 | } | 5303 | } |
5266 | write_unlock(&em_tree->lock); | 5304 | write_unlock(&em_tree->lock); |
5267 | out: | 5305 | out: |
5306 | |||
5307 | trace_btrfs_get_extent(root, em); | ||
5308 | |||
5268 | if (path) | 5309 | if (path) |
5269 | btrfs_free_path(path); | 5310 | btrfs_free_path(path); |
5270 | if (trans) { | 5311 | if (trans) { |
@@ -5402,17 +5443,30 @@ out: | |||
5402 | } | 5443 | } |
5403 | 5444 | ||
5404 | static struct extent_map *btrfs_new_extent_direct(struct inode *inode, | 5445 | static struct extent_map *btrfs_new_extent_direct(struct inode *inode, |
5446 | struct extent_map *em, | ||
5405 | u64 start, u64 len) | 5447 | u64 start, u64 len) |
5406 | { | 5448 | { |
5407 | struct btrfs_root *root = BTRFS_I(inode)->root; | 5449 | struct btrfs_root *root = BTRFS_I(inode)->root; |
5408 | struct btrfs_trans_handle *trans; | 5450 | struct btrfs_trans_handle *trans; |
5409 | struct extent_map *em; | ||
5410 | struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; | 5451 | struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; |
5411 | struct btrfs_key ins; | 5452 | struct btrfs_key ins; |
5412 | u64 alloc_hint; | 5453 | u64 alloc_hint; |
5413 | int ret; | 5454 | int ret; |
5455 | bool insert = false; | ||
5414 | 5456 | ||
5415 | btrfs_drop_extent_cache(inode, start, start + len - 1, 0); | 5457 | /* |
5458 | * Ok if the extent map we looked up is a hole and is for the exact | ||
5459 | * range we want, there is no reason to allocate a new one, however if | ||
5460 | * it is not right then we need to free this one and drop the cache for | ||
5461 | * our range. | ||
5462 | */ | ||
5463 | if (em->block_start != EXTENT_MAP_HOLE || em->start != start || | ||
5464 | em->len != len) { | ||
5465 | free_extent_map(em); | ||
5466 | em = NULL; | ||
5467 | insert = true; | ||
5468 | btrfs_drop_extent_cache(inode, start, start + len - 1, 0); | ||
5469 | } | ||
5416 | 5470 | ||
5417 | trans = btrfs_join_transaction(root, 0); | 5471 | trans = btrfs_join_transaction(root, 0); |
5418 | if (IS_ERR(trans)) | 5472 | if (IS_ERR(trans)) |
@@ -5428,10 +5482,12 @@ static struct extent_map *btrfs_new_extent_direct(struct inode *inode, | |||
5428 | goto out; | 5482 | goto out; |
5429 | } | 5483 | } |
5430 | 5484 | ||
5431 | em = alloc_extent_map(GFP_NOFS); | ||
5432 | if (!em) { | 5485 | if (!em) { |
5433 | em = ERR_PTR(-ENOMEM); | 5486 | em = alloc_extent_map(GFP_NOFS); |
5434 | goto out; | 5487 | if (!em) { |
5488 | em = ERR_PTR(-ENOMEM); | ||
5489 | goto out; | ||
5490 | } | ||
5435 | } | 5491 | } |
5436 | 5492 | ||
5437 | em->start = start; | 5493 | em->start = start; |
@@ -5441,9 +5497,15 @@ static struct extent_map *btrfs_new_extent_direct(struct inode *inode, | |||
5441 | em->block_start = ins.objectid; | 5497 | em->block_start = ins.objectid; |
5442 | em->block_len = ins.offset; | 5498 | em->block_len = ins.offset; |
5443 | em->bdev = root->fs_info->fs_devices->latest_bdev; | 5499 | em->bdev = root->fs_info->fs_devices->latest_bdev; |
5500 | |||
5501 | /* | ||
5502 | * We need to do this because if we're using the original em we searched | ||
5503 | * for, we could have EXTENT_FLAG_VACANCY set, and we don't want that. | ||
5504 | */ | ||
5505 | em->flags = 0; | ||
5444 | set_bit(EXTENT_FLAG_PINNED, &em->flags); | 5506 | set_bit(EXTENT_FLAG_PINNED, &em->flags); |
5445 | 5507 | ||
5446 | while (1) { | 5508 | while (insert) { |
5447 | write_lock(&em_tree->lock); | 5509 | write_lock(&em_tree->lock); |
5448 | ret = add_extent_mapping(em_tree, em); | 5510 | ret = add_extent_mapping(em_tree, em); |
5449 | write_unlock(&em_tree->lock); | 5511 | write_unlock(&em_tree->lock); |
@@ -5661,8 +5723,7 @@ must_cow: | |||
5661 | * it above | 5723 | * it above |
5662 | */ | 5724 | */ |
5663 | len = bh_result->b_size; | 5725 | len = bh_result->b_size; |
5664 | free_extent_map(em); | 5726 | em = btrfs_new_extent_direct(inode, em, start, len); |
5665 | em = btrfs_new_extent_direct(inode, start, len); | ||
5666 | if (IS_ERR(em)) | 5727 | if (IS_ERR(em)) |
5667 | return PTR_ERR(em); | 5728 | return PTR_ERR(em); |
5668 | len = min(len, em->len - (start - em->start)); | 5729 | len = min(len, em->len - (start - em->start)); |
@@ -5748,6 +5809,10 @@ static void btrfs_endio_direct_read(struct bio *bio, int err) | |||
5748 | 5809 | ||
5749 | kfree(dip->csums); | 5810 | kfree(dip->csums); |
5750 | kfree(dip); | 5811 | kfree(dip); |
5812 | |||
5813 | /* If we had a csum failure make sure to clear the uptodate flag */ | ||
5814 | if (err) | ||
5815 | clear_bit(BIO_UPTODATE, &bio->bi_flags); | ||
5751 | dio_end_io(bio, err); | 5816 | dio_end_io(bio, err); |
5752 | } | 5817 | } |
5753 | 5818 | ||
@@ -5821,8 +5886,10 @@ again: | |||
5821 | } | 5886 | } |
5822 | 5887 | ||
5823 | add_pending_csums(trans, inode, ordered->file_offset, &ordered->list); | 5888 | add_pending_csums(trans, inode, ordered->file_offset, &ordered->list); |
5824 | btrfs_ordered_update_i_size(inode, 0, ordered); | 5889 | ret = btrfs_ordered_update_i_size(inode, 0, ordered); |
5825 | btrfs_update_inode(trans, root, inode); | 5890 | if (!ret) |
5891 | btrfs_update_inode(trans, root, inode); | ||
5892 | ret = 0; | ||
5826 | out_unlock: | 5893 | out_unlock: |
5827 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, ordered->file_offset, | 5894 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, ordered->file_offset, |
5828 | ordered->file_offset + ordered->len - 1, | 5895 | ordered->file_offset + ordered->len - 1, |
@@ -5849,6 +5916,10 @@ out_done: | |||
5849 | 5916 | ||
5850 | kfree(dip->csums); | 5917 | kfree(dip->csums); |
5851 | kfree(dip); | 5918 | kfree(dip); |
5919 | |||
5920 | /* If we had an error make sure to clear the uptodate flag */ | ||
5921 | if (err) | ||
5922 | clear_bit(BIO_UPTODATE, &bio->bi_flags); | ||
5852 | dio_end_io(bio, err); | 5923 | dio_end_io(bio, err); |
5853 | } | 5924 | } |
5854 | 5925 | ||
@@ -5904,7 +5975,7 @@ static struct bio *btrfs_dio_bio_alloc(struct block_device *bdev, | |||
5904 | 5975 | ||
5905 | static inline int __btrfs_submit_dio_bio(struct bio *bio, struct inode *inode, | 5976 | static inline int __btrfs_submit_dio_bio(struct bio *bio, struct inode *inode, |
5906 | int rw, u64 file_offset, int skip_sum, | 5977 | int rw, u64 file_offset, int skip_sum, |
5907 | u32 *csums) | 5978 | u32 *csums, int async_submit) |
5908 | { | 5979 | { |
5909 | int write = rw & REQ_WRITE; | 5980 | int write = rw & REQ_WRITE; |
5910 | struct btrfs_root *root = BTRFS_I(inode)->root; | 5981 | struct btrfs_root *root = BTRFS_I(inode)->root; |
@@ -5915,18 +5986,33 @@ static inline int __btrfs_submit_dio_bio(struct bio *bio, struct inode *inode, | |||
5915 | if (ret) | 5986 | if (ret) |
5916 | goto err; | 5987 | goto err; |
5917 | 5988 | ||
5918 | if (write && !skip_sum) { | 5989 | if (skip_sum) |
5990 | goto map; | ||
5991 | |||
5992 | if (write && async_submit) { | ||
5919 | ret = btrfs_wq_submit_bio(root->fs_info, | 5993 | ret = btrfs_wq_submit_bio(root->fs_info, |
5920 | inode, rw, bio, 0, 0, | 5994 | inode, rw, bio, 0, 0, |
5921 | file_offset, | 5995 | file_offset, |
5922 | __btrfs_submit_bio_start_direct_io, | 5996 | __btrfs_submit_bio_start_direct_io, |
5923 | __btrfs_submit_bio_done); | 5997 | __btrfs_submit_bio_done); |
5924 | goto err; | 5998 | goto err; |
5925 | } else if (!skip_sum) | 5999 | } else if (write) { |
5926 | btrfs_lookup_bio_sums_dio(root, inode, bio, | 6000 | /* |
6001 | * If we aren't doing async submit, calculate the csum of the | ||
6002 | * bio now. | ||
6003 | */ | ||
6004 | ret = btrfs_csum_one_bio(root, inode, bio, file_offset, 1); | ||
6005 | if (ret) | ||
6006 | goto err; | ||
6007 | } else if (!skip_sum) { | ||
6008 | ret = btrfs_lookup_bio_sums_dio(root, inode, bio, | ||
5927 | file_offset, csums); | 6009 | file_offset, csums); |
6010 | if (ret) | ||
6011 | goto err; | ||
6012 | } | ||
5928 | 6013 | ||
5929 | ret = btrfs_map_bio(root, rw, bio, 0, 1); | 6014 | map: |
6015 | ret = btrfs_map_bio(root, rw, bio, 0, async_submit); | ||
5930 | err: | 6016 | err: |
5931 | bio_put(bio); | 6017 | bio_put(bio); |
5932 | return ret; | 6018 | return ret; |
@@ -5948,22 +6034,30 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, | |||
5948 | int nr_pages = 0; | 6034 | int nr_pages = 0; |
5949 | u32 *csums = dip->csums; | 6035 | u32 *csums = dip->csums; |
5950 | int ret = 0; | 6036 | int ret = 0; |
5951 | 6037 | int async_submit = 0; | |
5952 | bio = btrfs_dio_bio_alloc(orig_bio->bi_bdev, start_sector, GFP_NOFS); | 6038 | 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 | 6039 | ||
5959 | map_length = orig_bio->bi_size; | 6040 | map_length = orig_bio->bi_size; |
5960 | ret = btrfs_map_block(map_tree, READ, start_sector << 9, | 6041 | ret = btrfs_map_block(map_tree, READ, start_sector << 9, |
5961 | &map_length, NULL, 0); | 6042 | &map_length, NULL, 0); |
5962 | if (ret) { | 6043 | if (ret) { |
5963 | bio_put(bio); | 6044 | bio_put(orig_bio); |
5964 | return -EIO; | 6045 | return -EIO; |
5965 | } | 6046 | } |
5966 | 6047 | ||
6048 | if (map_length >= orig_bio->bi_size) { | ||
6049 | bio = orig_bio; | ||
6050 | goto submit; | ||
6051 | } | ||
6052 | |||
6053 | async_submit = 1; | ||
6054 | bio = btrfs_dio_bio_alloc(orig_bio->bi_bdev, start_sector, GFP_NOFS); | ||
6055 | if (!bio) | ||
6056 | return -ENOMEM; | ||
6057 | bio->bi_private = dip; | ||
6058 | bio->bi_end_io = btrfs_end_dio_bio; | ||
6059 | atomic_inc(&dip->pending_bios); | ||
6060 | |||
5967 | while (bvec <= (orig_bio->bi_io_vec + orig_bio->bi_vcnt - 1)) { | 6061 | while (bvec <= (orig_bio->bi_io_vec + orig_bio->bi_vcnt - 1)) { |
5968 | if (unlikely(map_length < submit_len + bvec->bv_len || | 6062 | if (unlikely(map_length < submit_len + bvec->bv_len || |
5969 | bio_add_page(bio, bvec->bv_page, bvec->bv_len, | 6063 | bio_add_page(bio, bvec->bv_page, bvec->bv_len, |
@@ -5977,14 +6071,15 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, | |||
5977 | atomic_inc(&dip->pending_bios); | 6071 | atomic_inc(&dip->pending_bios); |
5978 | ret = __btrfs_submit_dio_bio(bio, inode, rw, | 6072 | ret = __btrfs_submit_dio_bio(bio, inode, rw, |
5979 | file_offset, skip_sum, | 6073 | file_offset, skip_sum, |
5980 | csums); | 6074 | csums, async_submit); |
5981 | if (ret) { | 6075 | if (ret) { |
5982 | bio_put(bio); | 6076 | bio_put(bio); |
5983 | atomic_dec(&dip->pending_bios); | 6077 | atomic_dec(&dip->pending_bios); |
5984 | goto out_err; | 6078 | goto out_err; |
5985 | } | 6079 | } |
5986 | 6080 | ||
5987 | if (!skip_sum) | 6081 | /* Write's use the ordered csums */ |
6082 | if (!write && !skip_sum) | ||
5988 | csums = csums + nr_pages; | 6083 | csums = csums + nr_pages; |
5989 | start_sector += submit_len >> 9; | 6084 | start_sector += submit_len >> 9; |
5990 | file_offset += submit_len; | 6085 | file_offset += submit_len; |
@@ -6013,8 +6108,9 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, | |||
6013 | } | 6108 | } |
6014 | } | 6109 | } |
6015 | 6110 | ||
6111 | submit: | ||
6016 | ret = __btrfs_submit_dio_bio(bio, inode, rw, file_offset, skip_sum, | 6112 | ret = __btrfs_submit_dio_bio(bio, inode, rw, file_offset, skip_sum, |
6017 | csums); | 6113 | csums, async_submit); |
6018 | if (!ret) | 6114 | if (!ret) |
6019 | return 0; | 6115 | return 0; |
6020 | 6116 | ||
@@ -6052,7 +6148,8 @@ static void btrfs_submit_direct(int rw, struct bio *bio, struct inode *inode, | |||
6052 | } | 6148 | } |
6053 | dip->csums = NULL; | 6149 | dip->csums = NULL; |
6054 | 6150 | ||
6055 | if (!skip_sum) { | 6151 | /* Write's use the ordered csum stuff, so we don't need dip->csums */ |
6152 | if (!write && !skip_sum) { | ||
6056 | dip->csums = kmalloc(sizeof(u32) * bio->bi_vcnt, GFP_NOFS); | 6153 | dip->csums = kmalloc(sizeof(u32) * bio->bi_vcnt, GFP_NOFS); |
6057 | if (!dip->csums) { | 6154 | if (!dip->csums) { |
6058 | kfree(dip); | 6155 | kfree(dip); |
@@ -6108,6 +6205,7 @@ static ssize_t check_direct_IO(struct btrfs_root *root, int rw, struct kiocb *io | |||
6108 | unsigned long nr_segs) | 6205 | unsigned long nr_segs) |
6109 | { | 6206 | { |
6110 | int seg; | 6207 | int seg; |
6208 | int i; | ||
6111 | size_t size; | 6209 | size_t size; |
6112 | unsigned long addr; | 6210 | unsigned long addr; |
6113 | unsigned blocksize_mask = root->sectorsize - 1; | 6211 | unsigned blocksize_mask = root->sectorsize - 1; |
@@ -6122,8 +6220,22 @@ static ssize_t check_direct_IO(struct btrfs_root *root, int rw, struct kiocb *io | |||
6122 | addr = (unsigned long)iov[seg].iov_base; | 6220 | addr = (unsigned long)iov[seg].iov_base; |
6123 | size = iov[seg].iov_len; | 6221 | size = iov[seg].iov_len; |
6124 | end += size; | 6222 | end += size; |
6125 | if ((addr & blocksize_mask) || (size & blocksize_mask)) | 6223 | if ((addr & blocksize_mask) || (size & blocksize_mask)) |
6126 | goto out; | 6224 | goto out; |
6225 | |||
6226 | /* If this is a write we don't need to check anymore */ | ||
6227 | if (rw & WRITE) | ||
6228 | continue; | ||
6229 | |||
6230 | /* | ||
6231 | * Check to make sure we don't have duplicate iov_base's in this | ||
6232 | * iovec, if so return EINVAL, otherwise we'll get csum errors | ||
6233 | * when reading back. | ||
6234 | */ | ||
6235 | for (i = seg + 1; i < nr_segs; i++) { | ||
6236 | if (iov[seg].iov_base == iov[i].iov_base) | ||
6237 | goto out; | ||
6238 | } | ||
6127 | } | 6239 | } |
6128 | retval = 0; | 6240 | retval = 0; |
6129 | out: | 6241 | out: |
@@ -6474,28 +6586,42 @@ out: | |||
6474 | return ret; | 6586 | return ret; |
6475 | } | 6587 | } |
6476 | 6588 | ||
6477 | static void btrfs_truncate(struct inode *inode) | 6589 | static int btrfs_truncate(struct inode *inode) |
6478 | { | 6590 | { |
6479 | struct btrfs_root *root = BTRFS_I(inode)->root; | 6591 | struct btrfs_root *root = BTRFS_I(inode)->root; |
6480 | int ret; | 6592 | int ret; |
6593 | int err = 0; | ||
6481 | struct btrfs_trans_handle *trans; | 6594 | struct btrfs_trans_handle *trans; |
6482 | unsigned long nr; | 6595 | unsigned long nr; |
6483 | u64 mask = root->sectorsize - 1; | 6596 | u64 mask = root->sectorsize - 1; |
6484 | 6597 | ||
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); | 6598 | ret = btrfs_truncate_page(inode->i_mapping, inode->i_size); |
6491 | if (ret) | 6599 | if (ret) |
6492 | return; | 6600 | return ret; |
6493 | 6601 | ||
6494 | btrfs_wait_ordered_range(inode, inode->i_size & (~mask), (u64)-1); | 6602 | btrfs_wait_ordered_range(inode, inode->i_size & (~mask), (u64)-1); |
6495 | btrfs_ordered_update_i_size(inode, inode->i_size, NULL); | 6603 | btrfs_ordered_update_i_size(inode, inode->i_size, NULL); |
6496 | 6604 | ||
6605 | trans = btrfs_start_transaction(root, 5); | ||
6606 | if (IS_ERR(trans)) | ||
6607 | return PTR_ERR(trans); | ||
6608 | |||
6609 | btrfs_set_trans_block_group(trans, inode); | ||
6610 | |||
6611 | ret = btrfs_orphan_add(trans, inode); | ||
6612 | if (ret) { | ||
6613 | btrfs_end_transaction(trans, root); | ||
6614 | return ret; | ||
6615 | } | ||
6616 | |||
6617 | nr = trans->blocks_used; | ||
6618 | btrfs_end_transaction(trans, root); | ||
6619 | btrfs_btree_balance_dirty(root, nr); | ||
6620 | |||
6621 | /* Now start a transaction for the truncate */ | ||
6497 | trans = btrfs_start_transaction(root, 0); | 6622 | trans = btrfs_start_transaction(root, 0); |
6498 | BUG_ON(IS_ERR(trans)); | 6623 | if (IS_ERR(trans)) |
6624 | return PTR_ERR(trans); | ||
6499 | btrfs_set_trans_block_group(trans, inode); | 6625 | btrfs_set_trans_block_group(trans, inode); |
6500 | trans->block_rsv = root->orphan_block_rsv; | 6626 | trans->block_rsv = root->orphan_block_rsv; |
6501 | 6627 | ||
@@ -6522,29 +6648,38 @@ static void btrfs_truncate(struct inode *inode) | |||
6522 | while (1) { | 6648 | while (1) { |
6523 | if (!trans) { | 6649 | if (!trans) { |
6524 | trans = btrfs_start_transaction(root, 0); | 6650 | trans = btrfs_start_transaction(root, 0); |
6525 | BUG_ON(IS_ERR(trans)); | 6651 | if (IS_ERR(trans)) |
6652 | return PTR_ERR(trans); | ||
6526 | btrfs_set_trans_block_group(trans, inode); | 6653 | btrfs_set_trans_block_group(trans, inode); |
6527 | trans->block_rsv = root->orphan_block_rsv; | 6654 | trans->block_rsv = root->orphan_block_rsv; |
6528 | } | 6655 | } |
6529 | 6656 | ||
6530 | ret = btrfs_block_rsv_check(trans, root, | 6657 | ret = btrfs_block_rsv_check(trans, root, |
6531 | root->orphan_block_rsv, 0, 5); | 6658 | root->orphan_block_rsv, 0, 5); |
6532 | if (ret) { | 6659 | if (ret == -EAGAIN) { |
6533 | BUG_ON(ret != -EAGAIN); | ||
6534 | ret = btrfs_commit_transaction(trans, root); | 6660 | ret = btrfs_commit_transaction(trans, root); |
6535 | BUG_ON(ret); | 6661 | if (ret) |
6662 | return ret; | ||
6536 | trans = NULL; | 6663 | trans = NULL; |
6537 | continue; | 6664 | continue; |
6665 | } else if (ret) { | ||
6666 | err = ret; | ||
6667 | break; | ||
6538 | } | 6668 | } |
6539 | 6669 | ||
6540 | ret = btrfs_truncate_inode_items(trans, root, inode, | 6670 | ret = btrfs_truncate_inode_items(trans, root, inode, |
6541 | inode->i_size, | 6671 | inode->i_size, |
6542 | BTRFS_EXTENT_DATA_KEY); | 6672 | BTRFS_EXTENT_DATA_KEY); |
6543 | if (ret != -EAGAIN) | 6673 | if (ret != -EAGAIN) { |
6674 | err = ret; | ||
6544 | break; | 6675 | break; |
6676 | } | ||
6545 | 6677 | ||
6546 | ret = btrfs_update_inode(trans, root, inode); | 6678 | ret = btrfs_update_inode(trans, root, inode); |
6547 | BUG_ON(ret); | 6679 | if (ret) { |
6680 | err = ret; | ||
6681 | break; | ||
6682 | } | ||
6548 | 6683 | ||
6549 | nr = trans->blocks_used; | 6684 | nr = trans->blocks_used; |
6550 | btrfs_end_transaction(trans, root); | 6685 | btrfs_end_transaction(trans, root); |
@@ -6554,16 +6689,27 @@ static void btrfs_truncate(struct inode *inode) | |||
6554 | 6689 | ||
6555 | if (ret == 0 && inode->i_nlink > 0) { | 6690 | if (ret == 0 && inode->i_nlink > 0) { |
6556 | ret = btrfs_orphan_del(trans, inode); | 6691 | ret = btrfs_orphan_del(trans, inode); |
6557 | BUG_ON(ret); | 6692 | if (ret) |
6693 | err = ret; | ||
6694 | } else if (ret && inode->i_nlink > 0) { | ||
6695 | /* | ||
6696 | * Failed to do the truncate, remove us from the in memory | ||
6697 | * orphan list. | ||
6698 | */ | ||
6699 | ret = btrfs_orphan_del(NULL, inode); | ||
6558 | } | 6700 | } |
6559 | 6701 | ||
6560 | ret = btrfs_update_inode(trans, root, inode); | 6702 | ret = btrfs_update_inode(trans, root, inode); |
6561 | BUG_ON(ret); | 6703 | if (ret && !err) |
6704 | err = ret; | ||
6562 | 6705 | ||
6563 | nr = trans->blocks_used; | 6706 | nr = trans->blocks_used; |
6564 | ret = btrfs_end_transaction_throttle(trans, root); | 6707 | ret = btrfs_end_transaction_throttle(trans, root); |
6565 | BUG_ON(ret); | 6708 | if (ret && !err) |
6709 | err = ret; | ||
6566 | btrfs_btree_balance_dirty(root, nr); | 6710 | btrfs_btree_balance_dirty(root, nr); |
6711 | |||
6712 | return err; | ||
6567 | } | 6713 | } |
6568 | 6714 | ||
6569 | /* | 6715 | /* |
@@ -6630,9 +6776,8 @@ struct inode *btrfs_alloc_inode(struct super_block *sb) | |||
6630 | ei->index_cnt = (u64)-1; | 6776 | ei->index_cnt = (u64)-1; |
6631 | ei->last_unlink_trans = 0; | 6777 | ei->last_unlink_trans = 0; |
6632 | 6778 | ||
6633 | spin_lock_init(&ei->accounting_lock); | ||
6634 | atomic_set(&ei->outstanding_extents, 0); | 6779 | atomic_set(&ei->outstanding_extents, 0); |
6635 | ei->reserved_extents = 0; | 6780 | atomic_set(&ei->reserved_extents, 0); |
6636 | 6781 | ||
6637 | ei->ordered_data_close = 0; | 6782 | ei->ordered_data_close = 0; |
6638 | ei->orphan_meta_reserved = 0; | 6783 | ei->orphan_meta_reserved = 0; |
@@ -6668,7 +6813,7 @@ void btrfs_destroy_inode(struct inode *inode) | |||
6668 | WARN_ON(!list_empty(&inode->i_dentry)); | 6813 | WARN_ON(!list_empty(&inode->i_dentry)); |
6669 | WARN_ON(inode->i_data.nrpages); | 6814 | WARN_ON(inode->i_data.nrpages); |
6670 | WARN_ON(atomic_read(&BTRFS_I(inode)->outstanding_extents)); | 6815 | WARN_ON(atomic_read(&BTRFS_I(inode)->outstanding_extents)); |
6671 | WARN_ON(BTRFS_I(inode)->reserved_extents); | 6816 | WARN_ON(atomic_read(&BTRFS_I(inode)->reserved_extents)); |
6672 | 6817 | ||
6673 | /* | 6818 | /* |
6674 | * This can happen where we create an inode, but somebody else also | 6819 | * This can happen where we create an inode, but somebody else also |
@@ -6760,6 +6905,8 @@ void btrfs_destroy_cachep(void) | |||
6760 | kmem_cache_destroy(btrfs_transaction_cachep); | 6905 | kmem_cache_destroy(btrfs_transaction_cachep); |
6761 | if (btrfs_path_cachep) | 6906 | if (btrfs_path_cachep) |
6762 | kmem_cache_destroy(btrfs_path_cachep); | 6907 | kmem_cache_destroy(btrfs_path_cachep); |
6908 | if (btrfs_free_space_cachep) | ||
6909 | kmem_cache_destroy(btrfs_free_space_cachep); | ||
6763 | } | 6910 | } |
6764 | 6911 | ||
6765 | int btrfs_init_cachep(void) | 6912 | int btrfs_init_cachep(void) |
@@ -6788,6 +6935,12 @@ int btrfs_init_cachep(void) | |||
6788 | if (!btrfs_path_cachep) | 6935 | if (!btrfs_path_cachep) |
6789 | goto fail; | 6936 | goto fail; |
6790 | 6937 | ||
6938 | btrfs_free_space_cachep = kmem_cache_create("btrfs_free_space_cache", | ||
6939 | sizeof(struct btrfs_free_space), 0, | ||
6940 | SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD, NULL); | ||
6941 | if (!btrfs_free_space_cachep) | ||
6942 | goto fail; | ||
6943 | |||
6791 | return 0; | 6944 | return 0; |
6792 | fail: | 6945 | fail: |
6793 | btrfs_destroy_cachep(); | 6946 | btrfs_destroy_cachep(); |
@@ -6806,6 +6959,26 @@ static int btrfs_getattr(struct vfsmount *mnt, | |||
6806 | return 0; | 6959 | return 0; |
6807 | } | 6960 | } |
6808 | 6961 | ||
6962 | /* | ||
6963 | * If a file is moved, it will inherit the cow and compression flags of the new | ||
6964 | * directory. | ||
6965 | */ | ||
6966 | static void fixup_inode_flags(struct inode *dir, struct inode *inode) | ||
6967 | { | ||
6968 | struct btrfs_inode *b_dir = BTRFS_I(dir); | ||
6969 | struct btrfs_inode *b_inode = BTRFS_I(inode); | ||
6970 | |||
6971 | if (b_dir->flags & BTRFS_INODE_NODATACOW) | ||
6972 | b_inode->flags |= BTRFS_INODE_NODATACOW; | ||
6973 | else | ||
6974 | b_inode->flags &= ~BTRFS_INODE_NODATACOW; | ||
6975 | |||
6976 | if (b_dir->flags & BTRFS_INODE_COMPRESS) | ||
6977 | b_inode->flags |= BTRFS_INODE_COMPRESS; | ||
6978 | else | ||
6979 | b_inode->flags &= ~BTRFS_INODE_COMPRESS; | ||
6980 | } | ||
6981 | |||
6809 | static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | 6982 | static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, |
6810 | struct inode *new_dir, struct dentry *new_dentry) | 6983 | struct inode *new_dir, struct dentry *new_dentry) |
6811 | { | 6984 | { |
@@ -6854,8 +7027,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. | 7027 | * should cover the worst case number of items we'll modify. |
6855 | */ | 7028 | */ |
6856 | trans = btrfs_start_transaction(root, 20); | 7029 | trans = btrfs_start_transaction(root, 20); |
6857 | if (IS_ERR(trans)) | 7030 | if (IS_ERR(trans)) { |
6858 | return PTR_ERR(trans); | 7031 | ret = PTR_ERR(trans); |
7032 | goto out_notrans; | ||
7033 | } | ||
6859 | 7034 | ||
6860 | btrfs_set_trans_block_group(trans, new_dir); | 7035 | btrfs_set_trans_block_group(trans, new_dir); |
6861 | 7036 | ||
@@ -6908,11 +7083,12 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
6908 | old_dentry->d_name.name, | 7083 | old_dentry->d_name.name, |
6909 | old_dentry->d_name.len); | 7084 | old_dentry->d_name.len); |
6910 | } else { | 7085 | } else { |
6911 | btrfs_inc_nlink(old_dentry->d_inode); | 7086 | ret = __btrfs_unlink_inode(trans, root, old_dir, |
6912 | ret = btrfs_unlink_inode(trans, root, old_dir, | 7087 | old_dentry->d_inode, |
6913 | old_dentry->d_inode, | 7088 | old_dentry->d_name.name, |
6914 | old_dentry->d_name.name, | 7089 | old_dentry->d_name.len); |
6915 | old_dentry->d_name.len); | 7090 | if (!ret) |
7091 | ret = btrfs_update_inode(trans, root, old_inode); | ||
6916 | } | 7092 | } |
6917 | BUG_ON(ret); | 7093 | BUG_ON(ret); |
6918 | 7094 | ||
@@ -6939,6 +7115,8 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
6939 | } | 7115 | } |
6940 | } | 7116 | } |
6941 | 7117 | ||
7118 | fixup_inode_flags(new_dir, old_inode); | ||
7119 | |||
6942 | ret = btrfs_add_link(trans, new_dir, old_inode, | 7120 | ret = btrfs_add_link(trans, new_dir, old_inode, |
6943 | new_dentry->d_name.name, | 7121 | new_dentry->d_name.name, |
6944 | new_dentry->d_name.len, 0, index); | 7122 | new_dentry->d_name.len, 0, index); |
@@ -6952,7 +7130,7 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
6952 | } | 7130 | } |
6953 | out_fail: | 7131 | out_fail: |
6954 | btrfs_end_transaction_throttle(trans, root); | 7132 | btrfs_end_transaction_throttle(trans, root); |
6955 | 7133 | out_notrans: | |
6956 | if (old_inode->i_ino == BTRFS_FIRST_FREE_OBJECTID) | 7134 | if (old_inode->i_ino == BTRFS_FIRST_FREE_OBJECTID) |
6957 | up_read(&root->fs_info->subvol_sem); | 7135 | up_read(&root->fs_info->subvol_sem); |
6958 | 7136 | ||
@@ -7100,9 +7278,10 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | |||
7100 | dentry->d_name.len, dir->i_ino, objectid, | 7278 | dentry->d_name.len, dir->i_ino, objectid, |
7101 | BTRFS_I(dir)->block_group, S_IFLNK|S_IRWXUGO, | 7279 | BTRFS_I(dir)->block_group, S_IFLNK|S_IRWXUGO, |
7102 | &index); | 7280 | &index); |
7103 | err = PTR_ERR(inode); | 7281 | if (IS_ERR(inode)) { |
7104 | if (IS_ERR(inode)) | 7282 | err = PTR_ERR(inode); |
7105 | goto out_unlock; | 7283 | goto out_unlock; |
7284 | } | ||
7106 | 7285 | ||
7107 | err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); | 7286 | err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); |
7108 | if (err) { | 7287 | if (err) { |
@@ -7340,7 +7519,6 @@ static const struct address_space_operations btrfs_aops = { | |||
7340 | .writepage = btrfs_writepage, | 7519 | .writepage = btrfs_writepage, |
7341 | .writepages = btrfs_writepages, | 7520 | .writepages = btrfs_writepages, |
7342 | .readpages = btrfs_readpages, | 7521 | .readpages = btrfs_readpages, |
7343 | .sync_page = block_sync_page, | ||
7344 | .direct_IO = btrfs_direct_IO, | 7522 | .direct_IO = btrfs_direct_IO, |
7345 | .invalidatepage = btrfs_invalidatepage, | 7523 | .invalidatepage = btrfs_invalidatepage, |
7346 | .releasepage = btrfs_releasepage, | 7524 | .releasepage = btrfs_releasepage, |
@@ -7356,7 +7534,6 @@ static const struct address_space_operations btrfs_symlink_aops = { | |||
7356 | }; | 7534 | }; |
7357 | 7535 | ||
7358 | static const struct inode_operations btrfs_file_inode_operations = { | 7536 | static const struct inode_operations btrfs_file_inode_operations = { |
7359 | .truncate = btrfs_truncate, | ||
7360 | .getattr = btrfs_getattr, | 7537 | .getattr = btrfs_getattr, |
7361 | .setattr = btrfs_setattr, | 7538 | .setattr = btrfs_setattr, |
7362 | .setxattr = btrfs_setxattr, | 7539 | .setxattr = btrfs_setxattr, |