@@ -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;
@@ -2563,7 +2562,12 @@ int f2fs_do_write_data_page(struct f2fs_io_info *fio)
2563
2562
bool ipu_force = false;
2564
2563
int err = 0 ;
2565
2564
2566
- set_new_dnode (& dn , inode , NULL , NULL , 0 );
2565
+ /* Use COW inode to make dnode_of_data for atomic write */
2566
+ if (f2fs_is_atomic_file (inode ))
2567
+ set_new_dnode (& dn , F2FS_I (inode )-> cow_inode , NULL , NULL , 0 );
2568
+ else
2569
+ set_new_dnode (& dn , inode , NULL , NULL , 0 );
2570
+
2567
2571
if (need_inplace_update (fio ) &&
2568
2572
f2fs_lookup_extent_cache (inode , page -> index , & ei )) {
2569
2573
fio -> old_blkaddr = ei .blk + page -> index - ei .fofs ;
@@ -2600,6 +2604,7 @@ int f2fs_do_write_data_page(struct f2fs_io_info *fio)
2600
2604
err = - EFSCORRUPTED ;
2601
2605
goto out_writepage ;
2602
2606
}
2607
+
2603
2608
/*
2604
2609
* If current allocation needs SSR,
2605
2610
* it had better in-place writes for updated data.
@@ -3313,6 +3318,100 @@ static int prepare_write_begin(struct f2fs_sb_info *sbi,
3313
3318
return err ;
3314
3319
}
3315
3320
3321
+ static int __find_data_block (struct inode * inode , pgoff_t index ,
3322
+ block_t * blk_addr )
3323
+ {
3324
+ struct dnode_of_data dn ;
3325
+ struct page * ipage ;
3326
+ struct extent_info ei = {0 , };
3327
+ int err = 0 ;
3328
+
3329
+ ipage = f2fs_get_node_page (F2FS_I_SB (inode ), inode -> i_ino );
3330
+ if (IS_ERR (ipage ))
3331
+ return PTR_ERR (ipage );
3332
+
3333
+ set_new_dnode (& dn , inode , ipage , ipage , 0 );
3334
+
3335
+ if (f2fs_lookup_extent_cache (inode , index , & ei )) {
3336
+ dn .data_blkaddr = ei .blk + index - ei .fofs ;
3337
+ } else {
3338
+ /* hole case */
3339
+ err = f2fs_get_dnode_of_data (& dn , index , LOOKUP_NODE );
3340
+ if (err ) {
3341
+ dn .data_blkaddr = NULL_ADDR ;
3342
+ err = 0 ;
3343
+ }
3344
+ }
3345
+ * blk_addr = dn .data_blkaddr ;
3346
+ f2fs_put_dnode (& dn );
3347
+ return err ;
3348
+ }
3349
+
3350
+ static int __reserve_data_block (struct inode * inode , pgoff_t index ,
3351
+ block_t * blk_addr , bool * node_changed )
3352
+ {
3353
+ struct f2fs_sb_info * sbi = F2FS_I_SB (inode );
3354
+ struct dnode_of_data dn ;
3355
+ struct page * ipage ;
3356
+ int err = 0 ;
3357
+
3358
+ f2fs_do_map_lock (sbi , F2FS_GET_BLOCK_PRE_AIO , true);
3359
+
3360
+ ipage = f2fs_get_node_page (sbi , inode -> i_ino );
3361
+ if (IS_ERR (ipage )) {
3362
+ err = PTR_ERR (ipage );
3363
+ goto unlock_out ;
3364
+ }
3365
+ set_new_dnode (& dn , inode , ipage , ipage , 0 );
3366
+
3367
+ err = f2fs_get_block (& dn , index );
3368
+
3369
+ * blk_addr = dn .data_blkaddr ;
3370
+ * node_changed = dn .node_changed ;
3371
+ f2fs_put_dnode (& dn );
3372
+
3373
+ unlock_out :
3374
+ f2fs_do_map_lock (sbi , F2FS_GET_BLOCK_PRE_AIO , false);
3375
+ return err ;
3376
+ }
3377
+
3378
+ static int prepare_atomic_write_begin (struct f2fs_sb_info * sbi ,
3379
+ struct page * page , loff_t pos , unsigned int len ,
3380
+ block_t * blk_addr , bool * node_changed )
3381
+ {
3382
+ struct inode * inode = page -> mapping -> host ;
3383
+ struct inode * cow_inode = F2FS_I (inode )-> cow_inode ;
3384
+ pgoff_t index = page -> index ;
3385
+ int err = 0 ;
3386
+ block_t ori_blk_addr ;
3387
+
3388
+ /* If pos is beyond the end of file, reserve a new block in COW inode */
3389
+ if ((pos & PAGE_MASK ) >= i_size_read (inode ))
3390
+ return __reserve_data_block (cow_inode , index , blk_addr ,
3391
+ node_changed );
3392
+
3393
+ /* Look for the block in COW inode first */
3394
+ err = __find_data_block (cow_inode , index , blk_addr );
3395
+ if (err )
3396
+ return err ;
3397
+ else if (* blk_addr != NULL_ADDR )
3398
+ return 0 ;
3399
+
3400
+ /* Look for the block in the original inode */
3401
+ err = __find_data_block (inode , index , & ori_blk_addr );
3402
+ if (err )
3403
+ return err ;
3404
+
3405
+ /* Finally, we should reserve a new block in COW inode for the update */
3406
+ err = __reserve_data_block (cow_inode , index , blk_addr , node_changed );
3407
+ if (err )
3408
+ return err ;
3409
+
3410
+ if (ori_blk_addr != NULL_ADDR )
3411
+ * blk_addr = ori_blk_addr ;
3412
+ return 0 ;
3413
+ }
3414
+
3316
3415
static int f2fs_write_begin (struct file * file , struct address_space * mapping ,
3317
3416
loff_t pos , unsigned len , unsigned flags ,
3318
3417
struct page * * pagep , void * * fsdata )
@@ -3321,7 +3420,7 @@ static int f2fs_write_begin(struct file *file, struct address_space *mapping,
3321
3420
struct f2fs_sb_info * sbi = F2FS_I_SB (inode );
3322
3421
struct page * page = NULL ;
3323
3422
pgoff_t index = ((unsigned long long ) pos ) >> PAGE_SHIFT ;
3324
- bool need_balance = false, drop_atomic = false ;
3423
+ bool need_balance = false;
3325
3424
block_t blkaddr = NULL_ADDR ;
3326
3425
int err = 0 ;
3327
3426
@@ -3332,14 +3431,6 @@ static int f2fs_write_begin(struct file *file, struct address_space *mapping,
3332
3431
goto fail ;
3333
3432
}
3334
3433
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
3434
/*
3344
3435
* We should check this at this moment to avoid deadlock on inode page
3345
3436
* and #0 page. The locking rule for inline_data conversion should be:
@@ -3387,7 +3478,11 @@ static int f2fs_write_begin(struct file *file, struct address_space *mapping,
3387
3478
3388
3479
* pagep = page ;
3389
3480
3390
- err = prepare_write_begin (sbi , page , pos , len ,
3481
+ if (f2fs_is_atomic_file (inode ))
3482
+ err = prepare_atomic_write_begin (sbi , page , pos , len ,
3483
+ & blkaddr , & need_balance );
3484
+ else
3485
+ err = prepare_write_begin (sbi , page , pos , len ,
3391
3486
& blkaddr , & need_balance );
3392
3487
if (err )
3393
3488
goto fail ;
@@ -3443,8 +3538,6 @@ static int f2fs_write_begin(struct file *file, struct address_space *mapping,
3443
3538
fail :
3444
3539
f2fs_put_page (page , 1 );
3445
3540
f2fs_write_failed (inode , pos + len );
3446
- if (drop_atomic )
3447
- f2fs_drop_inmem_pages_all (sbi , false);
3448
3541
return err ;
3449
3542
}
3450
3543
@@ -3488,8 +3581,12 @@ static int f2fs_write_end(struct file *file,
3488
3581
set_page_dirty (page );
3489
3582
3490
3583
if (pos + copied > i_size_read (inode ) &&
3491
- !f2fs_verity_in_progress (inode ))
3584
+ !f2fs_verity_in_progress (inode )) {
3492
3585
f2fs_i_size_write (inode , pos + copied );
3586
+ if (f2fs_is_atomic_file (inode ))
3587
+ f2fs_i_size_write (F2FS_I (inode )-> cow_inode ,
3588
+ pos + copied );
3589
+ }
3493
3590
unlock_out :
3494
3591
f2fs_put_page (page , 1 );
3495
3592
f2fs_update_time (F2FS_I_SB (inode ), REQ_TIME );
@@ -3522,9 +3619,6 @@ void f2fs_invalidate_folio(struct folio *folio, size_t offset, size_t length)
3522
3619
inode -> i_ino == F2FS_COMPRESS_INO (sbi ))
3523
3620
clear_page_private_data (& folio -> page );
3524
3621
3525
- if (page_private_atomic (& folio -> page ))
3526
- return f2fs_drop_inmem_page (inode , & folio -> page );
3527
-
3528
3622
folio_detach_private (folio );
3529
3623
}
3530
3624
@@ -3534,10 +3628,6 @@ int f2fs_release_page(struct page *page, gfp_t wait)
3534
3628
if (PageDirty (page ))
3535
3629
return 0 ;
3536
3630
3537
- /* This is atomic written page, keep Private */
3538
- if (page_private_atomic (page ))
3539
- return 0 ;
3540
-
3541
3631
if (test_opt (F2FS_P_SB (page ), COMPRESS_CACHE )) {
3542
3632
struct inode * inode = page -> mapping -> host ;
3543
3633
@@ -3563,18 +3653,6 @@ static bool f2fs_dirty_data_folio(struct address_space *mapping,
3563
3653
folio_mark_uptodate (folio );
3564
3654
BUG_ON (folio_test_swapcache (folio ));
3565
3655
3566
- if (f2fs_is_atomic_file (inode ) && !f2fs_is_commit_atomic_write (inode )) {
3567
- if (!page_private_atomic (& folio -> page )) {
3568
- f2fs_register_inmem_page (inode , & folio -> page );
3569
- return true;
3570
- }
3571
- /*
3572
- * Previously, this page has been registered, we just
3573
- * return here.
3574
- */
3575
- return false;
3576
- }
3577
-
3578
3656
if (!folio_test_dirty (folio )) {
3579
3657
filemap_dirty_folio (mapping , folio );
3580
3658
f2fs_update_dirty_folio (inode , folio );
@@ -3654,42 +3732,14 @@ static sector_t f2fs_bmap(struct address_space *mapping, sector_t block)
3654
3732
int f2fs_migrate_page (struct address_space * mapping ,
3655
3733
struct page * newpage , struct page * page , enum migrate_mode mode )
3656
3734
{
3657
- int rc , extra_count ;
3658
- struct f2fs_inode_info * fi = F2FS_I (mapping -> host );
3659
- bool atomic_written = page_private_atomic (page );
3735
+ int rc , extra_count = 0 ;
3660
3736
3661
3737
BUG_ON (PageWriteback (page ));
3662
3738
3663
- /* migrating an atomic written page is safe with the inmem_lock hold */
3664
- if (atomic_written ) {
3665
- if (mode != MIGRATE_SYNC )
3666
- return - EBUSY ;
3667
- if (!mutex_trylock (& fi -> inmem_lock ))
3668
- return - EAGAIN ;
3669
- }
3670
-
3671
- /* one extra reference was held for atomic_write page */
3672
- extra_count = atomic_written ? 1 : 0 ;
3673
3739
rc = migrate_page_move_mapping (mapping , newpage ,
3674
3740
page , extra_count );
3675
- if (rc != MIGRATEPAGE_SUCCESS ) {
3676
- if (atomic_written )
3677
- mutex_unlock (& fi -> inmem_lock );
3741
+ if (rc != MIGRATEPAGE_SUCCESS )
3678
3742
return rc ;
3679
- }
3680
-
3681
- if (atomic_written ) {
3682
- struct inmem_pages * cur ;
3683
-
3684
- list_for_each_entry (cur , & fi -> inmem_pages , list )
3685
- if (cur -> page == page ) {
3686
- cur -> page = newpage ;
3687
- break ;
3688
- }
3689
- mutex_unlock (& fi -> inmem_lock );
3690
- put_page (page );
3691
- get_page (newpage );
3692
- }
3693
3743
3694
3744
/* guarantee to start from no stale private field */
3695
3745
set_page_private (newpage , 0 );
0 commit comments