diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-02-28 13:21:57 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-02-28 13:21:57 -0500 |
commit | a015d33c98e67e984718ac2a0063a051e30ec548 (patch) | |
tree | 374d42ecb0626c18f07475b27d34743b6ffd4978 | |
parent | 2aaeb784bf3af6afe4084199dba9fcfb57ce5acc (diff) | |
parent | f0774d884bad7007b54cfffb5c93c23420c75aa6 (diff) |
Merge branch 'for-linus' of git://git.kernel.dk/linux-block
Pull block layer fixes from Jens Axboe:
"Two smaller fixes for this cycle:
- A fixup from Keith so that NVMe compiles without BLK_INTEGRITY,
basically just moving the code around appropriately.
- A fixup for shm, fixing an oops in shmem_mapping() for mapping with
no inode. From Sasha"
[ The shmem fix doesn't look block-layer-related, but fixes a bug that
happened due to the backing_dev_info removal.. - Linus ]
* 'for-linus' of git://git.kernel.dk/linux-block:
mm: shmem: check for mapping owner before dereferencing
NVMe: Fix for BLK_DEV_INTEGRITY not set
-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 | ||