lkml.org 
[lkml]   [2008]   [Feb]   [15]   [last100]   RSS Feed
Views: [more markup]  [less markup]  [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
SubjectRe: [PATCH] SCSI: fix data corruption caused by ses v2
FromJames Bottomley <>
DateFri, 15 Feb 2008 09:53:06 -0600
On Wed, 2008-02-13 at 16:25 -0800, Yinghai Lu wrote:
> one system: initrd get courrupted:> > RAMDISK: Compressed image found at block 0> RAMDISK: incomplete write (-28 != 2048) 134217728> crc error> VFS: Mounted root (ext2 filesystem).> Freeing unused kernel memory: 388k freed> init_special_inode: bogus i_mode (177777)> Warning: unable to open an initial console.> init_special_inode: bogus i_mode (177777)> init_special_inode: bogus i_mode (177777)> Kernel panic - not syncing: No init found.  Try passing init= option to kernel.
> > bisected to> commit 9927c68864e9c39cc317b4f559309ba29e642168> Author: James Bottomley <James.Bottomley@HansenPartnership.com>
> Date:   Sun Feb 3 15:48:56 2008 -0600
> 
>     [SCSI] ses: add new Enclosure ULD
> 
> changes:
> 1. change char to unsigned char to avoid type change later.
> 2. preserve len for page1
> 3. need to move desc_ptr even the entry is not enclosure_component_device/raid.
>    so keep desc_ptr on right position
> 4. record page7 len, and double check if desc_ptr out of boundary before touch.
> 5. fix typo in subenclosure checking: should use hdr_buf instead.
> 
> Signed-off-by: Yinghai Lu <yinghai.lu@sun.com>

OK, I added this with a fixup to eliminate the spurious goto

Thanks,

James

---
diff --git a/drivers/scsi/ses.c b/drivers/scsi/ses.c
index cbba012..a6d9669 100644
--- a/drivers/scsi/ses.c
+++ b/drivers/scsi/ses.c
@@ -561,16 +561,15 @@ static int ses_intf_add(struct class_device *cdev,
 			if (desc_ptr) {
 				if (desc_ptr >= buf + page7_len) {
 					desc_ptr = NULL;
-					goto noname;
+				} else {
+					len = (desc_ptr[2] << 8) + desc_ptr[3];
+					desc_ptr += 4;
+					/* Add trailing zero - pushes into
+					 * reserved space */
+					desc_ptr[len] = '\0';
+					name = desc_ptr;
 				}
-				len = (desc_ptr[2] << 8) + desc_ptr[3];
-				desc_ptr += 4;
-				/* Add trailing zero - pushes into
-				 * reserved space */
-				desc_ptr[len] = '\0';
-				name = desc_ptr;
 			}
-		noname:
 			if (type_ptr[0] == ENCLOSURE_COMPONENT_DEVICE ||
 			    type_ptr[0] == ENCLOSURE_COMPONENT_ARRAY_DEVICE) {
 



\
 
 \ /
  Last update: 2008-02-15 16:57    [from the cache]
©2003-2008