Commit ed9e1982347b36573cd622ee5f4e2a7ccd79b3fd

Authored by Tejun Heo
Committed by Jens Axboe
1 parent 870d665612

block: implement and use {disk|part}_to_dev()

Implement {disk|part}_to_dev() and use them to access generic device
instead of directly dereferencing {disk|part}->dev.  To make sure no
user is left behind, rename generic devices fields to __dev.

This is in preparation of unifying partition 0 handling with other
partitions.

Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>

Showing 11 changed files with 86 additions and 77 deletions Side-by-side Diff

block/blk-integrity.c
... ... @@ -331,7 +331,8 @@
331 331 return -1;
332 332  
333 333 if (kobject_init_and_add(&bi->kobj, &integrity_ktype,
334   - &disk->dev.kobj, "%s", "integrity")) {
  334 + &disk_to_dev(disk)->kobj,
  335 + "%s", "integrity")) {
335 336 kmem_cache_free(integrity_cachep, bi);
336 337 return -1;
337 338 }
... ... @@ -375,7 +376,7 @@
375 376  
376 377 kobject_uevent(&bi->kobj, KOBJ_REMOVE);
377 378 kobject_del(&bi->kobj);
378   - kobject_put(&disk->dev.kobj);
  379 + kobject_put(&disk_to_dev(disk)->kobj);
379 380 kmem_cache_free(integrity_cachep, bi);
380 381 }
381 382 EXPORT_SYMBOL(blk_integrity_unregister);
... ... @@ -310,7 +310,7 @@
310 310 if (!q->request_fn)
311 311 return 0;
312 312  
313   - ret = kobject_add(&q->kobj, kobject_get(&disk->dev.kobj),
  313 + ret = kobject_add(&q->kobj, kobject_get(&disk_to_dev(disk)->kobj),
314 314 "%s", "queue");
315 315 if (ret < 0)
316 316 return ret;
... ... @@ -339,7 +339,7 @@
339 339  
340 340 kobject_uevent(&q->kobj, KOBJ_REMOVE);
341 341 kobject_del(&q->kobj);
342   - kobject_put(&disk->dev.kobj);
  342 + kobject_put(&disk_to_dev(disk)->kobj);
343 343 }
344 344 }
... ... @@ -59,7 +59,7 @@
59 59 rcu_read_lock();
60 60 part = rcu_dereference(disk->__part[partno - 1]);
61 61 if (part)
62   - get_device(&part->dev);
  62 + get_device(part_to_dev(part));
63 63 rcu_read_unlock();
64 64  
65 65 return part;
... ... @@ -130,7 +130,7 @@
130 130 if (!(piter->flags & DISK_PITER_INCL_EMPTY) && !part->nr_sects)
131 131 continue;
132 132  
133   - get_device(&part->dev);
  133 + get_device(part_to_dev(part));
134 134 piter->part = part;
135 135 piter->idx += inc;
136 136 break;
... ... @@ -435,7 +435,7 @@
435 435 {
436 436 struct gendisk *p = data;
437 437  
438   - return &p->dev.kobj;
  438 + return &disk_to_dev(p)->kobj;
439 439 }
440 440  
441 441 static int exact_lock(dev_t devt, void *data)
... ... @@ -460,7 +460,7 @@
460 460 int retval;
461 461  
462 462 disk->flags |= GENHD_FL_UP;
463   - disk->dev.devt = MKDEV(disk->major, disk->first_minor);
  463 + disk_to_dev(disk)->devt = MKDEV(disk->major, disk->first_minor);
464 464 blk_register_region(disk_devt(disk), disk->minors, NULL,
465 465 exact_match, exact_lock, disk);
466 466 register_disk(disk);
... ... @@ -468,7 +468,8 @@
468 468  
469 469 bdi = &disk->queue->backing_dev_info;
470 470 bdi_register_dev(bdi, disk_devt(disk));
471   - retval = sysfs_create_link(&disk->dev.kobj, &bdi->dev->kobj, "bdi");
  471 + retval = sysfs_create_link(&disk_to_dev(disk)->kobj, &bdi->dev->kobj,
  472 + "bdi");
