| .. | .. |
|---|
| 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) { |
|---|