Skip to content

Commit

Permalink
umount: Add -d option to detach md devices
Browse files Browse the repository at this point in the history
  • Loading branch information
ricardobranco777 committed Jan 16, 2024
1 parent 4d08b56 commit 2e79aa6
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 8 deletions.
12 changes: 9 additions & 3 deletions sbin/umount/umount.8
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,15 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.Dd June 19, 2020
.Dd January 16, 2024
.Dt UMOUNT 8
.Os
.Sh NAME
.Nm umount
.Nd unmount file systems
.Sh SYNOPSIS
.Nm
.Op Fl fNnv
.Op Fl dfNnv
.Ar special ... | node ... | fsid ...
.Nm
.Fl a | A
Expand Down Expand Up @@ -71,6 +71,11 @@ except for those mounted at
.Pa /
or
.Pa /dev .
.It Fl d
If the filesystem is mounted on an
.Xr md 4
device (a memory disk), detach it after
.Xr unmount 2 .
.It Fl F Ar fstab
Specify the
.Pa fstab
Expand Down Expand Up @@ -182,7 +187,8 @@ file system table
.Xr unmount 2 ,
.Xr fstab 5 ,
.Xr autounmountd 8 ,
.Xr mount 8
.Xr mount 8 ,
.Xr mdconfig 8
.Sh HISTORY
A
.Nm
Expand Down
74 changes: 69 additions & 5 deletions sbin/umount/umount.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,20 @@

#include "mounttab.h"

/* used by md_detach() */
#include <sys/ioctl.h>
#include <sys/mdioctl.h>
#include <fcntl.h>
#include <paths.h>

#define DEV_MD _PATH_DEV MD_NAME
#define DEV_MDCTL _PATH_DEV MDCTL_NAME

typedef enum { FIND, REMOVE, CHECKUNIQUE } dowhat;

static struct addrinfo *nfshost_ai = NULL;
static int fflag, vflag;
static int dflag, fflag, vflag;
static int all;
static char *nfshost;

struct statfs *checkmntlist(char *);
Expand All @@ -70,24 +80,28 @@ int checkname (char *, char **);
int umountfs(struct statfs *sfs);
void usage (void);
int xdr_dir (XDR *, char *);
int md_detach(const char *);

int
main(int argc, char *argv[])
{
int all, errs, ch, mntsize, error, nfsforce, ret;
int errs, ch, mntsize, error, nfsforce, ret;
char **typelist = NULL;
struct statfs *mntbuf, *sfs;
struct addrinfo hints;

nfsforce = all = errs = 0;
while ((ch = getopt(argc, argv, "AaF:fh:Nnt:v")) != -1)
while ((ch = getopt(argc, argv, "AadF:fh:Nnt:v")) != -1)
switch (ch) {
case 'A':
all = 2;
break;
case 'a':
all = 1;
break;
case 'd':
dflag = 1;
break;
case 'F':
setfstab(optarg);
break;
Expand Down Expand Up @@ -455,6 +469,16 @@ umountfs(struct statfs *sfs)
clnt_destroy(clp);
}
free(orignfsdirname);

if (dflag) {
if (md_detach(sfs->f_mntfromname) == 0) {
if (vflag)
(void)printf("%s: detached\n",
sfs->f_mntfromname);
} else if (!all)
return (-1);
}

return (0);
}

Expand Down Expand Up @@ -637,7 +661,47 @@ usage(void)
{

(void)fprintf(stderr, "%s\n%s\n",
"usage: umount [-fNnv] special ... | node ... | fsid ...",
" umount -a | -A [-F fstab] [-fnv] [-h host] [-t type]");
"usage: umount [-dfNnv] special ... | node ... | fsid ...",
" umount -a | -A [-F fstab] [-dfnv] [-h host] [-t type]");
exit(1);
}

int
md_detach(const char *device)
{
struct md_ioctl mdio;
char *eptr;
int fd;

memset(&mdio, 0, sizeof(mdio));

mdio.md_version = MDIOVERSION;
mdio.md_options = fflag ? MD_FORCE : 0;

if (strncmp(device, DEV_MD, sizeof(DEV_MD) - 1)) {
if (!all)
warnx("invalid md device: %s", device);
return (-1);
}

mdio.md_unit = strtoul(device + sizeof(DEV_MD) - 1, &eptr, 0);
if (mdio.md_unit == (unsigned)ULONG_MAX || *eptr != '\0') {
warnx("invalid md device: %s", device);
return (-1);
}

fd = open(DEV_MDCTL, O_RDWR, 0);
if (fd < 0) {
warn("%s", DEV_MDCTL);
return (-1);
}

if (ioctl(fd, MDIOCDETACH, &mdio) < 0) {
warn("%s", DEV_MD);
close(fd);
return (-1);
}

close(fd);
return (0);
}

0 comments on commit 2e79aa6

Please sign in to comment.