@@ -110,7 +110,7 @@ struct workqueue_struct *nvme_delete_wq;
110
110
EXPORT_SYMBOL_GPL (nvme_delete_wq );
111
111
112
112
static LIST_HEAD (nvme_subsystems );
113
- static DEFINE_MUTEX (nvme_subsystems_lock );
113
+ DEFINE_MUTEX (nvme_subsystems_lock );
114
114
115
115
static DEFINE_IDA (nvme_instance_ida );
116
116
static dev_t nvme_ctrl_base_chr_devt ;
@@ -261,7 +261,7 @@ void nvme_delete_ctrl_sync(struct nvme_ctrl *ctrl)
261
261
262
262
static blk_status_t nvme_error_status (u16 status )
263
263
{
264
- switch (status & 0x7ff ) {
264
+ switch (status & NVME_SCT_SC_MASK ) {
265
265
case NVME_SC_SUCCESS :
266
266
return BLK_STS_OK ;
267
267
case NVME_SC_CAP_EXCEEDED :
@@ -307,7 +307,7 @@ static void nvme_retry_req(struct request *req)
307
307
u16 crd ;
308
308
309
309
/* The mask and shift result must be <= 3 */
310
- crd = (nvme_req (req )-> status & NVME_SC_CRD ) >> 11 ;
310
+ crd = (nvme_req (req )-> status & NVME_STATUS_CRD ) >> 11 ;
311
311
if (crd )
312
312
delay = nvme_req (req )-> ctrl -> crdt [crd - 1 ] * 100 ;
313
313
@@ -329,10 +329,10 @@ static void nvme_log_error(struct request *req)
329
329
nvme_sect_to_lba (ns -> head , blk_rq_pos (req )),
330
330
blk_rq_bytes (req ) >> ns -> head -> lba_shift ,
331
331
nvme_get_error_status_str (nr -> status ),
332
- nr -> status >> 8 & 7 , /* Status Code Type */
333
- nr -> status & 0xff , /* Status Code */
334
- nr -> status & NVME_SC_MORE ? "MORE " : "" ,
335
- nr -> status & NVME_SC_DNR ? "DNR " : "" );
332
+ NVME_SCT ( nr -> status ), /* Status Code Type */
333
+ nr -> status & NVME_SC_MASK , /* Status Code */
334
+ nr -> status & NVME_STATUS_MORE ? "MORE " : "" ,
335
+ nr -> status & NVME_STATUS_DNR ? "DNR " : "" );
336
336
return ;
337
337
}
338
338
@@ -341,10 +341,10 @@ static void nvme_log_error(struct request *req)
341
341
nvme_get_admin_opcode_str (nr -> cmd -> common .opcode ),
342
342
nr -> cmd -> common .opcode ,
343
343
nvme_get_error_status_str (nr -> status ),
344
- nr -> status >> 8 & 7 , /* Status Code Type */
345
- nr -> status & 0xff , /* Status Code */
346
- nr -> status & NVME_SC_MORE ? "MORE " : "" ,
347
- nr -> status & NVME_SC_DNR ? "DNR " : "" );
344
+ NVME_SCT ( nr -> status ) , /* Status Code Type */
345
+ nr -> status & NVME_SC_MASK , /* Status Code */
346
+ nr -> status & NVME_STATUS_MORE ? "MORE " : "" ,
347
+ nr -> status & NVME_STATUS_DNR ? "DNR " : "" );
348
348
}
349
349
350
350
static void nvme_log_err_passthru (struct request * req )
@@ -359,10 +359,10 @@ static void nvme_log_err_passthru(struct request *req)
359
359
nvme_get_admin_opcode_str (nr -> cmd -> common .opcode ),
360
360
nr -> cmd -> common .opcode ,
361
361
nvme_get_error_status_str (nr -> status ),
362
- nr -> status >> 8 & 7 , /* Status Code Type */
363
- nr -> status & 0xff , /* Status Code */
364
- nr -> status & NVME_SC_MORE ? "MORE " : "" ,
365
- nr -> status & NVME_SC_DNR ? "DNR " : "" ,
362
+ NVME_SCT ( nr -> status ), /* Status Code Type */
363
+ nr -> status & NVME_SC_MASK , /* Status Code */
364
+ nr -> status & NVME_STATUS_MORE ? "MORE " : "" ,
365
+ nr -> status & NVME_STATUS_DNR ? "DNR " : "" ,
366
366
nr -> cmd -> common .cdw10 ,
367
367
nr -> cmd -> common .cdw11 ,
368
368
nr -> cmd -> common .cdw12 ,
@@ -384,11 +384,11 @@ static inline enum nvme_disposition nvme_decide_disposition(struct request *req)
384
384
return COMPLETE ;
385
385
386
386
if (blk_noretry_request (req ) ||
387
- (nvme_req (req )-> status & NVME_SC_DNR ) ||
387
+ (nvme_req (req )-> status & NVME_STATUS_DNR ) ||
388
388
nvme_req (req )-> retries >= nvme_max_retries )
389
389
return COMPLETE ;
390
390
391
- if ((nvme_req (req )-> status & 0x7ff ) == NVME_SC_AUTH_REQUIRED )
391
+ if ((nvme_req (req )-> status & NVME_SCT_SC_MASK ) == NVME_SC_AUTH_REQUIRED )
392
392
return AUTHENTICATE ;
393
393
394
394
if (req -> cmd_flags & REQ_NVME_MPATH ) {
@@ -1256,7 +1256,7 @@ EXPORT_SYMBOL_NS_GPL(nvme_passthru_end, NVME_TARGET_PASSTHRU);
1256
1256
1257
1257
/*
1258
1258
* Recommended frequency for KATO commands per NVMe 1.4 section 7.12.1:
1259
- *
1259
+ *
1260
1260
* The host should send Keep Alive commands at half of the Keep Alive Timeout
1261
1261
* accounting for transport roundtrip times [..].
1262
1262
*/
@@ -2286,6 +2286,32 @@ static int nvme_update_ns_info(struct nvme_ns *ns, struct nvme_ns_info *info)
2286
2286
return ret ;
2287
2287
}
2288
2288
2289
+ int nvme_ns_get_unique_id (struct nvme_ns * ns , u8 id [16 ],
2290
+ enum blk_unique_id type )
2291
+ {
2292
+ struct nvme_ns_ids * ids = & ns -> head -> ids ;
2293
+
2294
+ if (type != BLK_UID_EUI64 )
2295
+ return - EINVAL ;
2296
+
2297
+ if (memchr_inv (ids -> nguid , 0 , sizeof (ids -> nguid ))) {
2298
+ memcpy (id , & ids -> nguid , sizeof (ids -> nguid ));
2299
+ return sizeof (ids -> nguid );
2300
+ }
2301
+ if (memchr_inv (ids -> eui64 , 0 , sizeof (ids -> eui64 ))) {
2302
+ memcpy (id , & ids -> eui64 , sizeof (ids -> eui64 ));
2303
+ return sizeof (ids -> eui64 );
2304
+ }
2305
+
2306
+ return - EINVAL ;
2307
+ }
2308
+
2309
+ static int nvme_get_unique_id (struct gendisk * disk , u8 id [16 ],
2310
+ enum blk_unique_id type )
2311
+ {
2312
+ return nvme_ns_get_unique_id (disk -> private_data , id , type );
2313
+ }
2314
+
2289
2315
#ifdef CONFIG_BLK_SED_OPAL
2290
2316
static int nvme_sec_submit (void * data , u16 spsp , u8 secp , void * buffer , size_t len ,
2291
2317
bool send )
@@ -2341,6 +2367,7 @@ const struct block_device_operations nvme_bdev_ops = {
2341
2367
.open = nvme_open ,
2342
2368
.release = nvme_release ,
2343
2369
.getgeo = nvme_getgeo ,
2370
+ .get_unique_id = nvme_get_unique_id ,
2344
2371
.report_zones = nvme_report_zones ,
2345
2372
.pr_ops = & nvme_pr_ops ,
2346
2373
};
@@ -3941,7 +3968,7 @@ static void nvme_ns_remove_by_nsid(struct nvme_ctrl *ctrl, u32 nsid)
3941
3968
3942
3969
static void nvme_validate_ns (struct nvme_ns * ns , struct nvme_ns_info * info )
3943
3970
{
3944
- int ret = NVME_SC_INVALID_NS | NVME_SC_DNR ;
3971
+ int ret = NVME_SC_INVALID_NS | NVME_STATUS_DNR ;
3945
3972
3946
3973
if (!nvme_ns_ids_equal (& ns -> head -> ids , & info -> ids )) {
3947
3974
dev_err (ns -> ctrl -> device ,
@@ -3957,7 +3984,7 @@ static void nvme_validate_ns(struct nvme_ns *ns, struct nvme_ns_info *info)
3957
3984
*
3958
3985
* TODO: we should probably schedule a delayed retry here.
3959
3986
*/
3960
- if (ret > 0 && (ret & NVME_SC_DNR ))
3987
+ if (ret > 0 && (ret & NVME_STATUS_DNR ))
3961
3988
nvme_ns_remove (ns );
3962
3989
}
3963
3990
@@ -4148,7 +4175,7 @@ static void nvme_scan_work(struct work_struct *work)
4148
4175
* they report) but don't actually support it.
4149
4176
*/
4150
4177
ret = nvme_scan_ns_list (ctrl );
4151
- if (ret > 0 && ret & NVME_SC_DNR )
4178
+ if (ret > 0 && ret & NVME_STATUS_DNR )
4152
4179
nvme_scan_ns_sequential (ctrl );
4153
4180
}
4154
4181
mutex_unlock (& ctrl -> scan_lock );
@@ -4668,6 +4695,9 @@ static void nvme_free_ctrl(struct device *dev)
4668
4695
* Initialize a NVMe controller structures. This needs to be called during
4669
4696
* earliest initialization so that we have the initialized structured around
4670
4697
* during probing.
4698
+ *
4699
+ * On success, the caller must use the nvme_put_ctrl() to release this when
4700
+ * needed, which also invokes the ops->free_ctrl() callback.
4671
4701
*/
4672
4702
int nvme_init_ctrl (struct nvme_ctrl * ctrl , struct device * dev ,
4673
4703
const struct nvme_ctrl_ops * ops , unsigned long quirks )
@@ -4716,6 +4746,12 @@ int nvme_init_ctrl(struct nvme_ctrl *ctrl, struct device *dev,
4716
4746
goto out ;
4717
4747
ctrl -> instance = ret ;
4718
4748
4749
+ ret = nvme_auth_init_ctrl (ctrl );
4750
+ if (ret )
4751
+ goto out_release_instance ;
4752
+
4753
+ nvme_mpath_init_ctrl (ctrl );
4754
+
4719
4755
device_initialize (& ctrl -> ctrl_device );
4720
4756
ctrl -> device = & ctrl -> ctrl_device ;
4721
4757
ctrl -> device -> devt = MKDEV (MAJOR (nvme_ctrl_base_chr_devt ),
@@ -4728,16 +4764,36 @@ int nvme_init_ctrl(struct nvme_ctrl *ctrl, struct device *dev,
4728
4764
ctrl -> device -> groups = nvme_dev_attr_groups ;
4729
4765
ctrl -> device -> release = nvme_free_ctrl ;
4730
4766
dev_set_drvdata (ctrl -> device , ctrl );
4767
+
4768
+ return ret ;
4769
+
4770
+ out_release_instance :
4771
+ ida_free (& nvme_instance_ida , ctrl -> instance );
4772
+ out :
4773
+ if (ctrl -> discard_page )
4774
+ __free_page (ctrl -> discard_page );
4775
+ cleanup_srcu_struct (& ctrl -> srcu );
4776
+ return ret ;
4777
+ }
4778
+ EXPORT_SYMBOL_GPL (nvme_init_ctrl );
4779
+
4780
+ /*
4781
+ * On success, returns with an elevated controller reference and caller must
4782
+ * use nvme_uninit_ctrl() to properly free resources associated with the ctrl.
4783
+ */
4784
+ int nvme_add_ctrl (struct nvme_ctrl * ctrl )
4785
+ {
4786
+ int ret ;
4787
+
4731
4788
ret = dev_set_name (ctrl -> device , "nvme%d" , ctrl -> instance );
4732
4789
if (ret )
4733
- goto out_release_instance ;
4790
+ return ret ;
4734
4791
4735
- nvme_get_ctrl (ctrl );
4736
4792
cdev_init (& ctrl -> cdev , & nvme_dev_fops );
4737
- ctrl -> cdev .owner = ops -> module ;
4793
+ ctrl -> cdev .owner = ctrl -> ops -> module ;
4738
4794
ret = cdev_device_add (& ctrl -> cdev , ctrl -> device );
4739
4795
if (ret )
4740
- goto out_free_name ;
4796
+ return ret ;
4741
4797
4742
4798
/*
4743
4799
* Initialize latency tolerance controls. The sysfs files won't
@@ -4748,28 +4804,11 @@ int nvme_init_ctrl(struct nvme_ctrl *ctrl, struct device *dev,
4748
4804
min (default_ps_max_latency_us , (unsigned long )S32_MAX ));
4749
4805
4750
4806
nvme_fault_inject_init (& ctrl -> fault_inject , dev_name (ctrl -> device ));
4751
- nvme_mpath_init_ctrl (ctrl );
4752
- ret = nvme_auth_init_ctrl (ctrl );
4753
- if (ret )
4754
- goto out_free_cdev ;
4807
+ nvme_get_ctrl (ctrl );
4755
4808
4756
4809
return 0 ;
4757
- out_free_cdev :
4758
- nvme_fault_inject_fini (& ctrl -> fault_inject );
4759
- dev_pm_qos_hide_latency_tolerance (ctrl -> device );
4760
- cdev_device_del (& ctrl -> cdev , ctrl -> device );
4761
- out_free_name :
4762
- nvme_put_ctrl (ctrl );
4763
- kfree_const (ctrl -> device -> kobj .name );
4764
- out_release_instance :
4765
- ida_free (& nvme_instance_ida , ctrl -> instance );
4766
- out :
4767
- if (ctrl -> discard_page )
4768
- __free_page (ctrl -> discard_page );
4769
- cleanup_srcu_struct (& ctrl -> srcu );
4770
- return ret ;
4771
4810
}
4772
- EXPORT_SYMBOL_GPL (nvme_init_ctrl );
4811
+ EXPORT_SYMBOL_GPL (nvme_add_ctrl );
4773
4812
4774
4813
/* let I/O to all namespaces fail in preparation for surprise removal */
4775
4814
void nvme_mark_namespaces_dead (struct nvme_ctrl * ctrl )
0 commit comments