From nobody@FreeBSD.org  Thu Mar  1 07:15:23 2012
Return-Path: <nobody@FreeBSD.org>
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id 7C248106566C
	for <freebsd-gnats-submit@FreeBSD.org>; Thu,  1 Mar 2012 07:15:23 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from red.freebsd.org (red.freebsd.org [IPv6:2001:4f8:fff6::22])
	by mx1.freebsd.org (Postfix) with ESMTP id 6845E8FC08
	for <freebsd-gnats-submit@FreeBSD.org>; Thu,  1 Mar 2012 07:15:23 +0000 (UTC)
Received: from red.freebsd.org (localhost [127.0.0.1])
	by red.freebsd.org (8.14.4/8.14.4) with ESMTP id q217FNd8016133
	for <freebsd-gnats-submit@FreeBSD.org>; Thu, 1 Mar 2012 07:15:23 GMT
	(envelope-from nobody@red.freebsd.org)
Received: (from nobody@localhost)
	by red.freebsd.org (8.14.4/8.14.4/Submit) id q217FN2q016131;
	Thu, 1 Mar 2012 07:15:23 GMT
	(envelope-from nobody)
Message-Id: <201203010715.q217FN2q016131@red.freebsd.org>
Date: Thu, 1 Mar 2012 07:15:23 GMT
From: Pavel Timofeev <timp87@gmail.com>
To: freebsd-gnats-submit@FreeBSD.org
Subject: Strange behavior of geom_part_* modules
X-Send-Pr-Version: www-3.1
X-GNATS-Notify:

>Number:         165573
>Category:       kern
>Synopsis:       [geom] Strange behavior of geom_part_* modules
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-geom
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Mar 01 07:20:10 UTC 2012
>Closed-Date:    Fri Apr 13 04:19:28 UTC 2012
>Last-Modified:  Fri Apr 13 04:20:14 UTC 2012
>Originator:     Pavel Timofeev
>Release:        FreeBSD 9.0-RELEASE i386
>Organization:
>Environment:
>Description:
Hello!
I have found some strange behavior of geom_part(gpt|mbr|bsd|ebr) modules.

Kernel can't boot if your kernel config contains these options and you add geom_part(gpt|mbr|bsd|ebr)_load="YES" to loader.conf

I have made some tests with default 9.0R and 8.3B1:
9.0-RELEASE i386 default gpt ufs
geom_part_gtp_load - boots ok
geom_part_mbr_load - boot stops (on usb detect)
geom_part_bsd_load - can't mount fs
geom_part_ebr_load - can't mount fs


8.3-BETA1 amd64 default mbr ufs
geom_part_gtp_load - can't mount fs
geom_part_mbr_load - boot stops (on usb detect)
geom_part_bsd_load - can't mount fs
geom_part_ebr_load - can't mount fs
>How-To-Repeat:
Just add to loader.conf these options
geom_part_gpt_load="YES"
geom_part_bsd_load="YES"
geom_part_ebr_load="YES"
geom_part_mbr_load="YES"
>Fix:


>Release-Note:
>Audit-Trail:

From: Pavel Timofeev <timp87@gmail.com>
To: bug-followup@FreeBSD.org, timp87@gmail.com
Cc:  
Subject: Re: kern/165573: Strange behavior of geom_part_* modules
Date: Thu, 1 Mar 2012 11:29:26 +0400

 10-CURRENT behavior same as 9.0-RELEASE
