* [PATCH] FIX: sysfs_disk_to_scsi_id() adapted to current sysfs format
@ 2011-02-16 12:40 Krzysztof Wojcik
2011-02-17 6:17 ` NeilBrown
0 siblings, 1 reply; 3+ messages in thread
From: Krzysztof Wojcik @ 2011-02-16 12:40 UTC (permalink / raw)
To: neilb
Cc: linux-raid, wojciech.neubauer, adam.kwolek, dan.j.williams,
ed.ciechanowski
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.
Signed-off-by: Krzysztof Wojcik <krzysztof.wojcik@intel.com>
---
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;
}
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] FIX: sysfs_disk_to_scsi_id() adapted to current sysfs format
2011-02-16 12:40 [PATCH] FIX: sysfs_disk_to_scsi_id() adapted to current sysfs format Krzysztof Wojcik
@ 2011-02-17 6:17 ` NeilBrown
2011-02-17 12:35 ` Wojcik, Krzysztof
0 siblings, 1 reply; 3+ messages in thread
From: NeilBrown @ 2011-02-17 6:17 UTC (permalink / raw)
To: Krzysztof Wojcik
Cc: linux-raid, wojciech.neubauer, adam.kwolek, dan.j.williams,
ed.ciechanowski
On Wed, 16 Feb 2011 13:40:21 +0100 Krzysztof Wojcik
<krzysztof.wojcik@intel.com> 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.
Thanks,
NeilBrown
>
> Signed-off-by: Krzysztof Wojcik <krzysztof.wojcik@intel.com>
> ---
> 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;
> }
^ permalink raw reply [flat|nested] 3+ messages in thread
* RE: [PATCH] FIX: sysfs_disk_to_scsi_id() adapted to current sysfs format
2011-02-17 6:17 ` NeilBrown
@ 2011-02-17 12:35 ` Wojcik, Krzysztof
0 siblings, 0 replies; 3+ messages in thread
From: Wojcik, Krzysztof @ 2011-02-17 12:35 UTC (permalink / raw)
To: NeilBrown
Cc: linux-raid@vger.kernel.org, Neubauer, Wojciech, Kwolek, Adam,
Williams, Dan J, Ciechanowski, Ed
> -----Original Message-----
> From: NeilBrown [mailto:neilb@suse.de]
> Sent: Thursday, February 17, 2011 7:18 AM
> To: Wojcik, Krzysztof
> Cc: linux-raid@vger.kernel.org; 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@intel.com> 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@intel.com>
> > ---
> > 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;
> > }
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2011-02-17 12:35 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-02-16 12:40 [PATCH] FIX: sysfs_disk_to_scsi_id() adapted to current sysfs format Krzysztof Wojcik
2011-02-17 6:17 ` NeilBrown
2011-02-17 12:35 ` Wojcik, Krzysztof
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox