variable nfs_vers_ping which sets the maximum version we ping for.
#endif /* HAVE_MAP_NIS */
char *nfs_proto; /* NFS protocol (NULL, udp, tcp) */
int nfs_vers; /* NFS version (0, 2, 3, 4) */
+ int nfs_vers_ping; /* NFS rpc ping version (0, 2, 3, 4) */
u_int exec_map_timeout; /* timeout (seconds) for executable maps */
};
static int gopt_nfs_retry_interval_tcp(const char *val);
static int gopt_nfs_retry_interval_toplvl(const char *val);
static int gopt_nfs_vers(const char *val);
+static int gopt_nfs_vers_ping(const char *val);
static int gopt_nis_domain(const char *val);
static int gopt_normalize_hostnames(const char *val);
static int gopt_normalize_slashes(const char *val);
{"nfs_retry_interval_tcp", gopt_nfs_retry_interval_tcp},
{"nfs_retry_interval_toplvl", gopt_nfs_retry_interval_toplvl},
{"nfs_vers", gopt_nfs_vers},
+ {"nfs_vers_ping", gopt_nfs_vers_ping},
{"nis_domain", gopt_nis_domain},
{"normalize_hostnames", gopt_normalize_hostnames},
{"normalize_slashes", gopt_normalize_slashes},
}
+static int
+gopt_nfs_vers_ping(const char *val)
+{
+ int i = atoi(val);
+
+ if (i == 2 || i == 3 || i == 4) {
+ gopt.nfs_vers_ping = i;
+ return 0;
+ }
+ fprintf(stderr, "conf: illegal nfs_vers_ping \"%s\"\n", val);
+ return 1;
+}
+
static int
gopt_nis_domain(const char *val)
{
int error;
nfs_private *np = (nfs_private *) fs->fs_private;
int fstimeo = -1;
+ int fs_version = nfs_valid_version(gopt.nfs_vers_ping) &&
+ gopt.nfs_vers_ping < fs->fs_version ? gopt.nfs_vers_ping : fs->fs_version;
/*
* Send an NFS ping to this node
*/
- if (ping_len[fs->fs_version - NFS_VERSION] == 0)
- create_ping_payload(fs->fs_version);
+ if (ping_len[fs_version - NFS_VERSION] == 0)
+ create_ping_payload(fs_version);
/*
* Queue the packet...
*/
error = fwd_packet(MK_RPC_XID(RPC_XID_NFSPING, np->np_xid),
- ping_buf[fs->fs_version - NFS_VERSION],
- ping_len[fs->fs_version - NFS_VERSION],
+ ping_buf[fs_version - NFS_VERSION],
+ ping_len[fs_version - NFS_VERSION],
fs->fs_ip,
(struct sockaddr_in *) NULL,
(voidp) ((long) np->np_xid), /* cast needed for 64-bit archs */
*/
if (check_pmap_up(host, ip)) {
if (nfs_proto) {
- best_nfs_version = get_nfs_version(host, ip, nfs_version, nfs_proto);
+ best_nfs_version = get_nfs_version(host, ip, nfs_version, nfs_proto,
+ gopt.nfs_vers);
nfs_port = ip->sin_port;
}
#ifdef MNTTAB_OPT_PROTO
char **p;
for (p = protocols; *p; p++) {
- proto_nfs_version = get_nfs_version(host, ip, nfs_version, *p);
-
+ proto_nfs_version = get_nfs_version(host, ip, nfs_version, *p,
+ gopt.nfs_vers);
if (proto_nfs_version > best_nfs_version) {
best_nfs_version = proto_nfs_version;
nfs_proto = *p;
* Find the best NFS version for a host and protocol.
*/
u_long
-get_nfs_version(char *host, struct sockaddr_in *sin, u_long nfs_version, const char *proto)
+get_nfs_version(char *host, struct sockaddr_in *sin, u_long nfs_version, const char *proto, u_long def)
{
CLIENT *clnt;
int again = 0;
* If not set or set wrong, then try from NFS_VERS_MAX on down. If
* set, then try from nfs_version on down.
*/
- if (nfs_version < NFS_VERS_MIN || nfs_version > NFS_VERS_MAX) {
- nfs_version = NFS_VERS_MAX;
+ if (!nfs_valid_version(nfs_version)) {
+ if (nfs_valid_version(def))
+ nfs_version = def;
+ else
+ nfs_version = NFS_VERS_MAX;
again = 1;
}
tv.tv_sec = 2; /* retry every 2 seconds, but also timeout */
* Find the best NFS version for a host.
*/
u_long
-get_nfs_version(char *host, struct sockaddr_in *sin, u_long nfs_version, const char *proto)
+get_nfs_version(char *host, struct sockaddr_in *sin, u_long nfs_version, const char *proto, u_long def)
{
CLIENT *clnt = NULL;
rpcvers_t versout;
* If not set or set wrong, then try from NFS_VERS_MAX on down. If
* set, then try from nfs_version on down.
*/
- if (nfs_version <= 0 || nfs_version > NFS_VERS_MAX) {
- nfs_version = NFS_VERS_MAX;
+ if (!nfs_valid_version(nfs_version))
+ if (nfs_valid_version(def))
+ nfs_version = def;
+ else
+ nfs_version = NFS_VERS_MAX;
}
if (nfs_version == NFS_VERSION) {
goto out;
}
+ plog(XLOG_ERROR, "Trying unmount %s, umount_flags 0x%x", mp_save->mnt->mnt_dir, unmount_flags);
dlog("Trying unmount(%s)", mp_save->mnt->mnt_dir);
#ifdef MOUNT_TABLE_ON_FILE
extern voidp xzalloc(int);
extern char *xstrdup(const char *);
extern int check_pmap_up(char *host, struct sockaddr_in* sin);
-extern u_long get_nfs_version(char *host, struct sockaddr_in *sin, u_long nfs_version, const char *proto);
+extern u_long get_nfs_version(char *host, struct sockaddr_in *sin, u_long nfs_version, const char *proto, u_long def);
+extern int nfs_valid_version(u_long vers);
extern long get_server_pid(void);
extern void setup_sighandler(int signum, void (*handler)(int));
extern time_t clocktime(nfstime *nt);
static char *
set_nfs4_security(nfs4_args_t *nap, mntent_t *mntp)
{
- const char *o = hasmnteq(mntp, MNTTAB_OPT_SEC);
+ const char *o = hasmntopt(mntp, MNTTAB_OPT_SEC);
char *q, *s, *ss;
size_t l, i;
proto = "udp";
for (nv=2; nv<=3; ++nv) {
fprintf(stderr, "\ttesting vers=%d, proto=\"%s\" -> ", nv, proto);
- ret = get_nfs_version(testhost, ip, nv, proto);
+ ret = get_nfs_version(testhost, ip, nv, proto, 0);
if (ret == 0)
fprintf(stderr, "failed!\n");
else
proto = "tcp";
for (nv=2; nv<=3; ++nv) {
fprintf(stderr, "\ttesting vers=%d, proto=\"%s\" -> ", nv, proto);
- ret = get_nfs_version(testhost, ip, nv, proto);
+ ret = get_nfs_version(testhost, ip, nv, proto, 0);
if (ret == 0)
fprintf(stderr, "failed!\n");
else