hc
2024-05-10 37f49e37ab4cb5d0bc4c60eb5c6d4dd57db767bb
kernel/drivers/dax/bus.c
....@@ -398,23 +398,39 @@
398398 dev_dbg(dev, "%s\n", __func__);
399399
400400 kill_dev_dax(dev_dax);
401
- free_dev_dax_ranges(dev_dax);
402401 device_del(dev);
402
+ free_dev_dax_ranges(dev_dax);
403403 put_device(dev);
404404 }
405
+
406
+static void dax_region_free(struct kref *kref)
407
+{
408
+ struct dax_region *dax_region;
409
+
410
+ dax_region = container_of(kref, struct dax_region, kref);
411
+ kfree(dax_region);
412
+}
413
+
414
+void dax_region_put(struct dax_region *dax_region)
415
+{
416
+ kref_put(&dax_region->kref, dax_region_free);
417
+}
418
+EXPORT_SYMBOL_GPL(dax_region_put);
405419
406420 /* a return value >= 0 indicates this invocation invalidated the id */
407421 static int __free_dev_dax_id(struct dev_dax *dev_dax)
408422 {
409
- struct dax_region *dax_region = dev_dax->region;
410423 struct device *dev = &dev_dax->dev;
424
+ struct dax_region *dax_region;
411425 int rc = dev_dax->id;
412426
413427 device_lock_assert(dev);
414428
415
- if (is_static(dax_region) || dev_dax->id < 0)
429
+ if (!dev_dax->dyn_id || dev_dax->id < 0)
416430 return -1;
431
+ dax_region = dev_dax->region;
417432 ida_free(&dax_region->ida, dev_dax->id);
433
+ dax_region_put(dax_region);
418434 dev_dax->id = -1;
419435 return rc;
420436 }
....@@ -428,6 +444,20 @@
428444 rc = __free_dev_dax_id(dev_dax);
429445 device_unlock(dev);
430446 return rc;
447
+}
448
+
449
+static int alloc_dev_dax_id(struct dev_dax *dev_dax)
450
+{
451
+ struct dax_region *dax_region = dev_dax->region;
452
+ int id;
453
+
454
+ id = ida_alloc(&dax_region->ida, GFP_KERNEL);
455
+ if (id < 0)
456
+ return id;
457
+ kref_get(&dax_region->kref);
458
+ dev_dax->dyn_id = true;
459
+ dev_dax->id = id;
460
+ return id;
431461 }
432462
433463 static ssize_t delete_store(struct device *dev, struct device_attribute *attr,
....@@ -517,20 +547,6 @@
517547 NULL,
518548 };
519549
520
-static void dax_region_free(struct kref *kref)
521
-{
522
- struct dax_region *dax_region;
523
-
524
- dax_region = container_of(kref, struct dax_region, kref);
525
- kfree(dax_region);
526
-}
527
-
528
-void dax_region_put(struct dax_region *dax_region)
529
-{
530
- kref_put(&dax_region->kref, dax_region_free);
531
-}
532
-EXPORT_SYMBOL_GPL(dax_region_put);
533
-
534550 static void dax_region_unregister(void *region)
535551 {
536552 struct dax_region *dax_region = region;
....@@ -592,10 +608,12 @@
592608 static void dax_mapping_release(struct device *dev)
593609 {
594610 struct dax_mapping *mapping = to_dax_mapping(dev);
595
- struct dev_dax *dev_dax = to_dev_dax(dev->parent);
611
+ struct device *parent = dev->parent;
612
+ struct dev_dax *dev_dax = to_dev_dax(parent);
596613
597614 ida_free(&dev_dax->ida, mapping->id);
598615 kfree(mapping);
616
+ put_device(parent);
599617 }
600618
601619 static void unregister_dax_mapping(void *data)
....@@ -735,6 +753,7 @@
735753 dev = &mapping->dev;
736754 device_initialize(dev);
737755 dev->parent = &dev_dax->dev;
756
+ get_device(dev->parent);
738757 dev->type = &dax_mapping_type;
739758 dev_set_name(dev, "mapping%d", mapping->id);
740759 rc = device_add(dev);
....@@ -1267,12 +1286,10 @@
12671286 static void dev_dax_release(struct device *dev)
12681287 {
12691288 struct dev_dax *dev_dax = to_dev_dax(dev);
1270
- struct dax_region *dax_region = dev_dax->region;
12711289 struct dax_device *dax_dev = dev_dax->dax_dev;
12721290
12731291 put_dax(dax_dev);
12741292 free_dev_dax_id(dev_dax);
1275
- dax_region_put(dax_region);
12761293 kfree(dev_dax->pgmap);
12771294 kfree(dev_dax);
12781295 }
....@@ -1296,6 +1313,7 @@
12961313 if (!dev_dax)
12971314 return ERR_PTR(-ENOMEM);
12981315
1316
+ dev_dax->region = dax_region;
12991317 if (is_static(dax_region)) {
13001318 if (dev_WARN_ONCE(parent, data->id < 0,
13011319 "dynamic id specified to static region\n")) {
....@@ -1311,13 +1329,11 @@
13111329 goto err_id;
13121330 }
13131331
1314
- rc = ida_alloc(&dax_region->ida, GFP_KERNEL);
1332
+ rc = alloc_dev_dax_id(dev_dax);
13151333 if (rc < 0)
13161334 goto err_id;
1317
- dev_dax->id = rc;
13181335 }
13191336
1320
- dev_dax->region = dax_region;
13211337 dev = &dev_dax->dev;
13221338 device_initialize(dev);
13231339 dev_set_name(dev, "dax%d.%d", dax_region->id, dev_dax->id);
....@@ -1355,7 +1371,6 @@
13551371 dev_dax->target_node = dax_region->target_node;
13561372 dev_dax->align = dax_region->align;
13571373 ida_init(&dev_dax->ida);
1358
- kref_get(&dax_region->kref);
13591374
13601375 inode = dax_inode(dax_dev);
13611376 dev->devt = inode->i_rdev;