* conf/mount/mount_aix.c (mount_aix3): if the NFSv3 mount fails
authorIon Badulescu <ib42@cs.columbia.edu>
Fri, 21 Jun 2002 22:40:43 +0000 (22:40 +0000)
committerIon Badulescu <ib42@cs.columbia.edu>
Fri, 21 Jun 2002 22:40:43 +0000 (22:40 +0000)
with EINVAL and we have MOUNT_TYPE_NFS3_BIS defined, retry the
mount with the alternative nfs3_args structure

* conf/nfs_prot/nfs_prot_aix4_3.h: added alternative nfs3_args
structure, similar to that in aix5.1, for a hack that tries to
compensate for IBM's brain fart

* conf/nfs_prot/nfs_prot_aix5_1.h: new nfs_prot header for aix5.1+

* aux/macros/check_nfs_prot_headers.m4: added new header for aix5.1+

ChangeLog
conf/mount/mount_aix.c
conf/nfs_prot/nfs_prot_aix4_3.h
conf/nfs_prot/nfs_prot_aix5_1.h [new file with mode: 0644]
m4/macros/check_nfs_prot_headers.m4

index 926028d0a354067f1202b01751e4f9d85b2928bf..1ab5d122728abbf8c9b1cefbfb46aad912dc0915 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,17 @@
 2002-06-21  Ion Badulescu  <ion@guppy.limebrokerage.com>
 
+       * conf/mount/mount_aix.c (mount_aix3): if the NFSv3 mount fails
+       with EINVAL and we have MOUNT_TYPE_NFS3_BIS defined, retry the
+       mount with the alternative nfs3_args structure
+
+       * conf/nfs_prot/nfs_prot_aix4_3.h: added alternative nfs3_args
+       structure, similar to that in aix5.1, for a hack that tries to
+       compensate for IBM's brain fart
+
+       * conf/nfs_prot/nfs_prot_aix5_1.h: new nfs_prot header for aix5.1+
+
+       * aux/macros/check_nfs_prot_headers.m4: added new header for aix5.1+
+
        * BUGS: update for direct mounts on Linux; document the brokenness
        of /bin/sh on AIX
 
index 36f9668e1612304577e3ff50bd69e82f302a3218..966da05f2cb5b3187ed30bcda0dc2571b85cec68 100644 (file)
@@ -38,7 +38,7 @@
  *
  *      %W% (Berkeley) %G%
  *
- * $Id: mount_aix.c,v 1.4.2.2 2002/01/21 00:49:45 ezk Exp $
+ * $Id: mount_aix.c,v 1.4.2.3 2002/06/21 22:40:45 ib42 Exp $
  *
  */
 
