[openib-general] Re: [RFC] [PATCH] user_mad: Support RMPP on send side

Hal Rosenstock halr at voltaire.com
Fri May 20 06:23:00 PDT 2005


On Wed, 2005-05-18 at 19:04, Roland Dreier wrote: 
> This looks OK to check in with one small comment on the following:
> 
> -	if (copy_to_user(buf, &packet->mad, sizeof packet->mad))
> +	if (copy_to_user(buf, &packet->mad,
> +			 min(count, packet->length +
> +			     sizeof (struct ib_user_mad))))
>  		ret = -EFAULT;
>  	else
> -		ret = sizeof packet->mad;
> +		ret = count;
> 
> This code will truncate a received MAD that is bigger than the buffer
> passed into read(), but return the full size of the packet.  I don't
> think read() is allowed to do this: the return value can be at most
> the count value passed in by the user.
> 
> I think we have two options: truncate and return the actual amount of
> data read to the user, or return an error if the user's buffer is too
> small.

The man page for read states:
       read()  attempts to read up to count bytes from file descriptor fd into
       the buffer starting at buf.
RETURN VALUE
       On success, the number of bytes read is returned (zero indicates end of
       file), and the file position is advanced by this number.

For RMPP reads (next set of changes to this), it would eliminate an
additional call (ioctl) if on a read that a return length larger than
the count supplied indicates that the read did not occur and the count
(buffer size) to be used for the next read to get the entire packet.

It appears to me that there is nothing that enforces the man page
behavior above in Linux so this is a "convention". Is this something we
can take advantage of or do we need to require the additional call to
get the buffer length ?

-- Hal




More information about the general mailing list