From eugen@grosbein.pp.ru  Sun Mar 14 11:27:51 2010
Return-Path: <eugen@grosbein.pp.ru>
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id 0CA38106566B
	for <FreeBSD-gnats-submit@freebsd.org>; Sun, 14 Mar 2010 11:27:51 +0000 (UTC)
	(envelope-from eugen@grosbein.pp.ru)
Received: from grosbein.pp.ru (grosbein.pp.ru [89.189.172.146])
	by mx1.freebsd.org (Postfix) with ESMTP id 6366D8FC14
	for <FreeBSD-gnats-submit@freebsd.org>; Sun, 14 Mar 2010 11:27:49 +0000 (UTC)
Received: from grosbein.pp.ru (localhost [127.0.0.1])
	by grosbein.pp.ru (8.14.4/8.14.4) with ESMTP id o2EBCtPp002349
	for <FreeBSD-gnats-submit@freebsd.org>; Sun, 14 Mar 2010 18:12:55 +0700 (KRAT)
	(envelope-from eugen@grosbein.pp.ru)
Received: (from eugen@localhost)
	by grosbein.pp.ru (8.14.4/8.14.4/Submit) id o2EBCsKs002348;
	Sun, 14 Mar 2010 18:12:54 +0700 (KRAT)
	(envelope-from eugen)
Message-Id: <201003141112.o2EBCsKs002348@grosbein.pp.ru>
Date: Sun, 14 Mar 2010 18:12:54 +0700 (KRAT)
From: Eugene Grosbein <eugen@grosbein.pp.ru>
To: FreeBSD-gnats-submit@freebsd.org
Cc:
Subject: [patch] geom_cache erroneously decodes its on-disk label
X-Send-Pr-Version: 3.113
X-GNATS-Notify:

>Number:         144732
>Category:       kern
>Synopsis:       [geom] [patch] geom_cache erroneously decodes its on-disk label
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-geom
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sun Mar 14 11:30:05 UTC 2010
>Closed-Date:    Mon Jul 19 10:57:16 UTC 2010
>Last-Modified:  Mon Jul 19 11:00:16 UTC 2010
>Originator:     Eugene Grosbein
>Release:        FreeBSD 8.0-STABLE i386
>Organization:
RDTC JSC
>Environment:
System: FreeBSD grosbein.pp.ru 8.0-STABLE FreeBSD 8.0-STABLE #11: Sat Feb 6 21:23:34 KRAT 2010 root@grosbein.pp.ru:/usr/local/obj/usr/local/src/sys/DADV i386

>Description:

	Let's take a look at struct g_cache_metadata definition in
	/usr/src/sys/geom/cache/g_cache.h:

struct g_cache_metadata {
        char            md_magic[16];           /* Magic value. */
        uint32_t        md_version;             /* Version number. */
        char            md_name[16];            /* Cache value. */
        uint32_t        md_bsize;               /* Cache block size. */
        uint32_t        md_size;                /* Cache size. */
        uint64_t        md_provsize;            /* Provider's size. */
};

	Note that md_size is 32-bit unsigned value. Next lines present
	cache_metadata_encode() funtion that uses le32enc() to encode
	this value, that's right.

	Now look at cache_metadata_decode() below: it uses le16dec()
	function to decode stored label. This error effectively limits
	cache size to 16-bit quantity (and limits stripe/block size too).

>How-To-Repeat:

	kldload geom_cache
	gcache label -v -b 32768 -s 65536

	Label is written successfully but gem_cache compains to kernel log:

GEOM_CACHE: Invalid size for device ca0.

	That's because le16dec() decodes 65536 as zero cache size.

>Fix:

--- sys/geom/cache/g_cache.h.orig	2010-03-14 17:36:16.000000000 +0700
+++ sys/geom/cache/g_cache.h	2010-03-14 17:35:25.000000000 +0700
@@ -139,7 +139,7 @@
 	md->md_version = le32dec(data + 16);
 	bcopy(data + 20, md->md_name, sizeof(md->md_name));
 	md->md_bsize = le32dec(data + 36);