472 473 WARN_ON(retval);
473 474 }
474 475  
... ... @@ -477,7 +478,7 @@
477 478  
478 479 void unlink_gendisk(struct gendisk *disk)
479 480 {
480   - sysfs_remove_link(&disk->dev.kobj, "bdi");
  481 + sysfs_remove_link(&disk_to_dev(disk)->kobj, "bdi");
481 482 bdi_unregister(&disk->queue->backing_dev_info);
482 483 blk_unregister_queue(disk);
483 484 blk_unregister_region(disk_devt(disk), disk->minors);
... ... @@ -903,7 +904,7 @@
903 904 int cpu;
904 905  
905 906 /*
906   - if (&gp->dev.kobj.entry == block_class.devices.next)
  907 + if (&disk_to_dev(gp)->kobj.entry == block_class.devices.next)
907 908 seq_puts(seqf, "major minor name"
908 909 " rio rmerge rsect ruse wio wmerge "
909 910 "wsect wuse running use aveq"
... ... @@ -972,7 +973,7 @@
972 973 * set enviroment vars to indicate which event this is for
973 974 * so that user space will know to go check the media status.
974 975 */
975   - kobject_uevent_env(&gd->dev.kobj, KOBJ_CHANGE, envp);
  976 + kobject_uevent_env(&disk_to_dev(gd)->kobj, KOBJ_CHANGE, envp);
976 977 put_device(gd->driverfs_dev);
977 978 }
978 979  
... ... @@ -1062,9 +1063,9 @@
1062 1063 disk->minors = minors;
1063 1064 disk->ext_minors = ext_minors;
1064 1065 rand_initialize_disk(disk);
1065   - disk->dev.class = &block_class;
1066   - disk->dev.type = &disk_type;
1067   - device_initialize(&disk->dev);
  1066 + disk_to_dev(disk)->class = &block_class;
  1067 + disk_to_dev(disk)->type = &disk_type;
  1068 + device_initialize(disk_to_dev(disk));
1068 1069 INIT_WORK(&disk->async_notify,
1069 1070 media_change_notify_thread);
1070 1071 }
... ... @@ -1086,7 +1087,7 @@
1086 1087 owner = disk->fops->owner;
1087 1088 if (owner && !try_module_get(owner))
1088 1089 return NULL;
1089   - kobj = kobject_get(&disk->dev.kobj);
  1090 + kobj = kobject_get(&disk_to_dev(disk)->kobj);
1090 1091 if (kobj == NULL) {
1091 1092 module_put(owner);
1092 1093 return NULL;
... ... @@ -1100,7 +1101,7 @@
1100 1101 void put_disk(struct gendisk *disk)
1101 1102 {
1102 1103 if (disk)
1103   - kobject_put(&disk->dev.kobj);
  1104 + kobject_put(&disk_to_dev(disk)->kobj);
1104 1105 }
1105 1106  
1106 1107 EXPORT_SYMBOL(put_disk);
drivers/block/aoe/aoeblk.c
... ... @@ -109,12 +109,12 @@
109 109 static int
110 110 aoedisk_add_sysfs(struct aoedev *d)
111 111 {
112   - return sysfs_create_group(&d->gd->dev.kobj, &attr_group);
  112 + return sysfs_create_group(&disk_to_dev(d->gd)->kobj, &attr_group);
113 113 }
114 114 void
115 115 aoedisk_rm_sysfs(struct aoedev *d)
116 116 {
117   - sysfs_remove_group(&d->gd->dev.kobj, &attr_group);
  117 + sysfs_remove_group(&disk_to_dev(d->gd)->kobj, &attr_group);
118 118 }
119 119  
120 120 static int
... ... @@ -403,7 +403,7 @@
403 403 BUG_ON(lo->magic != LO_MAGIC);
404 404  
405 405 lo->pid = current->pid;
406   - ret = sysfs_create_file(&lo->disk->dev.kobj, &pid_attr.attr);
  406 + ret = sysfs_create_file(&disk_to_dev(lo->disk)->kobj, &pid_attr.attr);
407 407 if (ret) {
408 408 printk(KERN_ERR "nbd: sysfs_create_file failed!");
409 409 return ret;
... ... @@ -412,7 +412,7 @@
412 412 while ((req = nbd_read_stat(lo)) != NULL)
413 413 nbd_end_request(req);
414 414  
415   - sysfs_remove_file(&lo->disk->dev.kobj, &pid_attr.attr);
  415 + sysfs_remove_file(&disk_to_dev(lo->disk)->kobj, &pid_attr.attr);
416 416 return 0;
417 417 }
418 418  
drivers/ide/ide-probe.c
... ... @@ -1188,7 +1188,7 @@
1188 1188 {
1189 1189 struct gendisk *p = data;
1190 1190 *part &= (1 << PARTN_BITS) - 1;
1191   - return &p->dev.kobj;
  1191 + return &disk_to_dev(p)->kobj;
1192 1192 }
1193 1193  
1194 1194 static int exact_lock(dev_t dev, void *data)
... ... @@ -1186,7 +1186,7 @@
1186 1186 list_splice_init(&md->uevent_list, &uevents);
1187 1187 spin_unlock_irqrestore(&md->uevent_lock, flags);
1188 1188  
1189   - dm_send_uevents(&uevents, &md->disk->dev.kobj);
  1189 + dm_send_uevents(&uevents, &disk_to_dev(md->disk)->kobj);
1190 1190  
1191 1191 atomic_inc(&md->event_nr);
1192 1192 wake_up(&md->eventq);
... ... @@ -1643,7 +1643,7 @@
1643 1643 *---------------------------------------------------------------*/
1644 1644 void dm_kobject_uevent(struct mapped_device *md)
1645 1645 {
1646   - kobject_uevent(&md->disk->dev.kobj, KOBJ_CHANGE);
  1646 + kobject_uevent(&disk_to_dev(md->disk)->kobj, KOBJ_CHANGE);
1647 1647 }
1648 1648  
1649 1649 uint32_t dm_next_uevent_seq(struct mapped_device *md)
... ... @@ -1465,9 +1465,9 @@
1465 1465 goto fail;
1466 1466  
1467 1467 if (rdev->bdev->bd_part)
1468   - ko = &rdev->bdev->bd_part->dev.kobj;
  1468 + ko = &part_to_dev(rdev->bdev->bd_part)->kobj;
1469 1469 else
1470   - ko = &rdev->bdev->bd_disk->dev.kobj;
  1470 + ko = &disk_to_dev(rdev->bdev->bd_disk)->kobj;
1471 1471 if ((err = sysfs_create_link(&rdev->kobj, ko, "block"))) {
1472 1472 kobject_del(&rdev->kobj);
1473 1473 goto fail;
... ... @@ -3470,8 +3470,8 @@
3470 3470 disk->queue = mddev->queue;
3471 3471 add_disk(disk);
3472 3472 mddev->gendisk = disk;
3473   - error = kobject_init_and_add(&mddev->kobj, &md_ktype, &disk->dev.kobj,
3474   - "%s", "md");
  3473 + error = kobject_init_and_add(&mddev->kobj, &md_ktype,
  3474 + &disk_to_dev(disk)->kobj, "%s", "md");
3475 3475 mutex_unlock(&disks_mutex);
3476 3476 if (error)
3477 3477 printk(KERN_WARNING "md: cannot register %s/md - name in use\n",
... ... @@ -3761,7 +3761,7 @@
3761 3761 sysfs_notify(&mddev->kobj, NULL, "array_state");
3762 3762 sysfs_notify(&mddev->kobj, NULL, "sync_action");
3763 3763 sysfs_notify(&mddev->kobj, NULL, "degraded");
3764   - kobject_uevent(&mddev->gendisk->dev.kobj, KOBJ_CHANGE);
  3764 + kobject_uevent(&disk_to_dev(mddev->gendisk)->kobj, KOBJ_CHANGE);
3765 3765 return 0;
3766 3766 }
3767 3767  
... ... @@ -543,9 +543,9 @@
543 543 static struct kobject *bdev_get_kobj(struct block_device *bdev)
544 544 {
545 545 if (bdev->bd_contains != bdev)
546   - return kobject_get(&bdev->bd_part->dev.kobj);
  546 + return kobject_get(&part_to_dev(bdev->bd_part)->kobj);
547 547 else
548   - return kobject_get(&bdev->bd_disk->dev.kobj);
  548 + return kobject_get(&disk_to_dev(bdev->bd_disk)->kobj);
549 549 }
550 550  
551 551 static struct kobject *bdev_get_holder(struct block_device *bdev)
fs/partitions/check.c
... ... @@ -309,7 +309,7 @@
309 309 {
310 310 struct kobject *k;
311 311  
312   - k = kobject_get(&disk->dev.kobj);
  312 + k = kobject_get(&disk_to_dev(disk)->kobj);
313 313 disk->holder_dir = kobject_create_and_add("holders", k);
314 314 disk->slave_dir = kobject_create_and_add("slaves", k);
315 315 kobject_put(k);
... ... @@ -322,7 +322,7 @@
322 322 part->start_sect = 0;
323 323 part->nr_sects = 0;
324 324 part_stat_set_all(part, 0);
325   - put_device(&part->dev);
  325 + put_device(part_to_dev(part));
326 326 }
327 327  
328 328 void delete_partition(struct gendisk *disk, int partno)
... ... @@ -336,7 +336,7 @@
336 336 blk_free_devt(part_devt(part));
337 337 rcu_assign_pointer(disk->__part[partno-1], NULL);
338 338 kobject_put(part->holder_dir);
339   - device_del(&part->dev);
  339 + device_del(part_to_dev(part));
340 340  
341 341 call_rcu(&part->rcu_head, delete_partition_rcu_cb);
342 342 }
... ... @@ -354,6 +354,9 @@
354 354 {
355 355 struct hd_struct *p;
356 356 dev_t devt = MKDEV(0, 0);
  357 + struct device *ddev = disk_to_dev(disk);
  358 + struct device *pdev;
  359 + const char *dname;
357 360 int err;
358 361  
359 362 if (disk->__part[partno - 1])
360 363  
361 364  
362 365  
363 366  
364 367  
365 368  
366 369  
367 370  
... ... @@ -367,42 +370,43 @@
367 370 err = -ENOMEM;
368 371 goto out_free;
369 372 }
  373 + pdev = part_to_dev(p);
  374 +
370 375 p->start_sect = start;
371 376 p->nr_sects = len;
372 377 p->partno = partno;
373 378 p->policy = disk->policy;
374 379  
375   - if (isdigit(disk->dev.bus_id[strlen(disk->dev.bus_id)-1]))
376   - snprintf(p->dev.bus_id, BUS_ID_SIZE,
377   - "%sp%d", disk->dev.bus_id, partno);
  380 + dname = dev_name(ddev);
  381 + if (isdigit(dname[strlen(dname) - 1]))
  382 + snprintf(pdev->bus_id, BUS_ID_SIZE, "%sp%d", dname, partno);
378 383 else
379   - snprintf(p->dev.bus_id, BUS_ID_SIZE,
380   - "%s%d", disk->dev.bus_id, partno);
  384 + snprintf(pdev->bus_id, BUS_ID_SIZE, "%s%d", dname, partno);
381 385  
382   - device_initialize(&p->dev);
383   - p->dev.class = &block_class;
384   - p->dev.type = &part_type;
385   - p->dev.parent = &disk->dev;
  386 + device_initialize(pdev);
  387 + pdev->class = &block_class;
  388 + pdev->type = &part_type;
  389 + pdev->parent = ddev;
386 390  
387 391 err = blk_alloc_devt(p, &devt);
388 392 if (err)
389   - goto out_put;
390   - p->dev.devt = devt;
  393 + goto out_free;
  394 + pdev->devt = devt;
391 395  
392 396 /* delay uevent until 'holders' subdir is created */
393   - p->dev.uevent_suppress = 1;
394   - err = device_add(&p->dev);
  397 + pdev->uevent_suppress = 1;
  398 + err = device_add(pdev);
395 399 if (err)
396 400 goto out_put;
397 401  
398 402 err = -ENOMEM;
399   - p->holder_dir = kobject_create_and_add("holders", &p->dev.kobj);
  403 + p->holder_dir = kobject_create_and_add("holders", &pdev->kobj);
400 404 if (!p->holder_dir)
401 405 goto out_del;
402 406  
403   - p->dev.uevent_suppress = 0;
  407 + pdev->uevent_suppress = 0;
404 408 if (flags & ADDPART_FLAG_WHOLEDISK) {
405   - err = device_create_file(&p->dev, &dev_attr_whole_disk);
  409 + err = device_create_file(pdev, &dev_attr_whole_disk);
406 410 if (err)
407 411 goto out_del;
408 412 }
... ... @@ -412,8 +416,8 @@
412 416 rcu_assign_pointer(disk->__part[partno - 1], p);
413 417  
414 418 /* suppress uevent if the disk supresses it */
415   - if (!disk->dev.uevent_suppress)
416   - kobject_uevent(&p->dev.kobj, KOBJ_ADD);
  419 + if (!ddev->uevent_suppress)
  420 + kobject_uevent(&pdev->kobj, KOBJ_ADD);
417 421  
418 422 return 0;
419 423  
420 424  
... ... @@ -422,9 +426,9 @@
422 426 return err;
423 427 out_del:
424 428 kobject_put(p->holder_dir);
425   - device_del(&p->dev);
  429 + device_del(pdev);
426 430 out_put:
427   - put_device(&p->dev);
  431 + put_device(pdev);
428 432 blk_free_devt(devt);
429 433 return err;
430 434 }
431 435  
432 436  
433 437  
434 438  
435 439  
436 440  
437 441  
... ... @@ -432,30 +436,31 @@
432 436 /* Not exported, helper to add_disk(). */
433 437 void register_disk(struct gendisk *disk)
434 438 {
  439 + struct device *ddev = disk_to_dev(disk);
435 440 struct block_device *bdev;
436 441 struct disk_part_iter piter;
437 442 struct hd_struct *part;
438 443 char *s;
439 444 int err;
440 445  
441   - disk->dev.parent = disk->driverfs_dev;
  446 + ddev->parent = disk->driverfs_dev;
442 447  
443   - strlcpy(disk->dev.bus_id, disk->disk_name, BUS_ID_SIZE);
  448 + strlcpy(ddev->bus_id, disk->disk_name, BUS_ID_SIZE);
444 449 /* ewww... some of these buggers have / in the name... */
445   - s = strchr(disk->dev.bus_id, '/');
  450 + s = strchr(ddev->bus_id, '/');
446 451 if (s)
447 452 *s = '!';
448 453  
449 454 /* delay uevents, until we scanned partition table */
450   - disk->dev.uevent_suppress = 1;
  455 + ddev->uevent_suppress = 1;
451 456  
452   - if (device_add(&disk->dev))
  457 + if (device_add(ddev))
453 458 return;
454 459 #ifndef CONFIG_SYSFS_DEPRECATED
455   - err = sysfs_create_link(block_depr, &disk->dev.kobj,
456   - kobject_name(&disk->dev.kobj));
  460 + err = sysfs_create_link(block_depr, &ddev->kobj,
  461 + kobject_name(&ddev->kobj));
457 462 if (err) {
458   - device_del(&disk->dev);
  463 + device_del(ddev);
459 464 return;
460 465 }
461 466 #endif
462 467  
... ... @@ -481,13 +486,13 @@
481 486  
482 487 exit:
483 488 /* announce disk after possible partitions are created */
484   - disk->dev.uevent_suppress = 0;
485   - kobject_uevent(&disk->dev.kobj, KOBJ_ADD);
  489 + ddev->uevent_suppress = 0;
  490 + kobject_uevent(&ddev->kobj, KOBJ_ADD);
486 491  
487 492 /* announce possible partitions */
488 493 disk_part_iter_init(&piter, disk, 0);
489 494 while ((part = disk_part_iter_next(&piter)))
490   - kobject_uevent(&part->dev.kobj, KOBJ_ADD);
  495 + kobject_uevent(&part_to_dev(part)->kobj, KOBJ_ADD);
491 496 disk_part_iter_exit(&piter);
492 497 }
493 498  
... ... @@ -518,7 +523,7 @@
518 523 return -EIO;
519 524  
520 525 /* tell userspace that the media / partition table may have changed */
521   - kobject_uevent(&disk->dev.kobj, KOBJ_CHANGE);
  526 + kobject_uevent(&disk_to_dev(disk)->kobj, KOBJ_CHANGE);
522 527  
523 528 for (p = 1; p < state->limit; p++) {
524 529 sector_t size = state->parts[p].size;
525 530  
... ... @@ -591,8 +596,8 @@
591 596 kobject_put(disk->slave_dir);
592 597 disk->driverfs_dev = NULL;
593 598 #ifndef CONFIG_SYSFS_DEPRECATED
594   - sysfs_remove_link(block_depr, disk->dev.bus_id);
  599 + sysfs_remove_link(block_depr, dev_name(disk_to_dev(disk)));
595 600 #endif
596   - device_del(&disk->dev);
  601 + device_del(disk_to_dev(disk));
597 602 }
include/linux/genhd.h
... ... @@ -15,9 +15,11 @@
15 15  
16 16 #ifdef CONFIG_BLOCK
17 17  
18   -#define kobj_to_dev(k) container_of(k, struct device, kobj)
19   -#define dev_to_disk(device) container_of(device, struct gendisk, dev)
20   -#define dev_to_part(device) container_of(device, struct hd_struct, dev)
  18 +#define kobj_to_dev(k) container_of((k), struct device, kobj)
  19 +#define dev_to_disk(device) container_of((device), struct gendisk, __dev)
  20 +#define dev_to_part(device) container_of((device), struct hd_struct, __dev)
  21 +#define disk_to_dev(disk) (&((disk)->__dev))
  22 +#define part_to_dev(part) (&((part)->__dev))
21 23  
22 24 extern struct device_type part_type;
23 25 extern struct kobject *block_depr;
... ... @@ -88,7 +90,7 @@
88 90 struct hd_struct {
89 91 sector_t start_sect;
90 92 sector_t nr_sects;
91   - struct device dev;
  93 + struct device __dev;
92 94 struct kobject *holder_dir;
93 95 int policy, partno;
94 96 #ifdef CONFIG_FAIL_MAKE_REQUEST
... ... @@ -139,7 +141,7 @@
139 141  
140 142 int flags;
141 143 struct device *driverfs_dev; // FIXME: remove
142   - struct device dev;
  144 + struct device __dev;
143 145 struct kobject *holder_dir;
144 146 struct kobject *slave_dir;
145 147  
... ... @@ -163,7 +165,7 @@
163 165 static inline struct gendisk *part_to_disk(struct hd_struct *part)
164 166 {
165 167 if (likely(part))
166   - return dev_to_disk((part)->dev.parent);
  168 + return dev_to_disk(part_to_dev(part)->parent);
167 169 return NULL;
168 170 }
169 171  
170 172  
... ... @@ -174,12 +176,12 @@
174 176  
175 177 static inline dev_t disk_devt(struct gendisk *disk)
176 178 {
177   - return disk->dev.devt;
  179 + return disk_to_dev(disk)->devt;
178 180 }
179 181  
180 182 static inline dev_t part_devt(struct hd_struct *part)
181 183 {
182   - return part->dev.devt;
  184 + return part_to_dev(part)->devt;
183 185 }
184 186  
185 187 extern struct hd_struct *disk_get_part(struct gendisk *disk, int partno);
... ... @@ -187,7 +189,7 @@
187 189 static inline void disk_put_part(struct hd_struct *part)
188 190 {
189 191 if (likely(part))
190   - put_device(&part->dev);
  192 + put_device(part_to_dev(part));
191 193 }
192 194  
193 195 /*