16
16
17
17
static DEFINE_IDA (nsim_bus_dev_ids );
18
18
static LIST_HEAD (nsim_bus_dev_list );
19
- static DEFINE_MUTEX (nsim_bus_dev_list_lock );
19
+ static DEFINE_MUTEX (nsim_bus_dev_ops_lock );
20
+ static bool enable ;
20
21
21
22
static struct nsim_bus_dev * to_nsim_bus_dev (struct device * dev )
22
23
{
@@ -99,6 +100,8 @@ new_port_store(struct device *dev, struct device_attribute *attr,
99
100
unsigned int port_index ;
100
101
int ret ;
101
102
103
+ if (!nsim_bus_dev -> init )
104
+ return - EBUSY ;
102
105
ret = kstrtouint (buf , 0 , & port_index );
103
106
if (ret )
104
107
return ret ;
@@ -116,6 +119,8 @@ del_port_store(struct device *dev, struct device_attribute *attr,
116
119
unsigned int port_index ;
117
120
int ret ;
118
121
122
+ if (!nsim_bus_dev -> init )
123
+ return - EBUSY ;
119
124
ret = kstrtouint (buf , 0 , & port_index );
120
125
if (ret )
121
126
return ret ;
@@ -179,13 +184,21 @@ new_device_store(struct bus_type *bus, const char *buf, size_t count)
179
184
pr_err ("Format for adding new device is \"id port_count\" (uint uint).\n" );
180
185
return - EINVAL ;
181
186
}
187
+ mutex_lock (& nsim_bus_dev_ops_lock );
188
+ if (!enable ) {
189
+ mutex_unlock (& nsim_bus_dev_ops_lock );
190
+ return - EBUSY ;
191
+ }
182
192
nsim_bus_dev = nsim_bus_dev_new (id , port_count );
183
- if (IS_ERR (nsim_bus_dev ))
193
+ if (IS_ERR (nsim_bus_dev )) {
194
+ mutex_unlock (& nsim_bus_dev_ops_lock );
184
195
return PTR_ERR (nsim_bus_dev );
196
+ }
197
+
198
+ nsim_bus_dev -> init = true;
185
199
186
- mutex_lock (& nsim_bus_dev_list_lock );
187
200
list_add_tail (& nsim_bus_dev -> list , & nsim_bus_dev_list );
188
- mutex_unlock (& nsim_bus_dev_list_lock );
201
+ mutex_unlock (& nsim_bus_dev_ops_lock );
189
202
190
203
return count ;
191
204
}
@@ -214,7 +227,11 @@ del_device_store(struct bus_type *bus, const char *buf, size_t count)
214
227
}
215
228
216
229
err = - ENOENT ;
217
- mutex_lock (& nsim_bus_dev_list_lock );
230
+ mutex_lock (& nsim_bus_dev_ops_lock );
231
+ if (!enable ) {
232
+ mutex_unlock (& nsim_bus_dev_ops_lock );
233
+ return - EBUSY ;
234
+ }
218
235
list_for_each_entry_safe (nsim_bus_dev , tmp , & nsim_bus_dev_list , list ) {
219
236
if (nsim_bus_dev -> dev .id != id )
220
237
continue ;
@@ -223,7 +240,7 @@ del_device_store(struct bus_type *bus, const char *buf, size_t count)
223
240
err = 0 ;
224
241
break ;
225
242
}
226
- mutex_unlock (& nsim_bus_dev_list_lock );
243
+ mutex_unlock (& nsim_bus_dev_ops_lock );
227
244
return !err ? count : err ;
228
245
}
229
246
static BUS_ATTR_WO (del_device );
@@ -320,6 +337,7 @@ int nsim_bus_init(void)
320
337
err = driver_register (& nsim_driver );
321
338
if (err )
322
339
goto err_bus_unregister ;
340
+ enable = true;
323
341
return 0 ;
324
342
325
343
err_bus_unregister :
@@ -331,12 +349,13 @@ void nsim_bus_exit(void)
331
349
{
332
350
struct nsim_bus_dev * nsim_bus_dev , * tmp ;
333
351
334
- mutex_lock (& nsim_bus_dev_list_lock );
352
+ mutex_lock (& nsim_bus_dev_ops_lock );
353
+ enable = false;
335
354
list_for_each_entry_safe (nsim_bus_dev , tmp , & nsim_bus_dev_list , list ) {
336
355
list_del (& nsim_bus_dev -> list );
337
356
nsim_bus_dev_del (nsim_bus_dev );
338
357
}
339
- mutex_unlock (& nsim_bus_dev_list_lock );
358
+ mutex_unlock (& nsim_bus_dev_ops_lock );
340
359
driver_unregister (& nsim_driver );
341
360
bus_unregister (& nsim_bus );
342
361
}
0 commit comments