RE: [PATCH] FIX: sysfs_disk_to_scsi_id() adapted to current sysfs format

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> -----Original Message-----
> From: NeilBrown [mailto:neilb@xxxxxxx]
> Sent: Thursday, February 17, 2011 7:18 AM
> To: Wojcik, Krzysztof
> Cc: linux-raid@xxxxxxxxxxxxxxx; Neubauer, Wojciech; Kwolek, Adam;
> Williams, Dan J; Ciechanowski, Ed
> Subject: Re: [PATCH] FIX: sysfs_disk_to_scsi_id() adapted to current
> sysfs format
> 
> On Wed, 16 Feb 2011 13:40:21 +0100 Krzysztof Wojcik
> <krzysztof.wojcik@xxxxxxxxx> wrote:
> 
> > Problem: sysfs_disk_to_scsi_id() not returns correct scsi_id value.
> > Reason: sysfs format has been changed
> >
> > This patch adapt sysfs_disk_to_scsi_id() to new sysfs format.
> 
> If there has been a change in sysfs format, we want the code to work in
> both
> old and new cases.
> 
> Do you know if this new code works in the 'old' case?  Do you know when
> (which kernel version) the change happened, or at least can you name a
> kernel
> version when the 'old' style worked.
> 
> The patch looks OK, but I want to be sure all bases are covered.

I tested the patch with a few versions of kernels since 2.6.27. The patch works with all versions.
I haven't found kernel working properly with initial code.
I assume that scsi_id field was not filled properly for a long time.
It is not critical because scsi_id is not currently used by mdadm so bug hasn't been discovered earlier.
For today scsi_id is important from the viewpoint of IMSM metadata compatibility only.
I suggest to apply the patch.

> 
> Thanks,
> NeilBrown
> 
> 
> >
> > Signed-off-by: Krzysztof Wojcik <krzysztof.wojcik@xxxxxxxxx>
> > ---
> >  sysfs.c |   14 ++++++--------
> >  1 files changed, 6 insertions(+), 8 deletions(-)
> >
> > diff --git a/sysfs.c b/sysfs.c
> > index f0773d4..883a834 100644
> > --- a/sysfs.c
> > +++ b/sysfs.c
> > @@ -705,7 +705,7 @@ int sysfs_disk_to_scsi_id(int fd, __u32 *id)
> >  	if (fstat(fd, &st))
> >  		return 1;
> >
> > -	snprintf(path, sizeof(path), "/sys/dev/block/%d:%d/device",
> > +	snprintf(path, sizeof(path),
> "/sys/dev/block/%d:%d/device/scsi_device",
> >  		 major(st.st_rdev), minor(st.st_rdev));
> >
> >  	dir = opendir(path);
> > @@ -714,8 +714,7 @@ int sysfs_disk_to_scsi_id(int fd, __u32 *id)
> >
> >  	de = readdir(dir);
> >  	while (de) {
> > -		if (strncmp("scsi_disk:", de->d_name,
> > -			    strlen("scsi_disk:")) == 0)
> > +		if (strchr(de->d_name, ':'))
> >  			break;
> >  		de = readdir(dir);
> >  	}
> > @@ -724,21 +723,20 @@ int sysfs_disk_to_scsi_id(int fd, __u32 *id)
> >  	if (!de)
> >  		return 1;
> >
> > -	c1 = strchr(de->d_name, ':');
> > -	c1++;
> > +	c1 = de->d_name;
> >  	c2 = strchr(c1, ':');
> >  	*c2 = '\0';
> >  	*id = strtol(c1, NULL, 10) << 24; /* host */
> >  	c1 = c2 + 1;
> >  	c2 = strchr(c1, ':');
> >  	*c2 = '\0';
> > -	*id |= strtol(c1, NULL, 10) << 16; /* channel */
> > +	*id |= strtol(c1, NULL, 10) << 16; /* bus */
> >  	c1 = c2 + 1;
> >  	c2 = strchr(c1, ':');
> >  	*c2 = '\0';
> > -	*id |= strtol(c1, NULL, 10) << 8; /* lun */
> > +	*id |= strtol(c1, NULL, 10) << 8; /* target */
> >  	c1 = c2 + 1;
> > -	*id |= strtol(c1, NULL, 10); /* id */
> > +	*id |= strtol(c1, NULL, 10); /* lun */
> >
> >  	return 0;
> >  }

--
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux