@@ -2929,7 +2929,7 @@ int nvme_get_log(struct nvme_ctrl *ctrl, u32 nsid, u8 log_page, u8 lsp, u8 csi,
29292929static int nvme_get_effects_log (struct nvme_ctrl * ctrl , u8 csi ,
29302930 struct nvme_effects_log * * log )
29312931{
2932- struct nvme_cel * cel = xa_load (& ctrl -> cels , csi );
2932+ struct nvme_effects_log * cel = xa_load (& ctrl -> cels , csi );
29332933 int ret ;
29342934
29352935 if (cel )
@@ -2940,16 +2940,15 @@ static int nvme_get_effects_log(struct nvme_ctrl *ctrl, u8 csi,
29402940 return - ENOMEM ;
29412941
29422942 ret = nvme_get_log (ctrl , 0x00 , NVME_LOG_CMD_EFFECTS , 0 , csi ,
2943- & cel -> log , sizeof (cel -> log ), 0 );
2943+ cel , sizeof (* cel ), 0 );
29442944 if (ret ) {
29452945 kfree (cel );
29462946 return ret ;
29472947 }
29482948
2949- cel -> csi = csi ;
2950- xa_store (& ctrl -> cels , cel -> csi , cel , GFP_KERNEL );
2949+ xa_store (& ctrl -> cels , csi , cel , GFP_KERNEL );
29512950out :
2952- * log = & cel -> log ;
2951+ * log = cel ;
29532952 return 0 ;
29542953}
29552954
@@ -4374,6 +4373,19 @@ void nvme_uninit_ctrl(struct nvme_ctrl *ctrl)
43744373}
43754374EXPORT_SYMBOL_GPL (nvme_uninit_ctrl );
43764375
4376+ static void nvme_free_cels (struct nvme_ctrl * ctrl )
4377+ {
4378+ struct nvme_effects_log * cel ;
4379+ unsigned long i ;
4380+
4381+ xa_for_each (& ctrl -> cels , i , cel ) {
4382+ xa_erase (& ctrl -> cels , i );
4383+ kfree (cel );
4384+ }
4385+
4386+ xa_destroy (& ctrl -> cels );
4387+ }
4388+
43774389static void nvme_free_ctrl (struct device * dev )
43784390{
43794391 struct nvme_ctrl * ctrl =
@@ -4383,8 +4395,7 @@ static void nvme_free_ctrl(struct device *dev)
43834395 if (!subsys || ctrl -> instance != subsys -> instance )
43844396 ida_simple_remove (& nvme_instance_ida , ctrl -> instance );
43854397
4386- xa_destroy (& ctrl -> cels );
4387-
4398+ nvme_free_cels (ctrl );
43884399 nvme_mpath_uninit (ctrl );
43894400 __free_page (ctrl -> discard_page );
43904401
0 commit comments