diff options
Diffstat (limited to 'fs/btrfs/file.c')
| -rw-r--r-- | fs/btrfs/file.c | 165 |
1 files changed, 130 insertions, 35 deletions
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index 4205ba752d40..a005fe2c072a 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
| @@ -309,10 +309,6 @@ static int __btrfs_run_defrag_inode(struct btrfs_fs_info *fs_info, | |||
| 309 | ret = PTR_ERR(inode_root); | 309 | ret = PTR_ERR(inode_root); |
| 310 | goto cleanup; | 310 | goto cleanup; |
| 311 | } | 311 | } |
| 312 | if (btrfs_root_refs(&inode_root->root_item) == 0) { | ||
| 313 | ret = -ENOENT; | ||
| 314 | goto cleanup; | ||
| 315 | } | ||
| 316 | 312 | ||
| 317 | key.objectid = defrag->ino; | 313 | key.objectid = defrag->ino; |
| 318 | btrfs_set_key_type(&key, BTRFS_INODE_ITEM_KEY); | 314 | btrfs_set_key_type(&key, BTRFS_INODE_ITEM_KEY); |
| @@ -1317,6 +1313,56 @@ fail: | |||
| 1317 | 1313 | ||
| 1318 | } | 1314 | } |
| 1319 | 1315 | ||
| 1316 | static noinline int check_can_nocow(struct inode *inode, loff_t pos, | ||
| 1317 | size_t *write_bytes) | ||
| 1318 | { | ||
| 1319 | struct btrfs_trans_handle *trans; | ||
| 1320 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
| 1321 | struct btrfs_ordered_extent *ordered; | ||
| 1322 | u64 lockstart, lockend; | ||
| 1323 | u64 num_bytes; | ||
| 1324 | int ret; | ||
| 1325 | |||
| 1326 | lockstart = round_down(pos, root->sectorsize); | ||
| 1327 | lockend = lockstart + round_up(*write_bytes, root->sectorsize) - 1; | ||
| 1328 | |||
| 1329 | while (1) { | ||
| 1330 | lock_extent(&BTRFS_I(inode)->io_tree, lockstart, lockend); | ||
| 1331 | ordered = btrfs_lookup_ordered_range(inode, lockstart, | ||
| 1332 | lockend - lockstart + 1); | ||
| 1333 | if (!ordered) { | ||
| 1334 | break; | ||
| 1335 | } | ||
| 1336 | unlock_extent(&BTRFS_I(inode)->io_tree, lockstart, lockend); | ||
| 1337 | btrfs_start_ordered_extent(inode, ordered, 1); | ||
| 1338 | btrfs_put_ordered_extent(ordered); | ||
| 1339 | } | ||
| 1340 | |||
| 1341 | trans = btrfs_join_transaction(root); | ||
| 1342 | if (IS_ERR(trans)) { | ||
| 1343 | unlock_extent(&BTRFS_I(inode)->io_tree, lockstart, lockend); | ||
| 1344 | return PTR_ERR(trans); | ||
| 1345 | } | ||
| 1346 | |||
| 1347 | num_bytes = lockend - lockstart + 1; | ||
| 1348 | ret = can_nocow_extent(trans, inode, lockstart, &num_bytes, NULL, NULL, | ||
| 1349 | NULL); | ||
| 1350 | btrfs_end_transaction(trans, root); | ||
| 1351 | if (ret <= 0) { | ||
| 1352 | ret = 0; | ||
| 1353 | } else { | ||
| 1354 | clear_extent_bit(&BTRFS_I(inode)->io_tree, lockstart, lockend, | ||
| 1355 | EXTENT_DIRTY | EXTENT_DELALLOC | | ||
| 1356 | EXTENT_DO_ACCOUNTING | EXTENT_DEFRAG, 0, 0, | ||
| 1357 | NULL, GFP_NOFS); | ||
| 1358 | *write_bytes = min_t(size_t, *write_bytes, num_bytes); | ||
| 1359 | } | ||
| 1360 | |||
| 1361 | unlock_extent(&BTRFS_I(inode)->io_tree, lockstart, lockend); | ||
| 1362 | |||
| 1363 | return ret; | ||
| 1364 | } | ||
| 1365 | |||
| 1320 | static noinline ssize_t __btrfs_buffered_write(struct file *file, | 1366 | static noinline ssize_t __btrfs_buffered_write(struct file *file, |
| 1321 | struct iov_iter *i, | 1367 | struct iov_iter *i, |
| 1322 | loff_t pos) | 1368 | loff_t pos) |
| @@ -1324,10 +1370,12 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file, | |||
| 1324 | struct inode *inode = file_inode(file); | 1370 | struct inode *inode = file_inode(file); |
| 1325 | struct btrfs_root *root = BTRFS_I(inode)->root; | 1371 | struct btrfs_root *root = BTRFS_I(inode)->root; |
| 1326 | struct page **pages = NULL; | 1372 | struct page **pages = NULL; |
| 1373 | u64 release_bytes = 0; | ||
| 1327 | unsigned long first_index; | 1374 | unsigned long first_index; |
| 1328 | size_t num_written = 0; | 1375 | size_t num_written = 0; |
| 1329 | int nrptrs; | 1376 | int nrptrs; |
| 1330 | int ret = 0; | 1377 | int ret = 0; |
| 1378 | bool only_release_metadata = false; | ||
| 1331 | bool force_page_uptodate = false; | 1379 | bool force_page_uptodate = false; |
| 1332 | 1380 | ||
| 1333 | nrptrs = min((iov_iter_count(i) + PAGE_CACHE_SIZE - 1) / | 1381 | nrptrs = min((iov_iter_count(i) + PAGE_CACHE_SIZE - 1) / |
| @@ -1348,6 +1396,7 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file, | |||
| 1348 | offset); | 1396 | offset); |
| 1349 | size_t num_pages = (write_bytes + offset + | 1397 | size_t num_pages = (write_bytes + offset + |
| 1350 | PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; | 1398 | PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; |
| 1399 | size_t reserve_bytes; | ||
| 1351 | size_t dirty_pages; | 1400 | size_t dirty_pages; |
| 1352 | size_t copied; | 1401 | size_t copied; |
| 1353 | 1402 | ||
| @@ -1362,11 +1411,41 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file, | |||
| 1362 | break; | 1411 | break; |
| 1363 | } | 1412 | } |
| 1364 | 1413 | ||
| 1365 | ret = btrfs_delalloc_reserve_space(inode, | 1414 | reserve_bytes = num_pages << PAGE_CACHE_SHIFT; |
| 1366 | num_pages << PAGE_CACHE_SHIFT); | 1415 | ret = btrfs_check_data_free_space(inode, reserve_bytes); |
| 1416 | if (ret == -ENOSPC && | ||
| 1417 | (BTRFS_I(inode)->flags & (BTRFS_INODE_NODATACOW | | ||
| 1418 | BTRFS_INODE_PREALLOC))) { | ||
| 1419 | ret = check_can_nocow(inode, pos, &write_bytes); | ||
| 1420 | if (ret > 0) { | ||
| 1421 | only_release_metadata = true; | ||
| 1422 | /* | ||
| 1423 | * our prealloc extent may be smaller than | ||
| 1424 | * write_bytes, so scale down. | ||
| 1425 | */ | ||
| 1426 | num_pages = (write_bytes + offset + | ||
| 1427 | PAGE_CACHE_SIZE - 1) >> | ||
| 1428 | PAGE_CACHE_SHIFT; | ||
| 1429 | reserve_bytes = num_pages << PAGE_CACHE_SHIFT; | ||
| 1430 | ret = 0; | ||
| 1431 | } else { | ||
| 1432 | ret = -ENOSPC; | ||
| 1433 | } | ||
| 1434 | } | ||
| 1435 | |||
| 1367 | if (ret) | 1436 | if (ret) |
| 1368 | break; | 1437 | break; |
| 1369 | 1438 | ||
| 1439 | ret = btrfs_delalloc_reserve_metadata(inode, reserve_bytes); | ||
| 1440 | if (ret) { | ||
| 1441 | if (!only_release_metadata) | ||
| 1442 | btrfs_free_reserved_data_space(inode, | ||
| 1443 | reserve_bytes); | ||
| 1444 | break; | ||
| 1445 | } | ||
| 1446 | |||
| 1447 | release_bytes = reserve_bytes; | ||
| 1448 | |||
| 1370 | /* | 1449 | /* |
| 1371 | * This is going to setup the pages array with the number of | 1450 | * This is going to setup the pages array with the number of |
| 1372 | * pages we want, so we don't really need to worry about the | 1451 | * pages we want, so we don't really need to worry about the |
| @@ -1375,11 +1454,8 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file, | |||
| 1375 | ret = prepare_pages(root, file, pages, num_pages, | 1454 | ret = prepare_pages(root, file, pages, num_pages, |
| 1376 | pos, first_index, write_bytes, | 1455 | pos, first_index, write_bytes, |
| 1377 | force_page_uptodate); | 1456 | force_page_uptodate); |
| 1378 | if (ret) { | 1457 | if (ret) |
| 1379 | btrfs_delalloc_release_space(inode, | ||
| 1380 | num_pages << PAGE_CACHE_SHIFT); | ||
| 1381 | break; | 1458 | break; |
| 1382 | } | ||
| 1383 | 1459 | ||
| 1384 | copied = btrfs_copy_from_user(pos, num_pages, | 1460 | copied = btrfs_copy_from_user(pos, num_pages, |
| 1385 | write_bytes, pages, i); | 1461 | write_bytes, pages, i); |
| @@ -1409,30 +1485,46 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file, | |||
| 1409 | * managed to copy. | 1485 | * managed to copy. |
| 1410 | */ | 1486 | */ |
| 1411 | if (num_pages > dirty_pages) { | 1487 | if (num_pages > dirty_pages) { |
| 1488 | release_bytes = (num_pages - dirty_pages) << | ||
| 1489 | PAGE_CACHE_SHIFT; | ||
| 1412 | if (copied > 0) { | 1490 | if (copied > 0) { |
| 1413 | spin_lock(&BTRFS_I(inode)->lock); | 1491 | spin_lock(&BTRFS_I(inode)->lock); |
| 1414 | BTRFS_I(inode)->outstanding_extents++; | 1492 | BTRFS_I(inode)->outstanding_extents++; |
| 1415 | spin_unlock(&BTRFS_I(inode)->lock); | 1493 | spin_unlock(&BTRFS_I(inode)->lock); |
| 1416 | } | 1494 | } |
| 1417 | btrfs_delalloc_release_space(inode, | 1495 | if (only_release_metadata) |
| 1418 | (num_pages - dirty_pages) << | 1496 | btrfs_delalloc_release_metadata(inode, |
| 1419 | PAGE_CACHE_SHIFT); | 1497 | release_bytes); |
| 1498 | else | ||
| 1499 | btrfs_delalloc_release_space(inode, | ||
| 1500 | release_bytes); | ||
| 1420 | } | 1501 | } |
| 1421 | 1502 | ||
| 1503 | release_bytes = dirty_pages << PAGE_CACHE_SHIFT; | ||
| 1422 | if (copied > 0) { | 1504 | if (copied > 0) { |
| 1423 | ret = btrfs_dirty_pages(root, inode, pages, | 1505 | ret = btrfs_dirty_pages(root, inode, pages, |
| 1424 | dirty_pages, pos, copied, | 1506 | dirty_pages, pos, copied, |
| 1425 | NULL); | 1507 | NULL); |
| 1426 | if (ret) { | 1508 | if (ret) { |
| 1427 | btrfs_delalloc_release_space(inode, | ||
| 1428 | dirty_pages << PAGE_CACHE_SHIFT); | ||
| 1429 | btrfs_drop_pages(pages, num_pages); | 1509 | btrfs_drop_pages(pages, num_pages); |
| 1430 | break; | 1510 | break; |
| 1431 | } | 1511 | } |
| 1432 | } | 1512 | } |
| 1433 | 1513 | ||
| 1514 | release_bytes = 0; | ||
| 1434 | btrfs_drop_pages(pages, num_pages); | 1515 | btrfs_drop_pages(pages, num_pages); |
| 1435 | 1516 | ||
| 1517 | if (only_release_metadata && copied > 0) { | ||
| 1518 | u64 lockstart = round_down(pos, root->sectorsize); | ||
| 1519 | u64 lockend = lockstart + | ||
| 1520 | (dirty_pages << PAGE_CACHE_SHIFT) - 1; | ||
| 1521 | |||
| 1522 | set_extent_bit(&BTRFS_I(inode)->io_tree, lockstart, | ||
| 1523 | lockend, EXTENT_NORESERVE, NULL, | ||
| 1524 | NULL, GFP_NOFS); | ||
| 1525 | only_release_metadata = false; | ||
| 1526 | } | ||
| 1527 | |||
| 1436 | cond_resched(); | 1528 | cond_resched(); |
| 1437 | 1529 | ||
| 1438 | balance_dirty_pages_ratelimited(inode->i_mapping); | 1530 | balance_dirty_pages_ratelimited(inode->i_mapping); |
| @@ -1445,6 +1537,13 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file, | |||
| 1445 | 1537 | ||
| 1446 | kfree(pages); | 1538 | kfree(pages); |
| 1447 | 1539 | ||
| 1540 | if (release_bytes) { | ||
| 1541 | if (only_release_metadata) | ||
| 1542 | btrfs_delalloc_release_metadata(inode, release_bytes); | ||
| 1543 | else | ||
| 1544 | btrfs_delalloc_release_space(inode, release_bytes); | ||
| 1545 | } | ||
| 1546 | |||
| 1448 | return num_written ? num_written : ret; | 1547 | return num_written ? num_written : ret; |
| 1449 | } | 1548 | } |
| 1450 | 1549 | ||
| @@ -2175,12 +2274,6 @@ static long btrfs_fallocate(struct file *file, int mode, | |||
| 2175 | goto out_reserve_fail; | 2274 | goto out_reserve_fail; |
| 2176 | } | 2275 | } |
| 2177 | 2276 | ||
| 2178 | /* | ||
| 2179 | * wait for ordered IO before we have any locks. We'll loop again | ||
| 2180 | * below with the locks held. | ||
| 2181 | */ | ||
| 2182 | btrfs_wait_ordered_range(inode, alloc_start, alloc_end - alloc_start); | ||
| 2183 | |||
| 2184 | mutex_lock(&inode->i_mutex); | 2277 | mutex_lock(&inode->i_mutex); |
| 2185 | ret = inode_newsize_ok(inode, alloc_end); | 2278 | ret = inode_newsize_ok(inode, alloc_end); |
| 2186 | if (ret) | 2279 | if (ret) |
| @@ -2191,8 +2284,23 @@ static long btrfs_fallocate(struct file *file, int mode, | |||
| 2191 | alloc_start); | 2284 | alloc_start); |
| 2192 | if (ret) | 2285 | if (ret) |
| 2193 | goto out; | 2286 | goto out; |
| 2287 | } else { | ||
| 2288 | /* | ||
| 2289 | * If we are fallocating from the end of the file onward we | ||
| 2290 | * need to zero out the end of the page if i_size lands in the | ||
| 2291 | * middle of a page. | ||
| 2292 | */ | ||
| 2293 | ret = btrfs_truncate_page(inode, inode->i_size, 0, 0); | ||
| 2294 | if (ret) | ||
| 2295 | goto out; | ||
| 2194 | } | 2296 | } |
| 2195 | 2297 | ||
| 2298 | /* | ||
| 2299 | * wait for ordered IO before we have any locks. We'll loop again | ||
| 2300 | * below with the locks held. | ||
| 2301 | */ | ||
| 2302 | btrfs_wait_ordered_range(inode, alloc_start, alloc_end - alloc_start); | ||
| 2303 | |||
| 2196 | locked_end = alloc_end - 1; | 2304 | locked_end = alloc_end - 1; |
| 2197 | while (1) { | 2305 | while (1) { |
| 2198 | struct btrfs_ordered_extent *ordered; | 2306 | struct btrfs_ordered_extent *ordered; |
| @@ -2425,20 +2533,7 @@ static loff_t btrfs_file_llseek(struct file *file, loff_t offset, int whence) | |||
| 2425 | } | 2533 | } |
| 2426 | } | 2534 | } |
| 2427 | 2535 | ||
| 2428 | if (offset < 0 && !(file->f_mode & FMODE_UNSIGNED_OFFSET)) { | 2536 | offset = vfs_setpos(file, offset, inode->i_sb->s_maxbytes); |
| 2429 | offset = -EINVAL; | ||
| 2430 | goto out; | ||
| 2431 | } | ||
| 2432 | if (offset > inode->i_sb->s_maxbytes) { | ||
| 2433 | offset = -EINVAL; | ||
| 2434 | goto out; | ||
| 2435 | } | ||
| 2436 | |||
| 2437 | /* Special lock needed here? */ | ||
| 2438 | if (offset != file->f_pos) { | ||
| 2439 | file->f_pos = offset; | ||
| 2440 | file->f_version = 0; | ||
| 2441 | } | ||
| 2442 | out: | 2537 | out: |
| 2443 | mutex_unlock(&inode->i_mutex); | 2538 | mutex_unlock(&inode->i_mutex); |
| 2444 | return offset; | 2539 | return offset; |
