.. | .. |
---|
1434 | 1434 | blkdev_put(FDEV(i).bdev, FMODE_EXCL); |
---|
1435 | 1435 | #ifdef CONFIG_BLK_DEV_ZONED |
---|
1436 | 1436 | kvfree(FDEV(i).blkz_seq); |
---|
1437 | | - kfree(FDEV(i).zone_capacity_blocks); |
---|
1438 | 1437 | #endif |
---|
1439 | 1438 | } |
---|
1440 | 1439 | kvfree(sbi->devs); |
---|
.. | .. |
---|
1932 | 1931 | return 0; |
---|
1933 | 1932 | } |
---|
1934 | 1933 | |
---|
1935 | | -static void default_options(struct f2fs_sb_info *sbi) |
---|
| 1934 | +static void default_options(struct f2fs_sb_info *sbi, bool remount) |
---|
1936 | 1935 | { |
---|
1937 | 1936 | /* 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 | + |
---|
1938 | 1945 | if (f2fs_sb_has_readonly(sbi)) |
---|
1939 | 1946 | F2FS_OPTION(sbi).active_logs = NR_CURSEG_RO_TYPE; |
---|
1940 | 1947 | else |
---|
.. | .. |
---|
1958 | 1965 | set_opt(sbi, INLINE_XATTR); |
---|
1959 | 1966 | set_opt(sbi, INLINE_DATA); |
---|
1960 | 1967 | set_opt(sbi, INLINE_DENTRY); |
---|
1961 | | - set_opt(sbi, READ_EXTENT_CACHE); |
---|
1962 | 1968 | set_opt(sbi, NOHEAP); |
---|
1963 | | - clear_opt(sbi, DISABLE_CHECKPOINT); |
---|
1964 | 1969 | set_opt(sbi, MERGE_CHECKPOINT); |
---|
1965 | 1970 | F2FS_OPTION(sbi).unusable_cap = 0; |
---|
1966 | 1971 | sbi->sb->s_flags |= SB_LAZYTIME; |
---|
1967 | 1972 | set_opt(sbi, FLUSH_MERGE); |
---|
1968 | | - set_opt(sbi, DISCARD); |
---|
1969 | 1973 | if (f2fs_sb_has_blkzoned(sbi)) |
---|
1970 | 1974 | F2FS_OPTION(sbi).fs_mode = FS_MODE_LFS; |
---|
1971 | 1975 | else |
---|
.. | .. |
---|
1999 | 2003 | } |
---|
2000 | 2004 | sbi->sb->s_flags |= SB_ACTIVE; |
---|
2001 | 2005 | |
---|
| 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 | + |
---|
2002 | 2011 | f2fs_update_time(sbi, DISABLE_TIME); |
---|
2003 | 2012 | |
---|
2004 | 2013 | while (!f2fs_time_over(sbi, DISABLE_TIME)) { |
---|
.. | .. |
---|
2024 | 2033 | goto restore_flag; |
---|
2025 | 2034 | } |
---|
2026 | 2035 | |
---|
| 2036 | +skip_gc: |
---|
2027 | 2037 | f2fs_down_write(&sbi->gc_lock); |
---|
2028 | 2038 | cpc.reason = CP_PAUSE; |
---|
2029 | 2039 | set_sbi_flag(sbi, SBI_CP_DISABLED); |
---|
.. | .. |
---|
2123 | 2133 | clear_sbi_flag(sbi, SBI_NEED_SB_WRITE); |
---|
2124 | 2134 | } |
---|
2125 | 2135 | |
---|
2126 | | - default_options(sbi); |
---|
| 2136 | + default_options(sbi, true); |
---|
2127 | 2137 | |
---|
2128 | 2138 | /* parse mount options */ |
---|
2129 | 2139 | err = parse_options(sb, data, true); |
---|
.. | .. |
---|
2333 | 2343 | size_t toread; |
---|
2334 | 2344 | loff_t i_size = i_size_read(inode); |
---|
2335 | 2345 | struct page *page; |
---|
2336 | | - char *kaddr; |
---|
2337 | 2346 | |
---|
2338 | 2347 | if (off > i_size) |
---|
2339 | 2348 | return 0; |
---|
.. | .. |
---|
2367 | 2376 | return -EIO; |
---|
2368 | 2377 | } |
---|
2369 | 2378 | |
---|
2370 | | - kaddr = kmap_atomic(page); |
---|
2371 | | - memcpy(data, kaddr + offset, tocopy); |
---|
2372 | | - kunmap_atomic(kaddr); |
---|
| 2379 | + memcpy_from_page(data, page, offset, tocopy); |
---|
2373 | 2380 | f2fs_put_page(page, 1); |
---|
2374 | 2381 | |
---|
2375 | 2382 | offset = 0; |
---|
.. | .. |
---|
2391 | 2398 | size_t towrite = len; |
---|
2392 | 2399 | struct page *page; |
---|
2393 | 2400 | void *fsdata = NULL; |
---|
2394 | | - char *kaddr; |
---|
2395 | 2401 | int err = 0; |
---|
2396 | 2402 | int tocopy; |
---|
2397 | 2403 | |
---|
.. | .. |
---|
2411 | 2417 | break; |
---|
2412 | 2418 | } |
---|
2413 | 2419 | |
---|
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); |
---|
2418 | 2421 | |
---|
2419 | 2422 | a_ops->write_end(NULL, mapping, off, tocopy, tocopy, |
---|
2420 | 2423 | page, fsdata); |
---|
.. | .. |
---|
3513 | 3516 | #ifdef CONFIG_BLK_DEV_ZONED |
---|
3514 | 3517 | |
---|
3515 | 3518 | struct f2fs_report_zones_args { |
---|
| 3519 | + struct f2fs_sb_info *sbi; |
---|
3516 | 3520 | struct f2fs_dev_info *dev; |
---|
3517 | | - bool zone_cap_mismatch; |
---|
3518 | 3521 | }; |
---|
3519 | 3522 | |
---|
3520 | 3523 | static int f2fs_report_zone_cb(struct blk_zone *zone, unsigned int idx, |
---|
3521 | 3524 | void *data) |
---|
3522 | 3525 | { |
---|
3523 | 3526 | struct f2fs_report_zones_args *rz_args = data; |
---|
| 3527 | + block_t unusable_blocks = (zone->len - zone->capacity) >> |
---|
| 3528 | + F2FS_LOG_SECTORS_PER_BLOCK; |
---|
3524 | 3529 | |
---|
3525 | 3530 | if (zone->type == BLK_ZONE_TYPE_CONVENTIONAL) |
---|
3526 | 3531 | return 0; |
---|
3527 | 3532 | |
---|
3528 | 3533 | 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 | + } |
---|
3534 | 3542 | return 0; |
---|
3535 | 3543 | } |
---|
3536 | 3544 | |
---|
.. | .. |
---|
3564 | 3572 | if (!FDEV(devi).blkz_seq) |
---|
3565 | 3573 | return -ENOMEM; |
---|
3566 | 3574 | |
---|
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; |
---|
3574 | 3576 | rep_zone_arg.dev = &FDEV(devi); |
---|
3575 | | - rep_zone_arg.zone_cap_mismatch = false; |
---|
3576 | 3577 | |
---|
3577 | 3578 | ret = blkdev_report_zones(bdev, 0, BLK_ALL_ZONES, f2fs_report_zone_cb, |
---|
3578 | 3579 | &rep_zone_arg); |
---|
3579 | 3580 | if (ret < 0) |
---|
3580 | 3581 | 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 | | - |
---|
3587 | 3582 | return 0; |
---|
3588 | 3583 | } |
---|
3589 | 3584 | #endif |
---|
.. | .. |
---|
3905 | 3900 | sbi->s_chksum_seed = f2fs_chksum(sbi, ~0, raw_super->uuid, |
---|
3906 | 3901 | sizeof(raw_super->uuid)); |
---|
3907 | 3902 | |
---|
3908 | | - default_options(sbi); |
---|
| 3903 | + default_options(sbi, false); |
---|
3909 | 3904 | /* parse mount options */ |
---|
3910 | 3905 | options = kstrdup((const char *)data, GFP_KERNEL); |
---|
3911 | 3906 | if (data && !options) { |
---|