From: Christoph Hellwig <hch-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
To: Steve French <smfrench-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Cc: linux-cifs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
Jeff Layton <jlayton-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Subject: Re: Removing endian warning due to mixed endian use by cifs of smb_buf_length
Date: Wed, 16 Mar 2011 05:25:27 -0400 [thread overview]
Message-ID: <20110316092527.GA13400@infradead.org> (raw)
In-Reply-To: <AANLkTikJM39qVWtUa2uU4+zyUSYc0X+56q04vFzV61NN-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
On Tue, Mar 15, 2011 at 05:58:20PM -0500, Steve French wrote:
> I wanted to make the following trivial change to cifs's smb_sendv to
> allow smb2 (the smb2 code treats the RFC1001 length as always big
> endian, its native form, while cifs only converts it to bigendian at
> the last possible moment) to use cifs's smb_sendv routine to put data
> on the wire:
> +int smb_sendv(struct TCP_Server_Info *server, struct kvec *iov, int n_vec)
> {
> int rc = 0;
> int i = 0;
> @@ -154,7 +153,17 @@ smb_sendv(struct TCP_Server_Info *server, struct
> kvec *iov, int n_vec)
> for (i = 0; i < n_vec; i++)
> total_len += iov[i].iov_len;
>
> - smb_buffer->smb_buf_length = cpu_to_be32(smb_buffer->smb_buf_length);
> + /* In SMB2 we treat the buffer length in its native form
> + (always be32 for RFC1001 length), but in all of the cifs
> + callers the equivalent, smb_buf_length, is treated
> + as host endian until right before we send it (here) so
> + has to be converted to big endian below. Would be
> + too big a change for cifspdu.c to change the many
> + dozen places that treat it as host endian for cifs, but
> + at least for smb2 we can treat it as host endian */
> + if (server->is_smb2 == false)
> + smb_buffer->smb_buf_length = (__force __u32)
> + cpu_to_be32(smb_buffer->smb_buf_length);
NACK. You really need to maintain smb_buf_length properly in BE format
for cifs, too.
> Jeff prefers that we change cifs (a much larger change, hits about 100
> places) to make:
> u32 smb_buf_length;
> instead (as it actually is on the wire)
> _be32 smb_buf_length;
>
> Basically this requires at least 50 changes like:
> pSMB->hdr.smb_buf_length += byte_count;
> to
> pSMB->hdr.smb_buf_length =
> cpu_to_be32(be32_to_cpu(pSMB->hdr.smb_buf_length) + byte_count);
> (or an equivalent macro)
>
> and about 40 other changes. This is marginally slower than the
> current cifs approach, but is more accurate and intuitive in some
> ways.
And it's provable correct. With the proper macro it's not a problem at
all, we have similar fields in XFS, too. It's also not more cpu
intensive on most architectures that either have special store as big
endian instruction or eat up the byteswap in the pipeline.
prev parent reply other threads:[~2011-03-16 9:25 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-03-15 22:58 Removing endian warning due to mixed endian use by cifs of smb_buf_length Steve French
[not found] ` <AANLkTikJM39qVWtUa2uU4+zyUSYc0X+56q04vFzV61NN-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2011-03-16 9:25 ` Christoph Hellwig [this message]
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=20110316092527.GA13400@infradead.org \
--to=hch-wegcikhe2lqwvfeawa7xhq@public.gmane.org \
--cc=jlayton-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
--cc=linux-cifs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=smfrench-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.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