aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPete Zaitcev <zaitcev@redhat.com>2006-05-25 23:04:54 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2006-06-21 18:04:14 -0400
commit688e9fb1bbdd4e5a51b5030b7f9b1c811fd5e5e3 (patch)
tree302c191611e780f3e897d353b134f1fe3c9394bc
parent2f8ad9a1b91bc6856860a2fea8b07e0c82c0ad0a (diff)
[PATCH] ub: atomic add_disk
<zaitcev> I am taling about this: "if (disk->flags & GENHD_FL_UP) del_gendisk(disk);" <zaitcev> If del_gendisk() undoes add_disk() like viro just said, why is it conditional? <viro> huh? <viro> add_disk() sets the damn flag <zaitcev> So, I should not need to check ever <viro> so the above is "if I've called add_disk(), call gendisk()" <viro> which might be what you want, of course <viro> but usually you know if you'd done add_disk() on that puppy anyway In ub, nobody upstream should ever see half-constructed disks before they were passed to add_disk. To that end, only add the struct lun to the list on the path of no return. With that fix in place, we do not need to test GENHD_FL_UP. Signed-off-by: Pete Zaitcev <zaitcev@redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--drivers/block/ub.c10
1 files changed, 3 insertions, 7 deletions
diff --git a/drivers/block/ub.c b/drivers/block/ub.c
index 8eb44a55b9b8..cfb824d90c86 100644
--- a/drivers/block/ub.c
+++ b/drivers/block/ub.c
@@ -2314,7 +2314,6 @@ static int ub_probe_lun(struct ub_dev *sc, int lnum)
2314 goto err_id; 2314 goto err_id;
2315 2315
2316 lun->udev = sc; 2316 lun->udev = sc;
2317 list_add(&lun->link, &sc->luns);
2318 2317
2319 snprintf(lun->name, 16, DRV_NAME "%c(%d.%d.%d)", 2318 snprintf(lun->name, 16, DRV_NAME "%c(%d.%d.%d)",
2320 lun->id + 'a', sc->dev->bus->busnum, sc->dev->devnum, lun->num); 2319 lun->id + 'a', sc->dev->bus->busnum, sc->dev->devnum, lun->num);
@@ -2327,7 +2326,6 @@ static int ub_probe_lun(struct ub_dev *sc, int lnum)
2327 if ((disk = alloc_disk(UB_PARTS_PER_LUN)) == NULL) 2326 if ((disk = alloc_disk(UB_PARTS_PER_LUN)) == NULL)
2328 goto err_diskalloc; 2327 goto err_diskalloc;
2329 2328
2330 lun->disk = disk;
2331 sprintf(disk->disk_name, DRV_NAME "%c", lun->id + 'a'); 2329 sprintf(disk->disk_name, DRV_NAME "%c", lun->id + 'a');
2332 sprintf(disk->devfs_name, DEVFS_NAME "/%c", lun->id + 'a'); 2330 sprintf(disk->devfs_name, DEVFS_NAME "/%c", lun->id + 'a');
2333 disk->major = UB_MAJOR; 2331 disk->major = UB_MAJOR;
@@ -2349,7 +2347,9 @@ static int ub_probe_lun(struct ub_dev *sc, int lnum)
2349 blk_queue_max_sectors(q, UB_MAX_SECTORS); 2347 blk_queue_max_sectors(q, UB_MAX_SECTORS);
2350 blk_queue_hardsect_size(q, lun->capacity.bsize); 2348 blk_queue_hardsect_size(q, lun->capacity.bsize);
2351 2349
2350 lun->disk = disk;
2352 q->queuedata = lun; 2351 q->queuedata = lun;
2352 list_add(&lun->link, &sc->luns);
2353 2353
2354 set_capacity(disk, lun->capacity.nsec); 2354 set_capacity(disk, lun->capacity.nsec);
2355 if (lun->removable) 2355 if (lun->removable)
@@ -2362,7 +2362,6 @@ static int ub_probe_lun(struct ub_dev *sc, int lnum)
2362err_blkqinit: 2362err_blkqinit:
2363 put_disk(disk); 2363 put_disk(disk);
2364err_diskalloc: 2364err_diskalloc:
2365 list_del(&lun->link);
2366 ub_id_put(lun->id); 2365 ub_id_put(lun->id);
2367err_id: 2366err_id:
2368 kfree(lun); 2367 kfree(lun);
@@ -2375,7 +2374,6 @@ static void ub_disconnect(struct usb_interface *intf)
2375 struct ub_dev *sc = usb_get_intfdata(intf); 2374 struct ub_dev *sc = usb_get_intfdata(intf);
2376 struct list_head *p; 2375 struct list_head *p;
2377 struct ub_lun *lun; 2376 struct ub_lun *lun;
2378 struct gendisk *disk;
2379 unsigned long flags; 2377 unsigned long flags;
2380 2378
2381 /* 2379 /*
@@ -2431,9 +2429,7 @@ static void ub_disconnect(struct usb_interface *intf)
2431 */ 2429 */
2432 list_for_each (p, &sc->luns) { 2430 list_for_each (p, &sc->luns) {
2433 lun = list_entry(p, struct ub_lun, link); 2431 lun = list_entry(p, struct ub_lun, link);
2434 disk = lun->disk; 2432 del_gendisk(lun->disk);
2435 if (disk->flags & GENHD_FL_UP)
2436 del_gendisk(disk);
2437 /* 2433 /*
2438 * I wish I could do: 2434 * I wish I could do:
2439 * set_bit(QUEUE_FLAG_DEAD, &q->queue_flags); 2435 * set_bit(QUEUE_FLAG_DEAD, &q->queue_flags);