diff options
| -rw-r--r-- | drivers/block/nvme-core.c | 99 | ||||
| -rw-r--r-- | mm/shmem.c | 3 |
2 files changed, 61 insertions, 41 deletions
diff --git a/drivers/block/nvme-core.c b/drivers/block/nvme-core.c index b64bccbb78c9..ceb32dd52a6c 100644 --- a/drivers/block/nvme-core.c +++ b/drivers/block/nvme-core.c | |||
| @@ -482,6 +482,7 @@ static int nvme_error_status(u16 status) | |||
| 482 | } | 482 | } |
| 483 | } | 483 | } |
| 484 | 484 | ||
| 485 | #ifdef CONFIG_BLK_DEV_INTEGRITY | ||
| 485 | static void nvme_dif_prep(u32 p, u32 v, struct t10_pi_tuple *pi) | 486 | static void nvme_dif_prep(u32 p, u32 v, struct t10_pi_tuple *pi) |
| 486 | { | 487 | { |
| 487 | if (be32_to_cpu(pi->ref_tag) == v) | 488 | if (be32_to_cpu(pi->ref_tag) == v) |
| @@ -538,6 +539,58 @@ static void nvme_dif_remap(struct request *req, | |||
| 538 | kunmap_atomic(pmap); | 539 | kunmap_atomic(pmap); |
| 539 | } | 540 | } |
| 540 | 541 | ||
| 542 | static int nvme_noop_verify(struct blk_integrity_iter *iter) | ||
| 543 | { | ||
| 544 | return 0; | ||
| 545 | } | ||
| 546 | |||
| 547 | static int nvme_noop_generate(struct blk_integrity_iter *iter) | ||
| 548 | { | ||
| 549 | return 0; | ||
| 550 | } | ||
| 551 | |||
| 552 | struct blk_integrity nvme_meta_noop = { | ||
| 553 | .name = "NVME_META_NOOP", | ||
| 554 | .generate_fn = nvme_noop_generate, | ||
| 555 | .verify_fn = nvme_noop_verify, | ||
| 556 | }; | ||
| 557 | |||
| 558 | static void nvme_init_integrity(struct nvme_ns *ns) | ||
| 559 | { | ||
| 560 | struct blk_integrity integrity; | ||
| 561 | |||
| 562 | switch (ns->pi_type) { | ||
| 563 | case NVME_NS_DPS_PI_TYPE3: | ||
| 564 | integrity = t10_pi_type3_crc; | ||
| 565 | break; | ||
| 566 | case NVME_NS_DPS_PI_TYPE1: | ||
| 567 | case NVME_NS_DPS_PI_TYPE2: | ||
| 568 | integrity = t10_pi_type1_crc; | ||
| 569 | break; | ||
| 570 | default: | ||
| 571 | integrity = nvme_meta_noop; | ||
| 572 | break; | ||
| 573 | } | ||
| 574 | integrity.tuple_size = ns->ms; | ||
| 575 | blk_integrity_register(ns->disk, &integrity); | ||
| 576 | blk_queue_max_integrity_segments(ns->queue, 1); | ||
| 577 | } | ||
| 578 | #else /* CONFIG_BLK_DEV_INTEGRITY */ | ||
| 579 | static void nvme_dif_remap(struct request *req, | ||
| 580 | void (*dif_swap)(u32 p, u32 v, struct t10_pi_tuple *pi)) | ||
| 581 | { | ||
| 582 | } | ||
| 583 | static void nvme_dif_prep(u32 p, u32 v, struct t10_pi_tuple *pi) | ||
| 584 | { | ||
| 585 | } | ||
| 586 | static void nvme_dif_complete(u32 p, u32 v, struct t10_pi_tuple *pi) | ||
| 587 | { | ||
| 588 | } | ||
| 589 | static void nvme_init_integrity(struct nvme_ns *ns) | ||
| 590 | { | ||
| 591 | } | ||
| 592 | #endif | ||
| 593 | |||
| 541 | static void req_completion(struct nvme_queue *nvmeq, void *ctx, | 594 | static void req_completion(struct nvme_queue *nvmeq, void *ctx, |
| 542 | struct nvme_completion *cqe) | 595 | struct nvme_completion *cqe) |
| 543 | { | 596 | { |
| @@ -1959,43 +2012,6 @@ static void nvme_config_discard(struct nvme_ns *ns) | |||
| 1959 | queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, ns->queue); | 2012 | queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, ns->queue); |
| 1960 | } | 2013 | } |
| 1961 | 2014 | ||
| 1962 | static int nvme_noop_verify(struct blk_integrity_iter *iter) | ||
| 1963 | { | ||
| 1964 | return 0; | ||
| 1965 | } | ||
| 1966 | |||
| 1967 | static int nvme_noop_generate(struct blk_integrity_iter *iter) | ||
| 1968 | { | ||
| 1969 | return 0; | ||
| 1970 | } | ||
| 1971 | |||
| 1972 | struct blk_integrity nvme_meta_noop = { | ||
| 1973 | .name = "NVME_META_NOOP", | ||
| 1974 | .generate_fn = nvme_noop_generate, | ||
| 1975 | .verify_fn = nvme_noop_verify, | ||
| 1976 | }; | ||
| 1977 | |||
| 1978 | static void nvme_init_integrity(struct nvme_ns *ns) | ||
| 1979 | { | ||
| 1980 | struct blk_integrity integrity; | ||
| 1981 | |||
| 1982 | switch (ns->pi_type) { | ||
| 1983 | case NVME_NS_DPS_PI_TYPE3: | ||
| 1984 | integrity = t10_pi_type3_crc; | ||
| 1985 | break; | ||
| 1986 | case NVME_NS_DPS_PI_TYPE1: | ||
| 1987 | case NVME_NS_DPS_PI_TYPE2: | ||
| 1988 | integrity = t10_pi_type1_crc; | ||
| 1989 | break; | ||
| 1990 | default: | ||
| 1991 | integrity = nvme_meta_noop; | ||
| 1992 | break; | ||
| 1993 | } | ||
| 1994 | integrity.tuple_size = ns->ms; | ||
| 1995 | blk_integrity_register(ns->disk, &integrity); | ||
| 1996 | blk_queue_max_integrity_segments(ns->queue, 1); | ||
| 1997 | } | ||
| 1998 | |||
| 1999 | static int nvme_revalidate_disk(struct gendisk *disk) | 2015 | static int nvme_revalidate_disk(struct gendisk *disk) |
| 2000 | { | 2016 | { |
| 2001 | struct nvme_ns *ns = disk->private_data; | 2017 | struct nvme_ns *ns = disk->private_data; |
| @@ -2036,7 +2052,8 @@ static int nvme_revalidate_disk(struct gendisk *disk) | |||
| 2036 | pi_type = ns->ms == sizeof(struct t10_pi_tuple) ? | 2052 | pi_type = ns->ms == sizeof(struct t10_pi_tuple) ? |
| 2037 | id->dps & NVME_NS_DPS_PI_MASK : 0; | 2053 | id->dps & NVME_NS_DPS_PI_MASK : 0; |
| 2038 | 2054 | ||
| 2039 | if (disk->integrity && (ns->pi_type != pi_type || ns->ms != old_ms || | 2055 | if (blk_get_integrity(disk) && (ns->pi_type != pi_type || |
| 2056 | ns->ms != old_ms || | ||
| 2040 | bs != queue_logical_block_size(disk->queue) || | 2057 | bs != queue_logical_block_size(disk->queue) || |
| 2041 | (ns->ms && id->flbas & NVME_NS_FLBAS_META_EXT))) | 2058 | (ns->ms && id->flbas & NVME_NS_FLBAS_META_EXT))) |
| 2042 | blk_integrity_unregister(disk); | 2059 | blk_integrity_unregister(disk); |
| @@ -2044,11 +2061,11 @@ static int nvme_revalidate_disk(struct gendisk *disk) | |||
| 2044 | ns->pi_type = pi_type; | 2061 | ns->pi_type = pi_type; |
| 2045 | blk_queue_logical_block_size(ns->queue, bs); | 2062 | blk_queue_logical_block_size(ns->queue, bs); |
| 2046 | 2063 | ||
| 2047 | if (ns->ms && !disk->integrity && (disk->flags & GENHD_FL_UP) && | 2064 | if (ns->ms && !blk_get_integrity(disk) && (disk->flags & GENHD_FL_UP) && |
| 2048 | !(id->flbas & NVME_NS_FLBAS_META_EXT)) | 2065 | !(id->flbas & NVME_NS_FLBAS_META_EXT)) |
| 2049 | nvme_init_integrity(ns); | 2066 | nvme_init_integrity(ns); |
| 2050 | 2067 | ||
| 2051 | if (id->ncap == 0 || (ns->ms && !disk->integrity)) | 2068 | if (id->ncap == 0 || (ns->ms && !blk_get_integrity(disk))) |
| 2052 | set_capacity(disk, 0); | 2069 | set_capacity(disk, 0); |
| 2053 | else | 2070 | else |
| 2054 | set_capacity(disk, le64_to_cpup(&id->nsze) << (ns->lba_shift - 9)); | 2071 | set_capacity(disk, le64_to_cpup(&id->nsze) << (ns->lba_shift - 9)); |
| @@ -2652,7 +2669,7 @@ static void nvme_dev_remove(struct nvme_dev *dev) | |||
| 2652 | 2669 | ||
| 2653 | list_for_each_entry(ns, &dev->namespaces, list) { | 2670 | list_for_each_entry(ns, &dev->namespaces, list) { |
| 2654 | if (ns->disk->flags & GENHD_FL_UP) { | 2671 | if (ns->disk->flags & GENHD_FL_UP) { |
| 2655 | if (ns->disk->integrity) | 2672 | if (blk_get_integrity(ns->disk)) |
| 2656 | blk_integrity_unregister(ns->disk); | 2673 | blk_integrity_unregister(ns->disk); |
| 2657 | del_gendisk(ns->disk); | 2674 | del_gendisk(ns->disk); |
| 2658 | } | 2675 | } |
diff --git a/mm/shmem.c b/mm/shmem.c index 2f17cb5f00a4..cf2d0ca010bc 100644 --- a/mm/shmem.c +++ b/mm/shmem.c | |||
| @@ -1455,6 +1455,9 @@ static struct inode *shmem_get_inode(struct super_block *sb, const struct inode | |||
| 1455 | 1455 | ||
| 1456 | bool shmem_mapping(struct address_space *mapping) | 1456 | bool shmem_mapping(struct address_space *mapping) |
| 1457 | { | 1457 | { |
| 1458 | if (!mapping->host) | ||
| 1459 | return false; | ||
| 1460 | |||
| 1458 | return mapping->host->i_sb->s_op == &shmem_ops; | 1461 | return mapping->host->i_sb->s_op == &shmem_ops; |
| 1459 | } | 1462 | } |
| 1460 | 1463 | ||
