I2O: Bugfixes
PATCH 4/5 I2O: Bugfixes
Changes:
--------
- Removed some kmalloc's with __GFP_ZERO and replace it with memset() because it didn't work properly.
- Fixed returned message frame in i2o_cfg_passthru() which caused raidutils to display wrong error message in case a disk was missing.
- Fixed size of printk() in i2o_scsi.c.
- Fixed get_device() and put_device() in probing of the I2O controller.
drivers/message/i2o/driver.c +2 -1
@@ -213,9 +213,10 @@/* cut of header from message size (in 32-bit words) */ size = (le32_to_cpu (msg->u.head[0 ]) >>16 ) -5 ; - evt =kmalloc (size *4 +sizeof (*evt),GFP_ATOMIC | __GFP_ZERO); + evt =kmalloc (size *4 +sizeof (*evt),GFP_ATOMIC );if (!evt)return -ENOMEM ; +memset (evt,0 , size *4 +sizeof (*evt)); evt->size = size; evt->tcntxt =le32_to_cpu (msg->u.s.tcntxt);
drivers/message/i2o/i2o_config.c +14 -15
@@ -36,12 +36,12 @@#include <asm/uaccess.h> -#include "core.h" -#define SG_TABLESIZE 30 -static int i2o_cfg_ioctl (struct inode *inode,struct file *fp,unsigned int cmd, -unsigned long arg); +extern int i2o_parm_issue (struct i2o_device *,int ,void *,int ,void *,int ); + +static int i2o_cfg_ioctl (struct inode *,struct file *,unsigned int , +unsigned long );static spinlock_t i2o_config_lock;
@@ -593,9 +593,6 @@ sg_offset = (msg->u.head[0 ] >>4 ) &0x0f ; - msg->u.s.icntxt =cpu_to_le32 (i2o_config_driver.context); - msg->u.s.tcntxt =cpu_to_le32 (i2o_cntxt_list_add (c, reply)); -memset (sg_list,0 ,sizeof (sg_list[0 ]) *SG_TABLESIZE );if (sg_offset) {struct sg_simple_element *sg;
@@ -629,7 +626,7 @@ goto cleanup; } sg_size = sg[i].flag_count &0xffffff ; - p = &(sg_list[sg_index++]); + p = &(sg_list[sg_index]);/* Allocate memory for the transfer */ if (i2o_dma_alloc (&c->pdev->dev, p, sg_size,
@@ -640,6 +637,7 @@ rcode = -ENOMEM ; goto sg_list_cleanup; } + sg_index++;/* Copy in the user's SG buffer if necessary */ if (sg[i]. flag_count &0x04000000 /*I2O_SGL_FLAGS_DIR */ ) {
@@ -661,8 +659,10 @@ } rcode =i2o_msg_post_wait (c, m,60 ); -if (rcode) +if (rcode) { + reply[4 ] = ((u32 ) rcode) <<24 ; goto sg_list_cleanup; + }if (sg_offset) {u32 msg[I2O_OUTBOUND_MSG_FRAME_SIZE ];
@@ -712,6 +712,7 @@ } } + sg_list_cleanup:/* Copy back the reply to user space */ if (reply_size) {// we wrote our own values for context - now restore the user supplied ones
@@ -729,7 +730,6 @@ } } - sg_list_cleanup:for (i =0 ; i < sg_index; i++)i2o_dma_free (&c->pdev->dev, &sg_list[i]);
@@ -827,9 +827,6 @@ sg_offset = (msg->u.head[0 ] >>4 ) &0x0f ; - msg->u.s.icntxt =cpu_to_le32 (i2o_config_driver.context); - msg->u.s.tcntxt =cpu_to_le32 (i2o_cntxt_list_add (c, reply)); -memset (sg_list,0 ,sizeof (sg_list[0 ]) *SG_TABLESIZE );if (sg_offset) {struct sg_simple_element *sg;
@@ -892,8 +889,10 @@ } rcode =i2o_msg_post_wait (c, msg,60 ); -if (rcode) +if (rcode) { + reply[4 ] = ((u32 ) rcode) <<24 ; goto sg_list_cleanup; + }if (sg_offset) {u32 msg[128 ];
@@ -943,6 +942,7 @@ } } + sg_list_cleanup:/* Copy back the reply to user space */ if (reply_size) {// we wrote our own values for context - now restore the user supplied ones
@@ -959,7 +959,6 @@ } } - sg_list_cleanup:for (i =0 ; i < sg_index; i++)kfree (sg_list[i]);
drivers/message/i2o/i2o_scsi.c +2 -2
@@ -309,9 +309,9 @@sysfs_create_link (&i2o_dev->device.kobj, &scsi_dev->sdev_gendev.kobj,"scsi" ); -osm_info ("device added (TID: %03x) channel: %d, id: %d, lun: %d\n" , +osm_info ("device added (TID: %03x) channel: %d, id: %d, lun: %ld\n" , i2o_dev->lct_data.tid, channel,le32_to_cpu (id), - (unsigned int )le64_to_cpu (lun)); + (long unsigned int )le64_to_cpu (lun));return 0 ; };
drivers/message/i2o/pci.c +1 -5
@@ -338,7 +338,7 @@ pci_name(pdev)); c->pdev = pdev; - c->device.parent =get_device (&pdev->dev); + c->device.parent = &pdev->dev;/* Cards that fall apart if you hit them with large I/O loads... */ if (pdev->vendor ==PCI_VENDOR_ID_NCR && pdev->device ==0x0630 ) {
@@ -407,8 +407,6 @@if ((rc =i2o_iop_add (c))) goto uninstall; -get_device (&c->device); -if (i960)pci_write_config_word (i960,0x42 ,0x03ff );
@@ -422,7 +420,6 @@ free_controller:i2o_iop_free (c); -put_device (c->device.parent); disable:pci_disable_device (pdev);
@@ -450,7 +447,6 @@printk (KERN_INFO "%s: Controller removed.\n" , c->name); -put_device (c->device.parent);put_device (&c->device); };
include/linux/i2o.h +1 -1
@@ -380,7 +380,7 @@/* defines for max_sectors and max_phys_segments */ #define I2O_MAX_SECTORS 1024 -#define I2O_MAX_SECTORS_LIMITED 256 +#define I2O_MAX_SECTORS_LIMITED 128#define I2O_MAX_PHYS_SEGMENTS MAX_PHYS_SEGMENTS/*
Quoted 4 lines · Markus Lidel
Changes:
--------
- Removed some kmalloc's with__GFP_ZEROand replace it withmemset()because it didn't work properly.
kzalloc() perhaps ?
Dave
Hello,
Quoted 7 lines · Dave Jones
Quoted 4 lines · Markus Lidel
Changes:
--------
- Removed some kmalloc's with__GFP_ZEROand replace it withmemset()because it didn't work properly.
kzalloc()perhaps ?
Ahhh, yep, that was what i'm looking for :-D In the next update i'll replace it with the proper function...
Thanks for the hint!
Best regards,
Markus Lidel
------------------------------------------
Markus Lidel (Senior IT Consultant)
Shadow Connect GmbH
Carl-Reisch-Weg 12
D-86381 Krumbach
Germany
Phone: +49 82 82/99 51-0 Fax: +49 82 82/99 51-11
E-Mail: [email protected] URL: http://www.shadowconnect.com