diff options
| author | James Bottomley <James.Bottomley@HansenPartnership.com> | 2008-01-29 16:17:15 -0500 |
|---|---|---|
| committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2008-01-30 14:14:26 -0500 |
| commit | 203a512f0976e8ba85df36d76b40af6c80239121 (patch) | |
| tree | 3954b548aec9c2748e06f97ad9dd7af105260141 | |
| parent | 40f620286dd08e29c995ca631f45e8d03f4fe1be (diff) | |
[SCSI] Revert "[SCSI] aacraid: fib context lock for management ioctls"
This reverts commit a119ee8ee3045bf559d4cf02d72b112f3de2a15b.
Adaptec found this was causing system lockups.
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
| -rw-r--r-- | drivers/scsi/aacraid/commctrl.c | 29 |
1 files changed, 12 insertions, 17 deletions
diff --git a/drivers/scsi/aacraid/commctrl.c b/drivers/scsi/aacraid/commctrl.c index 851a7e599c50..f8afa358b6b6 100644 --- a/drivers/scsi/aacraid/commctrl.c +++ b/drivers/scsi/aacraid/commctrl.c | |||
| @@ -243,7 +243,6 @@ static int next_getadapter_fib(struct aac_dev * dev, void __user *arg) | |||
| 243 | * Search the list of AdapterFibContext addresses on the adapter | 243 | * Search the list of AdapterFibContext addresses on the adapter |
| 244 | * to be sure this is a valid address | 244 | * to be sure this is a valid address |
| 245 | */ | 245 | */ |
| 246 | spin_lock_irqsave(&dev->fib_lock, flags); | ||
| 247 | entry = dev->fib_list.next; | 246 | entry = dev->fib_list.next; |
| 248 | fibctx = NULL; | 247 | fibctx = NULL; |
| 249 | 248 | ||
| @@ -252,25 +251,24 @@ static int next_getadapter_fib(struct aac_dev * dev, void __user *arg) | |||
| 252 | /* | 251 | /* |
| 253 | * Extract the AdapterFibContext from the Input parameters. | 252 | * Extract the AdapterFibContext from the Input parameters. |
| 254 | */ | 253 | */ |
| 255 | if (fibctx->unique == f.fibctx) { /* We found a winner */ | 254 | if (fibctx->unique == f.fibctx) { /* We found a winner */ |
| 256 | break; | 255 | break; |
| 257 | } | 256 | } |
| 258 | entry = entry->next; | 257 | entry = entry->next; |
| 259 | fibctx = NULL; | 258 | fibctx = NULL; |
| 260 | } | 259 | } |
| 261 | if (!fibctx) { | 260 | if (!fibctx) { |
| 262 | spin_unlock_irqrestore(&dev->fib_lock, flags); | ||
| 263 | dprintk ((KERN_INFO "Fib Context not found\n")); | 261 | dprintk ((KERN_INFO "Fib Context not found\n")); |
| 264 | return -EINVAL; | 262 | return -EINVAL; |
| 265 | } | 263 | } |
| 266 | 264 | ||
| 267 | if((fibctx->type != FSAFS_NTC_GET_ADAPTER_FIB_CONTEXT) || | 265 | if((fibctx->type != FSAFS_NTC_GET_ADAPTER_FIB_CONTEXT) || |
| 268 | (fibctx->size != sizeof(struct aac_fib_context))) { | 266 | (fibctx->size != sizeof(struct aac_fib_context))) { |
| 269 | spin_unlock_irqrestore(&dev->fib_lock, flags); | ||
| 270 | dprintk ((KERN_INFO "Fib Context corrupt?\n")); | 267 | dprintk ((KERN_INFO "Fib Context corrupt?\n")); |
| 271 | return -EINVAL; | 268 | return -EINVAL; |
| 272 | } | 269 | } |
| 273 | status = 0; | 270 | status = 0; |
| 271 | spin_lock_irqsave(&dev->fib_lock, flags); | ||
| 274 | /* | 272 | /* |
| 275 | * If there are no fibs to send back, then either wait or return | 273 | * If there are no fibs to send back, then either wait or return |
| 276 | * -EAGAIN | 274 | * -EAGAIN |
| @@ -328,9 +326,7 @@ return_fib: | |||
| 328 | int aac_close_fib_context(struct aac_dev * dev, struct aac_fib_context * fibctx) | 326 | int aac_close_fib_context(struct aac_dev * dev, struct aac_fib_context * fibctx) |
| 329 | { | 327 | { |
| 330 | struct fib *fib; | 328 | struct fib *fib; |
| 331 | unsigned long flags; | ||
| 332 | 329 | ||
| 333 | spin_lock_irqsave(&dev->fib_lock, flags); | ||
| 334 | /* | 330 | /* |
| 335 | * First free any FIBs that have not been consumed. | 331 | * First free any FIBs that have not been consumed. |
| 336 | */ | 332 | */ |
| @@ -353,7 +349,6 @@ int aac_close_fib_context(struct aac_dev * dev, struct aac_fib_context * fibctx) | |||
| 353 | * Remove the Context from the AdapterFibContext List | 349 | * Remove the Context from the AdapterFibContext List |
| 354 | */ | 350 | */ |
| 355 | list_del(&fibctx->next); | 351 | list_del(&fibctx->next); |
| 356 | spin_unlock_irqrestore(&dev->fib_lock, flags); | ||
| 357 | /* | 352 | /* |
| 358 | * Invalidate context | 353 | * Invalidate context |
| 359 | */ | 354 | */ |
| @@ -419,8 +414,8 @@ static int close_getadapter_fib(struct aac_dev * dev, void __user *arg) | |||
| 419 | * @arg: ioctl arguments | 414 | * @arg: ioctl arguments |
| 420 | * | 415 | * |
| 421 | * This routine returns the driver version. | 416 | * This routine returns the driver version. |
| 422 | * Under Linux, there have been no version incompatibilities, so this is | 417 | * Under Linux, there have been no version incompatibilities, so this is |
| 423 | * simple! | 418 | * simple! |
| 424 | */ | 419 | */ |
| 425 | 420 | ||
| 426 | static int check_revision(struct aac_dev *dev, void __user *arg) | 421 | static int check_revision(struct aac_dev *dev, void __user *arg) |
| @@ -468,7 +463,7 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg) | |||
| 468 | u32 data_dir; | 463 | u32 data_dir; |
| 469 | void __user *sg_user[32]; | 464 | void __user *sg_user[32]; |
| 470 | void *sg_list[32]; | 465 | void *sg_list[32]; |
| 471 | u32 sg_indx = 0; | 466 | u32 sg_indx = 0; |
| 472 | u32 byte_count = 0; | 467 | u32 byte_count = 0; |
| 473 | u32 actual_fibsize64, actual_fibsize = 0; | 468 | u32 actual_fibsize64, actual_fibsize = 0; |
| 474 | int i; | 469 | int i; |
| @@ -522,11 +517,11 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg) | |||
| 522 | // Fix up srb for endian and force some values | 517 | // Fix up srb for endian and force some values |
| 523 | 518 | ||
| 524 | srbcmd->function = cpu_to_le32(SRBF_ExecuteScsi); // Force this | 519 | srbcmd->function = cpu_to_le32(SRBF_ExecuteScsi); // Force this |
| 525 | srbcmd->channel = cpu_to_le32(user_srbcmd->channel); | 520 | srbcmd->channel = cpu_to_le32(user_srbcmd->channel); |
| 526 | srbcmd->id = cpu_to_le32(user_srbcmd->id); | 521 | srbcmd->id = cpu_to_le32(user_srbcmd->id); |
| 527 | srbcmd->lun = cpu_to_le32(user_srbcmd->lun); | 522 | srbcmd->lun = cpu_to_le32(user_srbcmd->lun); |
| 528 | srbcmd->timeout = cpu_to_le32(user_srbcmd->timeout); | 523 | srbcmd->timeout = cpu_to_le32(user_srbcmd->timeout); |
| 529 | srbcmd->flags = cpu_to_le32(flags); | 524 | srbcmd->flags = cpu_to_le32(flags); |
| 530 | srbcmd->retry_limit = 0; // Obsolete parameter | 525 | srbcmd->retry_limit = 0; // Obsolete parameter |
| 531 | srbcmd->cdb_size = cpu_to_le32(user_srbcmd->cdb_size); | 526 | srbcmd->cdb_size = cpu_to_le32(user_srbcmd->cdb_size); |
| 532 | memcpy(srbcmd->cdb, user_srbcmd->cdb, sizeof(srbcmd->cdb)); | 527 | memcpy(srbcmd->cdb, user_srbcmd->cdb, sizeof(srbcmd->cdb)); |
| @@ -791,9 +786,9 @@ static int aac_get_pci_info(struct aac_dev* dev, void __user *arg) | |||
| 791 | pci_info.bus = dev->pdev->bus->number; | 786 | pci_info.bus = dev->pdev->bus->number; |
| 792 | pci_info.slot = PCI_SLOT(dev->pdev->devfn); | 787 | pci_info.slot = PCI_SLOT(dev->pdev->devfn); |
| 793 | 788 | ||
| 794 | if (copy_to_user(arg, &pci_info, sizeof(struct aac_pci_info))) { | 789 | if (copy_to_user(arg, &pci_info, sizeof(struct aac_pci_info))) { |
| 795 | dprintk((KERN_DEBUG "aacraid: Could not copy pci info\n")); | 790 | dprintk((KERN_DEBUG "aacraid: Could not copy pci info\n")); |
| 796 | return -EFAULT; | 791 | return -EFAULT; |
| 797 | } | 792 | } |
| 798 | return 0; | 793 | return 0; |
| 799 | } | 794 | } |
