@@ -36,6 +36,7 @@ struct nvme_ns_info {
36
36
struct nvme_ns_ids ids ;
37
37
u32 nsid ;
38
38
__le32 anagrpid ;
39
+ u8 pi_offset ;
39
40
bool is_shared ;
40
41
bool is_readonly ;
41
42
bool is_ready ;
@@ -1757,8 +1758,8 @@ int nvme_getgeo(struct block_device *bdev, struct hd_geometry *geo)
1757
1758
return 0 ;
1758
1759
}
1759
1760
1760
- static bool nvme_init_integrity (struct gendisk * disk , struct nvme_ns_head * head ,
1761
- struct queue_limits * lim )
1761
+ static bool nvme_init_integrity (struct nvme_ns_head * head ,
1762
+ struct queue_limits * lim , struct nvme_ns_info * info )
1762
1763
{
1763
1764
struct blk_integrity * bi = & lim -> integrity ;
1764
1765
@@ -1816,7 +1817,7 @@ static bool nvme_init_integrity(struct gendisk *disk, struct nvme_ns_head *head,
1816
1817
}
1817
1818
1818
1819
bi -> tuple_size = head -> ms ;
1819
- bi -> pi_offset = head -> pi_offset ;
1820
+ bi -> pi_offset = info -> pi_offset ;
1820
1821
return true;
1821
1822
}
1822
1823
@@ -1902,12 +1903,11 @@ static void nvme_configure_pi_elbas(struct nvme_ns_head *head,
1902
1903
1903
1904
static void nvme_configure_metadata (struct nvme_ctrl * ctrl ,
1904
1905
struct nvme_ns_head * head , struct nvme_id_ns * id ,
1905
- struct nvme_id_ns_nvm * nvm )
1906
+ struct nvme_id_ns_nvm * nvm , struct nvme_ns_info * info )
1906
1907
{
1907
1908
head -> features &= ~(NVME_NS_METADATA_SUPPORTED | NVME_NS_EXT_LBAS );
1908
1909
head -> pi_type = 0 ;
1909
1910
head -> pi_size = 0 ;
1910
- head -> pi_offset = 0 ;
1911
1911
head -> ms = le16_to_cpu (id -> lbaf [nvme_lbaf_index (id -> flbas )].ms );
1912
1912
if (!head -> ms || !(ctrl -> ops -> flags & NVME_F_METADATA_SUPPORTED ))
1913
1913
return ;
@@ -1922,7 +1922,7 @@ static void nvme_configure_metadata(struct nvme_ctrl *ctrl,
1922
1922
if (head -> pi_size && head -> ms >= head -> pi_size )
1923
1923
head -> pi_type = id -> dps & NVME_NS_DPS_PI_MASK ;
1924
1924
if (!(id -> dps & NVME_NS_DPS_PI_FIRST ))
1925
- head -> pi_offset = head -> ms - head -> pi_size ;
1925
+ info -> pi_offset = head -> ms - head -> pi_size ;
1926
1926
1927
1927
if (ctrl -> ops -> flags & NVME_F_FABRICS ) {
1928
1928
/*
@@ -2156,7 +2156,7 @@ static int nvme_update_ns_info_block(struct nvme_ns *ns,
2156
2156
2157
2157
lim = queue_limits_start_update (ns -> disk -> queue );
2158
2158
nvme_set_ctrl_limits (ns -> ctrl , & lim );
2159
- nvme_configure_metadata (ns -> ctrl , ns -> head , id , nvm );
2159
+ nvme_configure_metadata (ns -> ctrl , ns -> head , id , nvm , info );
2160
2160
nvme_set_chunk_sectors (ns , id , & lim );
2161
2161
if (!nvme_update_disk_info (ns , id , & lim ))
2162
2162
capacity = 0 ;
@@ -2176,7 +2176,7 @@ static int nvme_update_ns_info_block(struct nvme_ns *ns,
2176
2176
* I/O to namespaces with metadata except when the namespace supports
2177
2177
* PI, as it can strip/insert in that case.
2178
2178
*/
2179
- if (!nvme_init_integrity (ns -> disk , ns -> head , & lim ))
2179
+ if (!nvme_init_integrity (ns -> head , & lim , info ))
2180
2180
capacity = 0 ;
2181
2181
2182
2182
ret = queue_limits_commit_update (ns -> disk -> queue , & lim );
@@ -2280,7 +2280,7 @@ static int nvme_update_ns_info(struct nvme_ns *ns, struct nvme_ns_info *info)
2280
2280
if (unsupported )
2281
2281
ns -> head -> disk -> flags |= GENHD_FL_HIDDEN ;
2282
2282
else
2283
- nvme_init_integrity (ns -> head -> disk , ns -> head , & lim );
2283
+ nvme_init_integrity (ns -> head , & lim , info );
2284
2284
ret = queue_limits_commit_update (ns -> head -> disk -> queue , & lim );
2285
2285
2286
2286
set_capacity_and_notify (ns -> head -> disk , get_capacity (ns -> disk ));
0 commit comments