@@ -123,6 +123,26 @@ void nvm_unregister_mgr(struct nvmm_type *mt)
123
123
}
124
124
EXPORT_SYMBOL (nvm_unregister_mgr );
125
125
126
+ /* register with device with a supported manager */
127
+ static int register_mgr (struct nvm_dev * dev )
128
+ {
129
+ struct nvmm_type * mt ;
130
+ int ret = 0 ;
131
+
132
+ list_for_each_entry (mt , & nvm_mgrs , list ) {
133
+ ret = mt -> register_mgr (dev );
134
+ if (ret > 0 ) {
135
+ dev -> mt = mt ;
136
+ break ; /* successfully initialized */
137
+ }
138
+ }
139
+
140
+ if (!ret )
141
+ pr_info ("nvm: no compatible nvm manager found.\n" );
142
+
143
+ return ret ;
144
+ }
145
+
126
146
static struct nvm_dev * nvm_find_nvm_dev (const char * name )
127
147
{
128
148
struct nvm_dev * dev ;
@@ -221,7 +241,6 @@ static void nvm_free(struct nvm_dev *dev)
221
241
222
242
static int nvm_init (struct nvm_dev * dev )
223
243
{
224
- struct nvmm_type * mt ;
225
244
int ret = - EINVAL ;
226
245
227
246
if (!dev -> q || !dev -> ops )
@@ -252,21 +271,13 @@ static int nvm_init(struct nvm_dev *dev)
252
271
goto err ;
253
272
}
254
273
255
- /* register with device with a supported manager */
256
- list_for_each_entry (mt , & nvm_mgrs , list ) {
257
- ret = mt -> register_mgr (dev );
258
- if (ret < 0 )
259
- goto err ; /* initialization failed */
260
- if (ret > 0 ) {
261
- dev -> mt = mt ;
262
- break ; /* successfully initialized */
263
- }
264
- }
265
-
266
- if (!ret ) {
267
- pr_info ("nvm: no compatible manager found.\n" );
274
+ down_write (& nvm_lock );
275
+ ret = register_mgr (dev );
276
+ up_write (& nvm_lock );
277
+ if (ret < 0 )
278
+ goto err ;
279
+ if (!ret )
268
280
return 0 ;
269
- }
270
281
271
282
pr_info ("nvm: registered %s [%u/%u/%u/%u/%u/%u]\n" ,
272
283
dev -> name , dev -> sec_per_pg , dev -> nr_planes ,
@@ -337,15 +348,17 @@ EXPORT_SYMBOL(nvm_register);
337
348
338
349
void nvm_unregister (char * disk_name )
339
350
{
340
- struct nvm_dev * dev = nvm_find_nvm_dev ( disk_name ) ;
351
+ struct nvm_dev * dev ;
341
352
353
+ down_write (& nvm_lock );
354
+ dev = nvm_find_nvm_dev (disk_name );
342
355
if (!dev ) {
343
356
pr_err ("nvm: could not find device %s to unregister\n" ,
344
357
disk_name );
358
+ up_write (& nvm_lock );
345
359
return ;
346
360
}
347
361
348
- down_write (& nvm_lock );
349
362
list_del (& dev -> devices );
350
363
up_write (& nvm_lock );
351
364
@@ -363,38 +376,30 @@ static int nvm_create_target(struct nvm_dev *dev,
363
376
{
364
377
struct nvm_ioctl_create_simple * s = & create -> conf .s ;
365
378
struct request_queue * tqueue ;
366
- struct nvmm_type * mt ;
367
379
struct gendisk * tdisk ;
368
380
struct nvm_tgt_type * tt ;
369
381
struct nvm_target * t ;
370
382
void * targetdata ;
371
383
int ret = 0 ;
372
384
385
+ down_write (& nvm_lock );
373
386
if (!dev -> mt ) {
374
- /* register with device with a supported NVM manager */
375
- list_for_each_entry (mt , & nvm_mgrs , list ) {
376
- ret = mt -> register_mgr (dev );
377
- if (ret < 0 )
378
- return ret ; /* initialization failed */
379
- if (ret > 0 ) {
380
- dev -> mt = mt ;
381
- break ; /* successfully initialized */
382
- }
383
- }
384
-
385
- if (!ret ) {
386
- pr_info ("nvm: no compatible nvm manager found.\n" );
387
- return - ENODEV ;
387
+ ret = register_mgr (dev );
388
+ if (!ret )
389
+ ret = - ENODEV ;
390
+ if (ret < 0 ) {
391
+ up_write (& nvm_lock );
392
+ return ret ;
388
393
}
389
394
}
390
395
391
396
tt = nvm_find_target_type (create -> tgttype );
392
397
if (!tt ) {
393
398
pr_err ("nvm: target type %s not found\n" , create -> tgttype );
399
+ up_write (& nvm_lock );
394
400
return - EINVAL ;
395
401
}
396
402
397
- down_write (& nvm_lock );
398
403
list_for_each_entry (t , & dev -> online_targets , list ) {
399
404
if (!strcmp (create -> tgtname , t -> disk -> disk_name )) {
400
405
pr_err ("nvm: target name already exists.\n" );
@@ -478,7 +483,9 @@ static int __nvm_configure_create(struct nvm_ioctl_create *create)
478
483
struct nvm_dev * dev ;
479
484
struct nvm_ioctl_create_simple * s ;
480
485
486
+ down_write (& nvm_lock );
481
487
dev = nvm_find_nvm_dev (create -> dev );
488
+ up_write (& nvm_lock );
482
489
if (!dev ) {
483
490
pr_err ("nvm: device not found\n" );
484
491
return - EINVAL ;
@@ -537,7 +544,9 @@ static int nvm_configure_show(const char *val)
537
544
return - EINVAL ;
538
545
}
539
546
547
+ down_write (& nvm_lock );
540
548
dev = nvm_find_nvm_dev (devname );
549
+ up_write (& nvm_lock );
541
550
if (!dev ) {
542
551
pr_err ("nvm: device not found\n" );
543
552
return - EINVAL ;
0 commit comments