len = qword_get(&mesg, vers, size);
                if (len <= 0) return -EINVAL;
                do {
+                       enum vers_op cmd;
                        sign = *vers;
                        if (sign == '+' || sign == '-')
                                num = simple_strtol((vers+1), &minorp, 0);
                                        return -EINVAL;
                                if (kstrtouint(minorp+1, 0, &minor) < 0)
                                        return -EINVAL;
-                               if (nfsd_minorversion(minor, sign == '-' ?
-                                                    NFSD_CLEAR : NFSD_SET) < 0)
-                                       return -EINVAL;
-                               goto next;
-                       }
+                       } else
+                               minor = 0;
+                       cmd = sign == '-' ? NFSD_CLEAR : NFSD_SET;
                        switch(num) {
                        case 2:
                        case 3:
-                       case 4:
-                               nfsd_vers(num, sign == '-' ? NFSD_CLEAR : NFSD_SET);
+                               nfsd_vers(num, cmd);
                                break;
+                       case 4:
+                               if (nfsd_minorversion(minor, cmd) >= 0)
+                                       break;
                        default:
                                return -EINVAL;
                        }
-               next:
                        vers += len + 1;
                } while ((len = qword_get(&mesg, vers, size)) > 0);
                /* If all get turned off, turn them back on, as
 
        return 0;
 }
 
+static void
+nfsd_adjust_nfsd_versions4(void)
+{
+       unsigned i;
+
+       for (i = 0; i <= NFSD_SUPPORTED_MINOR_VERSION; i++) {
+               if (nfsd_supported_minorversions[i])
+                       return;
+       }
+       nfsd_vers(4, NFSD_CLEAR);
+}
+
 int nfsd_minorversion(u32 minorversion, enum vers_op change)
 {
        if (minorversion > NFSD_SUPPORTED_MINOR_VERSION)
        switch(change) {
        case NFSD_SET:
                nfsd_supported_minorversions[minorversion] = true;
+               nfsd_vers(4, NFSD_SET);
                break;
        case NFSD_CLEAR:
                nfsd_supported_minorversions[minorversion] = false;
+               nfsd_adjust_nfsd_versions4();
                break;
        case NFSD_TEST:
                return nfsd_supported_minorversions[minorversion];