Responsible-Changed-From-To: freebsd-bugs->freebsd-geom 
Responsible-Changed-By: linimon 
Responsible-Changed-When: Mon Mar 12 07:28:00 UTC 2012 
Responsible-Changed-Why:  
Over to maintainer(s). 

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

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/165573: commit references a PR
Date: Fri, 23 Mar 2012 07:26:27 +0000 (UTC)

 Author: ae
 Date: Fri Mar 23 07:26:17 2012
 New Revision: 233342
 URL: http://svn.freebsd.org/changeset/base/233342
 
 Log:
   Check that scheme is not already registered. This may happens when a
   KLD is preloaded with loader(8) and leads to infinity loops.
   
   Also do not return EEXIST error code from MOD_LOAD handler, because
   we have undocumented(?) ability replace kernel's module with preloaded one.
   And if we have so, then preloaded module will be initialized first.
   Thus error in MOD_LOAD handler will be triggered for the kernel.
   
   PR:		kern/165573
   MFC after:	3 weeks
 
 Modified:
   head/sys/geom/part/g_part.c
 
 Modified: head/sys/geom/part/g_part.c
 ==============================================================================
 --- head/sys/geom/part/g_part.c	Fri Mar 23 06:57:04 2012	(r233341)
 +++ head/sys/geom/part/g_part.c	Fri Mar 23 07:26:17 2012	(r233342)
 @@ -2211,23 +2211,32 @@ g_part_unload_event(void *arg, int flag)
  int
  g_part_modevent(module_t mod, int type, struct g_part_scheme *scheme)
  {
 +	struct g_part_scheme *iter;
  	uintptr_t arg;
  	int error;
  
 +	error = 0;
  	switch (type) {
  	case MOD_LOAD:
 -		TAILQ_INSERT_TAIL(&g_part_schemes, scheme, scheme_list);
 -
 -		error = g_retaste(&g_part_class);
 -		if (error)
 -			TAILQ_REMOVE(&g_part_schemes, scheme, scheme_list);
 +		TAILQ_FOREACH(iter, &g_part_schemes, scheme_list) {
 +			if (scheme == iter) {
 +				printf("GEOM_PART: scheme %s is already "
 +				    "registered!\n", scheme->name);
 +				break;
 +			}
 +		}
 +		if (iter == NULL) {
 +			TAILQ_INSERT_TAIL(&g_part_schemes, scheme,
 +			    scheme_list);
 +			g_retaste(&g_part_class);
 +		}
  		break;
  	case MOD_UNLOAD:
  		arg = (uintptr_t)scheme;
  		error = g_waitfor_event(g_part_unload_event, &arg, M_WAITOK,
  		    NULL);
 -		if (!error)
 -			error = (arg == (uintptr_t)scheme) ? EDOOFUS : arg;
 +		if (error == 0)
 +			error = arg;
  		break;
  	default:
  		error = EOPNOTSUPP;
 _______________________________________________
 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: open->patched 
State-Changed-By: ae 
State-Changed-When: Fri Mar 23 07:32:13 UTC 2012 
State-Changed-Why:  
Patched in head/. Thanks! 

http://www.freebsd.org/cgi/query-pr.cgi?pr=165573 
State-Changed-From-To: patched->closed 
State-Changed-By: ae 
State-Changed-When: Fri Apr 13 04:18:58 UTC 2012 
State-Changed-Why:  
Merged to stable/8 and stable/9. Thanks! 

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

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/165573: commit references a PR
Date: Fri, 13 Apr 2012 04:17:59 +0000 (UTC)

 Author: ae
 Date: Fri Apr 13 04:17:43 2012
 New Revision: 234198
 URL: http://svn.freebsd.org/changeset/base/234198
 
 Log:
   MFC r233000:
     Add MODULE_DEPEND() to geom_part modules.
   
   MFC r233342:
     Check that scheme is not already registered. This may happens when a
     KLD is preloaded with loader(8) and leads to infinity loop.
   
     Also do not return EEXIST error code from MOD_LOAD handler, because
     we have undocumented(?) ability replace kernel's module with preloaded one.
     And if we have so, then preloaded module will be initialized first.
     Thus error in MOD_LOAD handler will be triggered for the kernel.
   
     PR:		kern/165573
 
 Modified:
   stable/9/sys/geom/part/g_part.c
   stable/9/sys/geom/part/g_part.h
 Directory Properties:
   stable/9/sys/   (props changed)
 
 Modified: stable/9/sys/geom/part/g_part.c
 ==============================================================================
 --- stable/9/sys/geom/part/g_part.c	Thu Apr 12 23:06:07 2012	(r234197)
 +++ stable/9/sys/geom/part/g_part.c	Fri Apr 13 04:17:43 2012	(r234198)
 @@ -145,6 +145,7 @@ static struct g_class g_part_class = {
  };
  
  DECLARE_GEOM_CLASS(g_part_class, g_part);
 +MODULE_VERSION(g_part, 0);
  
  /*
   * Support functions.
 @@ -2208,23 +2209,32 @@ g_part_unload_event(void *arg, int flag)
  int
  g_part_modevent(module_t mod, int type, struct g_part_scheme *scheme)
  {
 +	struct g_part_scheme *iter;
  	uintptr_t arg;
  	int error;
  
 +	error = 0;
  	switch (type) {
  	case MOD_LOAD:
 -		TAILQ_INSERT_TAIL(&g_part_schemes, scheme, scheme_list);
 -
 -		error = g_retaste(&g_part_class);
 -		if (error)
 -			TAILQ_REMOVE(&g_part_schemes, scheme, scheme_list);
 +		TAILQ_FOREACH(iter, &g_part_schemes, scheme_list) {
 +			if (scheme == iter) {
 +				printf("GEOM_PART: scheme %s is already "
 +				    "registered!\n", scheme->name);
 +				break;
 +			}
 +		}
 +		if (iter == NULL) {
 +			TAILQ_INSERT_TAIL(&g_part_schemes, scheme,
 +			    scheme_list);
 +			g_retaste(&g_part_class);
 +		}
  		break;
  	case MOD_UNLOAD:
  		arg = (uintptr_t)scheme;
  		error = g_waitfor_event(g_part_unload_event, &arg, M_WAITOK,
  		    NULL);
 -		if (!error)
 -			error = (arg == (uintptr_t)scheme) ? EDOOFUS : arg;
 +		if (error == 0)
 +			error = arg;
  		break;
  	default:
  		error = EOPNOTSUPP;
 
 Modified: stable/9/sys/geom/part/g_part.h
 ==============================================================================
 --- stable/9/sys/geom/part/g_part.h	Thu Apr 12 23:06:07 2012	(r234197)
 +++ stable/9/sys/geom/part/g_part.h	Fri Apr 13 04:17:43 2012	(r234198)
 @@ -208,6 +208,7 @@ int g_part_modevent(module_t, int, struc
  	name##_modevent,					\
  	&name##_scheme						\
      };								\
 -    DECLARE_MODULE(name, name##_mod, SI_SUB_DRIVERS, SI_ORDER_ANY)
 +    DECLARE_MODULE(name, name##_mod, SI_SUB_DRIVERS, SI_ORDER_ANY); \
 +    MODULE_DEPEND(name, g_part, 0, 0, 0)
  
  #endif /* !_GEOM_PART_H_ */
 _______________________________________________
 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"
 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/165573: commit references a PR
Date: Fri, 13 Apr 2012 04:18:21 +0000 (UTC)

 Author: ae
 Date: Fri Apr 13 04:18:12 2012
 New Revision: 234199
 URL: http://svn.freebsd.org/changeset/base/234199
 
 Log:
   MFC r233000:
     Add MODULE_DEPEND() to geom_part modules.
   
   MFC r233342:
     Check that scheme is not already registered. This may happens when a
     KLD is preloaded with loader(8) and leads to infinity loop.
   
     Also do not return EEXIST error code from MOD_LOAD handler, because
     we have undocumented(?) ability replace kernel's module with preloaded one.
     And if we have so, then preloaded module will be initialized first.
     Thus error in MOD_LOAD handler will be triggered for the kernel.
   
     PR:		kern/165573
 
 Modified:
   stable/8/sys/geom/part/g_part.c
   stable/8/sys/geom/part/g_part.h
 Directory Properties:
   stable/8/sys/   (props changed)
 
 Modified: stable/8/sys/geom/part/g_part.c
 ==============================================================================
 --- stable/8/sys/geom/part/g_part.c	Fri Apr 13 04:17:43 2012	(r234198)
 +++ stable/8/sys/geom/part/g_part.c	Fri Apr 13 04:18:12 2012	(r234199)
 @@ -145,6 +145,7 @@ static struct g_class g_part_class = {
  };
  
  DECLARE_GEOM_CLASS(g_part_class, g_part);
 +MODULE_VERSION(g_part, 0);
  
  /*
   * Support functions.
 @@ -2135,23 +2136,32 @@ g_part_unload_event(void *arg, int flag)
  int
  g_part_modevent(module_t mod, int type, struct g_part_scheme *scheme)
  {
 +	struct g_part_scheme *iter;
  	uintptr_t arg;
  	int error;
  
 +	error = 0;
  	switch (type) {
  	case MOD_LOAD:
 -		TAILQ_INSERT_TAIL(&g_part_schemes, scheme, scheme_list);
 -
 -		error = g_retaste(&g_part_class);
 -		if (error)
 -			TAILQ_REMOVE(&g_part_schemes, scheme, scheme_list);
 +		TAILQ_FOREACH(iter, &g_part_schemes, scheme_list) {
 +			if (scheme == iter) {
 +				printf("GEOM_PART: scheme %s is already "
 +				    "registered!\n", scheme->name);
 +				break;
 +			}
 +		}
 +		if (iter == NULL) {
 +			TAILQ_INSERT_TAIL(&g_part_schemes, scheme,
 +			    scheme_list);
 +			g_retaste(&g_part_class);
 +		}
  		break;
  	case MOD_UNLOAD:
  		arg = (uintptr_t)scheme;
  		error = g_waitfor_event(g_part_unload_event, &arg, M_WAITOK,
  		    NULL);
 -		if (!error)
 -			error = (arg == (uintptr_t)scheme) ? EDOOFUS : arg;
 +		if (error == 0)
 +			error = arg;
  		break;
  	default:
  		error = EOPNOTSUPP;
 
 Modified: stable/8/sys/geom/part/g_part.h
 ==============================================================================
 --- stable/8/sys/geom/part/g_part.h	Fri Apr 13 04:17:43 2012	(r234198)
 +++ stable/8/sys/geom/part/g_part.h	Fri Apr 13 04:18:12 2012	(r234199)
 @@ -208,6 +208,7 @@ int g_part_modevent(module_t, int, struc
  	name##_modevent,					\
  	&name##_scheme						\
      };								\
 -    DECLARE_MODULE(name, name##_mod, SI_SUB_DRIVERS, SI_ORDER_ANY)
 +    DECLARE_MODULE(name, name##_mod, SI_SUB_DRIVERS, SI_ORDER_ANY); \
 +    MODULE_DEPEND(name, g_part, 0, 0, 0)
  
  #endif /* !_GEOM_PART_H_ */
 _______________________________________________
 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:
