diff options
| author | David S. Miller <davem@davemloft.net> | 2008-07-27 07:40:08 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2008-07-27 07:40:08 -0400 |
| commit | 15d3b4a26291c170563e2b25ded5de1324f93959 (patch) | |
| tree | 9bea548a7de5215c58a091d58f4eefdb92349f2c /drivers/message | |
| parent | 2c3abab7c95295f319dc8899b74cbd60140fcdfb (diff) | |
| parent | 8be1a6d6c77ab4532e4476fdb8177030ef48b52c (diff) | |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux-2.6
Diffstat (limited to 'drivers/message')
| -rw-r--r-- | drivers/message/fusion/lsi/mpi_history.txt | 6 | ||||
| -rw-r--r-- | drivers/message/i2o/device.c | 54 |
2 files changed, 45 insertions, 15 deletions
diff --git a/drivers/message/fusion/lsi/mpi_history.txt b/drivers/message/fusion/lsi/mpi_history.txt index 241592ab13ad..3f15fcfe4a2e 100644 --- a/drivers/message/fusion/lsi/mpi_history.txt +++ b/drivers/message/fusion/lsi/mpi_history.txt | |||
| @@ -127,7 +127,7 @@ mpi_ioc.h | |||
| 127 | * 08-08-01 01.02.01 Original release for v1.2 work. | 127 | * 08-08-01 01.02.01 Original release for v1.2 work. |
| 128 | * New format for FWVersion and ProductId in | 128 | * New format for FWVersion and ProductId in |
| 129 | * MSG_IOC_FACTS_REPLY and MPI_FW_HEADER. | 129 | * MSG_IOC_FACTS_REPLY and MPI_FW_HEADER. |
| 130 | * 08-31-01 01.02.02 Addded event MPI_EVENT_SCSI_DEVICE_STATUS_CHANGE and | 130 | * 08-31-01 01.02.02 Added event MPI_EVENT_SCSI_DEVICE_STATUS_CHANGE and |
| 131 | * related structure and defines. | 131 | * related structure and defines. |
| 132 | * Added event MPI_EVENT_ON_BUS_TIMER_EXPIRED. | 132 | * Added event MPI_EVENT_ON_BUS_TIMER_EXPIRED. |
| 133 | * Added MPI_IOCINIT_FLAGS_DISCARD_FW_IMAGE. | 133 | * Added MPI_IOCINIT_FLAGS_DISCARD_FW_IMAGE. |
| @@ -187,7 +187,7 @@ mpi_ioc.h | |||
| 187 | * 10-11-06 01.05.12 Added MPI_IOCFACTS_EXCEPT_METADATA_UNSUPPORTED. | 187 | * 10-11-06 01.05.12 Added MPI_IOCFACTS_EXCEPT_METADATA_UNSUPPORTED. |
| 188 | * Added MaxInitiators field to PortFacts reply. | 188 | * Added MaxInitiators field to PortFacts reply. |
| 189 | * Added SAS Device Status Change ReasonCode for | 189 | * Added SAS Device Status Change ReasonCode for |
| 190 | * asynchronous notificaiton. | 190 | * asynchronous notification. |
| 191 | * Added MPI_EVENT_SAS_EXPANDER_STATUS_CHANGE and event | 191 | * Added MPI_EVENT_SAS_EXPANDER_STATUS_CHANGE and event |
| 192 | * data structure. | 192 | * data structure. |
| 193 | * Added new ImageType values for FWDownload and FWUpload | 193 | * Added new ImageType values for FWDownload and FWUpload |
| @@ -213,7 +213,7 @@ mpi_cnfg.h | |||
| 213 | * Added _RESPONSE_ID_MASK definition to SCSI_PORT_1 | 213 | * Added _RESPONSE_ID_MASK definition to SCSI_PORT_1 |
| 214 | * page and updated the page version. | 214 | * page and updated the page version. |
| 215 | * Added Information field and _INFO_PARAMS_NEGOTIATED | 215 | * Added Information field and _INFO_PARAMS_NEGOTIATED |
| 216 | * definitionto SCSI_DEVICE_0 page. | 216 | * definition to SCSI_DEVICE_0 page. |
| 217 | * 06-22-00 01.00.03 Removed batch controls from LAN_0 page and updated the | 217 | * 06-22-00 01.00.03 Removed batch controls from LAN_0 page and updated the |
| 218 | * page version. | 218 | * page version. |
| 219 | * Added BucketsRemaining to LAN_1 page, redefined the | 219 | * Added BucketsRemaining to LAN_1 page, redefined the |
diff --git a/drivers/message/i2o/device.c b/drivers/message/i2o/device.c index 489d7c5c4965..8774c670e668 100644 --- a/drivers/message/i2o/device.c +++ b/drivers/message/i2o/device.c | |||
| @@ -243,29 +243,41 @@ static int i2o_device_add(struct i2o_controller *c, i2o_lct_entry *entry) | |||
| 243 | 243 | ||
| 244 | /* create user entries for this device */ | 244 | /* create user entries for this device */ |
| 245 | tmp = i2o_iop_find_device(i2o_dev->iop, i2o_dev->lct_data.user_tid); | 245 | tmp = i2o_iop_find_device(i2o_dev->iop, i2o_dev->lct_data.user_tid); |
| 246 | if (tmp && (tmp != i2o_dev)) | 246 | if (tmp && (tmp != i2o_dev)) { |
| 247 | sysfs_create_link(&i2o_dev->device.kobj, &tmp->device.kobj, | 247 | rc = sysfs_create_link(&i2o_dev->device.kobj, |
| 248 | "user"); | 248 | &tmp->device.kobj, "user"); |
| 249 | if (rc) | ||
| 250 | goto unreg_dev; | ||
| 251 | } | ||
| 249 | 252 | ||
| 250 | /* create user entries refering to this device */ | 253 | /* create user entries refering to this device */ |
| 251 | list_for_each_entry(tmp, &c->devices, list) | 254 | list_for_each_entry(tmp, &c->devices, list) |
| 252 | if ((tmp->lct_data.user_tid == i2o_dev->lct_data.tid) | 255 | if ((tmp->lct_data.user_tid == i2o_dev->lct_data.tid) |
| 253 | && (tmp != i2o_dev)) | 256 | && (tmp != i2o_dev)) { |
| 254 | sysfs_create_link(&tmp->device.kobj, | 257 | rc = sysfs_create_link(&tmp->device.kobj, |
| 255 | &i2o_dev->device.kobj, "user"); | 258 | &i2o_dev->device.kobj, "user"); |
| 259 | if (rc) | ||
| 260 | goto rmlink1; | ||
| 261 | } | ||
| 256 | 262 | ||
| 257 | /* create parent entries for this device */ | 263 | /* create parent entries for this device */ |
| 258 | tmp = i2o_iop_find_device(i2o_dev->iop, i2o_dev->lct_data.parent_tid); | 264 | tmp = i2o_iop_find_device(i2o_dev->iop, i2o_dev->lct_data.parent_tid); |
| 259 | if (tmp && (tmp != i2o_dev)) | 265 | if (tmp && (tmp != i2o_dev)) { |
| 260 | sysfs_create_link(&i2o_dev->device.kobj, &tmp->device.kobj, | 266 | rc = sysfs_create_link(&i2o_dev->device.kobj, |
| 261 | "parent"); | 267 | &tmp->device.kobj, "parent"); |
| 268 | if (rc) | ||
| 269 | goto rmlink1; | ||
| 270 | } | ||
| 262 | 271 | ||
| 263 | /* create parent entries refering to this device */ | 272 | /* create parent entries refering to this device */ |
| 264 | list_for_each_entry(tmp, &c->devices, list) | 273 | list_for_each_entry(tmp, &c->devices, list) |
| 265 | if ((tmp->lct_data.parent_tid == i2o_dev->lct_data.tid) | 274 | if ((tmp->lct_data.parent_tid == i2o_dev->lct_data.tid) |
| 266 | && (tmp != i2o_dev)) | 275 | && (tmp != i2o_dev)) { |
| 267 | sysfs_create_link(&tmp->device.kobj, | 276 | rc = sysfs_create_link(&tmp->device.kobj, |
| 268 | &i2o_dev->device.kobj, "parent"); | 277 | &i2o_dev->device.kobj, "parent"); |
| 278 | if (rc) | ||
| 279 | goto rmlink2; | ||
| 280 | } | ||
| 269 | 281 | ||
| 270 | i2o_driver_notify_device_add_all(i2o_dev); | 282 | i2o_driver_notify_device_add_all(i2o_dev); |
| 271 | 283 | ||
| @@ -273,6 +285,24 @@ static int i2o_device_add(struct i2o_controller *c, i2o_lct_entry *entry) | |||
| 273 | 285 | ||
| 274 | return 0; | 286 | return 0; |
| 275 | 287 | ||
| 288 | rmlink2: | ||
| 289 | /* If link creating failed halfway, we loop whole list to cleanup. | ||
| 290 | * And we don't care wrong removing of link, because sysfs_remove_link | ||
| 291 | * will take care of it. | ||
| 292 | */ | ||
| 293 | list_for_each_entry(tmp, &c->devices, list) { | ||
| 294 | if (tmp->lct_data.parent_tid == i2o_dev->lct_data.tid) | ||
| 295 | sysfs_remove_link(&tmp->device.kobj, "parent"); | ||
| 296 | } | ||
| 297 | sysfs_remove_link(&i2o_dev->device.kobj, "parent"); | ||
| 298 | rmlink1: | ||
| 299 | list_for_each_entry(tmp, &c->devices, list) | ||
| 300 | if (tmp->lct_data.user_tid == i2o_dev->lct_data.tid) | ||
| 301 | sysfs_remove_link(&tmp->device.kobj, "user"); | ||
| 302 | sysfs_remove_link(&i2o_dev->device.kobj, "user"); | ||
| 303 | unreg_dev: | ||
| 304 | list_del(&i2o_dev->list); | ||
| 305 | device_unregister(&i2o_dev->device); | ||
| 276 | err: | 306 | err: |
| 277 | kfree(i2o_dev); | 307 | kfree(i2o_dev); |
| 278 | return rc; | 308 | return rc; |
