@@ -797,8 +797,8 @@ int f2fs_setattr(struct dentry *dentry, struct iattr *attr)
797
797
if (attr -> ia_valid & ATTR_SIZE ) {
798
798
bool to_smaller = (attr -> ia_size <= i_size_read (inode ));
799
799
800
- down_write (& F2FS_I (inode )-> i_mmap_sem );
801
800
down_write (& F2FS_I (inode )-> i_gc_rwsem [WRITE ]);
801
+ down_write (& F2FS_I (inode )-> i_mmap_sem );
802
802
803
803
truncate_setsize (inode , attr -> ia_size );
804
804
@@ -808,8 +808,8 @@ int f2fs_setattr(struct dentry *dentry, struct iattr *attr)
808
808
* do not trim all blocks after i_size if target size is
809
809
* larger than i_size.
810
810
*/
811
- up_write (& F2FS_I (inode )-> i_gc_rwsem [WRITE ]);
812
811
up_write (& F2FS_I (inode )-> i_mmap_sem );
812
+ up_write (& F2FS_I (inode )-> i_gc_rwsem [WRITE ]);
813
813
814
814
if (err )
815
815
return err ;
@@ -962,8 +962,8 @@ static int punch_hole(struct inode *inode, loff_t offset, loff_t len)
962
962
blk_start = (loff_t )pg_start << PAGE_SHIFT ;
963
963
blk_end = (loff_t )pg_end << PAGE_SHIFT ;
964
964
965
- down_write (& F2FS_I (inode )-> i_mmap_sem );
966
965
down_write (& F2FS_I (inode )-> i_gc_rwsem [WRITE ]);
966
+ down_write (& F2FS_I (inode )-> i_mmap_sem );
967
967
968
968
truncate_inode_pages_range (mapping , blk_start ,
969
969
blk_end - 1 );
@@ -972,8 +972,8 @@ static int punch_hole(struct inode *inode, loff_t offset, loff_t len)
972
972
ret = f2fs_truncate_hole (inode , pg_start , pg_end );
973
973
f2fs_unlock_op (sbi );
974
974
975
- up_write (& F2FS_I (inode )-> i_gc_rwsem [WRITE ]);
976
975
up_write (& F2FS_I (inode )-> i_mmap_sem );
976
+ up_write (& F2FS_I (inode )-> i_gc_rwsem [WRITE ]);
977
977
}
978
978
}
979
979
@@ -1188,25 +1188,33 @@ static int __exchange_data_block(struct inode *src_inode,
1188
1188
return ret ;
1189
1189
}
1190
1190
1191
- static int f2fs_do_collapse (struct inode * inode , pgoff_t start , pgoff_t end )
1191
+ static int f2fs_do_collapse (struct inode * inode , loff_t offset , loff_t len )
1192
1192
{
1193
1193
struct f2fs_sb_info * sbi = F2FS_I_SB (inode );
1194
1194
pgoff_t nrpages = (i_size_read (inode ) + PAGE_SIZE - 1 ) / PAGE_SIZE ;
1195
+ pgoff_t start = offset >> PAGE_SHIFT ;
1196
+ pgoff_t end = (offset + len ) >> PAGE_SHIFT ;
1195
1197
int ret ;
1196
1198
1197
1199
f2fs_balance_fs (sbi , true);
1198
- f2fs_lock_op (sbi );
1199
1200
1200
- f2fs_drop_extent_tree (inode );
1201
+ /* avoid gc operation during block exchange */
1202
+ down_write (& F2FS_I (inode )-> i_gc_rwsem [WRITE ]);
1203
+ down_write (& F2FS_I (inode )-> i_mmap_sem );
1201
1204
1205
+ f2fs_lock_op (sbi );
1206
+ f2fs_drop_extent_tree (inode );
1207
+ truncate_pagecache (inode , offset );
1202
1208
ret = __exchange_data_block (inode , inode , end , start , nrpages - end , true);
1203
1209
f2fs_unlock_op (sbi );
1210
+
1211
+ up_write (& F2FS_I (inode )-> i_mmap_sem );
1212
+ up_write (& F2FS_I (inode )-> i_gc_rwsem [WRITE ]);
1204
1213
return ret ;
1205
1214
}
1206
1215
1207
1216
static int f2fs_collapse_range (struct inode * inode , loff_t offset , loff_t len )
1208
1217
{
1209
- pgoff_t pg_start , pg_end ;
1210
1218
loff_t new_size ;
1211
1219
int ret ;
1212
1220
@@ -1221,37 +1229,27 @@ static int f2fs_collapse_range(struct inode *inode, loff_t offset, loff_t len)
1221
1229
if (ret )
1222
1230
return ret ;
1223
1231
1224
- pg_start = offset >> PAGE_SHIFT ;
1225
- pg_end = (offset + len ) >> PAGE_SHIFT ;
1226
-
1227
- /* avoid gc operation during block exchange */
1228
- down_write (& F2FS_I (inode )-> i_gc_rwsem [WRITE ]);
1229
-
1230
- down_write (& F2FS_I (inode )-> i_mmap_sem );
1231
1232
/* write out all dirty pages from offset */
1232
1233
ret = filemap_write_and_wait_range (inode -> i_mapping , offset , LLONG_MAX );
1233
1234
if (ret )
1234
- goto out_unlock ;
1235
-
1236
- truncate_pagecache (inode , offset );
1235
+ return ret ;
1237
1236
1238
- ret = f2fs_do_collapse (inode , pg_start , pg_end );
1237
+ ret = f2fs_do_collapse (inode , offset , len );
1239
1238
if (ret )
1240
- goto out_unlock ;
1239
+ return ret ;
1241
1240
1242
1241
/* write out all moved pages, if possible */
1242
+ down_write (& F2FS_I (inode )-> i_mmap_sem );
1243
1243
filemap_write_and_wait_range (inode -> i_mapping , offset , LLONG_MAX );
1244
1244
truncate_pagecache (inode , offset );
1245
1245
1246
1246
new_size = i_size_read (inode ) - len ;
1247
1247
truncate_pagecache (inode , new_size );
1248
1248
1249
1249
ret = f2fs_truncate_blocks (inode , new_size , true);
1250
+ up_write (& F2FS_I (inode )-> i_mmap_sem );
1250
1251
if (!ret )
1251
1252
f2fs_i_size_write (inode , new_size );
1252
- out_unlock :
1253
- up_write (& F2FS_I (inode )-> i_mmap_sem );
1254
- up_write (& F2FS_I (inode )-> i_gc_rwsem [WRITE ]);
1255
1253
return ret ;
1256
1254
}
1257
1255
@@ -1317,10 +1315,9 @@ static int f2fs_zero_range(struct inode *inode, loff_t offset, loff_t len,
1317
1315
if (ret )
1318
1316
return ret ;
1319
1317
1320
- down_write (& F2FS_I (inode )-> i_mmap_sem );
1321
1318
ret = filemap_write_and_wait_range (mapping , offset , offset + len - 1 );
1322
1319
if (ret )
1323
- goto out_sem ;
1320
+ return ret ;
1324
1321
1325
1322
pg_start = ((unsigned long long ) offset ) >> PAGE_SHIFT ;
1326
1323
pg_end = ((unsigned long long ) offset + len ) >> PAGE_SHIFT ;
@@ -1332,15 +1329,15 @@ static int f2fs_zero_range(struct inode *inode, loff_t offset, loff_t len,
1332
1329
ret = fill_zero (inode , pg_start , off_start ,
1333
1330
off_end - off_start );
1334
1331
if (ret )
1335
- goto out_sem ;
1332
+ return ret ;
1336
1333
1337
1334
new_size = max_t (loff_t , new_size , offset + len );
1338
1335
} else {
1339
1336
if (off_start ) {
1340
1337
ret = fill_zero (inode , pg_start ++ , off_start ,
1341
1338
PAGE_SIZE - off_start );
1342
1339
if (ret )
1343
- goto out_sem ;
1340
+ return ret ;
1344
1341
1345
1342
new_size = max_t (loff_t , new_size ,
1346
1343
(loff_t )pg_start << PAGE_SHIFT );
@@ -1352,6 +1349,7 @@ static int f2fs_zero_range(struct inode *inode, loff_t offset, loff_t len,
1352
1349
pgoff_t end ;
1353
1350
1354
1351
down_write (& F2FS_I (inode )-> i_gc_rwsem [WRITE ]);
1352
+ down_write (& F2FS_I (inode )-> i_mmap_sem );
1355
1353
1356
1354
truncate_pagecache_range (inode ,
1357
1355
(loff_t )index << PAGE_SHIFT ,
@@ -1363,6 +1361,7 @@ static int f2fs_zero_range(struct inode *inode, loff_t offset, loff_t len,
1363
1361
ret = f2fs_get_dnode_of_data (& dn , index , ALLOC_NODE );
1364
1362
if (ret ) {
1365
1363
f2fs_unlock_op (sbi );
1364
+ up_write (& F2FS_I (inode )-> i_mmap_sem );
1366
1365
up_write (& F2FS_I (inode )-> i_gc_rwsem [WRITE ]);
1367
1366
goto out ;
1368
1367
}
@@ -1374,6 +1373,7 @@ static int f2fs_zero_range(struct inode *inode, loff_t offset, loff_t len,
1374
1373
f2fs_put_dnode (& dn );
1375
1374
1376
1375
f2fs_unlock_op (sbi );
1376
+ up_write (& F2FS_I (inode )-> i_mmap_sem );
1377
1377
up_write (& F2FS_I (inode )-> i_gc_rwsem [WRITE ]);
1378
1378
1379
1379
f2fs_balance_fs (sbi , dn .node_changed );
@@ -1402,9 +1402,6 @@ static int f2fs_zero_range(struct inode *inode, loff_t offset, loff_t len,
1402
1402
else
1403
1403
f2fs_i_size_write (inode , new_size );
1404
1404
}
1405
- out_sem :
1406
- up_write (& F2FS_I (inode )-> i_mmap_sem );
1407
-
1408
1405
return ret ;
1409
1406
}
1410
1407
@@ -1433,26 +1430,27 @@ static int f2fs_insert_range(struct inode *inode, loff_t offset, loff_t len)
1433
1430
1434
1431
f2fs_balance_fs (sbi , true);
1435
1432
1436
- /* avoid gc operation during block exchange */
1437
- down_write (& F2FS_I (inode )-> i_gc_rwsem [WRITE ]);
1438
-
1439
1433
down_write (& F2FS_I (inode )-> i_mmap_sem );
1440
1434
ret = f2fs_truncate_blocks (inode , i_size_read (inode ), true);
1435
+ up_write (& F2FS_I (inode )-> i_mmap_sem );
1441
1436
if (ret )
1442
- goto out ;
1437
+ return ret ;
1443
1438
1444
1439
/* write out all dirty pages from offset */
1445
1440
ret = filemap_write_and_wait_range (inode -> i_mapping , offset , LLONG_MAX );
1446
1441
if (ret )
1447
- goto out ;
1448
-
1449
- truncate_pagecache (inode , offset );
1442
+ return ret ;
1450
1443
1451
1444
pg_start = offset >> PAGE_SHIFT ;
1452
1445
pg_end = (offset + len ) >> PAGE_SHIFT ;
1453
1446
delta = pg_end - pg_start ;
1454
1447
idx = (i_size_read (inode ) + PAGE_SIZE - 1 ) / PAGE_SIZE ;
1455
1448
1449
+ /* avoid gc operation during block exchange */
1450
+ down_write (& F2FS_I (inode )-> i_gc_rwsem [WRITE ]);
1451
+ down_write (& F2FS_I (inode )-> i_mmap_sem );
1452
+ truncate_pagecache (inode , offset );
1453
+
1456
1454
while (!ret && idx > pg_start ) {
1457
1455
nr = idx - pg_start ;
1458
1456
if (nr > delta )
@@ -1466,16 +1464,17 @@ static int f2fs_insert_range(struct inode *inode, loff_t offset, loff_t len)
1466
1464
idx + delta , nr , false);
1467
1465
f2fs_unlock_op (sbi );
1468
1466
}
1467
+ up_write (& F2FS_I (inode )-> i_mmap_sem );
1468
+ up_write (& F2FS_I (inode )-> i_gc_rwsem [WRITE ]);
1469
1469
1470
1470
/* write out all moved pages, if possible */
1471
+ down_write (& F2FS_I (inode )-> i_mmap_sem );
1471
1472
filemap_write_and_wait_range (inode -> i_mapping , offset , LLONG_MAX );
1472
1473
truncate_pagecache (inode , offset );
1474
+ up_write (& F2FS_I (inode )-> i_mmap_sem );
1473
1475
1474
1476
if (!ret )
1475
1477
f2fs_i_size_write (inode , new_size );
1476
- out :
1477
- up_write (& F2FS_I (inode )-> i_mmap_sem );
1478
- up_write (& F2FS_I (inode )-> i_gc_rwsem [WRITE ]);
1479
1478
return ret ;
1480
1479
}
1481
1480
@@ -1722,8 +1721,6 @@ static int f2fs_ioc_start_atomic_write(struct file *filp)
1722
1721
1723
1722
inode_lock (inode );
1724
1723
1725
- down_write (& F2FS_I (inode )-> i_gc_rwsem [WRITE ]);
1726
-
1727
1724
if (f2fs_is_atomic_file (inode )) {
1728
1725
if (is_inode_flag_set (inode , FI_ATOMIC_REVOKE_REQUEST ))
1729
1726
ret = - EINVAL ;
@@ -1734,25 +1731,29 @@ static int f2fs_ioc_start_atomic_write(struct file *filp)
1734
1731
if (ret )
1735
1732
goto out ;
1736
1733
1734
+ down_write (& F2FS_I (inode )-> i_gc_rwsem [WRITE ]);
1735
+
1737
1736
if (!get_dirty_pages (inode ))
1738
1737
goto skip_flush ;
1739
1738
1740
1739
f2fs_msg (F2FS_I_SB (inode )-> sb , KERN_WARNING ,
1741
1740
"Unexpected flush for atomic writes: ino=%lu, npages=%u" ,
1742
1741
inode -> i_ino , get_dirty_pages (inode ));
1743
1742
ret = filemap_write_and_wait_range (inode -> i_mapping , 0 , LLONG_MAX );
1744
- if (ret )
1743
+ if (ret ) {
1744
+ up_write (& F2FS_I (inode )-> i_gc_rwsem [WRITE ]);
1745
1745
goto out ;
1746
+ }
1746
1747
skip_flush :
1747
1748
set_inode_flag (inode , FI_ATOMIC_FILE );
1748
1749
clear_inode_flag (inode , FI_ATOMIC_REVOKE_REQUEST );
1749
- f2fs_update_time ( F2FS_I_SB (inode ), REQ_TIME );
1750
+ up_write ( & F2FS_I (inode )-> i_gc_rwsem [ WRITE ] );
1750
1751
1752
+ f2fs_update_time (F2FS_I_SB (inode ), REQ_TIME );
1751
1753
F2FS_I (inode )-> inmem_task = current ;
1752
1754
stat_inc_atomic_write (inode );
1753
1755
stat_update_max_atomic_write (inode );
1754
1756
out :
1755
- up_write (& F2FS_I (inode )-> i_gc_rwsem [WRITE ]);
1756
1757
inode_unlock (inode );
1757
1758
mnt_drop_write_file (filp );
1758
1759
return ret ;
@@ -1770,9 +1771,9 @@ static int f2fs_ioc_commit_atomic_write(struct file *filp)
1770
1771
if (ret )
1771
1772
return ret ;
1772
1773
1773
- inode_lock ( inode );
1774
+ f2fs_balance_fs ( F2FS_I_SB ( inode ), true );
1774
1775
1775
- down_write ( & F2FS_I ( inode ) -> i_gc_rwsem [ WRITE ] );
1776
+ inode_lock ( inode );
1776
1777
1777
1778
if (f2fs_is_volatile_file (inode )) {
1778
1779
ret = - EINVAL ;
@@ -1798,7 +1799,6 @@ static int f2fs_ioc_commit_atomic_write(struct file *filp)
1798
1799
clear_inode_flag (inode , FI_ATOMIC_REVOKE_REQUEST );
1799
1800
ret = - EINVAL ;
1800
1801
}
1801
- up_write (& F2FS_I (inode )-> i_gc_rwsem [WRITE ]);
1802
1802
inode_unlock (inode );
1803
1803
mnt_drop_write_file (filp );
1804
1804
return ret ;
@@ -2394,15 +2394,10 @@ static int f2fs_move_file_range(struct file *file_in, loff_t pos_in,
2394
2394
}
2395
2395
2396
2396
inode_lock (src );
2397
- down_write (& F2FS_I (src )-> i_gc_rwsem [WRITE ]);
2398
2397
if (src != dst ) {
2399
2398
ret = - EBUSY ;
2400
2399
if (!inode_trylock (dst ))
2401
2400
goto out ;
2402
- if (!down_write_trylock (& F2FS_I (dst )-> i_gc_rwsem [WRITE ])) {
2403
- inode_unlock (dst );
2404
- goto out ;
2405
- }
2406
2401
}
2407
2402
2408
2403
ret = - EINVAL ;
@@ -2447,6 +2442,14 @@ static int f2fs_move_file_range(struct file *file_in, loff_t pos_in,
2447
2442
goto out_unlock ;
2448
2443
2449
2444
f2fs_balance_fs (sbi , true);
2445
+
2446
+ down_write (& F2FS_I (src )-> i_gc_rwsem [WRITE ]);
2447
+ if (src != dst ) {
2448
+ ret = - EBUSY ;
2449
+ if (!down_write_trylock (& F2FS_I (dst )-> i_gc_rwsem [WRITE ]))
2450
+ goto out_src ;
2451
+ }
2452
+
2450
2453
f2fs_lock_op (sbi );
2451
2454
ret = __exchange_data_block (src , dst , pos_in >> F2FS_BLKSIZE_BITS ,
2452
2455
pos_out >> F2FS_BLKSIZE_BITS ,
@@ -2459,13 +2462,15 @@ static int f2fs_move_file_range(struct file *file_in, loff_t pos_in,
2459
2462
f2fs_i_size_write (dst , dst_osize );
2460
2463
}
2461
2464
f2fs_unlock_op (sbi );
2462
- out_unlock :
2463
- if (src != dst ) {
2465
+
2466
+ if (src != dst )
2464
2467
up_write (& F2FS_I (dst )-> i_gc_rwsem [WRITE ]);
2468
+ out_src :
2469
+ up_write (& F2FS_I (src )-> i_gc_rwsem [WRITE ]);
2470
+ out_unlock :
2471
+ if (src != dst )
2465
2472
inode_unlock (dst );
2466
- }
2467
2473
out :
2468
- up_write (& F2FS_I (src )-> i_gc_rwsem [WRITE ]);
2469
2474
inode_unlock (src );
2470
2475
return ret ;
2471
2476
}
0 commit comments