git: 0d28d014c855 - main - vfs: refactor kern_unmount
Mateusz Guzik
mjg at FreeBSD.org
Thu Aug 26 12:02:50 UTC 2021
The branch main has been updated by mjg:
URL: https://cgit.FreeBSD.org/src/commit/?id=0d28d014c8552520879d3c4f75b3e89dd116eaa5
commit 0d28d014c8552520879d3c4f75b3e89dd116eaa5
Author: Mateusz Guzik <mjg at FreeBSD.org>
AuthorDate: 2021-08-26 11:49:41 +0000
Commit: Mateusz Guzik <mjg at FreeBSD.org>
CommitDate: 2021-08-26 11:58:28 +0000
vfs: refactor kern_unmount
Split unmounting by path and id in preparation for other changes.
Sponsored by: Rubicon Communications, LLC ("Netgate")
---
sys/kern/vfs_mount.c | 52 ++++++++++++++++++++++++++++++++--------------------
1 file changed, 32 insertions(+), 20 deletions(-)
diff --git a/sys/kern/vfs_mount.c b/sys/kern/vfs_mount.c
index 2d955fc4889f..40581d9e6e79 100644
--- a/sys/kern/vfs_mount.c
+++ b/sys/kern/vfs_mount.c
@@ -1588,7 +1588,7 @@ kern_unmount(struct thread *td, const char *path, int flags)
{
struct nameidata nd;
struct mount *mp;
- char *pathbuf;
+ char *fsidbuf, *pathbuf;
fsid_t fsid;
int error;
@@ -1599,22 +1599,34 @@ kern_unmount(struct thread *td, const char *path, int flags)
return (error);
}
- pathbuf = malloc(MNAMELEN, M_TEMP, M_WAITOK);
- error = copyinstr(path, pathbuf, MNAMELEN, NULL);
- if (error) {
- free(pathbuf, M_TEMP);
- return (error);
- }
if (flags & MNT_BYFSID) {
- AUDIT_ARG_TEXT(pathbuf);
+ fsidbuf = malloc(MNAMELEN, M_TEMP, M_WAITOK);
+ error = copyinstr(path, fsidbuf, MNAMELEN, NULL);
+ if (error) {
+ free(fsidbuf, M_TEMP);
+ return (error);
+ }
+
+ AUDIT_ARG_TEXT(fsidbuf);
/* Decode the filesystem ID. */
- if (sscanf(pathbuf, "FSID:%d:%d", &fsid.val[0], &fsid.val[1]) != 2) {
- free(pathbuf, M_TEMP);
+ if (sscanf(fsidbuf, "FSID:%d:%d", &fsid.val[0], &fsid.val[1]) != 2) {
+ free(fsidbuf, M_TEMP);
return (EINVAL);
}
mp = vfs_getvfs(&fsid);
+ free(fsidbuf, M_TEMP);
+ if (mp == NULL) {
+ return (ENOENT);
+ }
} else {
+ pathbuf = malloc(MNAMELEN, M_TEMP, M_WAITOK);
+ error = copyinstr(path, pathbuf, MNAMELEN, NULL);
+ if (error) {
+ free(pathbuf, M_TEMP);
+ return (error);
+ }
+
/*
* Try to find global path for path argument.
*/
@@ -1635,16 +1647,16 @@ kern_unmount(struct thread *td, const char *path, int flags)
}
}
mtx_unlock(&mountlist_mtx);
- }
- free(pathbuf, M_TEMP);
- if (mp == NULL) {
- /*
- * Previously we returned ENOENT for a nonexistent path and
- * EINVAL for a non-mountpoint. We cannot tell these apart
- * now, so in the !MNT_BYFSID case return the more likely
- * EINVAL for compatibility.
- */
- return ((flags & MNT_BYFSID) ? ENOENT : EINVAL);
+ free(pathbuf, M_TEMP);
+ if (mp == NULL) {
+ /*
+ * Previously we returned ENOENT for a nonexistent path and
+ * EINVAL for a non-mountpoint. We cannot tell these apart
+ * now, so in the !MNT_BYFSID case return the more likely
+ * EINVAL for compatibility.
+ */
+ return (EINVAL);
+ }
}
/*
More information about the dev-commits-src-main
mailing list