@@ -106,19 +106,25 @@ mount_aix3(char *fsname, char *dir, int flags, int type, void *data, char *mnt_o
   int size, ret;
   int real_size = sizeof(nfs_args_t); /* size passed to aix3_mkvp() */
   char *real_args = data;      /* args passed to aix3_mkvp() */
-  char *host = strdup(fsname);
-  char *rfs = strchr(host, ':');
-  int free_rfs = 0;
+  char *host, *rfs, *idx;
+  int aix_type = type;
 #ifdef HAVE_FS_NFS3
   struct nfs_args v2args;
   nfs_args_t *v3args = (nfs_args_t *) data;
+#ifdef MOUNT_TYPE_NFS3_BIS
+  struct aix42_nfs_args_bis v3args_bis;
+#endif /* MOUNT_TYPE_NFS3_BIS */
 #endif /* HAVE_FS_NFS3 */
 
+ retry_ibm_stupid_service_pack:
 #ifdef DEBUG
   dlog("mount_aix3: fsname %s, dir %s, type %d", fsname, dir, type);
 #endif /* DEBUG */
 
-  switch (type) {
+#ifdef MOUNT_TYPE_NFS3_BIS
+ retry_ibm_stupid_service_pack:
+#endif /* MOUNT_TYPE_NFS3_BIS */
+  switch (aix_type) {
 
   case MOUNT_TYPE_NFS:
 
@@ -146,28 +152,54 @@ mount_aix3(char *fsname, char *dir, int flags, int type, void *data, char *mnt_o
     v2args.pathconf = v3args->pathconf;
 
     /* now set real_* stuff */
-    real_size = sizeof(struct nfs_args);
+    real_size = sizeof(v2args);
     real_args = (char *) &v2args;
 
   case MOUNT_TYPE_NFS3:
-    /* do nothing, because the nfs_args passed is already a v3 one */
+#ifdef MOUNT_TYPE_NFS3_BIS
+  case MOUNT_TYPE_NFS3_BIS:
     /* just fall through */
+    if (aix_type == MOUNT_TYPE_NFS3_BIS) {
+      memmove((voidp) &v3args_bis.addr, (voidp) &v3args->addr, sizeof(struct sockaddr_in));
+      v3args_bis.u0 = v3args->u0;
+      v3args_bis.proto = v3args->proto;
+      v3args_bis.hostname = v3args->hostname;
+      v3args_bis.netname = v3args->netname;
+      v3args_bis.fh = v3args->fh;
+      v3args_bis.flags = v3args->flags;
+      v3args_bis.wsize = v3args->wsize;
+      v3args_bis.rsize = v3args->rsize;
+      v3args_bis.timeo = v3args->timeo;
+      v3args_bis.retrans = v3args->retrans;
+      v3args_bis.acregmin = v3args->acregmin;
+      v3args_bis.acregmax = v3args->acregmax;
+      v3args_bis.acdirmin = v3args->acdirmin;
+      v3args_bis.acdirmax = v3args->acdirmax;
+      v3args_bis.u14 = v3args->u14;
+      v3args_bis.pathconf = v3args->pathconf;
+      /* now set real_* stuff */
+      real_size = sizeof(v3args_bis);
+      real_args = (char *) &v3args_bis;
+    }
+#endif /* MOUNT_TYPE_NFS3_BIS */
 #endif /* HAVE_FS_NFS3 */
 
-    if (rfs) {
-      *rfs++ = '\0';
+    idx = strchr(fsname, ':');
+    if (idx) {
+      *idx = '\0';
+      rfs = strdup(idx + 1);
+      host = strdup(fsname);
+      *idx = ':';
     } else {
-      rfs = host;
-      free_rfs = 1;
+      rfs = strdup(fsname);
       host = strdup(am_get_hostname());
     }
 
     size = aix3_mkvp(buf, type, flags, rfs, dir, host,
                     real_args, real_size, mnt_opts);
-    if (free_rfs)
-      XFREE(rfs);
+    XFREE(rfs);
     XFREE(host);
-  break;
+    break;
 
   case MOUNT_TYPE_UFS:
     /* Need to open block device and extract log device info from sblk. */
@@ -178,7 +210,17 @@ mount_aix3(char *fsname, char *dir, int flags, int type, void *data, char *mnt_o
   }
 
   ret = vmount((struct vmount *)buf, size);
-  if (ret < 0)
+  if (ret < 0) {
+#ifdef MOUNT_TYPE_NFS3_BIS
+    if (aix_type == MOUNT_TYPE_NFS3 && errno == EINVAL) {
+      aix_type = MOUNT_TYPE_NFS3_BIS;
+#ifdef DEBUG
+      dlog("mount_aix3: retrying with alternate nfs3_args structure");
+#endif /* DEBUG */
+      goto retry_ibm_stupid_service_pack;
+    }
+#endif /* MOUNT_TYPE_NFS3_BIS */
     plog(XLOG_ERROR, "mount_aix3: vmount failed with errno %d", errno);
+  }
   return ret;
 }
index eebb7da68533a6923e0b0179574697f59ff0edfa..aeda9bbdc80362baf7e77bcadfc72a9730e8b078 100644 (file)
@@ -38,7 +38,7 @@
  *
  *      %W% (Berkeley) %G%
  *
- * $Id: nfs_prot_aix4_3.h,v 1.3.2.4 2002/02/12 02:44:18 ib42 Exp $
+ * $Id: nfs_prot_aix4_3.h,v 1.3.2.5 2002/06/21 22:40:46 ib42 Exp $
  *
  */
 
@@ -256,6 +256,35 @@ struct aix42_nfs_args {
   struct pathcnf *pathconf;    /* pathconf */
 };
 
+/*
+ * IBM is in dire need of taking a soft-eng class.
+ * They changed the API/ABI (namely the nfs3_args structure)
+ * in a service pack...
+ *
+ * All the following *_bis junk is here to try and deal with this idiocy.
+ */
+#define MOUNT_TYPE_NFS3_BIS 0x12344321
+struct aix42_nfs_args_bis {
+  struct sockaddr_in addr;     /* server address and port */
+  caddr_t u0;                  /* ??? UNKNOWN ??? */
+  unsigned long proto;         /* IPPROTO_TCP/IPPROTO_UDP */
+  char *hostname;              /* pointer to hostname? */
+  char *netname;               /* pointer to netname? */
+  caddr_t fh;                  /* pointer to NFS v3 fh? */
+  unsigned long junk;          /* IBM sux, IBM sux, IBM sux... */
+  unsigned long flags;         /* flags */
+  unsigned long wsize;         /* wsize */
+  unsigned long rsize;         /* rsize */
+  unsigned long timeo;         /* timeo */
+  unsigned long retrans;       /* retrans */
+  unsigned long acregmin;      /* acregmin */
+  unsigned long acregmax;      /* acregmax */
+  unsigned long acdirmin;      /* acdirmin */
+  unsigned long acdirmax;      /* acdirmax */
+  unsigned long u14;           /* ??? UNKNOWN ??? */
+  struct pathcnf *pathconf;    /* pathconf */
+};
+
 typedef struct {
   u_int fhandle3_len;
   char *fhandle3_val;
diff --git a/conf/nfs_prot/nfs_prot_aix5_1.h b/conf/nfs_prot/nfs_prot_aix5_1.h
new file mode 100644 (file)
index 0000000..c9e2826
--- /dev/null
@@ -0,0 +1,315 @@
+/*
+ * Copyright (c) 1997-2002 Erez Zadok
+ * Copyright (c) 1990 Jan-Simon Pendry
+ * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
+ * Copyright (c) 1990 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Jan-Simon Pendry at Imperial College, London.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgment:
+ *      This product includes software developed by the University of
+ *      California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *      %W% (Berkeley) %G%
+ *
+ * $Id: nfs_prot_aix5_1.h,v 1.1.2.1 2002/06/21 22:40:46 ib42 Exp $
+ *
+ */
+
+#ifndef _AMU_NFS_PROT_H
+#define _AMU_NFS_PROT_H
+
+
+/*
+ * AIX 4.3 and newer support NFS V.3, hence the separate header.
+ */
+
+#ifdef HAVE_RPCSVC_NFS_PROT_H
+# include <rpcsvc/nfs_prot.h>
+#endif /* HAVE_RPCSVC_NFS_PROT_H */
+#ifdef HAVE_NFS_NFSV2_H
+# include <nfs/nfsv2.h>
+#endif /* HAVE_NFS_NFSV2_H */
+#ifdef HAVE_NFS_RPCV2_H
+# include <nfs/rpcv2.h>
+#endif /* HAVE_NFS_RPCV2_H */
+#ifdef HAVE_SYS_FS_NFS_H
+# include <sys/fs/nfs.h>
+#endif /* HAVE_SYS_FS_NFS_H */
+#ifdef HAVE_RPCSVC_MOUNT_H
+# include <rpcsvc/mount.h>
+#endif /* HAVE_RPCSVC_MOUNT_H */
+
+
+/*
+ * MACROS
+ */
+
+#ifndef MNTPATHLEN
+# define MNTPATHLEN 1024
+#endif /* not MNTPATHLEN */
+#ifndef MNTNAMLEN
+# define MNTNAMLEN 255
+#endif /* not MNTNAMLEN */
+
+/* map field names */
+#define ex_dir ex_name
+#define gr_name g_name
+#define gr_next g_next
+#define ml_directory ml_path
+#define ml_hostname ml_name
+#define ml_next ml_nxt
+
+#define        dr_drok_u       diropres
+#define ca_attributes  attributes
+#define ca_where       where
+#define da_fhandle     dir
+#define da_name                name
+#define dl_entries     entries
+#define dl_eof         eof
+#define dr_status      status
+#define dr_u           diropres_u
+#define drok_attributes        attributes
+#define drok_fhandle   file
+#define fh_data                data
+#define la_fhandle     from
+#define la_to          to
+#define na_atime       atime
+#define na_blocks      blocks
+#define na_blocksize   blocksize
+#define na_ctime       ctime
+#define na_fileid      fileid
+#define na_fsid                fsid
+#define na_gid         gid
+#define na_mode                mode
+#define na_mtime       mtime
+#define na_nlink       nlink
+#define na_rdev                rdev
+#define na_size                size
+#define na_type                type
+#define na_uid         uid
+#define ne_cookie      cookie
+#define ne_fileid      fileid
+#define ne_name                name
+#define ne_nextentry   nextentry
+#define ns_attr_u      attributes
+#define ns_status      status
+#define ns_u           attrstat_u
+#define nt_seconds     seconds
+#define nt_useconds    useconds
+#define ra_count       count
+#define ra_fhandle     file
+#define ra_offset      offset
+#define ra_totalcount  totalcount
+#define raok_attributes        attributes
+#define raok_len_u     data_len
+#define raok_u         data
+#define raok_val_u     data_val
+#define rda_cookie     cookie
+#define rda_count      count
+#define rda_fhandle    dir
+#define rdr_reply_u    reply
+#define rdr_status     status
+#define rdr_u          readdirres_u
+#define rlr_data_u     data
+#define rlr_status     status
+#define rlr_u          readlinkres_u
+#define rna_from       from
+#define rna_to         to
+#define rr_reply_u     reply
+#define rr_status      status
+#define rr_u           readres_u
+#define sa_atime       atime
+#define sa_gid         gid
+#define sa_mode                mode
+#define sa_mtime       mtime
+#define sa_size                size
+#define sa_uid         uid
+#define sag_attributes attributes
+#define sag_fhandle    file
+#define sfr_reply_u    reply
+#define sfr_status     status
+#define sfr_u          statfsres_u
+#define sfrok_bavail   bavail
+#define sfrok_bfree    bfree
+#define sfrok_blocks   blocks
+#define sfrok_bsize    bsize
+#define sfrok_tsize    tsize
+#define sla_attributes attributes
+#define sla_from       from
+#define sla_to         to
+#define wra_beginoffset        beginoffset
+#define wra_fhandle    file
+#define wra_len_u      data_len
+#define wra_offset     offset
+#define wra_totalcount totalcount
+#define wra_u          data
+#define wra_val_u      data_val
+
+
+/*
+ * TYPEDEFS:
+ */
+typedef char *dirpath;
+typedef char *name;
+typedef struct exports *exports;
+typedef struct exports exportnode;
+typedef struct groups *groups;
+typedef struct groups groupnode;
+typedef struct mountlist *mountlist;
+
+typedef attrstat       nfsattrstat;
+typedef createargs     nfscreateargs;
+typedef dirlist                nfsdirlist;
+typedef diropargs      nfsdiropargs;
+typedef diropokres     nfsdiropokres;
+typedef diropres       nfsdiropres;
+typedef entry          nfsentry;
+typedef fattr          nfsfattr;
+typedef ftype          nfsftype;
+typedef linkargs       nfslinkargs;
+typedef readargs       nfsreadargs;
+typedef readdirargs    nfsreaddirargs;
+typedef readdirres     nfsreaddirres;
+typedef readlinkres    nfsreadlinkres;
+typedef readokres      nfsreadokres;
+typedef readres                nfsreadres;
+typedef renameargs     nfsrenameargs;
+typedef sattr          nfssattr;
+typedef sattrargs      nfssattrargs;
+typedef statfsokres    nfsstatfsokres;
+typedef statfsres      nfsstatfsres;
+typedef symlinkargs    nfssymlinkargs;
+typedef writeargs      nfswriteargs;
+
+
+/*
+ * EXTERNALS:
+ */
+
+
+/*
+ * STRUCTURES:
+ */
+
+/*
+ * AIX 4.3 has NFS V3, but it is undefined in the header files.
+ * so I define everything that's needed for NFS V3 here.
+ */
+#ifdef MNT_NFS3
+
+#define FHSIZE3 64             /* size in bytes of a file handle (v3) */
+#define        NFS3_FHSIZE 64
+#define        MOUNTVERS3 ((unsigned long)(3))
+#define        NFS_V3 ((unsigned long)(3))
+
+#if 0
+struct nfs_fh3 {
+  u_int len;
+  char val[64];                        /* !!! */
+};
+#endif
+
+struct aix42_nfs_args {
+  struct sockaddr_in addr;     /* server address and port */
+  caddr_t u0;                  /* ??? UNKNOWN ??? */
+  unsigned long proto;         /* IPPROTO_TCP/IPPROTO_UDP */
+  char *hostname;              /* pointer to hostname? */
+  char *netname;               /* pointer to netname? */
+  caddr_t fh;                  /* pointer to NFS v3 fh? */
+  unsigned long junk;          /* IBM sux, IBM sux, IBM sux... */
+  unsigned long flags;         /* flags */
+  unsigned long wsize;         /* wsize */
+  unsigned long rsize;         /* rsize */
+  unsigned long timeo;         /* timeo */
+  unsigned long retrans;       /* retrans */
+  unsigned long acregmin;      /* acregmin */
+  unsigned long acregmax;      /* acregmax */
+  unsigned long acdirmin;      /* acdirmin */
+  unsigned long acdirmax;      /* acdirmax */
+  unsigned long u14;           /* ??? UNKNOWN ??? */
+  struct pathcnf *pathconf;    /* pathconf */
+};
+
+typedef struct {
+  u_int fhandle3_len;
+  char *fhandle3_val;
+} fhandle3;
+
+enum mountstat3 {
+  MNT3_OK = 0,
+  MNT3ERR_PERM = 1,
+  MNT3ERR_NOENT = 2,
+  MNT3ERR_IO = 5,
+  MNT3ERR_ACCES = 13,
+  MNT3ERR_NOTDIR = 20,
+  MNT3ERR_INVAL = 22,
+  MNT3ERR_NAMETOOLONG = 63,
+  MNT3ERR_NOTSUPP = 10004,
+  MNT3ERR_SERVERFAULT = 10006
+};
+typedef enum mountstat3 mountstat3;
+
+struct mountres3_ok {
+  fhandle3 fhandle;
+  struct {
+    u_int auth_flavors_len;
+    int *auth_flavors_val;
+  } auth_flavors;
+};
+typedef struct mountres3_ok mountres3_ok;
+
+struct mountres3 {
+  mountstat3 fhs_status;
+  union {
+    mountres3_ok mountinfo;
+  } mountres3_u;
+};
+typedef struct mountres3 mountres3;
+
+struct nfs_fh3 {
+  u_int fh3_length;
+  union nfs_fh3_u {
+    struct nfs_fh3_i {
+      fhandle_t fh3_i;
+    } nfs_fh3_i;
+    char data[NFS3_FHSIZE];
+  } fh3_u;
+};
+typedef struct nfs_fh3 nfs_fh3;
+
+#endif /* MNT_NFS3 */
+
+/*
+ * EXTERNALS:
+ */
+extern bool_t xdr_groups(XDR *xdrs, groups *objp);
+extern char *yperr_string (int incode);
+
+#endif /* not _AMU_NFS_PROT_H */
index 1ccf09420ba349ac007e2642fcfc6db465301ca7..4c59e08a1fdccad098b656cfb668d34a674d776a 100644 (file)
@@ -53,8 +53,10 @@ case "${host_os}" in
                        ac_cv_nfs_prot_headers=aix4 ;;
        aix4.2* )
                        ac_cv_nfs_prot_headers=aix4_2 ;;
-       aix* )
+       aix4.3* )
                        ac_cv_nfs_prot_headers=aix4_3 ;;
+       aix* )
+                       ac_cv_nfs_prot_headers=aix5_1 ;;
        osf[[1-3]]* )
                        ac_cv_nfs_prot_headers=osf2 ;;
        osf4* )