diff options
Diffstat (limited to 'drivers/scsi/aacraid/commctrl.c')
| -rw-r--r-- | drivers/scsi/aacraid/commctrl.c | 12 | 
1 files changed, 9 insertions, 3 deletions
diff --git a/drivers/scsi/aacraid/commctrl.c b/drivers/scsi/aacraid/commctrl.c index 645ddd9d9b9..fbcd48d0bfc 100644 --- a/drivers/scsi/aacraid/commctrl.c +++ b/drivers/scsi/aacraid/commctrl.c @@ -5,7 +5,8 @@   * based on the old aacraid driver that is..   * Adaptec aacraid device driver for Linux.   * - * Copyright (c) 2000-2007 Adaptec, Inc. (aacraid@adaptec.com) + * Copyright (c) 2000-2010 Adaptec, Inc. + *               2010 PMC-Sierra, Inc. (aacraid@pmc-sierra.com)   *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by @@ -317,7 +318,8 @@ return_fib:  			kthread_stop(dev->thread);  			ssleep(1);  			dev->aif_thread = 0; -			dev->thread = kthread_run(aac_command_thread, dev, dev->name); +			dev->thread = kthread_run(aac_command_thread, dev, +						  "%s", dev->name);  			ssleep(1);  		}  		if (f.wait) { @@ -497,6 +499,8 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)  		return -ENOMEM;  	}  	aac_fib_init(srbfib); +	/* raw_srb FIB is not FastResponseCapable */ +	srbfib->hw_fib_va->header.XferState &= ~cpu_to_le32(FastResponseCapable);  	srbcmd = (struct aac_srb*) fib_data(srbfib); @@ -507,7 +511,8 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)  		goto cleanup;  	} -	if (fibsize > (dev->max_fib_size - sizeof(struct aac_fibhdr))) { +	if ((fibsize < (sizeof(struct user_aac_srb) - sizeof(struct user_sgentry))) || +	    (fibsize > (dev->max_fib_size - sizeof(struct aac_fibhdr)))) {  		rcode = -EINVAL;  		goto cleanup;  	} @@ -649,6 +654,7 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)  				     AAC_OPT_NEW_COMM) ?  				      (dev->scsi_host_ptr->max_sectors << 9) :  				      65536)) { +					kfree(usg);  					rcode = -EINVAL;  					goto cleanup;  				}  | 
