@@ -69,8 +69,7 @@ static bool __is_cp_guaranteed(struct page *page)
69
69
70
70
if (f2fs_is_compressed_page (page ))
71
71
return false;
72
- if ((S_ISREG (inode -> i_mode ) &&
73
- (f2fs_is_atomic_file (inode ) || IS_NOQUOTA (inode ))) ||
72
+ if ((S_ISREG (inode -> i_mode ) && IS_NOQUOTA (inode )) ||
74
73
page_private_gcing (page ))
75
74
return true;
76
75
return false;
@@ -585,6 +584,34 @@ static bool __has_merged_page(struct bio *bio, struct inode *inode,
585
584
return false;
586
585
}
587
586
587
+ int f2fs_init_write_merge_io (struct f2fs_sb_info * sbi )
588
+ {
589
+ int i ;
590
+
591
+ for (i = 0 ; i < NR_PAGE_TYPE ; i ++ ) {
592
+ int n = (i == META ) ? 1 : NR_TEMP_TYPE ;
593
+ int j ;
594
+
595
+ sbi -> write_io [i ] = f2fs_kmalloc (sbi ,
596
+ array_size (n , sizeof (struct f2fs_bio_info )),
597
+ GFP_KERNEL );
598
+ if (!sbi -> write_io [i ])
599
+ return - ENOMEM ;
600
+
601
+ for (j = HOT ; j < n ; j ++ ) {
602
+ init_f2fs_rwsem (& sbi -> write_io [i ][j ].io_rwsem );
603
+ sbi -> write_io [i ][j ].sbi = sbi ;
604
+ sbi -> write_io [i ][j ].bio = NULL ;
605
+ spin_lock_init (& sbi -> write_io [i ][j ].io_lock );
606
+ INIT_LIST_HEAD (& sbi -> write_io [i ][j ].io_list );
607
+ INIT_LIST_HEAD (& sbi -> write_io [i ][j ].bio_list );
608
+ init_f2fs_rwsem (& sbi -> write_io [i ][j ].bio_list_lock );
609
+ }
610
+ }
611
+
612
+ return 0 ;
613
+ }
614
+
588
615
static void __f2fs_submit_merged_write (struct f2fs_sb_info * sbi ,
589
616
enum page_type type , enum temp_type temp )
590
617
{
@@ -2564,7 +2591,12 @@ int f2fs_do_write_data_page(struct f2fs_io_info *fio)
2564
2591
bool ipu_force = false;
2565
2592
int err = 0 ;
2566
2593
2567
- set_new_dnode (& dn , inode , NULL , NULL , 0 );
2594
+ /* Use COW inode to make dnode_of_data for atomic write */
2595
+ if (f2fs_is_atomic_file (inode ))
2596
+ set_new_dnode (& dn , F2FS_I (inode )-> cow_inode , NULL , NULL , 0 );
2597
+ else
2598
+ set_new_dnode (& dn , inode , NULL , NULL , 0 );
2599
+
2568
2600
if (need_inplace_update (fio ) &&
2569
2601
f2fs_lookup_extent_cache (inode , page -> index , & ei )) {
2570
2602
fio -> old_blkaddr = ei .blk + page -> index - ei .fofs ;
@@ -2601,6 +2633,7 @@ int f2fs_do_write_data_page(struct f2fs_io_info *fio)
2601
2633
err = - EFSCORRUPTED ;
2602
2634
goto out_writepage ;
2603
2635
}
2636
+
2604
2637
/*
2605
2638
* If current allocation needs SSR,
2606
2639
* it had better in-place writes for updated data.
@@ -2737,11 +2770,6 @@ int f2fs_write_single_data_page(struct page *page, int *submitted,
2737
2770
write :
2738
2771
if (f2fs_is_drop_cache (inode ))
2739
2772
goto out ;
2740
- /* we should not write 0'th page having journal header */
2741
- if (f2fs_is_volatile_file (inode ) && (!page -> index ||
2742
- (!wbc -> for_reclaim &&
2743
- f2fs_available_free_memory (sbi , BASE_CHECK ))))
2744
- goto redirty_out ;
2745
2773
2746
2774
/* Dentry/quota blocks are controlled by checkpoint */
2747
2775
if (S_ISDIR (inode -> i_mode ) || IS_NOQUOTA (inode )) {
@@ -3314,14 +3342,108 @@ static int prepare_write_begin(struct f2fs_sb_info *sbi,
3314
3342
return err ;
3315
3343
}
3316
3344
3345
+ static int __find_data_block (struct inode * inode , pgoff_t index ,
3346
+ block_t * blk_addr )
3347
+ {
3348
+ struct dnode_of_data dn ;
3349
+ struct page * ipage ;
3350
+ struct extent_info ei = {0 , };
3351
+ int err = 0 ;
3352
+
3353
+ ipage = f2fs_get_node_page (F2FS_I_SB (inode ), inode -> i_ino );
3354
+ if (IS_ERR (ipage ))
3355
+ return PTR_ERR (ipage );
3356
+
3357
+ set_new_dnode (& dn , inode , ipage , ipage , 0 );
3358
+
3359
+ if (f2fs_lookup_extent_cache (inode , index , & ei )) {
3360
+ dn .data_blkaddr = ei .blk + index - ei .fofs ;
3361
+ } else {
3362
+ /* hole case */
3363
+ err = f2fs_get_dnode_of_data (& dn , index , LOOKUP_NODE );
3364
+ if (err ) {
3365
+ dn .data_blkaddr = NULL_ADDR ;
3366
+ err = 0 ;
3367
+ }
3368
+ }
3369
+ * blk_addr = dn .data_blkaddr ;
3370
+ f2fs_put_dnode (& dn );
3371
+ return err ;
3372
+ }
3373
+
3374
+ static int __reserve_data_block (struct inode * inode , pgoff_t index ,
3375
+ block_t * blk_addr , bool * node_changed )
3376
+ {
3377
+ struct f2fs_sb_info * sbi = F2FS_I_SB (inode );
3378
+ struct dnode_of_data dn ;
3379
+ struct page * ipage ;
3380
+ int err = 0 ;
3381
+
3382
+ f2fs_do_map_lock (sbi , F2FS_GET_BLOCK_PRE_AIO , true);
3383
+
3384
+ ipage = f2fs_get_node_page (sbi , inode -> i_ino );
3385
+ if (IS_ERR (ipage )) {
3386
+ err = PTR_ERR (ipage );
3387
+ goto unlock_out ;
3388
+ }
3389
+ set_new_dnode (& dn , inode , ipage , ipage , 0 );
3390
+
3391
+ err = f2fs_get_block (& dn , index );
3392
+
3393
+ * blk_addr = dn .data_blkaddr ;
3394
+ * node_changed = dn .node_changed ;
3395
+ f2fs_put_dnode (& dn );
3396
+
3397
+ unlock_out :
3398
+ f2fs_do_map_lock (sbi , F2FS_GET_BLOCK_PRE_AIO , false);
3399
+ return err ;
3400
+ }
3401
+
3402
+ static int prepare_atomic_write_begin (struct f2fs_sb_info * sbi ,
3403
+ struct page * page , loff_t pos , unsigned int len ,
3404
+ block_t * blk_addr , bool * node_changed )
3405
+ {
3406
+ struct inode * inode = page -> mapping -> host ;
3407
+ struct inode * cow_inode = F2FS_I (inode )-> cow_inode ;
3408
+ pgoff_t index = page -> index ;
3409
+ int err = 0 ;
3410
+ block_t ori_blk_addr ;
3411
+
3412
+ /* If pos is beyond the end of file, reserve a new block in COW inode */
3413
+ if ((pos & PAGE_MASK ) >= i_size_read (inode ))
3414
+ return __reserve_data_block (cow_inode , index , blk_addr ,
3415
+ node_changed );
3416
+
3417
+ /* Look for the block in COW inode first */
3418
+ err = __find_data_block (cow_inode , index , blk_addr );
3419
+ if (err )
3420
+ return err ;
3421
+ else if (* blk_addr != NULL_ADDR )
3422
+ return 0 ;
3423
+
3424
+ /* Look for the block in the original inode */
3425
+ err = __find_data_block (inode , index , & ori_blk_addr );
3426
+ if (err )
3427
+ return err ;
3428
+
3429
+ /* Finally, we should reserve a new block in COW inode for the update */
3430
+ err = __reserve_data_block (cow_inode , index , blk_addr , node_changed );
3431
+ if (err )
3432
+ return err ;
3433
+
3434
+ if (ori_blk_addr != NULL_ADDR )
3435
+ * blk_addr = ori_blk_addr ;
3436
+ return 0 ;
3437
+ }
3438
+
3317
3439
static int f2fs_write_begin (struct file * file , struct address_space * mapping ,
3318
3440
loff_t pos , unsigned len , struct page * * pagep , void * * fsdata )
3319
3441
{
3320
3442
struct inode * inode = mapping -> host ;
3321
3443
struct f2fs_sb_info * sbi = F2FS_I_SB (inode );
3322
3444
struct page * page = NULL ;
3323
3445
pgoff_t index = ((unsigned long long ) pos ) >> PAGE_SHIFT ;
3324
- bool need_balance = false, drop_atomic = false ;
3446
+ bool need_balance = false;
3325
3447
block_t blkaddr = NULL_ADDR ;
3326
3448
int err = 0 ;
3327
3449
@@ -3332,14 +3454,6 @@ static int f2fs_write_begin(struct file *file, struct address_space *mapping,
3332
3454
goto fail ;
3333
3455
}
3334
3456
3335
- if ((f2fs_is_atomic_file (inode ) &&
3336
- !f2fs_available_free_memory (sbi , INMEM_PAGES )) ||
3337
- is_inode_flag_set (inode , FI_ATOMIC_REVOKE_REQUEST )) {
3338
- err = - ENOMEM ;
3339
- drop_atomic = true;
3340
- goto fail ;
3341
- }
3342
-
3343
3457
/*
3344
3458
* We should check this at this moment to avoid deadlock on inode page
3345
3459
* and #0 page. The locking rule for inline_data conversion should be:
@@ -3387,7 +3501,11 @@ static int f2fs_write_begin(struct file *file, struct address_space *mapping,
3387
3501
3388
3502
* pagep = page ;
3389
3503
3390
- err = prepare_write_begin (sbi , page , pos , len ,
3504
+ if (f2fs_is_atomic_file (inode ))
3505
+ err = prepare_atomic_write_begin (sbi , page , pos , len ,
3506
+ & blkaddr , & need_balance );
3507
+ else
3508
+ err = prepare_write_begin (sbi , page , pos , len ,
3391
3509
& blkaddr , & need_balance );
3392
3510
if (err )
3393
3511
goto fail ;
@@ -3443,8 +3561,6 @@ static int f2fs_write_begin(struct file *file, struct address_space *mapping,
3443
3561
fail :
3444
3562
f2fs_put_page (page , 1 );
3445
3563
f2fs_write_failed (inode , pos + len );
3446
- if (drop_atomic )
3447
- f2fs_drop_inmem_pages_all (sbi , false);
3448
3564
return err ;
3449
3565
}
3450
3566
@@ -3488,8 +3604,12 @@ static int f2fs_write_end(struct file *file,
3488
3604
set_page_dirty (page );
3489
3605
3490
3606
if (pos + copied > i_size_read (inode ) &&
3491
- !f2fs_verity_in_progress (inode ))
3607
+ !f2fs_verity_in_progress (inode )) {
3492
3608
f2fs_i_size_write (inode , pos + copied );
3609
+ if (f2fs_is_atomic_file (inode ))
3610
+ f2fs_i_size_write (F2FS_I (inode )-> cow_inode ,
3611
+ pos + copied );
3612
+ }
3493
3613
unlock_out :
3494
3614
f2fs_put_page (page , 1 );
3495
3615
f2fs_update_time (F2FS_I_SB (inode ), REQ_TIME );
@@ -3522,9 +3642,6 @@ void f2fs_invalidate_folio(struct folio *folio, size_t offset, size_t length)
3522
3642
inode -> i_ino == F2FS_COMPRESS_INO (sbi ))
3523
3643
clear_page_private_data (& folio -> page );
3524
3644
3525
- if (page_private_atomic (& folio -> page ))
3526
- return f2fs_drop_inmem_page (inode , & folio -> page );
3527
-
3528
3645
folio_detach_private (folio );
3529
3646
}
3530
3647
@@ -3536,10 +3653,6 @@ bool f2fs_release_folio(struct folio *folio, gfp_t wait)
3536
3653
if (folio_test_dirty (folio ))
3537
3654
return false;
3538
3655
3539
- /* This is atomic written page, keep Private */
3540
- if (page_private_atomic (& folio -> page ))
3541
- return false;
3542
-
3543
3656
sbi = F2FS_M_SB (folio -> mapping );
3544
3657
if (test_opt (sbi , COMPRESS_CACHE )) {
3545
3658
struct inode * inode = folio -> mapping -> host ;
@@ -3565,18 +3678,6 @@ static bool f2fs_dirty_data_folio(struct address_space *mapping,
3565
3678
folio_mark_uptodate (folio );
3566
3679
BUG_ON (folio_test_swapcache (folio ));
3567
3680
3568
- if (f2fs_is_atomic_file (inode ) && !f2fs_is_commit_atomic_write (inode )) {
3569
- if (!page_private_atomic (& folio -> page )) {
3570
- f2fs_register_inmem_page (inode , & folio -> page );
3571
- return true;
3572
- }
3573
- /*
3574
- * Previously, this page has been registered, we just
3575
- * return here.
3576
- */
3577
- return false;
3578
- }
3579
-
3580
3681
if (!folio_test_dirty (folio )) {
3581
3682
filemap_dirty_folio (mapping , folio );
3582
3683
f2fs_update_dirty_folio (inode , folio );
@@ -3656,42 +3757,14 @@ static sector_t f2fs_bmap(struct address_space *mapping, sector_t block)
3656
3757
int f2fs_migrate_page (struct address_space * mapping ,
3657
3758
struct page * newpage , struct page * page , enum migrate_mode mode )
3658
3759
{
3659
- int rc , extra_count ;
3660
- struct f2fs_inode_info * fi = F2FS_I (mapping -> host );
3661
- bool atomic_written = page_private_atomic (page );
3760
+ int rc , extra_count = 0 ;
3662
3761
3663
3762
BUG_ON (PageWriteback (page ));
3664
3763
3665
- /* migrating an atomic written page is safe with the inmem_lock hold */
3666
- if (atomic_written ) {
3667
- if (mode != MIGRATE_SYNC )
3668
- return - EBUSY ;
3669
- if (!mutex_trylock (& fi -> inmem_lock ))
3670
- return - EAGAIN ;
3671
- }
3672
-
3673
- /* one extra reference was held for atomic_write page */
3674
- extra_count = atomic_written ? 1 : 0 ;
3675
3764
rc = migrate_page_move_mapping (mapping , newpage ,
3676
3765
page , extra_count );
3677
- if (rc != MIGRATEPAGE_SUCCESS ) {
3678
- if (atomic_written )
3679
- mutex_unlock (& fi -> inmem_lock );
3766
+ if (rc != MIGRATEPAGE_SUCCESS )
3680
3767
return rc ;
3681
- }
3682
-
3683
- if (atomic_written ) {
3684
- struct inmem_pages * cur ;
3685
-
3686
- list_for_each_entry (cur , & fi -> inmem_pages , list )
3687
- if (cur -> page == page ) {
3688
- cur -> page = newpage ;
3689
- break ;
3690
- }
3691
- mutex_unlock (& fi -> inmem_lock );
3692
- put_page (page );
3693
- get_page (newpage );
3694
- }
3695
3768
3696
3769
/* guarantee to start from no stale private field */
3697
3770
set_page_private (newpage , 0 );
0 commit comments