Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 14 Aug 2003 11:01:13 -0400
From:      Eric Jacobs <eaja@erols.com>
To:        freebsd-current@freebsd.org
Subject:   Re: usbd does not use detach
Message-ID:  <20030814110113.4d238ddd.eaja@erols.com>
In-Reply-To: <1060504397.777.15.camel@syrenna.deep-ocean.local>
References:  <1059835661.1198.7.camel@Twoflower.liebende.de> <1060185309.676.1.camel@Twoflower.liebende.de> <1060504397.777.15.camel@syrenna.deep-ocean.local>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, 14 Aug 2003 14:30:06 +0000
Olivier Cortes <olive@deep-ocean.org> wrote:

> Le Mer 06/08/2003 à 17:55, Jan Stocker a écrit :
> > Does nobody has this problem or does noone use this feature?
> 
> the problem i see with detach is the "utility" of the command.
> 
> example: my digital photo recorder.
> i have an attach script to mount automatically the partition on the
> cooresponding umass/da device. works great, and this helps.
> 
> but when detaching, the umount part should be done BEFORE detaching, not
> after. i can't find any good use for the detach hook. most of things
> should have been done before detaching, and i can't see how to do it
> without user interactivity, thus avoiding use of the detach hook.

The problem with this is that the system will be asking the FS to
e.g. flush buffers to a disk which it knows doesn't exist anymore, which
is an error (and will cause errors).

My proposal is that we need to amend newbus somewhat like this:

#
# Detach a device.  This can be called if the user is replacing the
# driver software or if a device is about to be physically removed 
# from the system (e.g. for pccard devices).  Returns 0 on success.
#
# The flags argument provides more information about the cause of
# the detach and the expected behavior of this function. Possible
# values:
#
#    DETACH_NORMAL: Detach succeeds only if no clients would be
#        affected by removing this device from the system. May
#        return EBUSY otherwise.
#
#    DETACH_FORCE: Clients using the device must be disconnected,
#        typically by revoking open file descriptors. May not
#        return EBUSY due to client activitiy, but may return
#        that or other errors due to hardware problems or
#        limitations.
#
#    DETACH_EJECTED: This call is made from a lower-level bus   
#        driver when the device has been physically removed from
#        the system. Like DETACH_FORCE, except that drivers can
#        avoid attemping (and failing) to reset the hardware
#        state. This request must succeed.
#
METHOD int detach {  
        device_t dev;
        int flags;
};

where each detach method call will now have a flags parameter
that provides enough information to handle the hot plug
scenarios you're describing.

In addition, the DETACH_FORCE and DETACH_EJECTED flags could
be mapped to appropriate flag values for the other subsystems, such
as MNT_FORCE and (a new) MNT_EJECTED flag for VFS.

> i once included a umount -f in the detach hook. after unplugin' the
> device, it resulted in a panic. i don't remember if the umount was
> causing it or if it was right after, when accessing the mount point or
> repluging the digital recorder.

Right, VFS needs to be clued in that the underlying device simply
isn't there anymore.

> anyway, i learned that umount -f is not
> meant to be used often... perhaps not on top of usb. for now.

umount -f is fine; however, it is not the same as the new 
DETACH_EJECTED condition that I'm proposing, which would handle this.

> i manually umount the device before unpluging it.

That is the only safe way to do it for now.

Eric



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