-	md->md_size = le16dec(data + 40);
+	md->md_size = le32dec(data + 40);
 	md->md_provsize = le64dec(data + 44);
 }
 


>Release-Note:
>Audit-Trail:
Responsible-Changed-From-To: freebsd-bugs->freebsd-geom 
Responsible-Changed-By: linimon 
Responsible-Changed-When: Mon Mar 15 06:23:00 UTC 2010 
Responsible-Changed-Why:  
Over to maintainer(s). 

http://www.freebsd.org/cgi/query-pr.cgi?pr=144732 
State-Changed-From-To: open->patched 
State-Changed-By: ru 
State-Changed-When: Wed Jul 14 08:23:17 UTC 2010 
State-Changed-Why:  
Committed to HEAD. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=144732 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/144732: commit references a PR
Date: Wed, 14 Jul 2010 08:22:10 +0000 (UTC)

 Author: ru
 Date: Wed Jul 14 08:22:00 2010
 New Revision: 210046
 URL: http://svn.freebsd.org/changeset/base/210046
 
 Log:
   Fixed cache size decoding read from a label.
   
   PR:		kern/144732
   Submitted by:	Eugene Grosbein
   MFC after:	3 days
 
 Modified:
   head/sys/geom/cache/g_cache.h
 
 Modified: head/sys/geom/cache/g_cache.h
 ==============================================================================
 --- head/sys/geom/cache/g_cache.h	Wed Jul 14 08:08:43 2010	(r210045)
 +++ head/sys/geom/cache/g_cache.h	Wed Jul 14 08:22:00 2010	(r210046)
 @@ -139,7 +139,7 @@ cache_metadata_decode(const u_char *data
  	md->md_version = le32dec(data + 16);
  	bcopy(data + 20, md->md_name, sizeof(md->md_name));
  	md->md_bsize = le32dec(data + 36);
 -	md->md_size = le16dec(data + 40);
 +	md->md_size = le32dec(data + 40);
  	md->md_provsize = le64dec(data + 44);
  }
  
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 
State-Changed-From-To: patched->closed 
State-Changed-By: ru 
State-Changed-When: Mon Jul 19 10:56:06 UTC 2010 
State-Changed-Why:  
Committed to SVN branch stable/8. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=144732 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/144732: commit references a PR
Date: Mon, 19 Jul 2010 10:55:54 +0000 (UTC)

 Author: ru
 Date: Mon Jul 19 10:55:44 2010
 New Revision: 210230
 URL: http://svn.freebsd.org/changeset/base/210230
 
 Log:
   MFC r210046: Fixed cache size decoding read from a label.
   
   PR:	  kern/144732
 
 Modified:
   stable/8/sys/geom/cache/g_cache.h
 Directory Properties:
   stable/8/sys/   (props changed)
   stable/8/sys/amd64/include/xen/   (props changed)
   stable/8/sys/cddl/contrib/opensolaris/   (props changed)
   stable/8/sys/contrib/dev/acpica/   (props changed)
   stable/8/sys/contrib/pf/   (props changed)
   stable/8/sys/dev/xen/xenpci/   (props changed)
 
 Modified: stable/8/sys/geom/cache/g_cache.h
 ==============================================================================
 --- stable/8/sys/geom/cache/g_cache.h	Mon Jul 19 07:28:35 2010	(r210229)
 +++ stable/8/sys/geom/cache/g_cache.h	Mon Jul 19 10:55:44 2010	(r210230)
 @@ -139,7 +139,7 @@ cache_metadata_decode(const u_char *data
  	md->md_version = le32dec(data + 16);
  	bcopy(data + 20, md->md_name, sizeof(md->md_name));
  	md->md_bsize = le32dec(data + 36);
 -	md->md_size = le16dec(data + 40);
 +	md->md_size = le32dec(data + 40);
  	md->md_provsize = le64dec(data + 44);
  }
  
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 
>Unformatted:
