block: make add_partition() return pointer to hd_struct

Make add_partition() return pointer to the new hd_struct on success
and ERR_PTR() value on failure. This change will be used to fix md
autodetection bug.

Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Neil Brown <neilb@suse.de>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>

authored by Tejun Heo and committed by Jens Axboe ba32929a eb60fa10

+19 -17
+3 -4
block/ioctl.c
··· 18 struct disk_part_iter piter; 19 long long start, length; 20 int partno; 21 - int err; 22 23 if (!capable(CAP_SYS_ADMIN)) 24 return -EACCES; ··· 60 disk_part_iter_exit(&piter); 61 62 /* all seems OK */ 63 - err = add_partition(disk, partno, start, length, 64 - ADDPART_FLAG_NONE); 65 mutex_unlock(&bdev->bd_mutex); 66 - return err; 67 case BLKPG_DEL_PARTITION: 68 part = disk_get_part(disk, partno); 69 if (!part)
··· 18 struct disk_part_iter piter; 19 long long start, length; 20 int partno; 21 22 if (!capable(CAP_SYS_ADMIN)) 23 return -EACCES; ··· 61 disk_part_iter_exit(&piter); 62 63 /* all seems OK */ 64 + part = add_partition(disk, partno, start, length, 65 + ADDPART_FLAG_NONE); 66 mutex_unlock(&bdev->bd_mutex); 67 + return IS_ERR(part) ? PTR_ERR(part) : 0; 68 case BLKPG_DEL_PARTITION: 69 part = disk_get_part(disk, partno); 70 if (!part)
+13 -12
fs/partitions/check.c
··· 348 static DEVICE_ATTR(whole_disk, S_IRUSR | S_IRGRP | S_IROTH, 349 whole_disk_show, NULL); 350 351 - int add_partition(struct gendisk *disk, int partno, 352 - sector_t start, sector_t len, int flags) 353 { 354 struct hd_struct *p; 355 dev_t devt = MKDEV(0, 0); ··· 361 362 err = disk_expand_part_tbl(disk, partno); 363 if (err) 364 - return err; 365 ptbl = disk->part_tbl; 366 367 if (ptbl->part[partno]) 368 - return -EBUSY; 369 370 p = kzalloc(sizeof(*p), GFP_KERNEL); 371 if (!p) 372 - return -ENOMEM; 373 374 if (!init_part_stats(p)) { 375 err = -ENOMEM; ··· 424 if (!ddev->uevent_suppress) 425 kobject_uevent(&pdev->kobj, KOBJ_ADD); 426 427 - return 0; 428 429 out_free_stats: 430 free_part_stats(p); 431 out_free: 432 kfree(p); 433 - return err; 434 out_del: 435 kobject_put(p->holder_dir); 436 device_del(pdev); 437 out_put: 438 put_device(pdev); 439 blk_free_devt(devt); 440 - return err; 441 } 442 443 /* Not exported, helper to add_disk(). */ ··· 568 disk->disk_name, p, (unsigned long long) size); 569 size = get_capacity(disk) - from; 570 } 571 - res = add_partition(disk, p, from, size, state->parts[p].flags); 572 - if (res) { 573 - printk(KERN_ERR " %s: p%d could not be added: %d\n", 574 - disk->disk_name, p, -res); 575 continue; 576 } 577 #ifdef CONFIG_BLK_DEV_MD
··· 348 static DEVICE_ATTR(whole_disk, S_IRUSR | S_IRGRP | S_IROTH, 349 whole_disk_show, NULL); 350 351 + struct hd_struct *add_partition(struct gendisk *disk, int partno, 352 + sector_t start, sector_t len, int flags) 353 { 354 struct hd_struct *p; 355 dev_t devt = MKDEV(0, 0); ··· 361 362 err = disk_expand_part_tbl(disk, partno); 363 if (err) 364 + return ERR_PTR(err); 365 ptbl = disk->part_tbl; 366 367 if (ptbl->part[partno]) 368 + return ERR_PTR(-EBUSY); 369 370 p = kzalloc(sizeof(*p), GFP_KERNEL); 371 if (!p) 372 + return ERR_PTR(-EBUSY); 373 374 if (!init_part_stats(p)) { 375 err = -ENOMEM; ··· 424 if (!ddev->uevent_suppress) 425 kobject_uevent(&pdev->kobj, KOBJ_ADD); 426 427 + return p; 428 429 out_free_stats: 430 free_part_stats(p); 431 out_free: 432 kfree(p); 433 + return ERR_PTR(err); 434 out_del: 435 kobject_put(p->holder_dir); 436 device_del(pdev); 437 out_put: 438 put_device(pdev); 439 blk_free_devt(devt); 440 + return ERR_PTR(err); 441 } 442 443 /* Not exported, helper to add_disk(). */ ··· 568 disk->disk_name, p, (unsigned long long) size); 569 size = get_capacity(disk) - from; 570 } 571 + part = add_partition(disk, p, from, size, 572 + state->parts[p].flags); 573 + if (IS_ERR(part)) { 574 + printk(KERN_ERR " %s: p%d could not be added: %ld\n", 575 + disk->disk_name, p, -PTR_ERR(part)); 576 continue; 577 } 578 #ifdef CONFIG_BLK_DEV_MD
+3 -1
include/linux/genhd.h
··· 522 523 extern int disk_expand_part_tbl(struct gendisk *disk, int target); 524 extern int rescan_partitions(struct gendisk *disk, struct block_device *bdev); 525 - extern int __must_check add_partition(struct gendisk *, int, sector_t, sector_t, int); 526 extern void delete_partition(struct gendisk *, int); 527 extern void printk_all_partitions(void); 528
··· 522 523 extern int disk_expand_part_tbl(struct gendisk *disk, int target); 524 extern int rescan_partitions(struct gendisk *disk, struct block_device *bdev); 525 + extern struct hd_struct * __must_check add_partition(struct gendisk *disk, 526 + int partno, sector_t start, 527 + sector_t len, int flags); 528 extern void delete_partition(struct gendisk *, int); 529 extern void printk_all_partitions(void); 530