diff options
author | kib <kib@FreeBSD.org> | 2011-09-13 20:16:11 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2011-09-13 20:16:11 +0000 |
commit | 661e793b80f2b1dd7136771f61c85d7038f75b3b (patch) | |
tree | d0c40a05e3e675b5fdfc78ce66ddc4969b6beddf | |
parent | c9926ff95a56b1b4098033e42a36925fc32b2d85 (diff) | |
download | FreeBSD-src-661e793b80f2b1dd7136771f61c85d7038f75b3b.zip FreeBSD-src-661e793b80f2b1dd7136771f61c85d7038f75b3b.tar.gz |
Do not try to change the mode or ownership of the root of the mountpoint
when newly established mdmfs mount is readonly.
PR: bin/128427
Tested and reviewed by: jchandra
MFC after: 1 week
Approved by: re (bz)
-rw-r--r-- | sbin/mdmfs/mdmfs.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/sbin/mdmfs/mdmfs.c b/sbin/mdmfs/mdmfs.c index ef45040..e093265 100644 --- a/sbin/mdmfs/mdmfs.c +++ b/sbin/mdmfs/mdmfs.c @@ -35,6 +35,7 @@ __FBSDID("$FreeBSD$"); #include <sys/param.h> #include <sys/mdioctl.h> +#include <sys/mount.h> #include <sys/stat.h> #include <sys/wait.h> @@ -60,6 +61,7 @@ struct mtpt_info { bool mi_have_gid; mode_t mi_mode; bool mi_have_mode; + bool mi_forced_pw; }; static bool debug; /* Emit debugging information? */ @@ -204,6 +206,7 @@ main(int argc, char **argv) usage(); mi.mi_mode = getmode(set, S_IRWXU | S_IRWXG | S_IRWXO); mi.mi_have_mode = true; + mi.mi_forced_pw = true; free(set); break; case 'S': @@ -223,6 +226,7 @@ main(int argc, char **argv) break; case 'w': extract_ugid(optarg, &mi); + mi.mi_forced_pw = true; break; case 'X': debug = true; @@ -443,6 +447,29 @@ do_mount(const char *args, const char *mtpoint) static void do_mtptsetup(const char *mtpoint, struct mtpt_info *mip) { + struct statfs sfs; + + if (!mip->mi_have_mode && !mip->mi_have_uid && !mip->mi_have_gid) + return; + + if (!norun) { + if (statfs(mtpoint, &sfs) == -1) { + warn("statfs: %s", mtpoint); + return; + } + if ((sfs.f_flags & MNT_RDONLY) != 0) { + if (mip->mi_forced_pw) { + warnx( + "Not changing mode/owner of %s since it is read-only", + mtpoint); + } else { + debugprintf( + "Not changing mode/owner of %s since it is read-only", + mtpoint); + } + return; + } + } if (mip->mi_have_mode) { debugprintf("changing mode of %s to %o.", mtpoint, |