svn commit: r274628 - head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs

Andriy Gapon avg at FreeBSD.org
Mon Nov 17 16:29:35 UTC 2014


On 17/11/2014 18:14, Steven Hartland wrote:
> 
> On 17/11/2014 15:07, Andriy Gapon wrote:
>> On 17/11/2014 17:06, Steven Hartland wrote:
>>> Looks like this could have introduced random data corruption, have you seen this
>>> in practice?
>> Which part exactly?
> The part where it zeroed beyond the allocated buffer.

Oh, maybe I worded the commit message badly, but I wanted to say was that *if* I
replaced SPA_MINBLOCKSIZE with vdev_ashift, but left the zeroing code where it
was before, then there would be zeroing beyond the buffer.  There was no
corruption with the previous code.

>>> On 17/11/2014 14:45, Andriy Gapon wrote:
>>>> Author: avg
>>>> Date: Mon Nov 17 14:45:42 2014
>>>> New Revision: 274628
>>>> URL: https://svnweb.freebsd.org/changeset/base/274628
>>>>
>>>> Log:
>>>>     l2arc: restore correct rounding up of asize of compressed data
>>>>        This rounding up was lost in a mismerge of illumos code.
>>>>     See r268075 MFV r267565.
>>>>     After that commit zio_compress_data() no longer performs any compressed
>>>>     size adjustment, so it needs to be done externally.  On FreeBSD we round
>>>>     up the size using vdev_ashift rather than SPA_MINBLOCKSIZE so that 4KB
>>>>     devices are properly supported.
>>>>        Additionally, zero out the buffer tail only if compression succeeds.
>>>>     The compression is considered successful if the size of compressed
>>>>     data after rounding up to account for the vdev ashift is less than the
>>>>     original data size.  It does not make sense to have the data compressed
>>>>     if all the savings are lost to rounding up.
>>>>     With the new zio_compress_data() it could have been possible that the
>>>>     rounded compressed size would be greater than the original size and thus
>>>>     we could zero beyond the allocated buffer if the zeroing code was kept
>>>>     at the original place.
>>>>        Discussed with:    delphij, gibbs
>>>>     MFC after:    2 weeks
>>>>     X-MFC with:    r274627
>>>>
>>>> Modified:
>>>>     head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
>>>>
>>>> Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
>>>> ==============================================================================
>>>> --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c    Mon Nov 17
>>>> 14:16:02 2014    (r274627)
>>>> +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c    Mon Nov 17
>>>> 14:45:42 2014    (r274628)
>>>> @@ -5326,12 +5326,6 @@ l2arc_compress_buf(l2arc_buf_hdr_t *l2hd
>>>>        csize = zio_compress_data(ZIO_COMPRESS_LZ4, l2hdr->b_tmp_cdata,
>>>>            cdata, l2hdr->b_asize);
>>>>    -    rounded = P2ROUNDUP(csize, (size_t)SPA_MINBLOCKSIZE);
>>>> -    if (rounded > csize) {
>>>> -        bzero((char *)cdata + csize, rounded - csize);
>>>> -        csize = rounded;
>>>> -    }
>>>> -
>>>>        if (csize == 0) {
>>>>            /* zero block, indicate that there's nothing to write */
>>>>            zio_data_buf_free(cdata, len);
>>>> @@ -5340,11 +5334,19 @@ l2arc_compress_buf(l2arc_buf_hdr_t *l2hd
>>>>            l2hdr->b_tmp_cdata = NULL;
>>>>            ARCSTAT_BUMP(arcstat_l2_compress_zeros);
>>>>            return (B_TRUE);
>>>> -    } else if (csize > 0 && csize < len) {
>>>> +    }
>>>> +
>>>> +    rounded = P2ROUNDUP(csize,
>>>> +        (size_t)1 << l2hdr->b_dev->l2ad_vdev->vdev_ashift);
>>>> +    if (rounded < len) {
>>>>            /*
>>>>             * Compression succeeded, we'll keep the cdata around for
>>>>             * writing and release it afterwards.
>>>>             */
>>>> +        if (rounded > csize) {
>>>> +            bzero((char *)cdata + csize, rounded - csize);
>>>> +            csize = rounded;
>>>> +        }
>>>>            l2hdr->b_compress = ZIO_COMPRESS_LZ4;
>>>>            l2hdr->b_asize = csize;
>>>>            l2hdr->b_tmp_cdata = cdata;
>>>>
>>
> 


-- 
Andriy Gapon


More information about the svn-src-all mailing list