Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 15 Feb 2006 17:29:32 +0700 (KRAT)
From:      Eugene Grosbein <eugen@grosbein.pp.ru>
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   kern/93381: reboot(8) works but 'reboot -n' hangs
Message-ID:  <200602151029.k1FATW95065244@kost.svzserv.kemerovo.su>
Resent-Message-ID: <200602151040.k1FAe35h018524@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         93381
>Category:       kern
>Synopsis:       reboot(8) works but 'reboot -n' hangs
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Wed Feb 15 10:40:02 GMT 2006
>Closed-Date:
>Last-Modified:
>Originator:     Eugene Grosbein
>Release:        FreeBSD 6.1-PRERELEASE i386
>Organization:
Svyaz-Service JSC
>Environment:
System: FreeBSD kost.svzserv.kemerovo.su 6.1-PRERELEASE FreeBSD 6.1-PRERELEASE #8: Wed Feb 15 06:40:36 KRAT 2006 eugen@kost.svzserv.kemerovo.su:/usr/obj/usr/src/sys/TEST i386

>Description:
	While testing NanoBSD running from USB flash (umass/da0)
	I discovered that 'reboot -n' hangs the box just after 'Uptime ...'
	is printed to console. Meantime, 'shutdown -r'
	and plain 'reboot' works.

	I've added lots of printf's into my kernel and traced the a bit.

1. boot() from src/sys/kern/kern_shutdown.c calls
   EVENTHANDLER_INVOKE(shutdown_post_sync, howto);
2. dashutdown() from src/sys/cam/scsi/scsi_da.c is called
   from shutdown_post_sync;
3. dashutdown() calls xpt_polled_action() from src/sys/cam/cam_xpt.c
4. xpt_polled_action() has the following code:

        if (timeout != 0) {
                xpt_action(start_ccb);
                while(--timeout > 0) {
                        (*(sim->sim_poll))(sim);
                        camisr(&cam_bioq);
                        if ((start_ccb->ccb_h.status  & CAM_STATUS_MASK)
                            != CAM_REQ_INPROG)
                                break;
                        DELAY(1000);
                }

This 'while' loop is effectively endless for that case.
timeout appears to be 3600000 (yes, five zeroes) here.

>How-To-Repeat:

	Run FreeBSD with root partition being /dev/da0s1a and USB flash.
	Try to reboot it using 'reboot -n'.
>Fix:

	Unknown
>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200602151029.k1FATW95065244>