Date: Sat, 31 May 1997 21:22:15 +0100 (BST) From: Doug Rabson <dfr@nlsystems.com> To: Robert Shady <rls@mail.id.net> Cc: freebsd-bugs@freebsd.org Subject: Re: Problem with 2.2.2-RELEASE & AMD Message-ID: <Pine.BSF.3.95q.970531211852.7076E-100000@herring.nlsystems.com> In-Reply-To: <199705311801.OAA00464@shell.id.net>
next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, 31 May 1997, Robert Shady wrote: > Help? > > Just upgraded from 2.2.1 (or so) to 2.2.2, and am now having a problem > with our automount daemon. Nothing is automounting, it just reports > "Bad address" when it tries. I tried "mount mail:/var/mail /mnt" and > it works without a problem, so I'm not really sure what the deal is. > Any clues? BTW-/etc/amd.map is the default that comes with the > distribution. > > amd_flags="-a /net -c 300 -k i386 -d id.net -l syslog /host /etc/amd.map" > > # cd /host/mail > May 31 13:58:07 server amd[1082]: /net/mail: mount: Bad address That was my fault I'm afraid. I missed out a file when merging some fixed over from current and 2.2.2 happened before anyone noticed :-(. Try this patch to /usr/src/usr.sbin/amd/amd/host_ops.c: Index: host_ops.c =================================================================== RCS file: /home/ncvs/src/usr.sbin/amd/amd/host_ops.c,v retrieving revision 1.2 retrieving revision 1.2.6.1 diff -u -r1.2 -r1.2.6.1 --- host_ops.c 1995/05/30 03:45:45 1.2 +++ host_ops.c 1997/05/17 18:42:50 1.2.6.1 @@ -37,7 +37,7 @@ * * @(#)host_ops.c 8.1 (Berkeley) 6/6/93 * - * $Id: host_ops.c,v 1.2 1995/05/30 03:45:45 rgrimes Exp $ + * $Id: host_ops.c,v 1.2.6.1 1997/05/17 18:42:50 dfr Exp $ * */ @@ -46,6 +46,7 @@ #ifdef HAS_HOST #include "mount.h" +#include "mountres.h" #include <sys/stat.h> /* @@ -132,9 +133,9 @@ return ((*xdr_args)(&xdr, args_ptr)); } -static int do_mount P((fhstatus *fhp, char *dir, char *fs_name, char *opts, mntfs *mf)); -static int do_mount(fhp, dir, fs_name, opts, mf) -fhstatus *fhp; +static int do_mount P((mountres *mrp, char *dir, char *fs_name, char *opts, mntfs *mf)); +static int do_mount(mrp, dir, fs_name, opts, mf) +mountres *mrp; char *dir; char *fs_name; char *opts; @@ -152,7 +153,7 @@ return ENOENT; } - return mount_nfs_fh(fhp, dir, fs_name, opts, mf); + return mount_nfs_fh(mrp, dir, fs_name, opts, mf); } static int sortfun P((exports *a, exports *b)); @@ -165,14 +166,16 @@ /* * Get filehandle */ -static int fetch_fhandle P((CLIENT *client, char *dir, fhstatus *fhp)); -static int fetch_fhandle(client, dir, fhp) +static int fetch_fhandle P((CLIENT *client, xdrproc_t xdr_mountres, char *dir, mountres *mrp)); +static int fetch_fhandle(client, xdr_mountres, dir, mrp) CLIENT *client; +xdrproc_t xdr_mountres; char *dir; -fhstatus *fhp; +mountres *mrp; { struct timeval tv; enum clnt_stat clnt_stat; + int status; /* * Pick a number, any number... @@ -187,7 +190,9 @@ * Call the mount daemon on the remote host to * get the filehandle. */ - clnt_stat = clnt_call(client, MOUNTPROC_MNT, xdr_dirpath, &dir, xdr_fhstatus, fhp, tv); + clnt_stat = clnt_call(client, MOUNTPROC_MNT, xdr_dirpath, &dir, xdr_mountres, &mrp->mr_mountres, tv); + if (clnt_stat == 0) + status = mrp->mr_fhstatus.fhs_status; /* XXX assumes fhstatus and mountres3 start the same */ if (clnt_stat != RPC_SUCCESS) { extern char *clnt_sperrno(); char *msg = clnt_sperrno(clnt_stat); @@ -197,12 +202,12 @@ /* * Check status of filehandle */ - if (fhp->fhs_status) { + if (status) { #ifdef DEBUG - errno = fhp->fhs_status; + errno = status; dlog("fhandle fetch failed: %m"); #endif /* DEBUG */ - return fhp->fhs_status; + return status; } return 0; } @@ -224,12 +229,35 @@ } /* - * Mount the export tree from a host + * Return TRUE if mount opts contains nfsv2 flag. */ -static int host_fmount P((mntfs *mf)); -static int host_fmount(mf) +static int forcev2(mf) mntfs *mf; { + struct mntent mnt; + + mnt.mnt_dir = mf->mf_mount; + mnt.mnt_fsname = mf->mf_info; + mnt.mnt_type = MTAB_TYPE_NFS; + mnt.mnt_opts = mf->mf_mopts; + mnt.mnt_freq = 0; + mnt.mnt_passno = 0; + + if (hasmntopt(&mnt, "nfsv2") != NULL) + return TRUE; + else + return FALSE; +} + +/* + * A helper for host_fmount. + */ +static int try_fmount P((mntfs *mf, int mountvers)); +static int try_fmount(mf, mountvers) +mntfs *mf; +int mountvers; +{ + xdrproc_t xdr_mountres; struct timeval tv2; CLIENT *client; enum clnt_stat clnt_stat; @@ -237,7 +265,7 @@ int j, k; exports exlist = 0, ex; exports *ep = 0; - fhstatus *fp = 0; + mountres *mrp = 0; char *host = mf->mf_server->fs_host; int error = 0; struct sockaddr_in sin; @@ -249,6 +277,11 @@ struct timeval tv; tv.tv_sec = 10; tv.tv_usec = 0; + if (mountvers == MOUNTVERS) + xdr_mountres = xdr_fhstatus; + else + xdr_mountres = xdr_mountres3; + /* * Read the mount list */ @@ -272,8 +305,8 @@ * Make a client end-point. * Try TCP first */ - if ((client = clnttcp_create(&sin, MOUNTPROG, MOUNTVERS, &sock, 0, 0)) == NULL && - (client = clntudp_create(&sin, MOUNTPROG, MOUNTVERS, tv, &sock)) == NULL) { + if ((client = clnttcp_create(&sin, MOUNTPROG, mountvers, &sock, 0, 0)) == NULL && + (client = clntudp_create(&sin, MOUNTPROG, mountvers, tv, &sock)) == NULL) { plog(XLOG_ERROR, "Failed to make rpc connection to mountd on %s", host); error = EIO; goto out; @@ -337,8 +370,9 @@ /* * Allocate an array of filehandles */ - fp = (fhstatus *) xmalloc(n_export * sizeof(fhstatus)); - + mrp = (mountres *) xmalloc(n_export * sizeof(mountres)); + bzero(mrp, n_export * sizeof(mountres)); + /* * Try to obtain filehandles for each directory. * If a fetch fails then just zero out the array @@ -353,7 +387,8 @@ ep[j] = 0; } else { k = j; - if (error = fetch_fhandle(client, ep[j]->ex_dir, &fp[j])) + mrp[j].mr_version = mountvers; + if (error = fetch_fhandle(client, xdr_mountres, ep[j]->ex_dir, &mrp[j])) ep[j] = 0; } } @@ -376,7 +411,7 @@ if (ex) { strcpy(rfs_dir, ex->ex_dir); MAKE_MNTPT(mntpt, ex, mf); - if (do_mount(&fp[j], mntpt, fs_name, mf->mf_mopts, mf) == 0) + if (do_mount(&mrp[j], mntpt, fs_name, mf->mf_mopts, mf) == 0) ok = TRUE; } } @@ -388,14 +423,41 @@ discard_mntlist(mlist); if (ep) free(ep); - if (fp) - free(fp); + if (mrp) { + for (j = 0; j < n_export; j++) + xdr_free(xdr_mountres, (char *) &mrp->mr_mountres); + free(mrp); + } if (client) clnt_destroy(client); if (exlist) xdr_pri_free(xdr_exports, &exlist); if (ok) return 0; + return error; +} + +/* + * Mount the export tree from a host + */ +static int host_fmount P((mntfs *mf)); +static int host_fmount(mf) +mntfs *mf; +{ + int error = -1; + +#ifdef DEBUG + dlog("host_fmount: trying to mount v3"); +#endif + if (!forcev2(mf)) + error = try_fmount(mf, MOUNTVERS3); + if (error) { +#ifdef DEBUG + dlog("host_fmount: trying to mount v2"); +#endif + error = try_fmount(mf, MOUNTVERS); + } + return error; } -- Doug Rabson Mail: dfr@nlsystems.com Nonlinear Systems Ltd. Phone: +44 181 951 1891 Fax: +44 181 381 1039
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.3.95q.970531211852.7076E-100000>