summaryrefslogtreecommitdiffstats
path: root/contrib/amd/conf/umount/umount_bsd44.c
diff options
context:
space:
mode:
authorobrien <obrien@FreeBSD.org>2007-12-05 15:48:03 +0000
committerobrien <obrien@FreeBSD.org>2007-12-05 15:48:03 +0000
commitfb2308c0814cba30bc0e0914e699b37bc2d9be00 (patch)
tree1339da9293125db04c1ce162ff377b70d0d5f09a /contrib/amd/conf/umount/umount_bsd44.c
parent9c2d68e98ee7f56a0026befe8b113a44ed58a0f0 (diff)
parentea691ecd980d2860f0b39e9e504de4da404806fd (diff)
downloadFreeBSD-src-fb2308c0814cba30bc0e0914e699b37bc2d9be00.zip
FreeBSD-src-fb2308c0814cba30bc0e0914e699b37bc2d9be00.tar.gz
This commit was generated by cvs2svn to compensate for changes in r174294,
which included commits to RCS files with non-trunk default branches.
Diffstat (limited to 'contrib/amd/conf/umount/umount_bsd44.c')
-rw-r--r--contrib/amd/conf/umount/umount_bsd44.c55
1 files changed, 43 insertions, 12 deletions
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 */
OpenPOWER on IntegriCloud