diff options
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 393 |
1 files changed, 249 insertions, 144 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 119520bdb9a5..5cc64ab9c485 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 */ |
@@ -1785,6 +1794,8 @@ out: | |||
1785 | static int btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end, | 1794 | static int btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end, |
1786 | struct extent_state *state, int uptodate) | 1795 | struct extent_state *state, int uptodate) |
1787 | { | 1796 | { |
1797 | trace_btrfs_writepage_end_io_hook(page, start, end, uptodate); | ||
1798 | |||
1788 | ClearPagePrivate2(page); | 1799 | ClearPagePrivate2(page); |
1789 | return btrfs_finish_ordered_io(page->mapping->host, start, end); | 1800 | return btrfs_finish_ordered_io(page->mapping->host, start, end); |
1790 | } | 1801 | } |
@@ -1895,10 +1906,10 @@ static int btrfs_io_failed_hook(struct bio *failed_bio, | |||
1895 | else | 1906 | else |
1896 | rw = READ; | 1907 | rw = READ; |
1897 | 1908 | ||
1898 | BTRFS_I(inode)->io_tree.ops->submit_bio_hook(inode, rw, bio, | 1909 | ret = BTRFS_I(inode)->io_tree.ops->submit_bio_hook(inode, rw, bio, |
1899 | failrec->last_mirror, | 1910 | failrec->last_mirror, |
1900 | failrec->bio_flags, 0); | 1911 | failrec->bio_flags, 0); |
1901 | return 0; | 1912 | return ret; |
1902 | } | 1913 | } |
1903 | 1914 | ||
1904 | /* | 1915 | /* |
@@ -2210,8 +2221,6 @@ int btrfs_orphan_add(struct btrfs_trans_handle *trans, struct inode *inode) | |||
2210 | insert = 1; | 2221 | insert = 1; |
2211 | #endif | 2222 | #endif |
2212 | insert = 1; | 2223 | insert = 1; |
2213 | } else { | ||
2214 | WARN_ON(!BTRFS_I(inode)->orphan_meta_reserved); | ||
2215 | } | 2224 | } |
2216 | 2225 | ||
2217 | if (!BTRFS_I(inode)->orphan_meta_reserved) { | 2226 | if (!BTRFS_I(inode)->orphan_meta_reserved) { |
@@ -2282,7 +2291,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 | 2291 | * this cleans up any orphans that may be left on the list from the last use |
2283 | * of this root. | 2292 | * of this root. |
2284 | */ | 2293 | */ |
2285 | void btrfs_orphan_cleanup(struct btrfs_root *root) | 2294 | int btrfs_orphan_cleanup(struct btrfs_root *root) |
2286 | { | 2295 | { |
2287 | struct btrfs_path *path; | 2296 | struct btrfs_path *path; |
2288 | struct extent_buffer *leaf; | 2297 | struct extent_buffer *leaf; |
@@ -2292,10 +2301,13 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2292 | int ret = 0, nr_unlink = 0, nr_truncate = 0; | 2301 | int ret = 0, nr_unlink = 0, nr_truncate = 0; |
2293 | 2302 | ||
2294 | if (cmpxchg(&root->orphan_cleanup_state, 0, ORPHAN_CLEANUP_STARTED)) | 2303 | if (cmpxchg(&root->orphan_cleanup_state, 0, ORPHAN_CLEANUP_STARTED)) |
2295 | return; | 2304 | return 0; |
2296 | 2305 | ||
2297 | path = btrfs_alloc_path(); | 2306 | path = btrfs_alloc_path(); |
2298 | BUG_ON(!path); | 2307 | if (!path) { |
2308 | ret = -ENOMEM; | ||
2309 | goto out; | ||
2310 | } | ||
2299 | path->reada = -1; | 2311 | path->reada = -1; |
2300 | 2312 | ||
2301 | key.objectid = BTRFS_ORPHAN_OBJECTID; | 2313 | key.objectid = BTRFS_ORPHAN_OBJECTID; |
@@ -2304,18 +2316,16 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2304 | 2316 | ||
2305 | while (1) { | 2317 | while (1) { |
2306 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); | 2318 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); |
2307 | if (ret < 0) { | 2319 | if (ret < 0) |
2308 | printk(KERN_ERR "Error searching slot for orphan: %d" | 2320 | goto out; |
2309 | "\n", ret); | ||
2310 | break; | ||
2311 | } | ||
2312 | 2321 | ||
2313 | /* | 2322 | /* |
2314 | * if ret == 0 means we found what we were searching for, which | 2323 | * 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 | 2324 | * 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 | 2325 | * find the key and see if we have stuff that matches |
2317 | */ | 2326 | */ |
2318 | if (ret > 0) { | 2327 | if (ret > 0) { |
2328 | ret = 0; | ||
2319 | if (path->slots[0] == 0) | 2329 | if (path->slots[0] == 0) |
2320 | break; | 2330 | break; |
2321 | path->slots[0]--; | 2331 | path->slots[0]--; |
@@ -2343,7 +2353,10 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2343 | found_key.type = BTRFS_INODE_ITEM_KEY; | 2353 | found_key.type = BTRFS_INODE_ITEM_KEY; |
2344 | found_key.offset = 0; | 2354 | found_key.offset = 0; |
2345 | inode = btrfs_iget(root->fs_info->sb, &found_key, root, NULL); | 2355 | inode = btrfs_iget(root->fs_info->sb, &found_key, root, NULL); |
2346 | BUG_ON(IS_ERR(inode)); | 2356 | if (IS_ERR(inode)) { |
2357 | ret = PTR_ERR(inode); | ||
2358 | goto out; | ||
2359 | } | ||
2347 | 2360 | ||
2348 | /* | 2361 | /* |
2349 | * add this inode to the orphan list so btrfs_orphan_del does | 2362 | * add this inode to the orphan list so btrfs_orphan_del does |
@@ -2361,7 +2374,10 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2361 | */ | 2374 | */ |
2362 | if (is_bad_inode(inode)) { | 2375 | if (is_bad_inode(inode)) { |
2363 | trans = btrfs_start_transaction(root, 0); | 2376 | trans = btrfs_start_transaction(root, 0); |
2364 | BUG_ON(IS_ERR(trans)); | 2377 | if (IS_ERR(trans)) { |
2378 | ret = PTR_ERR(trans); | ||
2379 | goto out; | ||
2380 | } | ||
2365 | btrfs_orphan_del(trans, inode); | 2381 | btrfs_orphan_del(trans, inode); |
2366 | btrfs_end_transaction(trans, root); | 2382 | btrfs_end_transaction(trans, root); |
2367 | iput(inode); | 2383 | iput(inode); |
@@ -2370,17 +2386,22 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2370 | 2386 | ||
2371 | /* if we have links, this was a truncate, lets do that */ | 2387 | /* if we have links, this was a truncate, lets do that */ |
2372 | if (inode->i_nlink) { | 2388 | if (inode->i_nlink) { |
2389 | if (!S_ISREG(inode->i_mode)) { | ||
2390 | WARN_ON(1); | ||
2391 | iput(inode); | ||
2392 | continue; | ||
2393 | } | ||
2373 | nr_truncate++; | 2394 | nr_truncate++; |
2374 | btrfs_truncate(inode); | 2395 | ret = btrfs_truncate(inode); |
2375 | } else { | 2396 | } else { |
2376 | nr_unlink++; | 2397 | nr_unlink++; |
2377 | } | 2398 | } |
2378 | 2399 | ||
2379 | /* this will do delete_inode and everything for us */ | 2400 | /* this will do delete_inode and everything for us */ |
2380 | iput(inode); | 2401 | iput(inode); |
2402 | if (ret) | ||
2403 | goto out; | ||
2381 | } | 2404 | } |
2382 | btrfs_free_path(path); | ||
2383 | |||
2384 | root->orphan_cleanup_state = ORPHAN_CLEANUP_DONE; | 2405 | root->orphan_cleanup_state = ORPHAN_CLEANUP_DONE; |
2385 | 2406 | ||
2386 | if (root->orphan_block_rsv) | 2407 | if (root->orphan_block_rsv) |
@@ -2389,14 +2410,20 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2389 | 2410 | ||
2390 | if (root->orphan_block_rsv || root->orphan_item_inserted) { | 2411 | if (root->orphan_block_rsv || root->orphan_item_inserted) { |
2391 | trans = btrfs_join_transaction(root, 1); | 2412 | trans = btrfs_join_transaction(root, 1); |
2392 | BUG_ON(IS_ERR(trans)); | 2413 | if (!IS_ERR(trans)) |
2393 | btrfs_end_transaction(trans, root); | 2414 | btrfs_end_transaction(trans, root); |
2394 | } | 2415 | } |
2395 | 2416 | ||
2396 | if (nr_unlink) | 2417 | if (nr_unlink) |
2397 | printk(KERN_INFO "btrfs: unlinked %d orphans\n", nr_unlink); | 2418 | printk(KERN_INFO "btrfs: unlinked %d orphans\n", nr_unlink); |
2398 | if (nr_truncate) | 2419 | if (nr_truncate) |
2399 | printk(KERN_INFO "btrfs: truncated %d orphans\n", nr_truncate); | 2420 | printk(KERN_INFO "btrfs: truncated %d orphans\n", nr_truncate); |
2421 | |||
2422 | out: | ||
2423 | if (ret) | ||
2424 | printk(KERN_CRIT "btrfs: could not do orphan cleanup %d\n", ret); | ||
2425 | btrfs_free_path(path); | ||
2426 | return ret; | ||
2400 | } | 2427 | } |
2401 | 2428 | ||
2402 | /* | 2429 | /* |
@@ -2635,10 +2662,10 @@ failed: | |||
2635 | * recovery code. It remove a link in a directory with a given name, and | 2662 | * 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 | 2663 | * also drops the back refs in the inode to the directory |
2637 | */ | 2664 | */ |
2638 | int btrfs_unlink_inode(struct btrfs_trans_handle *trans, | 2665 | static int __btrfs_unlink_inode(struct btrfs_trans_handle *trans, |
2639 | struct btrfs_root *root, | 2666 | struct btrfs_root *root, |
2640 | struct inode *dir, struct inode *inode, | 2667 | struct inode *dir, struct inode *inode, |
2641 | const char *name, int name_len) | 2668 | const char *name, int name_len) |
2642 | { | 2669 | { |
2643 | struct btrfs_path *path; | 2670 | struct btrfs_path *path; |
2644 | int ret = 0; | 2671 | int ret = 0; |
@@ -2710,12 +2737,25 @@ err: | |||
2710 | btrfs_i_size_write(dir, dir->i_size - name_len * 2); | 2737 | btrfs_i_size_write(dir, dir->i_size - name_len * 2); |
2711 | inode->i_ctime = dir->i_mtime = dir->i_ctime = CURRENT_TIME; | 2738 | inode->i_ctime = dir->i_mtime = dir->i_ctime = CURRENT_TIME; |
2712 | btrfs_update_inode(trans, root, dir); | 2739 | btrfs_update_inode(trans, root, dir); |
2713 | btrfs_drop_nlink(inode); | ||
2714 | ret = btrfs_update_inode(trans, root, inode); | ||
2715 | out: | 2740 | out: |
2716 | return ret; | 2741 | return ret; |
2717 | } | 2742 | } |
2718 | 2743 | ||
2744 | int btrfs_unlink_inode(struct btrfs_trans_handle *trans, | ||
2745 | struct btrfs_root *root, | ||
2746 | struct inode *dir, struct inode *inode, | ||
2747 | const char *name, int name_len) | ||
2748 | { | ||
2749 | int ret; | ||
2750 | ret = __btrfs_unlink_inode(trans, root, dir, inode, name, name_len); | ||
2751 | if (!ret) { | ||
2752 | btrfs_drop_nlink(inode); | ||
2753 | ret = btrfs_update_inode(trans, root, inode); | ||
2754 | } | ||
2755 | return ret; | ||
2756 | } | ||
2757 | |||
2758 | |||
2719 | /* helper to check if there is any shared block in the path */ | 2759 | /* helper to check if there is any shared block in the path */ |
2720 | static int check_path_shared(struct btrfs_root *root, | 2760 | static int check_path_shared(struct btrfs_root *root, |
2721 | struct btrfs_path *path) | 2761 | struct btrfs_path *path) |
@@ -3537,7 +3577,13 @@ out: | |||
3537 | return ret; | 3577 | return ret; |
3538 | } | 3578 | } |
3539 | 3579 | ||
3540 | int btrfs_cont_expand(struct inode *inode, loff_t size) | 3580 | /* |
3581 | * This function puts in dummy file extents for the area we're creating a hole | ||
3582 | * for. So if we are truncating this file to a larger size we need to insert | ||
3583 | * these file extents so that btrfs_get_extent will return a EXTENT_MAP_HOLE for | ||
3584 | * the range between oldsize and size | ||
3585 | */ | ||
3586 | int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size) | ||
3541 | { | 3587 | { |
3542 | struct btrfs_trans_handle *trans; | 3588 | struct btrfs_trans_handle *trans; |
3543 | struct btrfs_root *root = BTRFS_I(inode)->root; | 3589 | struct btrfs_root *root = BTRFS_I(inode)->root; |
@@ -3545,7 +3591,7 @@ int btrfs_cont_expand(struct inode *inode, loff_t size) | |||
3545 | struct extent_map *em = NULL; | 3591 | struct extent_map *em = NULL; |
3546 | struct extent_state *cached_state = NULL; | 3592 | struct extent_state *cached_state = NULL; |
3547 | u64 mask = root->sectorsize - 1; | 3593 | u64 mask = root->sectorsize - 1; |
3548 | u64 hole_start = (inode->i_size + mask) & ~mask; | 3594 | u64 hole_start = (oldsize + mask) & ~mask; |
3549 | u64 block_end = (size + mask) & ~mask; | 3595 | u64 block_end = (size + mask) & ~mask; |
3550 | u64 last_byte; | 3596 | u64 last_byte; |
3551 | u64 cur_offset; | 3597 | u64 cur_offset; |
@@ -3590,13 +3636,15 @@ int btrfs_cont_expand(struct inode *inode, loff_t size) | |||
3590 | err = btrfs_drop_extents(trans, inode, cur_offset, | 3636 | err = btrfs_drop_extents(trans, inode, cur_offset, |
3591 | cur_offset + hole_size, | 3637 | cur_offset + hole_size, |
3592 | &hint_byte, 1); | 3638 | &hint_byte, 1); |
3593 | BUG_ON(err); | 3639 | if (err) |
3640 | break; | ||
3594 | 3641 | ||
3595 | err = btrfs_insert_file_extent(trans, root, | 3642 | err = btrfs_insert_file_extent(trans, root, |
3596 | inode->i_ino, cur_offset, 0, | 3643 | inode->i_ino, cur_offset, 0, |
3597 | 0, hole_size, 0, hole_size, | 3644 | 0, hole_size, 0, hole_size, |
3598 | 0, 0, 0); | 3645 | 0, 0, 0); |
3599 | BUG_ON(err); | 3646 | if (err) |
3647 | break; | ||
3600 | 3648 | ||
3601 | btrfs_drop_extent_cache(inode, hole_start, | 3649 | btrfs_drop_extent_cache(inode, hole_start, |
3602 | last_byte - 1, 0); | 3650 | last_byte - 1, 0); |
@@ -3616,81 +3664,41 @@ int btrfs_cont_expand(struct inode *inode, loff_t size) | |||
3616 | return err; | 3664 | return err; |
3617 | } | 3665 | } |
3618 | 3666 | ||
3619 | static int btrfs_setattr_size(struct inode *inode, struct iattr *attr) | 3667 | static int btrfs_setsize(struct inode *inode, loff_t newsize) |
3620 | { | 3668 | { |
3621 | struct btrfs_root *root = BTRFS_I(inode)->root; | 3669 | loff_t oldsize = i_size_read(inode); |
3622 | struct btrfs_trans_handle *trans; | ||
3623 | unsigned long nr; | ||
3624 | int ret; | 3670 | int ret; |
3625 | 3671 | ||
3626 | if (attr->ia_size == inode->i_size) | 3672 | if (newsize == oldsize) |
3627 | return 0; | 3673 | return 0; |
3628 | 3674 | ||
3629 | if (attr->ia_size > inode->i_size) { | 3675 | if (newsize > oldsize) { |
3630 | unsigned long limit; | 3676 | i_size_write(inode, newsize); |
3631 | limit = current->signal->rlim[RLIMIT_FSIZE].rlim_cur; | 3677 | btrfs_ordered_update_i_size(inode, i_size_read(inode), NULL); |
3632 | if (attr->ia_size > inode->i_sb->s_maxbytes) | 3678 | truncate_pagecache(inode, oldsize, newsize); |
3633 | return -EFBIG; | 3679 | 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) { | 3680 | if (ret) { |
3656 | btrfs_truncate(inode); | 3681 | btrfs_setsize(inode, oldsize); |
3657 | return ret; | 3682 | return ret; |
3658 | } | 3683 | } |
3659 | 3684 | ||
3660 | i_size_write(inode, attr->ia_size); | 3685 | mark_inode_dirty(inode); |
3661 | btrfs_ordered_update_i_size(inode, inode->i_size, NULL); | 3686 | } else { |
3662 | 3687 | ||
3663 | trans = btrfs_start_transaction(root, 0); | 3688 | /* |
3664 | BUG_ON(IS_ERR(trans)); | 3689 | * We're truncating a file that used to have good data down to |
3665 | btrfs_set_trans_block_group(trans, inode); | 3690 | * zero. Make sure it gets into the ordered flush list so that |
3666 | trans->block_rsv = root->orphan_block_rsv; | 3691 | * any new writes get down to disk quickly. |
3667 | BUG_ON(!trans->block_rsv); | 3692 | */ |
3693 | if (newsize == 0) | ||
3694 | BTRFS_I(inode)->ordered_data_close = 1; | ||
3668 | 3695 | ||
3669 | ret = btrfs_update_inode(trans, root, inode); | 3696 | /* we don't support swapfiles, so vmtruncate shouldn't fail */ |
3670 | BUG_ON(ret); | 3697 | truncate_setsize(inode, newsize); |
3671 | if (inode->i_nlink > 0) { | 3698 | 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 | } | 3699 | } |
3680 | 3700 | ||
3681 | /* | 3701 | 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 | } | 3702 | } |
3695 | 3703 | ||
3696 | static int btrfs_setattr(struct dentry *dentry, struct iattr *attr) | 3704 | static int btrfs_setattr(struct dentry *dentry, struct iattr *attr) |
@@ -3707,7 +3715,7 @@ static int btrfs_setattr(struct dentry *dentry, struct iattr *attr) | |||
3707 | return err; | 3715 | return err; |
3708 | 3716 | ||
3709 | if (S_ISREG(inode->i_mode) && (attr->ia_valid & ATTR_SIZE)) { | 3717 | if (S_ISREG(inode->i_mode) && (attr->ia_valid & ATTR_SIZE)) { |
3710 | err = btrfs_setattr_size(inode, attr); | 3718 | err = btrfs_setsize(inode, attr->ia_size); |
3711 | if (err) | 3719 | if (err) |
3712 | return err; | 3720 | return err; |
3713 | } | 3721 | } |
@@ -3730,6 +3738,8 @@ void btrfs_evict_inode(struct inode *inode) | |||
3730 | unsigned long nr; | 3738 | unsigned long nr; |
3731 | int ret; | 3739 | int ret; |
3732 | 3740 | ||
3741 | trace_btrfs_inode_evict(inode); | ||
3742 | |||
3733 | truncate_inode_pages(&inode->i_data, 0); | 3743 | truncate_inode_pages(&inode->i_data, 0); |
3734 | if (inode->i_nlink && (btrfs_root_refs(&root->root_item) != 0 || | 3744 | if (inode->i_nlink && (btrfs_root_refs(&root->root_item) != 0 || |
3735 | root == root->fs_info->tree_root)) | 3745 | root == root->fs_info->tree_root)) |
@@ -4072,7 +4082,6 @@ struct inode *btrfs_iget(struct super_block *s, struct btrfs_key *location, | |||
4072 | BTRFS_I(inode)->root = root; | 4082 | BTRFS_I(inode)->root = root; |
4073 | memcpy(&BTRFS_I(inode)->location, location, sizeof(*location)); | 4083 | memcpy(&BTRFS_I(inode)->location, location, sizeof(*location)); |
4074 | btrfs_read_locked_inode(inode); | 4084 | btrfs_read_locked_inode(inode); |
4075 | |||
4076 | inode_tree_add(inode); | 4085 | inode_tree_add(inode); |
4077 | unlock_new_inode(inode); | 4086 | unlock_new_inode(inode); |
4078 | if (new) | 4087 | if (new) |
@@ -4147,8 +4156,10 @@ struct inode *btrfs_lookup_dentry(struct inode *dir, struct dentry *dentry) | |||
4147 | if (!IS_ERR(inode) && root != sub_root) { | 4156 | if (!IS_ERR(inode) && root != sub_root) { |
4148 | down_read(&root->fs_info->cleanup_work_sem); | 4157 | down_read(&root->fs_info->cleanup_work_sem); |
4149 | if (!(inode->i_sb->s_flags & MS_RDONLY)) | 4158 | if (!(inode->i_sb->s_flags & MS_RDONLY)) |
4150 | btrfs_orphan_cleanup(sub_root); | 4159 | ret = btrfs_orphan_cleanup(sub_root); |
4151 | up_read(&root->fs_info->cleanup_work_sem); | 4160 | up_read(&root->fs_info->cleanup_work_sem); |
4161 | if (ret) | ||
4162 | inode = ERR_PTR(ret); | ||
4152 | } | 4163 | } |
4153 | 4164 | ||
4154 | return inode; | 4165 | return inode; |
@@ -4282,6 +4293,9 @@ static int btrfs_real_readdir(struct file *filp, void *dirent, | |||
4282 | while (di_cur < di_total) { | 4293 | while (di_cur < di_total) { |
4283 | struct btrfs_key location; | 4294 | struct btrfs_key location; |
4284 | 4295 | ||
4296 | if (verify_dir_item(root, leaf, di)) | ||
4297 | break; | ||
4298 | |||
4285 | name_len = btrfs_dir_name_len(leaf, di); | 4299 | name_len = btrfs_dir_name_len(leaf, di); |
4286 | if (name_len <= sizeof(tmp_name)) { | 4300 | if (name_len <= sizeof(tmp_name)) { |
4287 | name_ptr = tmp_name; | 4301 | name_ptr = tmp_name; |
@@ -4517,6 +4531,8 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, | |||
4517 | return ERR_PTR(-ENOMEM); | 4531 | return ERR_PTR(-ENOMEM); |
4518 | 4532 | ||
4519 | if (dir) { | 4533 | if (dir) { |
4534 | trace_btrfs_inode_request(dir); | ||
4535 | |||
4520 | ret = btrfs_set_inode_index(dir, index); | 4536 | ret = btrfs_set_inode_index(dir, index); |
4521 | if (ret) { | 4537 | if (ret) { |
4522 | iput(inode); | 4538 | iput(inode); |
@@ -4585,12 +4601,16 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, | |||
4585 | if ((mode & S_IFREG)) { | 4601 | if ((mode & S_IFREG)) { |
4586 | if (btrfs_test_opt(root, NODATASUM)) | 4602 | if (btrfs_test_opt(root, NODATASUM)) |
4587 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATASUM; | 4603 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATASUM; |
4588 | if (btrfs_test_opt(root, NODATACOW)) | 4604 | if (btrfs_test_opt(root, NODATACOW) || |
4605 | (BTRFS_I(dir)->flags & BTRFS_INODE_NODATACOW)) | ||
4589 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATACOW; | 4606 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATACOW; |
4590 | } | 4607 | } |
4591 | 4608 | ||
4592 | insert_inode_hash(inode); | 4609 | insert_inode_hash(inode); |
4593 | inode_tree_add(inode); | 4610 | inode_tree_add(inode); |
4611 | |||
4612 | trace_btrfs_inode_new(inode); | ||
4613 | |||
4594 | return inode; | 4614 | return inode; |
4595 | fail: | 4615 | fail: |
4596 | if (dir) | 4616 | if (dir) |
@@ -4809,7 +4829,10 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, | |||
4809 | 4829 | ||
4810 | /* do not allow sys_link's with other subvols of the same device */ | 4830 | /* do not allow sys_link's with other subvols of the same device */ |
4811 | if (root->objectid != BTRFS_I(inode)->root->objectid) | 4831 | if (root->objectid != BTRFS_I(inode)->root->objectid) |
4812 | return -EPERM; | 4832 | return -EXDEV; |
4833 | |||
4834 | if (inode->i_nlink == ~0U) | ||
4835 | return -EMLINK; | ||
4813 | 4836 | ||
4814 | btrfs_inc_nlink(inode); | 4837 | btrfs_inc_nlink(inode); |
4815 | inode->i_ctime = CURRENT_TIME; | 4838 | inode->i_ctime = CURRENT_TIME; |
@@ -5265,6 +5288,9 @@ insert: | |||
5265 | } | 5288 | } |
5266 | write_unlock(&em_tree->lock); | 5289 | write_unlock(&em_tree->lock); |
5267 | out: | 5290 | out: |
5291 | |||
5292 | trace_btrfs_get_extent(root, em); | ||
5293 | |||
5268 | if (path) | 5294 | if (path) |
5269 | btrfs_free_path(path); | 5295 | btrfs_free_path(path); |
5270 | if (trans) { | 5296 | if (trans) { |
@@ -5748,6 +5774,10 @@ static void btrfs_endio_direct_read(struct bio *bio, int err) | |||
5748 | 5774 | ||
5749 | kfree(dip->csums); | 5775 | kfree(dip->csums); |
5750 | kfree(dip); | 5776 | kfree(dip); |
5777 | |||
5778 | /* If we had a csum failure make sure to clear the uptodate flag */ | ||
5779 | if (err) | ||
5780 | clear_bit(BIO_UPTODATE, &bio->bi_flags); | ||
5751 | dio_end_io(bio, err); | 5781 | dio_end_io(bio, err); |
5752 | } | 5782 | } |
5753 | 5783 | ||
@@ -5849,6 +5879,10 @@ out_done: | |||
5849 | 5879 | ||
5850 | kfree(dip->csums); | 5880 | kfree(dip->csums); |
5851 | kfree(dip); | 5881 | kfree(dip); |
5882 | |||
5883 | /* If we had an error make sure to clear the uptodate flag */ | ||
5884 | if (err) | ||
5885 | clear_bit(BIO_UPTODATE, &bio->bi_flags); | ||
5852 | dio_end_io(bio, err); | 5886 | dio_end_io(bio, err); |
5853 | } | 5887 | } |
5854 | 5888 | ||
@@ -5922,9 +5956,12 @@ static inline int __btrfs_submit_dio_bio(struct bio *bio, struct inode *inode, | |||
5922 | __btrfs_submit_bio_start_direct_io, | 5956 | __btrfs_submit_bio_start_direct_io, |
5923 | __btrfs_submit_bio_done); | 5957 | __btrfs_submit_bio_done); |
5924 | goto err; | 5958 | goto err; |
5925 | } else if (!skip_sum) | 5959 | } else if (!skip_sum) { |
5926 | btrfs_lookup_bio_sums_dio(root, inode, bio, | 5960 | ret = btrfs_lookup_bio_sums_dio(root, inode, bio, |
5927 | file_offset, csums); | 5961 | file_offset, csums); |
5962 | if (ret) | ||
5963 | goto err; | ||
5964 | } | ||
5928 | 5965 | ||
5929 | ret = btrfs_map_bio(root, rw, bio, 0, 1); | 5966 | ret = btrfs_map_bio(root, rw, bio, 0, 1); |
5930 | err: | 5967 | err: |
@@ -5948,6 +5985,7 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, | |||
5948 | int nr_pages = 0; | 5985 | int nr_pages = 0; |
5949 | u32 *csums = dip->csums; | 5986 | u32 *csums = dip->csums; |
5950 | int ret = 0; | 5987 | int ret = 0; |
5988 | int write = rw & REQ_WRITE; | ||
5951 | 5989 | ||
5952 | bio = btrfs_dio_bio_alloc(orig_bio->bi_bdev, start_sector, GFP_NOFS); | 5990 | bio = btrfs_dio_bio_alloc(orig_bio->bi_bdev, start_sector, GFP_NOFS); |
5953 | if (!bio) | 5991 | if (!bio) |
@@ -5984,7 +6022,8 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, | |||
5984 | goto out_err; | 6022 | goto out_err; |
5985 | } | 6023 | } |
5986 | 6024 | ||
5987 | if (!skip_sum) | 6025 | /* Write's use the ordered csums */ |
6026 | if (!write && !skip_sum) | ||
5988 | csums = csums + nr_pages; | 6027 | csums = csums + nr_pages; |
5989 | start_sector += submit_len >> 9; | 6028 | start_sector += submit_len >> 9; |
5990 | file_offset += submit_len; | 6029 | file_offset += submit_len; |
@@ -6052,7 +6091,8 @@ static void btrfs_submit_direct(int rw, struct bio *bio, struct inode *inode, | |||
6052 | } | 6091 | } |
6053 | dip->csums = NULL; | 6092 | dip->csums = NULL; |
6054 | 6093 | ||
6055 | if (!skip_sum) { | 6094 | /* Write's use the ordered csum stuff, so we don't need dip->csums */ |
6095 | if (!write && !skip_sum) { | ||
6056 | dip->csums = kmalloc(sizeof(u32) * bio->bi_vcnt, GFP_NOFS); | 6096 | dip->csums = kmalloc(sizeof(u32) * bio->bi_vcnt, GFP_NOFS); |
6057 | if (!dip->csums) { | 6097 | if (!dip->csums) { |
6058 | kfree(dip); | 6098 | kfree(dip); |
@@ -6474,28 +6514,42 @@ out: | |||
6474 | return ret; | 6514 | return ret; |
6475 | } | 6515 | } |
6476 | 6516 | ||
6477 | static void btrfs_truncate(struct inode *inode) | 6517 | static int btrfs_truncate(struct inode *inode) |
6478 | { | 6518 | { |
6479 | struct btrfs_root *root = BTRFS_I(inode)->root; | 6519 | struct btrfs_root *root = BTRFS_I(inode)->root; |
6480 | int ret; | 6520 | int ret; |
6521 | int err = 0; | ||
6481 | struct btrfs_trans_handle *trans; | 6522 | struct btrfs_trans_handle *trans; |
6482 | unsigned long nr; | 6523 | unsigned long nr; |
6483 | u64 mask = root->sectorsize - 1; | 6524 | u64 mask = root->sectorsize - 1; |
6484 | 6525 | ||
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); | 6526 | ret = btrfs_truncate_page(inode->i_mapping, inode->i_size); |
6491 | if (ret) | 6527 | if (ret) |
6492 | return; | 6528 | return ret; |
6493 | 6529 | ||
6494 | btrfs_wait_ordered_range(inode, inode->i_size & (~mask), (u64)-1); | 6530 | btrfs_wait_ordered_range(inode, inode->i_size & (~mask), (u64)-1); |
6495 | btrfs_ordered_update_i_size(inode, inode->i_size, NULL); | 6531 | btrfs_ordered_update_i_size(inode, inode->i_size, NULL); |
6496 | 6532 | ||
6533 | trans = btrfs_start_transaction(root, 5); | ||
6534 | if (IS_ERR(trans)) | ||
6535 | return PTR_ERR(trans); | ||
6536 | |||
6537 | btrfs_set_trans_block_group(trans, inode); | ||
6538 | |||
6539 | ret = btrfs_orphan_add(trans, inode); | ||
6540 | if (ret) { | ||
6541 | btrfs_end_transaction(trans, root); | ||
6542 | return ret; | ||
6543 | } | ||
6544 | |||
6545 | nr = trans->blocks_used; | ||
6546 | btrfs_end_transaction(trans, root); | ||
6547 | btrfs_btree_balance_dirty(root, nr); | ||
6548 | |||
6549 | /* Now start a transaction for the truncate */ | ||
6497 | trans = btrfs_start_transaction(root, 0); | 6550 | trans = btrfs_start_transaction(root, 0); |
6498 | BUG_ON(IS_ERR(trans)); | 6551 | if (IS_ERR(trans)) |
6552 | return PTR_ERR(trans); | ||
6499 | btrfs_set_trans_block_group(trans, inode); | 6553 | btrfs_set_trans_block_group(trans, inode); |
6500 | trans->block_rsv = root->orphan_block_rsv; | 6554 | trans->block_rsv = root->orphan_block_rsv; |
6501 | 6555 | ||
@@ -6522,29 +6576,38 @@ static void btrfs_truncate(struct inode *inode) | |||
6522 | while (1) { | 6576 | while (1) { |
6523 | if (!trans) { | 6577 | if (!trans) { |
6524 | trans = btrfs_start_transaction(root, 0); | 6578 | trans = btrfs_start_transaction(root, 0); |
6525 | BUG_ON(IS_ERR(trans)); | 6579 | if (IS_ERR(trans)) |
6580 | return PTR_ERR(trans); | ||
6526 | btrfs_set_trans_block_group(trans, inode); | 6581 | btrfs_set_trans_block_group(trans, inode); |
6527 | trans->block_rsv = root->orphan_block_rsv; | 6582 | trans->block_rsv = root->orphan_block_rsv; |
6528 | } | 6583 | } |
6529 | 6584 | ||
6530 | ret = btrfs_block_rsv_check(trans, root, | 6585 | ret = btrfs_block_rsv_check(trans, root, |
6531 | root->orphan_block_rsv, 0, 5); | 6586 | root->orphan_block_rsv, 0, 5); |
6532 | if (ret) { | 6587 | if (ret == -EAGAIN) { |
6533 | BUG_ON(ret != -EAGAIN); | ||
6534 | ret = btrfs_commit_transaction(trans, root); | 6588 | ret = btrfs_commit_transaction(trans, root); |
6535 | BUG_ON(ret); | 6589 | if (ret) |
6590 | return ret; | ||
6536 | trans = NULL; | 6591 | trans = NULL; |
6537 | continue; | 6592 | continue; |
6593 | } else if (ret) { | ||
6594 | err = ret; | ||
6595 | break; | ||
6538 | } | 6596 | } |
6539 | 6597 | ||
6540 | ret = btrfs_truncate_inode_items(trans, root, inode, | 6598 | ret = btrfs_truncate_inode_items(trans, root, inode, |
6541 | inode->i_size, | 6599 | inode->i_size, |
6542 | BTRFS_EXTENT_DATA_KEY); | 6600 | BTRFS_EXTENT_DATA_KEY); |
6543 | if (ret != -EAGAIN) | 6601 | if (ret != -EAGAIN) { |
6602 | err = ret; | ||
6544 | break; | 6603 | break; |
6604 | } | ||
6545 | 6605 | ||
6546 | ret = btrfs_update_inode(trans, root, inode); | 6606 | ret = btrfs_update_inode(trans, root, inode); |
6547 | BUG_ON(ret); | 6607 | if (ret) { |
6608 | err = ret; | ||
6609 | break; | ||
6610 | } | ||
6548 | 6611 | ||
6549 | nr = trans->blocks_used; | 6612 | nr = trans->blocks_used; |
6550 | btrfs_end_transaction(trans, root); | 6613 | btrfs_end_transaction(trans, root); |
@@ -6554,16 +6617,27 @@ static void btrfs_truncate(struct inode *inode) | |||
6554 | 6617 | ||
6555 | if (ret == 0 && inode->i_nlink > 0) { | 6618 | if (ret == 0 && inode->i_nlink > 0) { |
6556 | ret = btrfs_orphan_del(trans, inode); | 6619 | ret = btrfs_orphan_del(trans, inode); |
6557 | BUG_ON(ret); | 6620 | if (ret) |
6621 | err = ret; | ||
6622 | } else if (ret && inode->i_nlink > 0) { | ||
6623 | /* | ||
6624 | * Failed to do the truncate, remove us from the in memory | ||
6625 | * orphan list. | ||
6626 | */ | ||
6627 | ret = btrfs_orphan_del(NULL, inode); | ||
6558 | } | 6628 | } |
6559 | 6629 | ||
6560 | ret = btrfs_update_inode(trans, root, inode); | 6630 | ret = btrfs_update_inode(trans, root, inode); |
6561 | BUG_ON(ret); | 6631 | if (ret && !err) |
6632 | err = ret; | ||
6562 | 6633 | ||
6563 | nr = trans->blocks_used; | 6634 | nr = trans->blocks_used; |
6564 | ret = btrfs_end_transaction_throttle(trans, root); | 6635 | ret = btrfs_end_transaction_throttle(trans, root); |
6565 | BUG_ON(ret); | 6636 | if (ret && !err) |
6637 | err = ret; | ||
6566 | btrfs_btree_balance_dirty(root, nr); | 6638 | btrfs_btree_balance_dirty(root, nr); |
6639 | |||
6640 | return err; | ||
6567 | } | 6641 | } |
6568 | 6642 | ||
6569 | /* | 6643 | /* |
@@ -6630,9 +6704,8 @@ struct inode *btrfs_alloc_inode(struct super_block *sb) | |||
6630 | ei->index_cnt = (u64)-1; | 6704 | ei->index_cnt = (u64)-1; |
6631 | ei->last_unlink_trans = 0; | 6705 | ei->last_unlink_trans = 0; |
6632 | 6706 | ||
6633 | spin_lock_init(&ei->accounting_lock); | ||
6634 | atomic_set(&ei->outstanding_extents, 0); | 6707 | atomic_set(&ei->outstanding_extents, 0); |
6635 | ei->reserved_extents = 0; | 6708 | atomic_set(&ei->reserved_extents, 0); |
6636 | 6709 | ||
6637 | ei->ordered_data_close = 0; | 6710 | ei->ordered_data_close = 0; |
6638 | ei->orphan_meta_reserved = 0; | 6711 | ei->orphan_meta_reserved = 0; |
@@ -6668,7 +6741,7 @@ void btrfs_destroy_inode(struct inode *inode) | |||
6668 | WARN_ON(!list_empty(&inode->i_dentry)); | 6741 | WARN_ON(!list_empty(&inode->i_dentry)); |
6669 | WARN_ON(inode->i_data.nrpages); | 6742 | WARN_ON(inode->i_data.nrpages); |
6670 | WARN_ON(atomic_read(&BTRFS_I(inode)->outstanding_extents)); | 6743 | WARN_ON(atomic_read(&BTRFS_I(inode)->outstanding_extents)); |
6671 | WARN_ON(BTRFS_I(inode)->reserved_extents); | 6744 | WARN_ON(atomic_read(&BTRFS_I(inode)->reserved_extents)); |
6672 | 6745 | ||
6673 | /* | 6746 | /* |
6674 | * This can happen where we create an inode, but somebody else also | 6747 | * This can happen where we create an inode, but somebody else also |
@@ -6760,6 +6833,8 @@ void btrfs_destroy_cachep(void) | |||
6760 | kmem_cache_destroy(btrfs_transaction_cachep); | 6833 | kmem_cache_destroy(btrfs_transaction_cachep); |
6761 | if (btrfs_path_cachep) | 6834 | if (btrfs_path_cachep) |
6762 | kmem_cache_destroy(btrfs_path_cachep); | 6835 | kmem_cache_destroy(btrfs_path_cachep); |
6836 | if (btrfs_free_space_cachep) | ||
6837 | kmem_cache_destroy(btrfs_free_space_cachep); | ||
6763 | } | 6838 | } |
6764 | 6839 | ||
6765 | int btrfs_init_cachep(void) | 6840 | int btrfs_init_cachep(void) |
@@ -6788,6 +6863,12 @@ int btrfs_init_cachep(void) | |||
6788 | if (!btrfs_path_cachep) | 6863 | if (!btrfs_path_cachep) |
6789 | goto fail; | 6864 | goto fail; |
6790 | 6865 | ||
6866 | btrfs_free_space_cachep = kmem_cache_create("btrfs_free_space_cache", | ||
6867 | sizeof(struct btrfs_free_space), 0, | ||
6868 | SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD, NULL); | ||
6869 | if (!btrfs_free_space_cachep) | ||
6870 | goto fail; | ||
6871 | |||
6791 | return 0; | 6872 | return 0; |
6792 | fail: | 6873 | fail: |
6793 | btrfs_destroy_cachep(); | 6874 | btrfs_destroy_cachep(); |
@@ -6806,6 +6887,26 @@ static int btrfs_getattr(struct vfsmount *mnt, | |||
6806 | return 0; | 6887 | return 0; |
6807 | } | 6888 | } |
6808 | 6889 | ||
6890 | /* | ||
6891 | * If a file is moved, it will inherit the cow and compression flags of the new | ||
6892 | * directory. | ||
6893 | */ | ||
6894 | static void fixup_inode_flags(struct inode *dir, struct inode *inode) | ||
6895 | { | ||
6896 | struct btrfs_inode *b_dir = BTRFS_I(dir); | ||
6897 | struct btrfs_inode *b_inode = BTRFS_I(inode); | ||
6898 | |||
6899 | if (b_dir->flags & BTRFS_INODE_NODATACOW) | ||
6900 | b_inode->flags |= BTRFS_INODE_NODATACOW; | ||
6901 | else | ||
6902 | b_inode->flags &= ~BTRFS_INODE_NODATACOW; | ||
6903 | |||
6904 | if (b_dir->flags & BTRFS_INODE_COMPRESS) | ||
6905 | b_inode->flags |= BTRFS_INODE_COMPRESS; | ||
6906 | else | ||
6907 | b_inode->flags &= ~BTRFS_INODE_COMPRESS; | ||
6908 | } | ||
6909 | |||
6809 | static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | 6910 | static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, |
6810 | struct inode *new_dir, struct dentry *new_dentry) | 6911 | struct inode *new_dir, struct dentry *new_dentry) |
6811 | { | 6912 | { |
@@ -6854,8 +6955,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. | 6955 | * should cover the worst case number of items we'll modify. |
6855 | */ | 6956 | */ |
6856 | trans = btrfs_start_transaction(root, 20); | 6957 | trans = btrfs_start_transaction(root, 20); |
6857 | if (IS_ERR(trans)) | 6958 | if (IS_ERR(trans)) { |
6858 | return PTR_ERR(trans); | 6959 | ret = PTR_ERR(trans); |
6960 | goto out_notrans; | ||
6961 | } | ||
6859 | 6962 | ||
6860 | btrfs_set_trans_block_group(trans, new_dir); | 6963 | btrfs_set_trans_block_group(trans, new_dir); |
6861 | 6964 | ||
@@ -6908,11 +7011,12 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
6908 | old_dentry->d_name.name, | 7011 | old_dentry->d_name.name, |
6909 | old_dentry->d_name.len); | 7012 | old_dentry->d_name.len); |
6910 | } else { | 7013 | } else { |
6911 | btrfs_inc_nlink(old_dentry->d_inode); | 7014 | ret = __btrfs_unlink_inode(trans, root, old_dir, |
6912 | ret = btrfs_unlink_inode(trans, root, old_dir, | 7015 | old_dentry->d_inode, |
6913 | old_dentry->d_inode, | 7016 | old_dentry->d_name.name, |
6914 | old_dentry->d_name.name, | 7017 | old_dentry->d_name.len); |
6915 | old_dentry->d_name.len); | 7018 | if (!ret) |
7019 | ret = btrfs_update_inode(trans, root, old_inode); | ||
6916 | } | 7020 | } |
6917 | BUG_ON(ret); | 7021 | BUG_ON(ret); |
6918 | 7022 | ||
@@ -6939,6 +7043,8 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
6939 | } | 7043 | } |
6940 | } | 7044 | } |
6941 | 7045 | ||
7046 | fixup_inode_flags(new_dir, old_inode); | ||
7047 | |||
6942 | ret = btrfs_add_link(trans, new_dir, old_inode, | 7048 | ret = btrfs_add_link(trans, new_dir, old_inode, |
6943 | new_dentry->d_name.name, | 7049 | new_dentry->d_name.name, |
6944 | new_dentry->d_name.len, 0, index); | 7050 | new_dentry->d_name.len, 0, index); |
@@ -6952,7 +7058,7 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
6952 | } | 7058 | } |
6953 | out_fail: | 7059 | out_fail: |
6954 | btrfs_end_transaction_throttle(trans, root); | 7060 | btrfs_end_transaction_throttle(trans, root); |
6955 | 7061 | out_notrans: | |
6956 | if (old_inode->i_ino == BTRFS_FIRST_FREE_OBJECTID) | 7062 | if (old_inode->i_ino == BTRFS_FIRST_FREE_OBJECTID) |
6957 | up_read(&root->fs_info->subvol_sem); | 7063 | up_read(&root->fs_info->subvol_sem); |
6958 | 7064 | ||
@@ -7355,7 +7461,6 @@ static const struct address_space_operations btrfs_symlink_aops = { | |||
7355 | }; | 7461 | }; |
7356 | 7462 | ||
7357 | static const struct inode_operations btrfs_file_inode_operations = { | 7463 | static const struct inode_operations btrfs_file_inode_operations = { |
7358 | .truncate = btrfs_truncate, | ||
7359 | .getattr = btrfs_getattr, | 7464 | .getattr = btrfs_getattr, |
7360 | .setattr = btrfs_setattr, | 7465 | .setattr = btrfs_setattr, |
7361 | .setxattr = btrfs_setxattr, | 7466 | .setxattr = btrfs_setxattr, |