@@ -1312,17 +1312,69 @@ static noinline int prepare_pages(struct btrfs_root *root, struct file *file,
13121312
13131313}
13141314
1315+ static noinline int check_can_nocow (struct inode * inode , loff_t pos ,
1316+ size_t * write_bytes )
1317+ {
1318+ struct btrfs_trans_handle * trans ;
1319+ struct btrfs_root * root = BTRFS_I (inode )-> root ;
1320+ struct btrfs_ordered_extent * ordered ;
1321+ u64 lockstart , lockend ;
1322+ u64 num_bytes ;
1323+ int ret ;
1324+
1325+ lockstart = round_down (pos , root -> sectorsize );
1326+ lockend = lockstart + round_up (* write_bytes , root -> sectorsize ) - 1 ;
1327+
1328+ while (1 ) {
1329+ lock_extent (& BTRFS_I (inode )-> io_tree , lockstart , lockend );
1330+ ordered = btrfs_lookup_ordered_range (inode , lockstart ,
1331+ lockend - lockstart + 1 );
1332+ if (!ordered ) {
1333+ break ;
1334+ }
1335+ unlock_extent (& BTRFS_I (inode )-> io_tree , lockstart , lockend );
1336+ btrfs_start_ordered_extent (inode , ordered , 1 );
1337+ btrfs_put_ordered_extent (ordered );
1338+ }
1339+
1340+ trans = btrfs_join_transaction (root );
1341+ if (IS_ERR (trans )) {
1342+ unlock_extent (& BTRFS_I (inode )-> io_tree , lockstart , lockend );
1343+ return PTR_ERR (trans );
1344+ }
1345+
1346+ num_bytes = lockend - lockstart + 1 ;
1347+ ret = can_nocow_extent (trans , inode , lockstart , & num_bytes , NULL , NULL ,
1348+ NULL );
1349+ btrfs_end_transaction (trans , root );
1350+ if (ret <= 0 ) {
1351+ ret = 0 ;
1352+ } else {
1353+ clear_extent_bit (& BTRFS_I (inode )-> io_tree , lockstart , lockend ,
1354+ EXTENT_DIRTY | EXTENT_DELALLOC |
1355+ EXTENT_DO_ACCOUNTING | EXTENT_DEFRAG , 0 , 0 ,
1356+ NULL , GFP_NOFS );
1357+ * write_bytes = min_t (size_t , * write_bytes , num_bytes );
1358+ }
1359+
1360+ unlock_extent (& BTRFS_I (inode )-> io_tree , lockstart , lockend );
1361+
1362+ return ret ;
1363+ }
1364+
13151365static noinline ssize_t __btrfs_buffered_write (struct file * file ,
13161366 struct iov_iter * i ,
13171367 loff_t pos )
13181368{
13191369 struct inode * inode = file_inode (file );
13201370 struct btrfs_root * root = BTRFS_I (inode )-> root ;
13211371 struct page * * pages = NULL ;
1372+ u64 release_bytes = 0 ;
13221373 unsigned long first_index ;
13231374 size_t num_written = 0 ;
13241375 int nrptrs ;
13251376 int ret = 0 ;
1377+ bool only_release_metadata = false;
13261378 bool force_page_uptodate = false;
13271379
13281380 nrptrs = min ((iov_iter_count (i ) + PAGE_CACHE_SIZE - 1 ) /
@@ -1343,6 +1395,7 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file,
13431395 offset );
13441396 size_t num_pages = (write_bytes + offset +
13451397 PAGE_CACHE_SIZE - 1 ) >> PAGE_CACHE_SHIFT ;
1398+ size_t reserve_bytes ;
13461399 size_t dirty_pages ;
13471400 size_t copied ;
13481401
@@ -1357,11 +1410,41 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file,
13571410 break ;
13581411 }
13591412
1360- ret = btrfs_delalloc_reserve_space (inode ,
1361- num_pages << PAGE_CACHE_SHIFT );
1413+ reserve_bytes = num_pages << PAGE_CACHE_SHIFT ;
1414+ ret = btrfs_check_data_free_space (inode , reserve_bytes );
1415+ if (ret == - ENOSPC &&
1416+ (BTRFS_I (inode )-> flags & (BTRFS_INODE_NODATACOW |
1417+ BTRFS_INODE_PREALLOC ))) {
1418+ ret = check_can_nocow (inode , pos , & write_bytes );
1419+ if (ret > 0 ) {
1420+ only_release_metadata = true;
1421+ /*
1422+ * our prealloc extent may be smaller than
1423+ * write_bytes, so scale down.
1424+ */
1425+ num_pages = (write_bytes + offset +
1426+ PAGE_CACHE_SIZE - 1 ) >>
1427+ PAGE_CACHE_SHIFT ;
1428+ reserve_bytes = num_pages << PAGE_CACHE_SHIFT ;
1429+ ret = 0 ;
1430+ } else {
1431+ ret = - ENOSPC ;
1432+ }
1433+ }
1434+
13621435 if (ret )
13631436 break ;
13641437
1438+ ret = btrfs_delalloc_reserve_metadata (inode , reserve_bytes );
1439+ if (ret ) {
1440+ if (!only_release_metadata )
1441+ btrfs_free_reserved_data_space (inode ,
1442+ reserve_bytes );
1443+ break ;
1444+ }
1445+
1446+ release_bytes = reserve_bytes ;
1447+
13651448 /*
13661449 * This is going to setup the pages array with the number of
13671450 * pages we want, so we don't really need to worry about the
@@ -1370,11 +1453,8 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file,
13701453 ret = prepare_pages (root , file , pages , num_pages ,
13711454 pos , first_index , write_bytes ,
13721455 force_page_uptodate );
1373- if (ret ) {
1374- btrfs_delalloc_release_space (inode ,
1375- num_pages << PAGE_CACHE_SHIFT );
1456+ if (ret )
13761457 break ;
1377- }
13781458
13791459 copied = btrfs_copy_from_user (pos , num_pages ,
13801460 write_bytes , pages , i );
@@ -1404,30 +1484,46 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file,
14041484 * managed to copy.
14051485 */
14061486 if (num_pages > dirty_pages ) {
1487+ release_bytes = (num_pages - dirty_pages ) <<
1488+ PAGE_CACHE_SHIFT ;
14071489 if (copied > 0 ) {
14081490 spin_lock (& BTRFS_I (inode )-> lock );
14091491 BTRFS_I (inode )-> outstanding_extents ++ ;
14101492 spin_unlock (& BTRFS_I (inode )-> lock );
14111493 }
1412- btrfs_delalloc_release_space (inode ,
1413- (num_pages - dirty_pages ) <<
1414- PAGE_CACHE_SHIFT );
1494+ if (only_release_metadata )
1495+ btrfs_delalloc_release_metadata (inode ,
1496+ release_bytes );
1497+ else
1498+ btrfs_delalloc_release_space (inode ,
1499+ release_bytes );
14151500 }
14161501
1502+ release_bytes = dirty_pages << PAGE_CACHE_SHIFT ;
14171503 if (copied > 0 ) {
14181504 ret = btrfs_dirty_pages (root , inode , pages ,
14191505 dirty_pages , pos , copied ,
14201506 NULL );
14211507 if (ret ) {
1422- btrfs_delalloc_release_space (inode ,
1423- dirty_pages << PAGE_CACHE_SHIFT );
14241508 btrfs_drop_pages (pages , num_pages );
14251509 break ;
14261510 }
14271511 }
14281512
1513+ release_bytes = 0 ;
14291514 btrfs_drop_pages (pages , num_pages );
14301515
1516+ if (only_release_metadata && copied > 0 ) {
1517+ u64 lockstart = round_down (pos , root -> sectorsize );
1518+ u64 lockend = lockstart +
1519+ (dirty_pages << PAGE_CACHE_SHIFT ) - 1 ;
1520+
1521+ set_extent_bit (& BTRFS_I (inode )-> io_tree , lockstart ,
1522+ lockend , EXTENT_NORESERVE , NULL ,
1523+ NULL , GFP_NOFS );
1524+ only_release_metadata = false;
1525+ }
1526+
14311527 cond_resched ();
14321528
14331529 balance_dirty_pages_ratelimited (inode -> i_mapping );
@@ -1440,6 +1536,13 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file,
14401536
14411537 kfree (pages );
14421538
1539+ if (release_bytes ) {
1540+ if (only_release_metadata )
1541+ btrfs_delalloc_release_metadata (inode , release_bytes );
1542+ else
1543+ btrfs_delalloc_release_space (inode , release_bytes );
1544+ }
1545+
14431546 return num_written ? num_written : ret ;
14441547}
14451548
0 commit comments