Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 21 Feb 2006 12:24:35 +1030
From:      "Wilkinson, Alex" <alex.wilkinson@dsto.defence.gov.au>
To:        freebsd-current@freebsd.org
Cc:        matthew.thyer@dsto.defence.gov.au
Subject:   netgroup limits on -current ... [mountd(8)]
Message-ID:  <20060221015435.GM82482@squash.dsto.defence.gov.au>

next in thread | raw e-mail | index | archive | help
OS: FreeBSD 7.0-CURRENT #24: Thu Feb 16 12:28:58 CST 2006

Hi all,

We are currently experiencing problems with FreeBSD -CURRENT and mountd(8).
When we export a filesystem via NFS to a netgroup with a 'large' number of hosts
in it we get all sorts of truncation. There looks like a limit on the number of
hosts in a netgroup FreeBSD's mountd(8) can export to. e.g.

NFS Export
----------

/export/home/username my_netgroup

mountd(8) In Debugging Mode
---------------------------

Feb 21 12:10:49 host mountd[83451]: can't get address info for host hostname.dsto.defence.g
Feb 21 12:10:49 host mountd[83451]: bad host host.dsto.defence.g in netgroup my_netgroup, skipping

This happens as mountd(8) builds its exports list via:

mountd: getting export list
mountd: got line /export/home/username my_netgroup
mountd: making new ep fs=0x4297314f,0x57f85ac
got host host.dsto.defence.gov.au
got host host.dsto.defence.gov.au
got host host.dsto.defence.gov.au
got host host.dsto.defence.gov.au
got host host.dsto.defence.gov.au
got host host.dsto.defence.gov.au
got host host.dsto.defence.gov.au
got host host.dsto.defence.gov.au
got host host.dsto.defence.gov.au
got host host.dsto.defence.gov.au
got host host.dsto.defence.gov.au
got host host.dsto.defence.gov.au
got host host.dsto.defence.gov.au

...

relevant code producing this error:

/usr/src/usr.sbin/mountd

   get_host(cp, grp, tgrp)
           char *cp;
           struct grouplist *grp;
           struct grouplist *tgrp;
   {
           struct grouplist *checkgrp;
           struct addrinfo *ai, *tai, hints;
           int ecode;
           char host[NI_MAXHOST];

           if (grp->gr_type != GT_NULL) {
                   syslog(LOG_ERR, "Bad netgroup type for ip host %s", cp);
                   return (1);
           }
           memset(&hints, 0, sizeof hints);
           hints.ai_flags = AI_CANONNAME;
           hints.ai_protocol = IPPROTO_UDP;
           ecode = getaddrinfo(cp, NULL, &hints, &ai);
           if (ecode != 0) {
                   syslog(LOG_ERR,"can't get address info for host %s", cp);
                   return 1;
           }
           grp->gr_ptr.gt_addrinfo = ai;
           while (ai != NULL) {
                   if (ai->ai_canonname == NULL) {
                           if (getnameinfo(ai->ai_addr, ai->ai_addrlen, host,
                               sizeof host, NULL, 0, NI_NUMERICHOST) != 0)
                                   strlcpy(host, "?", sizeof(host));
                           ai->ai_canonname = strdup(host);
                           ai->ai_flags |= AI_CANONNAME;
                   }
                   if (debug)
                           fprintf(stderr, "got host %s\n", ai->ai_canonname);
                   /*
                    * Sanity check: make sure we don't already have an entry
                    * for this host in the grouplist.
                    */
                   for (checkgrp = tgrp; checkgrp != NULL;
                       checkgrp = checkgrp->gr_next) {
                           if (checkgrp->gr_type != GT_HOST)
                                   continue;
                           for (tai = checkgrp->gr_ptr.gt_addrinfo; tai != NULL;
                               tai = tai->ai_next) {
                                   if (sacmp(tai->ai_addr, ai->ai_addr, NULL) != 0)
                                           continue;
                                   if (debug)
                                           fprintf(stderr,
                                               "ignoring duplicate host %s\n",
                                               ai->ai_canonname);
                                   grp->gr_type = GT_IGNORE;
                                   return (0);
                           }
                   }
                   ai = ai->ai_next;
           }


Can someone please tell me if there is a limit on the number characters or hosts
that mountd(8) can build an export list from ? And if so can we increase it ?

Cheers

 - aW



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20060221015435.GM82482>