Index: usb-2.6/block/genhd.c =================================================================== --- usb-2.6.orig/block/genhd.c +++ usb-2.6/block/genhd.c @@ -17,6 +17,10 @@ #include #include +extern int alantest; +#define alanp(msg, disk) if (alantest) printk(KERN_INFO msg ": %d\n", \ + atomic_read(&disk->dev.kobj.kref.refcount)) + extern struct class block_class; extern struct device_type disk_type; extern struct device_type part_type; @@ -185,6 +189,7 @@ void add_disk(struct gendisk *disk) disk->minors, NULL, exact_match, exact_lock, disk); register_disk(disk); blk_register_queue(disk); + alanp("after blk_register_queue", disk); } EXPORT_SYMBOL(add_disk); Index: usb-2.6/drivers/scsi/sd.c =================================================================== --- usb-2.6.orig/drivers/scsi/sd.c +++ usb-2.6/drivers/scsi/sd.c @@ -62,6 +62,8 @@ #include "scsi_logging.h" +extern int alantest; + MODULE_AUTHOR("Eric Youngdale"); MODULE_DESCRIPTION("SCSI disk (sd) driver"); MODULE_LICENSE("GPL"); @@ -1677,7 +1679,10 @@ static int sd_probe(struct device *dev) gd->flags |= GENHD_FL_REMOVABLE; dev_set_drvdata(dev, sdkp); + printk(KERN_INFO "sd_probe: call add_disk\n"); + alantest = 1; add_disk(gd); + alantest = 0; sd_printk(KERN_NOTICE, sdkp, "Attached SCSI %sdisk\n", sdp->removable ? "removable " : ""); @@ -1708,6 +1713,8 @@ static int sd_remove(struct device *dev) struct scsi_disk *sdkp = dev_get_drvdata(dev); class_device_del(&sdkp->cdev); + printk(KERN_INFO "sd_remove: call del_gendisk\n"); + alantest = 1; del_gendisk(sdkp->disk); sd_shutdown(dev); @@ -1716,6 +1723,7 @@ static int sd_remove(struct device *dev) class_device_put(&sdkp->cdev); mutex_unlock(&sd_ref_mutex); + alantest = 0; return 0; } @@ -1738,6 +1746,7 @@ static void scsi_disk_release(struct cla spin_unlock(&sd_index_lock); disk->private_data = NULL; + printk(KERN_INFO "scsi_disk_release: call put_disk\n"); put_disk(disk); put_device(&sdkp->device->sdev_gendev); Index: usb-2.6/fs/partitions/check.c =================================================================== --- usb-2.6.orig/fs/partitions/check.c +++ usb-2.6/fs/partitions/check.c @@ -36,6 +36,11 @@ #include "karma.h" #include "sysv68.h" +int alantest; +EXPORT_SYMBOL(alantest); +#define alanp(msg, disk) if (alantest) printk(KERN_INFO msg ": %d\n", \ + atomic_read(&disk->dev.kobj.kref.refcount)) + extern struct kobject block_depr; extern struct class block_class; @@ -378,6 +383,7 @@ void register_disk(struct gendisk *disk) struct hd_struct *p; int err; + alanp("start of register_disk", disk); disk->dev.parent = disk->driverfs_dev; disk->dev.devt = MKDEV(disk->major, disk->first_minor); @@ -392,6 +398,7 @@ void register_disk(struct gendisk *disk) if (device_add(&disk->dev)) return; + alanp("after device_add", disk); #ifndef CONFIG_SYSFS_DEPRECATED err = sysfs_create_link(&block_depr, &disk->dev.kobj, kobject_name(&disk->dev.kobj)); @@ -399,8 +406,10 @@ void register_disk(struct gendisk *disk) device_del(&disk->dev); return; } + alanp("after sysfs_create_link", disk); #endif disk_sysfs_add_subdirs(disk); + alanp("after disk_sysfs_add_subdirs", disk); /* No minors to use for partitions */ if (disk->minors == 1) @@ -409,16 +418,20 @@ void register_disk(struct gendisk *disk) /* No such device (e.g., media were just removed) */ if (!get_capacity(disk)) goto exit; + alanp("after get_capacity", disk); bdev = bdget_disk(disk, 0); if (!bdev) goto exit; + alanp("after bdget_disk", disk); bdev->bd_invalidated = 1; err = blkdev_get(bdev, FMODE_READ, 0); if (err < 0) goto exit; + alanp("after blkdev_get", disk); blkdev_put(bdev); + alanp("after blkdev_put", disk); exit: /* announce disk after possible partitions are created */ @@ -432,6 +445,7 @@ exit: continue; kobject_uevent(&p->dev.kobj, KOBJ_ADD); } + alanp("end of register_disk", disk); } int rescan_partitions(struct gendisk *disk, struct block_device *bdev) @@ -497,24 +511,34 @@ void del_gendisk(struct gendisk *disk) { int p; + alanp("start of del_gendisk", disk); + /* invalidate stuff */ for (p = disk->minors - 1; p > 0; p--) { invalidate_partition(disk, p); delete_partition(disk, p); } + alanp("after deleting subpartitions", disk); invalidate_partition(disk, 0); + alanp("after invalidate_partition(0)", disk); + disk->capacity = 0; disk->flags &= ~GENHD_FL_UP; unlink_gendisk(disk); + alanp("after unlink_gendisk", disk); disk_stat_set_all(disk, 0); disk->stamp = 0; kobject_unregister(disk->holder_dir); kobject_unregister(disk->slave_dir); + alanp("after kobject_unregister subdirs", disk); disk->driverfs_dev = NULL; #ifndef CONFIG_SYSFS_DEPRECATED sysfs_remove_link(&block_depr, disk->dev.bus_id); + alanp("after sysfs_remove_link", disk); #endif device_del(&disk->dev); + alanp("after device_del", disk); put_device(&disk->dev); + alanp("after put_device", disk); }