Messages in this thread Patch in this message |  | | | Subject | Re: [PATCH] SCSI: fix data corruption caused by ses v2 | | From | James Bottomley <> | | Date | Fri, 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) {
|  |