From: Douglas Gilbert <dgilbert@interlog.com>
To: Bart Van Assche <bvanassche@acm.org>,
Hannes Reinecke <hare@suse.de>,
James Bottomley <jbottomley@parallels.com>
Cc: Christoph Hellwig <hch@infradead.org>,
Ewan Milne <emilne@redhat.com>,
linux-scsi@vger.kernel.org
Subject: Re: [PATCH 6/6] scsi_scan: Fixup scsilun_to_int()
Date: Tue, 10 Jun 2014 09:41:11 -0400 [thread overview]
Message-ID: <53970AF7.40304@interlog.com> (raw)
In-Reply-To: <5396EE0C.3070108@acm.org>
On 14-06-10 07:37 AM, Bart Van Assche wrote:
> On 06/03/14 10:58, Hannes Reinecke wrote:
>> + * Given a struct scsi_lun of: d2 04 0b 03 00 00 00 00, this function
>> + * returns the integer: 0x0b03d204
>> + *
>> + * This encoding will return a standard integer LUN for LUNs smaller
>> + * than 256, which typically use a single level LUN structure with
>> + * addressing method 0.
>> **/
>> u64 scsilun_to_int(struct scsi_lun *scsilun)
>> {
>> @@ -1279,7 +1280,7 @@ u64 scsilun_to_int(struct scsi_lun *scsilun)
>>
>> lun = 0;
>> for (i = 0; i < sizeof(lun); i += 2)
>> - lun = lun | (((scsilun->scsi_lun[i] << 8) |
>> + lun = lun | (((scsilun->scsi_lun[i] << ((i + 1) *8)) |
>> scsilun->scsi_lun[i + 1]) << (i * 8));
>> return lun;
>> }
>
> The above code doesn't match the comment header. Parentheses have been
> placed such that each byte with an even index is shifted left (2*i+1)*8
> bits instead of (i+1)*8. I assume this means the parentheses have been
> misplaced ? Another bug in this code is that a cast from
> scsilun->scsi_lun[i] from u8 to u64 is missing. I think the shift
> operations in the above code trigger what is called undefined behavior
> in the C standard if i >= 4.
Hmm, we have been over this ground before. In sg_luns,
to support translating between the T10 and Linux
representation of 64 bit LUNs, there are these two
versions:
static uint64_t
t10_2linux_lun(const unsigned char t10_lun[])
{
const unsigned char * cp;
uint64_t res;
res = (t10_lun[6] << 8) + t10_lun[7];
for (cp = t10_lun + 4; cp >= t10_lun; cp -= 2) {
res <<= 16;
res += (*cp << 8) + *(cp + 1);
}
return res;
}
/* Copy of t10_lun --> Linux unsigned int (i.e. 32 bit ) present in Linux
* kernel, up to least lk 3.8.0, extended to 64 bits.
* BEWARE: for sizeof(int==4) this function is BROKEN and is left here as
* as example and may soon be removed. */
static uint64_t
t10_2linux_lun64bitBR(const unsigned char t10_lun[])
{
int i;
uint64_t lun;
lun = 0;
for (i = 0; i < (int)sizeof(lun); i += 2)
lun = lun | (((t10_lun[i] << 8) | t10_lun[i + 1]) << (i * 8));
return lun;
}
The second one (with "BR" (for broken) appended) is for testing.
And that second one looks very similar to the code you are
objecting to.
Doug Gilbert
next prev parent reply other threads:[~2014-06-10 13:41 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-03 8:58 [PATCHv4 0/6] Support 64-bit LUNs Hannes Reinecke
2014-06-03 8:58 ` [PATCH 1/6] scsi: Remove CONFIG_SCSI_MULTI_LUN Hannes Reinecke
2014-06-03 8:58 ` [PATCH 2/6] scsi_scan: Restrict sequential scan to 256 LUNs Hannes Reinecke
2014-06-03 8:58 ` [PATCH 3/6] qla2xxx: Restrict max_lun to 16-bit for older HBAs Hannes Reinecke
2014-06-03 8:58 ` [PATCH 4/6] scsi: use 64-bit LUNs Hannes Reinecke
2014-06-03 8:58 ` [PATCH 5/6] scsi: use 64-bit value for 'max_luns' Hannes Reinecke
2014-06-25 12:28 ` Christoph Hellwig
2014-06-25 12:31 ` Hannes Reinecke
2014-06-25 12:33 ` Christoph Hellwig
2014-07-09 0:00 ` Rusty Russell
2014-06-03 8:58 ` [PATCH 6/6] scsi_scan: Fixup scsilun_to_int() Hannes Reinecke
2014-06-10 11:37 ` Bart Van Assche
2014-06-10 13:41 ` Douglas Gilbert [this message]
2014-06-10 14:06 ` James Bottomley
2014-06-10 14:48 ` Bart Van Assche
2014-06-10 15:01 ` James Bottomley
2014-06-10 16:08 ` Bart Van Assche
2014-06-10 14:55 ` Douglas Gilbert
2014-06-10 17:58 ` [PATCHv4 0/6] Support 64-bit LUNs Bart Van Assche
2014-06-11 6:34 ` Hannes Reinecke
2014-06-11 6:53 ` Bart Van Assche
2014-06-11 13:44 ` Douglas Gilbert
-- strict thread matches above, loose matches on Subject: below --
2014-06-25 11:20 [PATCH 6/6] scsi_scan: Fixup scsilun_to_int() Hannes Reinecke
2014-05-31 9:01 [PATCHv3 0/6] Support 64-bit LUNs Hannes Reinecke
2014-05-31 9:01 ` [PATCH 6/6] scsi_scan: Fixup scsilun_to_int() Hannes Reinecke
2014-06-02 16:03 ` James Bottomley
2014-06-02 16:16 ` Bart Van Assche
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=53970AF7.40304@interlog.com \
--to=dgilbert@interlog.com \
--cc=bvanassche@acm.org \
--cc=emilne@redhat.com \
--cc=hare@suse.de \
--cc=hch@infradead.org \
--cc=jbottomley@parallels.com \
--cc=linux-scsi@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).