hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/fs/f2fs/super.c
....@@ -1434,7 +1434,6 @@
14341434 blkdev_put(FDEV(i).bdev, FMODE_EXCL);
14351435 #ifdef CONFIG_BLK_DEV_ZONED
14361436 kvfree(FDEV(i).blkz_seq);
1437
- kfree(FDEV(i).zone_capacity_blocks);
14381437 #endif
14391438 }
14401439 kvfree(sbi->devs);
....@@ -1932,9 +1931,17 @@
19321931 return 0;
19331932 }
19341933
1935
-static void default_options(struct f2fs_sb_info *sbi)
1934
+static void default_options(struct f2fs_sb_info *sbi, bool remount)
19361935 {
19371936 /* init some FS parameters */
1937
+ if (!remount) {
1938
+ set_opt(sbi, READ_EXTENT_CACHE);
1939
+ clear_opt(sbi, DISABLE_CHECKPOINT);
1940
+
1941
+ if (f2fs_hw_support_discard(sbi) || f2fs_hw_should_discard(sbi))
1942
+ set_opt(sbi, DISCARD);
1943
+ }
1944
+
19381945 if (f2fs_sb_has_readonly(sbi))
19391946 F2FS_OPTION(sbi).active_logs = NR_CURSEG_RO_TYPE;
19401947 else
....@@ -1958,14 +1965,11 @@
19581965 set_opt(sbi, INLINE_XATTR);
19591966 set_opt(sbi, INLINE_DATA);
19601967 set_opt(sbi, INLINE_DENTRY);
1961
- set_opt(sbi, READ_EXTENT_CACHE);
19621968 set_opt(sbi, NOHEAP);
1963
- clear_opt(sbi, DISABLE_CHECKPOINT);
19641969 set_opt(sbi, MERGE_CHECKPOINT);
19651970 F2FS_OPTION(sbi).unusable_cap = 0;
19661971 sbi->sb->s_flags |= SB_LAZYTIME;
19671972 set_opt(sbi, FLUSH_MERGE);
1968
- set_opt(sbi, DISCARD);
19691973 if (f2fs_sb_has_blkzoned(sbi))
19701974 F2FS_OPTION(sbi).fs_mode = FS_MODE_LFS;
19711975 else
....@@ -1999,6 +2003,11 @@
19992003 }
20002004 sbi->sb->s_flags |= SB_ACTIVE;
20012005
2006
+ /* check if we need more GC first */
2007
+ unusable = f2fs_get_unusable_blocks(sbi);
2008
+ if (!f2fs_disable_cp_again(sbi, unusable))
2009
+ goto skip_gc;
2010
+
20022011 f2fs_update_time(sbi, DISABLE_TIME);
20032012
20042013 while (!f2fs_time_over(sbi, DISABLE_TIME)) {
....@@ -2024,6 +2033,7 @@
20242033 goto restore_flag;
20252034 }
20262035
2036
+skip_gc:
20272037 f2fs_down_write(&sbi->gc_lock);
20282038 cpc.reason = CP_PAUSE;
20292039 set_sbi_flag(sbi, SBI_CP_DISABLED);
....@@ -2123,7 +2133,7 @@
21232133 clear_sbi_flag(sbi, SBI_NEED_SB_WRITE);
21242134 }
21252135
2126
- default_options(sbi);
2136
+ default_options(sbi, true);
21272137
21282138 /* parse mount options */
21292139 err = parse_options(sb, data, true);
....@@ -2333,7 +2343,6 @@
23332343 size_t toread;
23342344 loff_t i_size = i_size_read(inode);
23352345 struct page *page;
2336
- char *kaddr;
23372346
23382347 if (off > i_size)
23392348 return 0;
....@@ -2367,9 +2376,7 @@
23672376 return -EIO;
23682377 }
23692378
2370
- kaddr = kmap_atomic(page);
2371
- memcpy(data, kaddr + offset, tocopy);
2372
- kunmap_atomic(kaddr);
2379
+ memcpy_from_page(data, page, offset, tocopy);
23732380 f2fs_put_page(page, 1);
23742381
23752382 offset = 0;
....@@ -2391,7 +2398,6 @@
23912398 size_t towrite = len;
23922399 struct page *page;
23932400 void *fsdata = NULL;
2394
- char *kaddr;
23952401 int err = 0;
23962402 int tocopy;
23972403
....@@ -2411,10 +2417,7 @@
24112417 break;
24122418 }
24132419
2414
- kaddr = kmap_atomic(page);
2415
- memcpy(kaddr + offset, data, tocopy);
2416
- kunmap_atomic(kaddr);
2417
- flush_dcache_page(page);
2420
+ memcpy_to_page(page, offset, data, tocopy);
24182421
24192422 a_ops->write_end(NULL, mapping, off, tocopy, tocopy,
24202423 page, fsdata);
....@@ -3513,24 +3516,29 @@
35133516 #ifdef CONFIG_BLK_DEV_ZONED
35143517
35153518 struct f2fs_report_zones_args {
3519
+ struct f2fs_sb_info *sbi;
35163520 struct f2fs_dev_info *dev;
3517
- bool zone_cap_mismatch;
35183521 };
35193522
35203523 static int f2fs_report_zone_cb(struct blk_zone *zone, unsigned int idx,
35213524 void *data)
35223525 {
35233526 struct f2fs_report_zones_args *rz_args = data;
3527
+ block_t unusable_blocks = (zone->len - zone->capacity) >>
3528
+ F2FS_LOG_SECTORS_PER_BLOCK;
35243529
35253530 if (zone->type == BLK_ZONE_TYPE_CONVENTIONAL)
35263531 return 0;
35273532
35283533 set_bit(idx, rz_args->dev->blkz_seq);
3529
- rz_args->dev->zone_capacity_blocks[idx] = zone->capacity >>
3530
- F2FS_LOG_SECTORS_PER_BLOCK;
3531
- if (zone->len != zone->capacity && !rz_args->zone_cap_mismatch)
3532
- rz_args->zone_cap_mismatch = true;
3533
-
3534
+ if (!rz_args->sbi->unusable_blocks_per_sec) {
3535
+ rz_args->sbi->unusable_blocks_per_sec = unusable_blocks;
3536
+ return 0;
3537
+ }
3538
+ if (rz_args->sbi->unusable_blocks_per_sec != unusable_blocks) {
3539
+ f2fs_err(rz_args->sbi, "F2FS supports single zone capacity\n");
3540
+ return -EINVAL;
3541
+ }
35343542 return 0;
35353543 }
35363544
....@@ -3564,26 +3572,13 @@
35643572 if (!FDEV(devi).blkz_seq)
35653573 return -ENOMEM;
35663574
3567
- /* Get block zones type and zone-capacity */
3568
- FDEV(devi).zone_capacity_blocks = f2fs_kzalloc(sbi,
3569
- FDEV(devi).nr_blkz * sizeof(block_t),
3570
- GFP_KERNEL);
3571
- if (!FDEV(devi).zone_capacity_blocks)
3572
- return -ENOMEM;
3573
-
3575
+ rep_zone_arg.sbi = sbi;
35743576 rep_zone_arg.dev = &FDEV(devi);
3575
- rep_zone_arg.zone_cap_mismatch = false;
35763577
35773578 ret = blkdev_report_zones(bdev, 0, BLK_ALL_ZONES, f2fs_report_zone_cb,
35783579 &rep_zone_arg);
35793580 if (ret < 0)
35803581 return ret;
3581
-
3582
- if (!rep_zone_arg.zone_cap_mismatch) {
3583
- kfree(FDEV(devi).zone_capacity_blocks);
3584
- FDEV(devi).zone_capacity_blocks = NULL;
3585
- }
3586
-
35873582 return 0;
35883583 }
35893584 #endif
....@@ -3905,7 +3900,7 @@
39053900 sbi->s_chksum_seed = f2fs_chksum(sbi, ~0, raw_super->uuid,
39063901 sizeof(raw_super->uuid));
39073902
3908
- default_options(sbi);
3903
+ default_options(sbi, false);
39093904 /* parse mount options */
39103905 options = kstrdup((const char *)data, GFP_KERNEL);
39113906 if (data && !options) {