@@ -219,7 +219,8 @@ void btrfs_cleanup_defrag_inodes(struct btrfs_fs_info *fs_info)
219
219
#define BTRFS_DEFRAG_BATCH 1024
220
220
221
221
static int btrfs_run_defrag_inode (struct btrfs_fs_info * fs_info ,
222
- struct inode_defrag * defrag )
222
+ struct inode_defrag * defrag ,
223
+ struct file_ra_state * ra )
223
224
{
224
225
struct btrfs_root * inode_root ;
225
226
struct inode * inode ;
@@ -258,9 +259,10 @@ static int btrfs_run_defrag_inode(struct btrfs_fs_info *fs_info,
258
259
range .len = (u64 )- 1 ;
259
260
range .start = cur ;
260
261
range .extent_thresh = defrag -> extent_thresh ;
262
+ file_ra_state_init (ra , inode -> i_mapping );
261
263
262
264
sb_start_write (fs_info -> sb );
263
- ret = btrfs_defrag_file (inode , NULL , & range , defrag -> transid ,
265
+ ret = btrfs_defrag_file (inode , ra , & range , defrag -> transid ,
264
266
BTRFS_DEFRAG_BATCH );
265
267
sb_end_write (fs_info -> sb );
266
268
iput (inode );
@@ -287,6 +289,8 @@ int btrfs_run_defrag_inodes(struct btrfs_fs_info *fs_info)
287
289
288
290
atomic_inc (& fs_info -> defrag_running );
289
291
while (1 ) {
292
+ struct file_ra_state ra = { 0 };
293
+
290
294
/* Pause the auto defragger. */
291
295
if (test_bit (BTRFS_FS_STATE_REMOUNTING , & fs_info -> fs_state ))
292
296
break ;
@@ -309,7 +313,7 @@ int btrfs_run_defrag_inodes(struct btrfs_fs_info *fs_info)
309
313
first_ino = defrag -> ino + 1 ;
310
314
root_objectid = defrag -> root ;
311
315
312
- btrfs_run_defrag_inode (fs_info , defrag );
316
+ btrfs_run_defrag_inode (fs_info , defrag , & ra );
313
317
}
314
318
atomic_dec (& fs_info -> defrag_running );
315
319
@@ -1302,8 +1306,7 @@ static int defrag_one_cluster(struct btrfs_inode *inode,
1302
1306
if (entry -> start + range_len <= * last_scanned_ret )
1303
1307
continue ;
1304
1308
1305
- if (ra )
1306
- page_cache_sync_readahead (inode -> vfs_inode .i_mapping ,
1309
+ page_cache_sync_readahead (inode -> vfs_inode .i_mapping ,
1307
1310
ra , NULL , entry -> start >> PAGE_SHIFT ,
1308
1311
((entry -> start + range_len - 1 ) >> PAGE_SHIFT ) -
1309
1312
(entry -> start >> PAGE_SHIFT ) + 1 );
@@ -1335,7 +1338,7 @@ static int defrag_one_cluster(struct btrfs_inode *inode,
1335
1338
* Entry point to file defragmentation.
1336
1339
*
1337
1340
* @inode: inode to be defragged
1338
- * @ra: readahead state (can be NUL)
1341
+ * @ra: readahead state
1339
1342
* @range: defrag options including range and flags
1340
1343
* @newer_than: minimum transid to defrag
1341
1344
* @max_to_defrag: max number of sectors to be defragged, if 0, the whole inode
@@ -1357,12 +1360,13 @@ int btrfs_defrag_file(struct inode *inode, struct file_ra_state *ra,
1357
1360
u64 cur ;
1358
1361
u64 last_byte ;
1359
1362
bool do_compress = (range -> flags & BTRFS_DEFRAG_RANGE_COMPRESS );
1360
- bool ra_allocated = false;
1361
1363
int compress_type = BTRFS_COMPRESS_ZLIB ;
1362
1364
int ret = 0 ;
1363
1365
u32 extent_thresh = range -> extent_thresh ;
1364
1366
pgoff_t start_index ;
1365
1367
1368
+ ASSERT (ra );
1369
+
1366
1370
if (isize == 0 )
1367
1371
return 0 ;
1368
1372
@@ -1391,18 +1395,6 @@ int btrfs_defrag_file(struct inode *inode, struct file_ra_state *ra,
1391
1395
cur = round_down (range -> start , fs_info -> sectorsize );
1392
1396
last_byte = round_up (last_byte , fs_info -> sectorsize ) - 1 ;
1393
1397
1394
- /*
1395
- * If we were not given a ra, allocate a readahead context. As
1396
- * readahead is just an optimization, defrag will work without it so
1397
- * we don't error out.
1398
- */
1399
- if (!ra ) {
1400
- ra_allocated = true;
1401
- ra = kzalloc (sizeof (* ra ), GFP_KERNEL );
1402
- if (ra )
1403
- file_ra_state_init (ra , inode -> i_mapping );
1404
- }
1405
-
1406
1398
/*
1407
1399
* Make writeback start from the beginning of the range, so that the
1408
1400
* defrag range can be written sequentially.
@@ -1457,8 +1449,6 @@ int btrfs_defrag_file(struct inode *inode, struct file_ra_state *ra,
1457
1449
cond_resched ();
1458
1450
}
1459
1451
1460
- if (ra_allocated )
1461
- kfree (ra );
1462
1452
/*
1463
1453
* Update range.start for autodefrag, this will indicate where to start
1464
1454
* in next run.
0 commit comments