]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mount/mount_libmount.c
mount.nfs: restore correct error status when umount fails
[nfs-utils.git] / utils / mount / mount_libmount.c
index cf6e58c512ade3235ab63cbf1089c6c85cd1f756..5c1116a5786d585262cf61e59d8312e4784b5763 100644 (file)
@@ -15,8 +15,8 @@
  *
  * You should have received a copy of the GNU General Public
  * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 021110-1307, USA.
+ * Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 0211-1301 USA
  *
  */
 
@@ -173,6 +173,7 @@ static int umount_main(struct libmnt_context *cxt, int argc, char **argv)
 {
        int rc, c;
        char *spec = NULL, *opts = NULL;
+       int ret = EX_FAIL;
 
        static const struct option longopts[] = {
                { "force", 0, 0, 'f' },
@@ -243,7 +244,7 @@ static int umount_main(struct libmnt_context *cxt, int argc, char **argv)
                        /* strange, no entry in mtab or /proc not mounted */
                        nfs_umount23(spec, "tcp,v3");
        }
-
+       ret = EX_FILEIO;
        rc = mnt_context_do_umount(cxt);        /* call umount(2) syscall */
        mnt_context_finalize_mount(cxt);        /* mtab update */
 
@@ -252,12 +253,10 @@ static int umount_main(struct libmnt_context *cxt, int argc, char **argv)
                umount_error(rc, spec);
                goto err;
        }
-
-       free(opts);
-       return EX_SUCCESS;
+       ret = EX_SUCCESS;
 err:
        free(opts);
-       return EX_FAIL;
+       return ret;
 }
 
 static int mount_main(struct libmnt_context *cxt, int argc, char **argv)
@@ -346,6 +345,21 @@ static int mount_main(struct libmnt_context *cxt, int argc, char **argv)
 
        if (chk_mountpoint(mount_point))
                goto err;
+
+       /*
+        * The libmount strictly uses only options from fstab if running in
+        * restricted mode (suid, non-root user). This is done in
+        * mnt_context_prepare_mount() by default.
+        *
+        * We have to read fstab before nfsmount.conf, otherwise the options
+        * from nfsmount.conf will be ignored (overwrited).
+        */
+       rc = mnt_context_apply_fstab(cxt);
+       if (rc) {
+               nfs_error(_("%s: failed to apply fstab options\n"), progname);
+               goto err;
+       }
+
        /*
         * Concatenate mount options from the configuration file
         */