diff options
| -rw-r--r-- | block/bsg.c | 21 | ||||
| -rw-r--r-- | drivers/scsi/scsi_sysfs.c | 2 | ||||
| -rw-r--r-- | drivers/scsi/scsi_transport_sas.c | 32 | ||||
| -rw-r--r-- | include/linux/bsg.h | 4 |
4 files changed, 38 insertions, 21 deletions
diff --git a/block/bsg.c b/block/bsg.c index 0e3d5d490d20..4eebcd5c7311 100644 --- a/block/bsg.c +++ b/block/bsg.c | |||
| @@ -936,20 +936,29 @@ void bsg_unregister_queue(struct request_queue *q) | |||
| 936 | 936 | ||
| 937 | mutex_lock(&bsg_mutex); | 937 | mutex_lock(&bsg_mutex); |
| 938 | sysfs_remove_link(&q->kobj, "bsg"); | 938 | sysfs_remove_link(&q->kobj, "bsg"); |
| 939 | class_device_destroy(bsg_class, MKDEV(bsg_major, bcd->minor)); | 939 | class_device_unregister(bcd->class_dev); |
| 940 | put_device(bcd->dev); | ||
| 940 | bcd->class_dev = NULL; | 941 | bcd->class_dev = NULL; |
| 942 | bcd->dev = NULL; | ||
| 941 | list_del_init(&bcd->list); | 943 | list_del_init(&bcd->list); |
| 942 | bsg_device_nr--; | 944 | bsg_device_nr--; |
| 943 | mutex_unlock(&bsg_mutex); | 945 | mutex_unlock(&bsg_mutex); |
| 944 | } | 946 | } |
| 945 | EXPORT_SYMBOL_GPL(bsg_unregister_queue); | 947 | EXPORT_SYMBOL_GPL(bsg_unregister_queue); |
| 946 | 948 | ||
| 947 | int bsg_register_queue(struct request_queue *q, const char *name) | 949 | int bsg_register_queue(struct request_queue *q, struct device *gdev, |
| 950 | const char *name) | ||
| 948 | { | 951 | { |
| 949 | struct bsg_class_device *bcd, *__bcd; | 952 | struct bsg_class_device *bcd, *__bcd; |
| 950 | dev_t dev; | 953 | dev_t dev; |
| 951 | int ret = -EMFILE; | 954 | int ret = -EMFILE; |
| 952 | struct class_device *class_dev = NULL; | 955 | struct class_device *class_dev = NULL; |
| 956 | const char *devname; | ||
| 957 | |||
| 958 | if (name) | ||
| 959 | devname = name; | ||
| 960 | else | ||
| 961 | devname = gdev->bus_id; | ||
| 953 | 962 | ||
| 954 | /* | 963 | /* |
| 955 | * we need a proper transport to send commands, not a stacked device | 964 | * we need a proper transport to send commands, not a stacked device |
| @@ -982,11 +991,13 @@ retry: | |||
| 982 | bsg_minor_idx = 0; | 991 | bsg_minor_idx = 0; |
| 983 | 992 | ||
| 984 | bcd->queue = q; | 993 | bcd->queue = q; |
| 994 | bcd->dev = get_device(gdev); | ||
| 985 | dev = MKDEV(bsg_major, bcd->minor); | 995 | dev = MKDEV(bsg_major, bcd->minor); |
| 986 | class_dev = class_device_create(bsg_class, NULL, dev, bcd->dev, "%s", name); | 996 | class_dev = class_device_create(bsg_class, NULL, dev, gdev, "%s", |
| 997 | devname); | ||
| 987 | if (IS_ERR(class_dev)) { | 998 | if (IS_ERR(class_dev)) { |
| 988 | ret = PTR_ERR(class_dev); | 999 | ret = PTR_ERR(class_dev); |
| 989 | goto err; | 1000 | goto err_put; |
| 990 | } | 1001 | } |
| 991 | bcd->class_dev = class_dev; | 1002 | bcd->class_dev = class_dev; |
| 992 | 1003 | ||
| @@ -1004,6 +1015,8 @@ retry: | |||
| 1004 | 1015 | ||
| 1005 | err_unregister: | 1016 | err_unregister: |
| 1006 | class_device_unregister(class_dev); | 1017 | class_device_unregister(class_dev); |
| 1018 | err_put: | ||
| 1019 | put_device(gdev); | ||
| 1007 | err: | 1020 | err: |
| 1008 | mutex_unlock(&bsg_mutex); | 1021 | mutex_unlock(&bsg_mutex); |
| 1009 | return ret; | 1022 | return ret; |
diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index ad5f21fd5d45..34cdce6738a6 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c | |||
| @@ -736,7 +736,7 @@ int scsi_sysfs_add_sdev(struct scsi_device *sdev) | |||
| 736 | * released by the sdev_class .release */ | 736 | * released by the sdev_class .release */ |
| 737 | get_device(&sdev->sdev_gendev); | 737 | get_device(&sdev->sdev_gendev); |
| 738 | 738 | ||
| 739 | error = bsg_register_queue(rq, sdev->sdev_gendev.bus_id); | 739 | error = bsg_register_queue(rq, &sdev->sdev_gendev, NULL); |
| 740 | 740 | ||
| 741 | if (error) | 741 | if (error) |
| 742 | sdev_printk(KERN_INFO, sdev, | 742 | sdev_printk(KERN_INFO, sdev, |
diff --git a/drivers/scsi/scsi_transport_sas.c b/drivers/scsi/scsi_transport_sas.c index 573f588154d0..3120f4b3a11a 100644 --- a/drivers/scsi/scsi_transport_sas.c +++ b/drivers/scsi/scsi_transport_sas.c | |||
| @@ -191,25 +191,34 @@ static void sas_non_host_smp_request(struct request_queue *q) | |||
| 191 | sas_smp_request(q, rphy_to_shost(rphy), rphy); | 191 | sas_smp_request(q, rphy_to_shost(rphy), rphy); |
| 192 | } | 192 | } |
| 193 | 193 | ||
| 194 | static int sas_bsg_initialize(struct Scsi_Host *shost, struct sas_rphy *rphy, | 194 | static int sas_bsg_initialize(struct Scsi_Host *shost, struct sas_rphy *rphy) |
| 195 | char *name) | ||
| 196 | { | 195 | { |
| 197 | struct request_queue *q; | 196 | struct request_queue *q; |
| 198 | int error; | 197 | int error; |
| 198 | struct device *dev; | ||
| 199 | char namebuf[BUS_ID_SIZE]; | ||
| 200 | const char *name; | ||
| 199 | 201 | ||
| 200 | if (!to_sas_internal(shost->transportt)->f->smp_handler) { | 202 | if (!to_sas_internal(shost->transportt)->f->smp_handler) { |
| 201 | printk("%s can't handle SMP requests\n", shost->hostt->name); | 203 | printk("%s can't handle SMP requests\n", shost->hostt->name); |
| 202 | return 0; | 204 | return 0; |
| 203 | } | 205 | } |
| 204 | 206 | ||
| 205 | if (rphy) | 207 | if (rphy) { |
| 206 | q = blk_init_queue(sas_non_host_smp_request, NULL); | 208 | q = blk_init_queue(sas_non_host_smp_request, NULL); |
| 207 | else | 209 | dev = &rphy->dev; |
| 210 | name = dev->bus_id; | ||
| 211 | } else { | ||
| 208 | q = blk_init_queue(sas_host_smp_request, NULL); | 212 | q = blk_init_queue(sas_host_smp_request, NULL); |
| 213 | dev = &shost->shost_gendev; | ||
| 214 | snprintf(namebuf, sizeof(namebuf), | ||
| 215 | "sas_host%d", shost->host_no); | ||
| 216 | name = namebuf; | ||
| 217 | } | ||
| 209 | if (!q) | 218 | if (!q) |
| 210 | return -ENOMEM; | 219 | return -ENOMEM; |
| 211 | 220 | ||
| 212 | error = bsg_register_queue(q, name); | 221 | error = bsg_register_queue(q, dev, name); |
| 213 | if (error) { | 222 | if (error) { |
| 214 | blk_cleanup_queue(q); | 223 | blk_cleanup_queue(q); |
| 215 | return -ENOMEM; | 224 | return -ENOMEM; |
| @@ -255,7 +264,6 @@ static int sas_host_setup(struct transport_container *tc, struct device *dev, | |||
| 255 | { | 264 | { |
| 256 | struct Scsi_Host *shost = dev_to_shost(dev); | 265 | struct Scsi_Host *shost = dev_to_shost(dev); |
| 257 | struct sas_host_attrs *sas_host = to_sas_host_attrs(shost); | 266 | struct sas_host_attrs *sas_host = to_sas_host_attrs(shost); |
| 258 | char name[BUS_ID_SIZE]; | ||
| 259 | 267 | ||
| 260 | INIT_LIST_HEAD(&sas_host->rphy_list); | 268 | INIT_LIST_HEAD(&sas_host->rphy_list); |
| 261 | mutex_init(&sas_host->lock); | 269 | mutex_init(&sas_host->lock); |
| @@ -263,8 +271,7 @@ static int sas_host_setup(struct transport_container *tc, struct device *dev, | |||
| 263 | sas_host->next_expander_id = 0; | 271 | sas_host->next_expander_id = 0; |
| 264 | sas_host->next_port_id = 0; | 272 | sas_host->next_port_id = 0; |
| 265 | 273 | ||
| 266 | snprintf(name, sizeof(name), "sas_host%d", shost->host_no); | 274 | if (sas_bsg_initialize(shost, NULL)) |
| 267 | if (sas_bsg_initialize(shost, NULL, name)) | ||
| 268 | dev_printk(KERN_ERR, dev, "fail to a bsg device %d\n", | 275 | dev_printk(KERN_ERR, dev, "fail to a bsg device %d\n", |
| 269 | shost->host_no); | 276 | shost->host_no); |
| 270 | 277 | ||
| @@ -1332,9 +1339,6 @@ struct sas_rphy *sas_end_device_alloc(struct sas_port *parent) | |||
| 1332 | sas_rphy_initialize(&rdev->rphy); | 1339 | sas_rphy_initialize(&rdev->rphy); |
| 1333 | transport_setup_device(&rdev->rphy.dev); | 1340 | transport_setup_device(&rdev->rphy.dev); |
| 1334 | 1341 | ||
| 1335 | if (sas_bsg_initialize(shost, &rdev->rphy, rdev->rphy.dev.bus_id)) | ||
| 1336 | printk("fail to a bsg device %s\n", rdev->rphy.dev.bus_id); | ||
| 1337 | |||
| 1338 | return &rdev->rphy; | 1342 | return &rdev->rphy; |
| 1339 | } | 1343 | } |
| 1340 | EXPORT_SYMBOL(sas_end_device_alloc); | 1344 | EXPORT_SYMBOL(sas_end_device_alloc); |
| @@ -1374,9 +1378,6 @@ struct sas_rphy *sas_expander_alloc(struct sas_port *parent, | |||
| 1374 | sas_rphy_initialize(&rdev->rphy); | 1378 | sas_rphy_initialize(&rdev->rphy); |
| 1375 | transport_setup_device(&rdev->rphy.dev); | 1379 | transport_setup_device(&rdev->rphy.dev); |
| 1376 | 1380 | ||
| 1377 | if (sas_bsg_initialize(shost, &rdev->rphy, rdev->rphy.dev.bus_id)) | ||
| 1378 | printk("fail to a bsg device %s\n", rdev->rphy.dev.bus_id); | ||
| 1379 | |||
| 1380 | return &rdev->rphy; | 1381 | return &rdev->rphy; |
| 1381 | } | 1382 | } |
| 1382 | EXPORT_SYMBOL(sas_expander_alloc); | 1383 | EXPORT_SYMBOL(sas_expander_alloc); |
| @@ -1404,6 +1405,9 @@ int sas_rphy_add(struct sas_rphy *rphy) | |||
| 1404 | return error; | 1405 | return error; |
| 1405 | transport_add_device(&rphy->dev); | 1406 | transport_add_device(&rphy->dev); |
| 1406 | transport_configure_device(&rphy->dev); | 1407 | transport_configure_device(&rphy->dev); |
| 1408 | if (sas_bsg_initialize(shost, rphy)) | ||
| 1409 | printk("fail to a bsg device %s\n", rphy->dev.bus_id); | ||
| 1410 | |||
| 1407 | 1411 | ||
| 1408 | mutex_lock(&sas_host->lock); | 1412 | mutex_lock(&sas_host->lock); |
| 1409 | list_add_tail(&rphy->list, &sas_host->rphy_list); | 1413 | list_add_tail(&rphy->list, &sas_host->rphy_list); |
diff --git a/include/linux/bsg.h b/include/linux/bsg.h index 8547b10c388b..f415f89e0ac8 100644 --- a/include/linux/bsg.h +++ b/include/linux/bsg.h | |||
| @@ -57,10 +57,10 @@ struct bsg_class_device { | |||
| 57 | struct request_queue *queue; | 57 | struct request_queue *queue; |
| 58 | }; | 58 | }; |
| 59 | 59 | ||
| 60 | extern int bsg_register_queue(struct request_queue *, const char *); | 60 | extern int bsg_register_queue(struct request_queue *, struct device *, const char *); |
| 61 | extern void bsg_unregister_queue(struct request_queue *); | 61 | extern void bsg_unregister_queue(struct request_queue *); |
| 62 | #else | 62 | #else |
| 63 | #define bsg_register_queue(disk, name) (0) | 63 | #define bsg_register_queue(disk, dev, name) (0) |
| 64 | #define bsg_unregister_queue(disk) do { } while (0) | 64 | #define bsg_unregister_queue(disk) do { } while (0) |
| 65 | #endif | 65 | #endif |
| 66 | 66 | ||
