From ea691ecd980d2860f0b39e9e504de4da404806fd Mon Sep 17 00:00:00 2001 From: obrien Date: Wed, 5 Dec 2007 15:48:03 +0000 Subject: Virgin import of AMD (am-utils) v6.1.5 Sponsored by: Juniper Networks --- contrib/amd/conf/umount/umount_bsd44.c | 55 ++++++++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 12 deletions(-) (limited to 'contrib/amd/conf/umount/umount_bsd44.c') diff --git a/contrib/amd/conf/umount/umount_bsd44.c b/contrib/amd/conf/umount/umount_bsd44.c index 6ac4c03..d05944d 100644 --- a/contrib/amd/conf/umount/umount_bsd44.c +++ b/contrib/amd/conf/umount/umount_bsd44.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997-2004 Erez Zadok + * Copyright (c) 1997-2006 Erez Zadok * Copyright (c) 1990 Jan-Simon Pendry * Copyright (c) 1990 Imperial College of Science, Technology & Medicine * Copyright (c) 1990 The Regents of the University of California. @@ -36,9 +36,8 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * %W% (Berkeley) %G% * - * $Id: umount_bsd44.c,v 1.3.2.4 2004/01/06 03:15:20 ezk Exp $ + * File: am-utils/conf/umount/umount_bsd44.c * */ @@ -54,12 +53,12 @@ int -umount_fs(char *fs_name, const char *mnttabname) +umount_fs(char *mntdir, const char *mnttabname, u_int unmount_flags) { int error; eintr: - error = unmount(fs_name, 0); + error = unmount(mntdir, 0); if (error < 0) error = errno; @@ -67,23 +66,55 @@ eintr: case EINVAL: case ENOTBLK: case ENOENT: - plog(XLOG_WARNING, "unmount: %s is not mounted", fs_name); + plog(XLOG_WARNING, "unmount: %s is not mounted", mntdir); error = 0; /* Not really an error */ break; case EINTR: -#ifdef DEBUG /* not sure why this happens, but it does. ask kirk one day... */ - dlog("%s: unmount: %m", fs_name); -#endif /* DEBUG */ + dlog("%s: unmount: %m", mntdir); goto eintr; -#ifdef DEBUG +#ifdef MNT2_GEN_OPT_FORCE + case EBUSY: + case EIO: + case ESTALE: + /* caller determines if forced unmounts should be used */ + if (unmount_flags & AMU_UMOUNT_FORCE) { + error = umount2_fs(mntdir, unmount_flags); + if (error < 0) + error = errno; + else + return error; + } + /* fallthrough */ +#endif /* MNT2_GEN_OPT_FORCE */ + default: - dlog("%s: unmount: %m", fs_name); + dlog("%s: unmount: %m", mntdir); break; -#endif /* DEBUG */ } return error; } + + +#ifdef MNT2_GEN_OPT_FORCE +/* force unmount, no questions asked, without touching mnttab file */ +int +umount2_fs(const char *mntdir, u_int unmount_flags) +{ + int error = 0; + if (unmount_flags & AMU_UMOUNT_FORCE) { + plog(XLOG_INFO, "umount2_fs: trying unmount/forced on %s", mntdir); + error = unmount(mntdir, MNT2_GEN_OPT_FORCE); + if (error < 0 && (errno == EINVAL || errno == ENOENT)) + error = 0; /* ignore EINVAL/ENOENT */ + if (error < 0) + plog(XLOG_WARNING, "%s: unmount/force: %m", mntdir); + else + dlog("%s: unmount/force: OK", mntdir); + } + return error; +} +#endif /* MNT2_GEN_OPT_FORCE */ -- cgit v1.1