Luigi
On Sat, 10 Nov 2001, Thorsten Kukuk wrote:
>
> Hi,
>
> On UltraSPARC and IA64, an "cat /proc/lvm/global" returns only
> garbage (it will print the contents of some random memory).
>
> The problem is in the _proc_read_global function. This function does
> not use the "page" parameter to return the data. Instead it allocates
> it's own buffer and change to "start" parameter to point to it.
> The "page" buffer will not be used. The culprint is now in the
> proc_file_read() function:
>
>                 /* This is a hack to allow mangling of file pos independent
>                  * of actual bytes read.  Simply place the data at page,
>                  * return the bytes, and set `start' to the desired offset
>                  * as an unsigned int. - Paul.Russell@rustcorp.com.au
>                  */
>                 n -= copy_to_user(buf, start < page ? page : start, n);
>
> In some cases (this cases seems to be always true on UltraSPARC and IA64
> and I think it works only by accident on ix32) the data from page and not
> from start is used -> page contains randam data which is printed by the
> kernel.
>
> I fixed this by the following patch (which works for me on UltraSPARC),
> but I don't know if it really correct in all cases. But I think it is.
> Don't return a pointer to the buffer, instead copy as far as possible
> data to page. This should work as before, since we never returns the
> full length of the data, but max. the length of the page buffer.
>
> --- drivers/md/lvm-fs.c	2001/11/09 19:00:38	1.1
> +++ drivers/md/lvm-fs.c	2001/11/09 20:50:16
> @@ -482,11 +480,15 @@
>  		buf = NULL;
>  		return 0;
>  	}
> -	*start = &buf[pos];
> -	if (sz - pos < count)
> +	/* *start = &buf[pos]; */
> +	if (sz - pos < count) {
> +		memcpy (page, &buf[pos], sz - pos);
>  		return sz - pos;
> -	else
> +        }
> +	else {
> +		memcpy (page, &buf[pos], count);
>  		return count;
> +	}
>
>  #undef LVM_PROC_BUF
>  }
>
>
> --
> Thorsten Kukuk       http://www.suse.de/~kukuk/        kukuk@suse.de
> SuSE GmbH            Deutschherrenstr. 15-19       D-90429 Nuernberg
> --------------------------------------------------------------------
> Key fingerprint = A368 676B 5E1B 3E46 CFCE  2D97 F8FD 4E23 56C6 FB4B
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
>
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/