Compare commits
10 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e1bffbb431 | ||
|
|
1d2da18098 | ||
|
|
2ae66b761f | ||
|
|
2aff790424 | ||
|
|
336ddc8c61 | ||
|
|
18135a43ff | ||
|
|
ad1caf6dd6 | ||
|
|
73b0d64247 | ||
|
|
509a4c2f2a | ||
|
|
8d3ff2fd10 |
44 changed files with 11514 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
/am-utils-6.2.tar.gz
|
||||
145
am-utils-6.2-32-bit-fixes.patch
Normal file
145
am-utils-6.2-32-bit-fixes.patch
Normal file
|
|
@ -0,0 +1,145 @@
|
|||
commit a6bbb7d9b098dacd2636925c232c630452e4b46e
|
||||
Author: Christos Zoulas <christos@zoulas.com>
|
||||
Date: Sun Jan 18 18:03:37 2015 -0500
|
||||
|
||||
32 bit fixes
|
||||
|
||||
diff --git a/amd/amq_subr.c b/amd/amq_subr.c
|
||||
index 8783611..86f0351 100644
|
||||
--- a/amd/amq_subr.c
|
||||
+++ b/amd/amq_subr.c
|
||||
@@ -528,6 +528,7 @@ xdr_amq_map_info_qelem(XDR *xdrs, qelem *qhead)
|
||||
u_int len = 0;
|
||||
int x;
|
||||
char *n;
|
||||
+ long modify;
|
||||
|
||||
/*
|
||||
* Compute length of list
|
||||
@@ -552,7 +553,8 @@ xdr_amq_map_info_qelem(XDR *xdrs, qelem *qhead)
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
- if (!xdr_long(xdrs, &m->modify)) {
|
||||
+ modify = (long)m->modify;
|
||||
+ if (!xdr_long(xdrs, &modify)) {
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
diff --git a/amd/nfs_subr.c b/amd/nfs_subr.c
|
||||
index e463ff7..7192a6a 100644
|
||||
--- a/amd/nfs_subr.c
|
||||
+++ b/amd/nfs_subr.c
|
||||
@@ -1104,9 +1104,9 @@ am_nfs3_getattr_3_svc(am_GETATTR3args *argp, struct svc_req *rqstp)
|
||||
result.status = AM_NFS3_OK;
|
||||
|
||||
if (amuDebug(D_TRACE))
|
||||
- plog(XLOG_DEBUG, "\tstat(%s), size = %lu, mtime=%d.%d",
|
||||
+ plog(XLOG_DEBUG, "\tstat(%s), size = %llu, mtime=%d.%d",
|
||||
mp->am_path,
|
||||
- (am_size3) fattr3->size,
|
||||
+ (unsigned long long)fattr3->size,
|
||||
(u_int) fattr3->mtime.seconds,
|
||||
(u_int) fattr3->mtime.nseconds);
|
||||
|
||||
diff --git a/amd/readdir.c b/amd/readdir.c
|
||||
index 4b5e61b..57773a5 100644
|
||||
--- a/amd/readdir.c
|
||||
+++ b/amd/readdir.c
|
||||
@@ -635,7 +635,7 @@ static size_t needroom3(void)
|
||||
|
||||
/* This one is called only if map is browsable */
|
||||
static int
|
||||
-amfs_readdir3_browsable(am_node *mp, am_cookie3 cookie,
|
||||
+amfs_readdir3_browsable(am_node *mp, voidp cookie,
|
||||
am_dirlist3 *dp, am_entry3 *ep, u_int count,
|
||||
int fully_browsable)
|
||||
{
|
||||
@@ -647,7 +647,8 @@ amfs_readdir3_browsable(am_node *mp, am_cookie3 cookie,
|
||||
dp->eof = FALSE; /* assume readdir not done */
|
||||
|
||||
if (amuDebug(D_READDIR))
|
||||
- plog(XLOG_DEBUG, "amfs_readdir3_browsable gen=%lu, count=%d", gen, count);
|
||||
+ plog(XLOG_DEBUG, "%s: gen=%llu, count=%d", __func__,
|
||||
+ (unsigned long long)gen, count);
|
||||
|
||||
if (gen == 0) {
|
||||
size_t needed = needroom3();
|
||||
@@ -732,8 +733,9 @@ amfs_readdir3_browsable(am_node *mp, am_cookie3 cookie,
|
||||
for (j = 0, ne = te; ne; ne = ne->ne_nextentry)
|
||||
plog(XLOG_DEBUG, "gen2 key %4d \"%s\"", j++, ne->name);
|
||||
for (j = 0, ne = ep; ne; ne = ne->ne_nextentry) {
|
||||
- plog(XLOG_DEBUG, "gen2+ key %4d \"%s\" fi=%lu ck=%lu",
|
||||
- j++, ne->name, ne->fileid, ne->cookie);
|
||||
+ plog(XLOG_DEBUG, "gen2+ key %4d \"%s\" fi=%llu ck=%llu",
|
||||
+ j++, ne->name, (unsigned long long)ne->fileid,
|
||||
+ (unsigned long long)ne->cookie);
|
||||
}
|
||||
plog(XLOG_DEBUG, "EOF is %d", dp->eof);
|
||||
}
|
||||
@@ -793,14 +795,15 @@ amfs_readdir3_browsable(am_node *mp, am_cookie3 cookie,
|
||||
}
|
||||
|
||||
static int
|
||||
-amfs_readdir3(am_node *mp, am_cookie3 cookie,
|
||||
+amfs_readdir3(am_node *mp, voidp cookie,
|
||||
am_dirlist3 *dp, am_entry3 *ep, u_int count)
|
||||
{
|
||||
uint64 gen = *(uint64 *) cookie;
|
||||
am_node *xp;
|
||||
|
||||
if (amuDebug(D_READDIR))
|
||||
- plog(XLOG_DEBUG, "amfs_readdir3 gen=%lu, count=%d", gen, count);
|
||||
+ plog(XLOG_DEBUG, "%s: gen=%llu, count=%d", __func__,
|
||||
+ (unsigned long long)gen, count);
|
||||
|
||||
dp->eof = FALSE; /* assume readdir not done */
|
||||
|
||||
@@ -847,8 +850,9 @@ amfs_readdir3(am_node *mp, am_cookie3 cookie,
|
||||
am_entry3 *ne;
|
||||
int j;
|
||||
for (j = 0, ne = ep; ne; ne = ne->nextentry) {
|
||||
- plog(XLOG_DEBUG, "gen1 key %4d \"%s\" fi=%lu ck=%lu",
|
||||
- j++, ne->name, ne->fileid, ne->cookie);
|
||||
+ plog(XLOG_DEBUG, "gen1 key %4d \"%s\" fi=%llu ck=%llu",
|
||||
+ j++, ne->name, (unsigned long long)ne->fileid,
|
||||
+ (unsigned long long)ne->cookie);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
@@ -907,8 +911,9 @@ amfs_readdir3(am_node *mp, am_cookie3 cookie,
|
||||
am_entry3 *ne;
|
||||
int j;
|
||||
for (j = 0, ne = ep; ne; ne = ne->nextentry) {
|
||||
- plog(XLOG_DEBUG, "gen2 key %4d \"%s\" fi=%lu ck=%lu",
|
||||
- j++, ne->name, ne->fileid, ne->cookie);
|
||||
+ plog(XLOG_DEBUG, "gen2 key %4d \"%s\" fi=%llu ck=%llu",
|
||||
+ j++, ne->name, (unsigned long long)ne->fileid,
|
||||
+ (unsigned long long)ne->cookie);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
@@ -944,8 +949,8 @@ amfs_generic_readdir(am_node *mp, voidp cookie, voidp dp, voidp ep, u_int count)
|
||||
return amfs_readdir(mp, cookie, dp, ep, count);
|
||||
} else {
|
||||
if (browsable)
|
||||
- return amfs_readdir3_browsable(mp, (am_cookie3) cookie, dp, ep, count, full);
|
||||
+ return amfs_readdir3_browsable(mp, cookie, dp, ep, count, full);
|
||||
else
|
||||
- return amfs_readdir3(mp, (am_cookie3) cookie, dp, ep, count);
|
||||
+ return amfs_readdir3(mp, cookie, dp, ep, count);
|
||||
}
|
||||
}
|
||||
diff --git a/amq/amq.c b/amq/amq.c
|
||||
index 5d4ed7a..dc5fe02 100644
|
||||
--- a/amq/amq.c
|
||||
+++ b/amq/amq.c
|
||||
@@ -79,7 +79,7 @@ enum show_opt {
|
||||
static void
|
||||
time_print(time_type tt)
|
||||
{
|
||||
- time_t t = (time_t)tt;
|
||||
+ time_t t = (time_t)*tt;
|
||||
struct tm *tp = localtime(&t);
|
||||
printf("%02d/%02d/%04d %02d:%02d:%02d",
|
||||
tp->tm_mon + 1, tp->tm_mday,
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
commit cb493f02ca3b8fbf0dba18d5a733345f54513300
|
||||
Author: zoulasc <christos@zoulas.com>
|
||||
Date: Mon Mar 7 18:03:19 2016 -0500
|
||||
|
||||
1. Add the "sys" alias for "unix", as well as "none", and "null"
|
||||
2. Properly handle multiple flavors, although the linux kernel does not (yet?)
|
||||
3. Don't add the "sec=" field, because it is already there.
|
||||
|
||||
diff --git a/libamu/mount_fs.c b/libamu/mount_fs.c
|
||||
index 87f64c3..366eb8b 100644
|
||||
--- a/libamu/mount_fs.c
|
||||
+++ b/libamu/mount_fs.c
|
||||
@@ -1076,7 +1076,10 @@ struct {
|
||||
const char *name;
|
||||
int num;
|
||||
} flavours[] = {
|
||||
+ { "none", AUTH_NONE },
|
||||
+ { "null", AUTH_NULL },
|
||||
{ "unix", AUTH_UNIX },
|
||||
+ { "sys", AUTH_SYS },
|
||||
{ "krb5", RPC_AUTH_GSS_KRB5 },
|
||||
{ "krb5i", RPC_AUTH_GSS_KRB5I },
|
||||
{ "krb5p", RPC_AUTH_GSS_KRB5P },
|
||||
@@ -1104,12 +1107,13 @@ set_nfs4_security(nfs4_args_t *nap, mntent_t *mntp)
|
||||
nap->auth_flavours = xmalloc(l * sizeof(*nap->auth_flavours));
|
||||
|
||||
s = ss = xstrdup(o);
|
||||
+ l = 0;
|
||||
for (;;) {
|
||||
q = strchr(s, ',');
|
||||
if (q)
|
||||
*q = '\0';
|
||||
|
||||
- for (l = 0, i = 0; i < sizeof(flavours) / sizeof(flavours[0]); i++)
|
||||
+ for (i = 0; i < sizeof(flavours) / sizeof(flavours[0]); i++)
|
||||
if (strcmp(flavours[i].name, s) == 0) {
|
||||
nap->auth_flavours[l++] = flavours[i].num;
|
||||
break;
|
||||
@@ -1125,6 +1129,9 @@ set_nfs4_security(nfs4_args_t *nap, mntent_t *mntp)
|
||||
s = ++q;
|
||||
}
|
||||
|
||||
+ if (l == 0) {
|
||||
+ nap->auth_flavours[l++] = AUTH_UNIX;
|
||||
+ }
|
||||
nap->auth_flavourlen = l;
|
||||
return ss;
|
||||
}
|
||||
@@ -1172,12 +1179,15 @@ add_nfs4_mntopts(const nfs4_args_t *nap, mntent_t *mntp, char *sec)
|
||||
opts = xrealloc(mntp->mnt_opts, len);
|
||||
xstrlcat(opts, buf, len);
|
||||
|
||||
+#ifdef notdef
|
||||
+ /* Already in the options */
|
||||
if (sec) {
|
||||
xstrlcat(opts, ",", len);
|
||||
xstrlcat(opts, MNTTAB_OPT_SEC, len);
|
||||
xstrlcat(opts, "=", len);
|
||||
xstrlcat(opts, sec, len);
|
||||
}
|
||||
+#endif
|
||||
|
||||
mntp->mnt_opts = opts;
|
||||
}
|
||||
58
am-utils-6.2-Default-to-string-mount-options-for-NFSv4.patch
Normal file
58
am-utils-6.2-Default-to-string-mount-options-for-NFSv4.patch
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
commit 3369871a5e68484e231705bb0a893b4c6da85d17
|
||||
Author: zoulasc <christos@zoulas.com>
|
||||
Date: Mon Mar 7 18:05:07 2016 -0500
|
||||
|
||||
Default to "string" mount options for NFSv4 because the kernel does not
|
||||
properly handle the auth_flavours[] field. Tested with nfs-utils-1.3.3 and
|
||||
it always defaults to krb5i if string options are not used. Please note
|
||||
that the "rw" option is not recognized by the linux kernel.
|
||||
|
||||
diff --git a/conf/mount/mount_linux.c b/conf/mount/mount_linux.c
|
||||
index d3841ce..de7708d 100644
|
||||
--- a/conf/mount/mount_linux.c
|
||||
+++ b/conf/mount/mount_linux.c
|
||||
@@ -450,7 +450,7 @@ do_mount_linux(MTYPE_TYPE type, mntent_t *mnt, int flags, caddr_t data)
|
||||
return mount(mnt->mnt_fsname,
|
||||
mnt->mnt_dir,
|
||||
type,
|
||||
- MS_MGC_VAL | flags,
|
||||
+ flags,
|
||||
data);
|
||||
}
|
||||
|
||||
@@ -566,9 +566,9 @@ mount_linux_nfs(MTYPE_TYPE type, mntent_t *mnt, int flags, caddr_t data)
|
||||
plog(XLOG_DEBUG, "%s: port %d\n", __func__,
|
||||
htons(mnt_data->addr.sin_port));
|
||||
}
|
||||
+ flags |= MS_MGC_VAL;
|
||||
if (amuDebug(D_TRACE)) {
|
||||
- plog(XLOG_DEBUG, "%s: Generic mount flags 0x%x", __func__,
|
||||
- MS_MGC_VAL | flags);
|
||||
+ plog(XLOG_DEBUG, "%s: Generic mount flags 0x%x", __func__, flags);
|
||||
plog(XLOG_DEBUG, "%s: updated nfs_args...", __func__);
|
||||
print_nfs_args(mnt_data, 0);
|
||||
}
|
||||
@@ -610,14 +610,21 @@ mount_linux_nfs4(MTYPE_TYPE type, mntent_t *mnt, int flags, caddr_t data)
|
||||
plog(XLOG_DEBUG, "%s: type %s\n", __func__, type);
|
||||
plog(XLOG_DEBUG, "%s: version %d\n", __func__, mnt_data->version);
|
||||
}
|
||||
+#if 0
|
||||
+ flags |= MS_MGC_VAL;
|
||||
+#endif
|
||||
if (amuDebug(D_TRACE)) {
|
||||
- plog(XLOG_DEBUG, "%s: Generic mount flags 0x%x", __func__,
|
||||
- MS_MGC_VAL | flags);
|
||||
+ plog(XLOG_DEBUG, "%s: Generic mount flags 0x%x", __func__, flags);
|
||||
plog(XLOG_DEBUG, "%s: updated nfs_args...", __func__);
|
||||
print_nfs_args(mnt_data, NFS_VERSION4);
|
||||
}
|
||||
|
||||
+#if 0
|
||||
errorcode = do_mount_linux(type, mnt, flags, data);
|
||||
+#else
|
||||
+ errorcode = do_mount_linux(type, mnt, flags, mnt->mnt_opts);
|
||||
+#endif
|
||||
+
|
||||
|
||||
return errorcode;
|
||||
}
|
||||
19
am-utils-6.2-Fix-SEGV-on-amq-entries-that-print-times.patch
Normal file
19
am-utils-6.2-Fix-SEGV-on-amq-entries-that-print-times.patch
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
commit 6a12fc0acb3afb654ba5e6efdeb28b943e2efd3e
|
||||
Author: zoulasc <christos@zoulas.com>
|
||||
Date: Thu Mar 31 14:56:53 2016 -0400
|
||||
|
||||
Fix SEGV on amq entries that print times.
|
||||
|
||||
diff --git a/amq/amq.c b/amq/amq.c
|
||||
index dc5fe02..04f9e4d 100644
|
||||
--- a/amq/amq.c
|
||||
+++ b/amq/amq.c
|
||||
@@ -79,7 +79,7 @@ enum show_opt {
|
||||
static void
|
||||
time_print(time_type tt)
|
||||
{
|
||||
- time_t t = (time_t)*tt;
|
||||
+ time_t t = (time_t)(intptr_t)tt;
|
||||
struct tm *tp = localtime(&t);
|
||||
printf("%02d/%02d/%04d %02d:%02d:%02d",
|
||||
tp->tm_mon + 1, tp->tm_mday,
|
||||
71
am-utils-6.2-Fix-nfs-args-setting-code.patch
Normal file
71
am-utils-6.2-Fix-nfs-args-setting-code.patch
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
commit 1c4c00a489d7aef115020b903dcd10201eb56ac0
|
||||
Author: zoulasc <christos@zoulas.com>
|
||||
Date: Thu Apr 30 14:24:39 2015 -0400
|
||||
|
||||
Fix nfs args setting code (raven at the maw dot net)
|
||||
|
||||
diff --git a/ChangeLog b/ChangeLog
|
||||
index fd05087..64be682 100644
|
||||
--- a/ChangeLog
|
||||
+++ b/ChangeLog
|
||||
@@ -1,3 +1,8 @@
|
||||
+2015-04-30 Christos Zoulas <christos@zoulas.com>
|
||||
+
|
||||
+ * fix compilation error in nfs args set code.
|
||||
+ (raven at themaw.net)
|
||||
+
|
||||
2015-01-17 Christos Zoulas <christos@zoulas.com>
|
||||
|
||||
* Move libtool macro functions from m4/macros to m4 and delete
|
||||
diff --git a/libamu/mount_fs.c b/libamu/mount_fs.c
|
||||
index b577bab..87f64c3 100644
|
||||
--- a/libamu/mount_fs.c
|
||||
+++ b/libamu/mount_fs.c
|
||||
@@ -1001,12 +1001,12 @@ compute_nfs23_args(nfs_args_t *nap,
|
||||
|
||||
#ifdef MNTTAB_OPT_SYMTTL /* symlink cache time-to-live */
|
||||
if ((nap->symttl = hasmntval(mntp, MNTTAB_OPT_SYMTTL)))
|
||||
- nap->args.flags |= MNT2_NFS_OPT_SYMTTL;
|
||||
+ nap->flags |= MNT2_NFS_OPT_SYMTTL;
|
||||
#endif /* MNTTAB_OPT_SYMTTL */
|
||||
|
||||
#ifdef MNT2_NFS_OPT_PGTHRESH /* paging threshold */
|
||||
if ((nap->pg_thresh = hasmntval(mntp, MNTTAB_OPT_PGTHRESH)))
|
||||
- nap->args.flags |= MNT2_NFS_OPT_PGTHRESH;
|
||||
+ nap->flags |= MNT2_NFS_OPT_PGTHRESH;
|
||||
#endif /* MNT2_NFS_OPT_PGTHRESH */
|
||||
|
||||
#if defined(MNT2_NFS_OPT_POSIX) && defined(MNTTAB_OPT_POSIX)
|
||||
@@ -1029,12 +1029,12 @@ compute_nfs23_args(nfs_args_t *nap,
|
||||
return;
|
||||
}
|
||||
/* update the flags field for knconf */
|
||||
- nap->args.flags |= MNT2_NFS_OPT_KNCONF;
|
||||
+ nap->flags |= MNT2_NFS_OPT_KNCONF;
|
||||
#endif /* HAVE_TRANSPORT_TYPE_TLI */
|
||||
|
||||
#ifdef MNT2_NFS_OPT_FSNAME
|
||||
nap->fsname = fs_name;
|
||||
- nap->args.flags |= MNT2_NFS_OPT_FSNAME;
|
||||
+ nap->flags |= MNT2_NFS_OPT_FSNAME;
|
||||
#endif /* MNT2_NFS_OPT_FSNAME */
|
||||
|
||||
|
||||
@@ -1323,7 +1323,7 @@ compute_nfs4_args(nfs4_args_t *nap,
|
||||
|
||||
#if defined(MNT2_NFS_OPT_POSIX) && defined(MNTTAB_OPT_POSIX)
|
||||
if (amu_hasmntopt(mntp, MNTTAB_OPT_POSIX) != NULL) {
|
||||
- nap->args.flags |= MNT2_NFS_OPT_POSIX;
|
||||
+ nap->flags |= MNT2_NFS_OPT_POSIX;
|
||||
# ifdef HAVE_NFS_ARGS_T_PATHCONF
|
||||
nap->pathconf = NULL;
|
||||
# endif /* HAVE_NFS_ARGS_T_PATHCONF */
|
||||
@@ -1333,7 +1333,7 @@ compute_nfs4_args(nfs4_args_t *nap,
|
||||
#if defined(MNT2_NFS_OPT_MAXGRPS) && defined(MNTTAB_OPT_MAXGROUPS)
|
||||
nap->maxgrouplist = hasmntval(mntp, MNTTAB_OPT_MAXGROUPS);
|
||||
if (nap->maxgrouplist != 0)
|
||||
- nap->args.flags |= MNT2_NFS_OPT_MAXGRPS;
|
||||
+ nap->flags |= MNT2_NFS_OPT_MAXGRPS;
|
||||
#endif /* defined(MNT2_NFS_OPT_MAXGRPS) && defined(MNTTAB_OPT_MAXGROUPS) */
|
||||
|
||||
#ifdef HAVE_NFS_ARGS_T_OPTSTR
|
||||
36
am-utils-6.2-Improve-debugging-for-unmounting.patch
Normal file
36
am-utils-6.2-Improve-debugging-for-unmounting.patch
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
commit 227ce116a307a7f38967639c94ad74970ee83700
|
||||
Author: zoulasc <christos@zoulas.com>
|
||||
Date: Tue Mar 8 23:30:38 2016 -0500
|
||||
|
||||
Improve debugging for unmounting.
|
||||
|
||||
diff --git a/amd/map.c b/amd/map.c
|
||||
index bcb2156..a6df44b 100644
|
||||
--- a/amd/map.c
|
||||
+++ b/amd/map.c
|
||||
@@ -904,10 +904,8 @@ unmount_mp(am_node *mp)
|
||||
int was_backgrounded = 0;
|
||||
mntfs *mf = mp->am_al->al_mnt;
|
||||
|
||||
-#ifdef notdef
|
||||
plog(XLOG_INFO, "\"%s\" on %s timed out (flags 0x%x)",
|
||||
- mp->am_path, mf->mf_mount, (int) mf->mf_flags);
|
||||
-#endif /* notdef */
|
||||
+ mp->am_path, mf->mf_mount, (int) mf->mf_flags);
|
||||
|
||||
#ifndef MNT2_NFS_OPT_SYMTTL
|
||||
/*
|
||||
@@ -938,11 +936,12 @@ unmount_mp(am_node *mp)
|
||||
plog(XLOG_STATS, "file server %s is down - timeout of \"%s\" ignored", mf->mf_server->fs_host, mp->am_path);
|
||||
mf->mf_flags |= MFF_LOGDOWN;
|
||||
}
|
||||
+ dlog("\"%s\" on %s server is down, deferred", mp->am_path, mf->mf_mount);
|
||||
notify_child(mp, AMQ_UMNT_SERVER, 0, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
- dlog("\"%s\" on %s timed out", mp->am_path, mf->mf_mount);
|
||||
+ dlog("\"%s\" on %s timed out, unmounting", mp->am_path, mf->mf_mount);
|
||||
mf->mf_flags |= MFF_UNMOUNTING;
|
||||
|
||||
#ifdef HAVE_FS_AUTOFS
|
||||
|
|
@ -0,0 +1,530 @@
|
|||
commit 1c9cd2d03ab1561b7eee831af381eff781fcf41e
|
||||
Author: zoulasc <christos@zoulas.com>
|
||||
Date: Fri Apr 8 15:29:33 2016 -0400
|
||||
|
||||
* Make hasmntval() return an 0 on error, 1 on success and
|
||||
place the value in an argument. Update all users and
|
||||
check properly for errors. Get rid of hasmntvalerr().
|
||||
* Add hasmntvaldelim() which takes a string delimiter. This
|
||||
is now used to chop vers=4.1 to 4, so that we can parse the
|
||||
version correctly (we don't care about the .1 part yet)
|
||||
|
||||
---
|
||||
amd/autil.c | 10 ++----
|
||||
amd/ops_cdfs.c | 7 ++++
|
||||
amd/ops_nfs.c | 3 --
|
||||
amd/ops_pcfs.c | 10 ++++--
|
||||
amd/ops_ufs.c | 6 +++-
|
||||
amd/srvr_nfs.c | 24 ++++++++++------
|
||||
hlfsd/hlfsd.c | 3 --
|
||||
include/am_utils.h | 4 +-
|
||||
libamu/mount_fs.c | 79 ++++++++++++++++++++++++++++++++++++++---------------
|
||||
libamu/mtab.c | 41 ++++++++-------------------
|
||||
10 files changed, 109 insertions(+), 78 deletions(-)
|
||||
|
||||
--- am-utils-6.2.orig/amd/autil.c
|
||||
+++ am-utils-6.2/amd/autil.c
|
||||
@@ -279,7 +279,7 @@ am_mounted(am_node *mp)
|
||||
if (amu_hasmntopt(&mnt, "nounmount") || amu_hasmntopt(&mnt, "noumount"))
|
||||
notimeout = 1;
|
||||
/* utimeout=N option: user wants to unmount this option AND set timeout */
|
||||
- if ((mp->am_timeo = hasmntval(&mnt, "utimeout")) == 0)
|
||||
+ if (!hasmntval(&mnt, "utimeout", &mp->am_timeo))
|
||||
mp->am_timeo = gopt.am_timeo; /* otherwise use default timeout */
|
||||
else
|
||||
notimeout = 0;
|
||||
@@ -480,8 +480,7 @@ amfs_mount(am_node *mp, mntfs *mf, char
|
||||
mnt.mnt_type = HIDE_MOUNT_TYPE;
|
||||
}
|
||||
|
||||
- retry = hasmntval(&mnt, MNTTAB_OPT_RETRY);
|
||||
- if (retry <= 0)
|
||||
+ if (!hasmntval(&mnt, MNTTAB_OPT_RETRY, &retry) || retry <= 0)
|
||||
retry = 2; /* XXX: default to 2 retries */
|
||||
|
||||
/*
|
||||
@@ -526,7 +525,7 @@ again:
|
||||
nfs_args_t nfs_args;
|
||||
am_nfs_handle_t *fhp, anh;
|
||||
#ifndef HAVE_TRANSPORT_TYPE_TLI
|
||||
- u_short port;
|
||||
+ int port;
|
||||
struct sockaddr_in sin;
|
||||
#endif /* not HAVE_TRANSPORT_TYPE_TLI */
|
||||
|
||||
@@ -547,8 +546,7 @@ again:
|
||||
/* as per POSIX, sin_len need not be set (used internally by kernel) */
|
||||
sin.sin_family = AF_INET;
|
||||
sin.sin_addr = myipaddr;
|
||||
- port = hasmntval(&mnt, MNTTAB_OPT_PORT);
|
||||
- if (port) {
|
||||
+ if (hasmntval(&mnt, MNTTAB_OPT_PORT, &port) && port > 0 && port < 65536) {
|
||||
sin.sin_port = htons(port);
|
||||
} else {
|
||||
plog(XLOG_ERROR, "no port number specified for %s", dir);
|
||||
--- am-utils-6.2.orig/amd/ops_cdfs.c
|
||||
+++ am-utils-6.2/amd/ops_cdfs.c
|
||||
@@ -190,7 +190,12 @@ mount_cdfs(char *mntdir, char *fs_name,
|
||||
#endif /* HAVE_CDFS_ARGS_T_ISO_FLAGS */
|
||||
|
||||
#ifdef HAVE_CDFS_ARGS_T_ISO_PGTHRESH
|
||||
- cdfs_args.iso_pgthresh = hasmntval(&mnt, MNTTAB_OPT_PGTHRESH);
|
||||
+ {
|
||||
+ int thresh;
|
||||
+ if (!hasmntval(&mnt, MNTTAB_OPT_PGTHRESH, &thresh) || thresh < 0)
|
||||
+ thresh = 0;
|
||||
+ cdfs_args.iso_pgthresh = thresh;
|
||||
+ }
|
||||
#endif /* HAVE_CDFS_ARGS_T_ISO_PGTHRESH */
|
||||
|
||||
#ifdef HAVE_CDFS_ARGS_T_NORRIP
|
||||
--- am-utils-6.2.orig/amd/ops_nfs.c
|
||||
+++ am-utils-6.2/amd/ops_nfs.c
|
||||
@@ -888,8 +888,7 @@ mount_nfs_fh(am_nfs_handle_t *fhp, char
|
||||
plog(XLOG_INFO, "mount_nfs_fh: NFS version %d", (int) nfs_version);
|
||||
plog(XLOG_INFO, "mount_nfs_fh: using NFS transport %s", nfs_proto);
|
||||
|
||||
- retry = hasmntval(&mnt, MNTTAB_OPT_RETRY);
|
||||
- if (retry <= 0)
|
||||
+ if (!hasmntval(&mnt, MNTTAB_OPT_RETRY, &retry) || retry <= 0)
|
||||
retry = 1; /* XXX */
|
||||
|
||||
genflags = compute_mount_flags(&mnt);
|
||||
--- am-utils-6.2.orig/amd/ops_pcfs.c
|
||||
+++ am-utils-6.2/amd/ops_pcfs.c
|
||||
@@ -139,17 +139,19 @@ mount_pcfs(char *mntdir, char *fs_name,
|
||||
#endif /* HAVE_PCFS_ARGS_T_FSPEC */
|
||||
|
||||
#ifdef HAVE_PCFS_ARGS_T_MASK
|
||||
- pcfs_args.mask = 0777; /* this may be the msdos file modes */
|
||||
- if ((mask = hasmntval(&mnt, MNTTAB_OPT_MASK)) > 0)
|
||||
+ if (hasmntval(&mnt, MNTTAB_OPT_MASK, &mask) && mask > 0)
|
||||
pcfs_args.mask = mask;
|
||||
+ else
|
||||
+ pcfs_args.mask = 0777; /* this may be the msdos file modes */
|
||||
if (amuDebug(D_TRACE))
|
||||
plog(XLOG_DEBUG, "mount_pcfs: mask=%o (octal)", (u_int) pcfs_args.mask);
|
||||
#endif /* HAVE_PCFS_ARGS_T_MASK */
|
||||
|
||||
#ifdef HAVE_PCFS_ARGS_T_DIRMASK
|
||||
- pcfs_args.dirmask = 0777; /* this may be the msdos dir modes */
|
||||
- if ((mask = hasmntval(&mnt, MNTTAB_OPT_DIRMASK)) > 0)
|
||||
+ if (hasmntval(&mnt, MNTTAB_OPT_DIRMASK, &mask) && mask > 0)
|
||||
pcfs_args.dirmask = mask;
|
||||
+ else
|
||||
+ pcfs_args.dirmask = 0777; /* this may be the msdos dir modes */
|
||||
if (amuDebug(D_TRACE))
|
||||
plog(XLOG_DEBUG, "mount_pcfs: dirmask=%o (octal)", (u_int) pcfs_args.dirmask);
|
||||
#endif /* HAVE_PCFS_ARGS_T_DIRMASK */
|
||||
--- am-utils-6.2.orig/amd/ops_ufs.c
|
||||
+++ am-utils-6.2/amd/ops_ufs.c
|
||||
@@ -144,7 +144,11 @@ mount_ufs(char *mntdir, char *fs_name, c
|
||||
#endif /* HAVE_UFS_ARGS_T_FSPEC */
|
||||
|
||||
#ifdef HAVE_UFS_ARGS_T_UFS_PGTHRESH
|
||||
- ufs_args.ufs_pgthresh = hasmntval(&mnt, MNTTAB_OPT_PGTHRESH);
|
||||
+ {
|
||||
+ int thresh;
|
||||
+ if (!hasmntval(&mnt, MNTTAB_OPT_PGTHRESH, &thresh) || thresh < 0)
|
||||
+ thresh = 0;
|
||||
+ ufs_args.ufs_pgthresh = thresh;
|
||||
#endif /* HAVE_UFS_ARGS_T_UFS_PGTHRESH */
|
||||
|
||||
/*
|
||||
--- am-utils-6.2.orig/amd/srvr_nfs.c
|
||||
+++ am-utils-6.2/amd/srvr_nfs.c
|
||||
@@ -704,10 +704,10 @@ find_nfs_srvr(mntfs *mf)
|
||||
struct hostent *hp = NULL;
|
||||
struct sockaddr_in *ip = NULL;
|
||||
u_long nfs_version = 0; /* default is no version specified */
|
||||
+ int val;
|
||||
u_long best_nfs_version = 0;
|
||||
char *nfs_proto = NULL; /* no IP protocol either */
|
||||
- int nfs_port = 0;
|
||||
- int nfs_port_opt = 0;
|
||||
+ int nfs_port;
|
||||
int fserver_is_down = 0;
|
||||
|
||||
if (mf->mf_fo == NULL) {
|
||||
@@ -721,7 +721,8 @@ find_nfs_srvr(mntfs *mf)
|
||||
* are required or not. < 0 = no pings.
|
||||
*/
|
||||
mnt.mnt_opts = mf->mf_mopts;
|
||||
- pingval = hasmntval(&mnt, "ping");
|
||||
+ if (!hasmntval(&mnt, "ping", &pingval) || pingval < 0)
|
||||
+ pingval = 0;
|
||||
|
||||
if (mf->mf_flags & MFF_NFS_SCALEDOWN) {
|
||||
/*
|
||||
@@ -739,7 +740,10 @@ find_nfs_srvr(mntfs *mf)
|
||||
* to decide the highest NFS version to try.
|
||||
*/
|
||||
#ifdef MNTTAB_OPT_VERS
|
||||
- nfs_version = hasmntval(&mnt, MNTTAB_OPT_VERS);
|
||||
+ if (!hasmntvaldelim(&mnt, MNTTAB_OPT_VERS, ",.", &val) || val < 0)
|
||||
+ nfs_version = 0;
|
||||
+ else
|
||||
+ nfs_version = val;
|
||||
#endif /* MNTTAB_OPT_VERS */
|
||||
|
||||
#ifdef MNTTAB_OPT_PROTO
|
||||
@@ -934,11 +938,11 @@ find_nfs_srvr(mntfs *mf)
|
||||
* If the port has been determined from the portmapper, use that.
|
||||
* Default to NFS_PORT otherwise (cf. RFC 2054, 3).
|
||||
*/
|
||||
- nfs_port_opt = hasmntval(&mnt, MNTTAB_OPT_PORT);
|
||||
- if (nfs_port_opt > 0)
|
||||
- nfs_port = htons(nfs_port_opt);
|
||||
- if (!nfs_port)
|
||||
+ if (!hasmntval(&mnt, MNTTAB_OPT_PORT, &nfs_port)
|
||||
+ || nfs_port > 65535 || nfs_port <= 0)
|
||||
nfs_port = htons(NFS_PORT);
|
||||
+ else
|
||||
+ nfs_port = htons(nfs_port);
|
||||
|
||||
dlog("%s: using port %d for nfs on %s", __func__,
|
||||
(int) ntohs(nfs_port), host);
|
||||
@@ -1050,7 +1054,9 @@ no_dns:
|
||||
fs->fs_flags |= FSF_PING_UNINIT; /* pinger hasn't been initialized */
|
||||
np = ALLOC(struct nfs_private);
|
||||
memset((voidp) np, 0, sizeof(*np));
|
||||
- np->np_mountd = htons(hasmntval(&mnt, "mountport"));
|
||||
+ if (!hasmntval(&mnt, "mountport", &val) || val < 0)
|
||||
+ val = 0;
|
||||
+ np->np_mountd = htons(val);
|
||||
if (np->np_mountd == 0) {
|
||||
np->np_mountd_inval = 'Y';
|
||||
np->np_xid = XID_ALLOC();
|
||||
--- am-utils-6.2.orig/hlfsd/hlfsd.c
|
||||
+++ am-utils-6.2/hlfsd/hlfsd.c
|
||||
@@ -530,8 +530,7 @@ main(int argc, char *argv[])
|
||||
|
||||
genflags = compute_mount_flags(&mnt);
|
||||
|
||||
- retry = hasmntval(&mnt, MNTTAB_OPT_RETRY);
|
||||
- if (retry <= 0)
|
||||
+ if (!hasmntval(&mnt, MNTTAB_OPT_RETRY, &retry) || retry <= 0)
|
||||
retry = 1; /* XXX */
|
||||
|
||||
memmove(&anh.v2, root_fhp, sizeof(*root_fhp));
|
||||
--- am-utils-6.2.orig/include/am_utils.h
|
||||
+++ am-utils-6.2/include/am_utils.h
|
||||
@@ -290,8 +290,8 @@ extern int compute_mount_flags(mntent_t
|
||||
extern void discard_nfs_args(void *, u_long);
|
||||
extern u_long get_amd_program_number(void);
|
||||
extern int getcreds(struct svc_req *, uid_t *, gid_t *, SVCXPRT *);
|
||||
-extern int hasmntval(mntent_t *, char *);
|
||||
-extern unsigned int hasmntvalerr(mntent_t *, char *, int *);
|
||||
+extern int hasmntval(mntent_t *, char *, int *);
|
||||
+extern int hasmntvaldelim(mntent_t *, char *, const char *, int *);
|
||||
extern char *hasmntstr(mntent_t *, char *);
|
||||
extern char *hasmnteq(mntent_t *, char *);
|
||||
extern char *haseq(char *);
|
||||
--- am-utils-6.2.orig/libamu/mount_fs.c
|
||||
+++ am-utils-6.2/libamu/mount_fs.c
|
||||
@@ -188,8 +188,10 @@ static void
|
||||
addvers(char *zopts, size_t l, mntent_t *mnt, u_long have_vers,
|
||||
u_long want_vers)
|
||||
{
|
||||
- if (have_vers == want_vers &&
|
||||
- hasmntval(mnt, MNTTAB_OPT_VERS) != want_vers) {
|
||||
+ int val;
|
||||
+ if (have_vers == want_vers
|
||||
+ && hasmntvaldelim(mnt, MNTTAB_OPT_VERS, ".,", &val)
|
||||
+ && (u_long)val != want_vers) {
|
||||
char optsbuf[48];
|
||||
xsnprintf(optsbuf, sizeof(optsbuf),
|
||||
"%s=%d", MNTTAB_OPT_VERS, want_vers);
|
||||
@@ -391,7 +393,7 @@ compute_nfs_attrcache_flags(struct nfs_c
|
||||
* on the values of the attribute caches.
|
||||
*/
|
||||
#ifdef MNTTAB_OPT_ACTIMEO
|
||||
- err_acval = hasmntvalerr(mntp, MNTTAB_OPT_ACTIMEO, &acval); /* attr cache timeout (sec) */
|
||||
+ err_acval = !hasmntval(mntp, MNTTAB_OPT_ACTIMEO, &acval); /* attr cache timeout (sec) */
|
||||
#endif /* MNTTAB_OPT_ACTIMEO */
|
||||
|
||||
/*** acregmin ***/
|
||||
@@ -402,7 +404,7 @@ compute_nfs_attrcache_flags(struct nfs_c
|
||||
} else {
|
||||
# ifdef MNTTAB_OPT_ACREGMIN
|
||||
int tmp;
|
||||
- err_acrdmm = hasmntvalerr(mntp, MNTTAB_OPT_ACREGMIN, &tmp);
|
||||
+ err_acrdmm = !hasmntval(mntp, MNTTAB_OPT_ACREGMIN, &tmp);
|
||||
nap->acregmin = tmp;
|
||||
# else /* not MNTTAB_OPT_ACREGMIN */
|
||||
nap->acregmin = 0;
|
||||
@@ -423,7 +425,7 @@ compute_nfs_attrcache_flags(struct nfs_c
|
||||
} else {
|
||||
# ifdef MNTTAB_OPT_ACREGMAX
|
||||
int tmp;
|
||||
- err_acrdmm = hasmntvalerr(mntp, MNTTAB_OPT_ACREGMAX, &tmp);
|
||||
+ err_acrdmm = !hasmntval(mntp, MNTTAB_OPT_ACREGMAX, &tmp);
|
||||
nap->acregmax = tmp;
|
||||
# else /* not MNTTAB_OPT_ACREGMAX */
|
||||
nap->acregmax = 0;
|
||||
@@ -444,7 +446,7 @@ compute_nfs_attrcache_flags(struct nfs_c
|
||||
} else {
|
||||
# ifdef MNTTAB_OPT_ACDIRMIN
|
||||
int tmp;
|
||||
- err_acrdmm = hasmntvalerr(mntp, MNTTAB_OPT_ACDIRMIN, &tmp);
|
||||
+ err_acrdmm = !hasmntval(mntp, MNTTAB_OPT_ACDIRMIN, &tmp);
|
||||
nap->acdirmin = tmp;
|
||||
# else /* not MNTTAB_OPT_ACDIRMIN */
|
||||
nap->acdirmin = 0;
|
||||
@@ -465,7 +467,7 @@ compute_nfs_attrcache_flags(struct nfs_c
|
||||
} else {
|
||||
# ifdef MNTTAB_OPT_ACDIRMAX
|
||||
int tmp;
|
||||
- err_acrdmm = hasmntvalerr(mntp, MNTTAB_OPT_ACDIRMAX, &tmp);
|
||||
+ err_acrdmm = !hasmntval(mntp, MNTTAB_OPT_ACDIRMAX, &tmp);
|
||||
nap->acdirmax = tmp;
|
||||
# else /* not MNTTAB_OPT_ACDIRMAX */
|
||||
nap->acdirmax = 0;
|
||||
@@ -492,6 +494,7 @@ static void
|
||||
compute_nfs_common_args(struct nfs_common_args *nap, mntent_t *mntp,
|
||||
const char *nfs_proto, u_long nfs_version)
|
||||
{
|
||||
+ int val;
|
||||
#ifdef MNT2_NFS_OPT_TCP
|
||||
if (nfs_proto && STREQ(nfs_proto, "tcp"))
|
||||
nap->flags |= MNT2_NFS_OPT_TCP;
|
||||
@@ -536,7 +539,10 @@ compute_nfs_common_args(struct nfs_commo
|
||||
# endif /* not MNTTAB_OPT_RESVPORT */
|
||||
#endif /* MNT2_NFS_OPT_RESVPORT */
|
||||
|
||||
- nap->rsize = hasmntval(mntp, MNTTAB_OPT_RSIZE);
|
||||
+ if (!hasmntval(mntp, MNTTAB_OPT_RSIZE, &val) || val <= 0)
|
||||
+ nap->rsize = 0;
|
||||
+ else
|
||||
+ nap->rsize = val;
|
||||
#ifdef MNT2_NFS_OPT_RSIZE
|
||||
if (nap->rsize)
|
||||
nap->flags |= MNT2_NFS_OPT_RSIZE;
|
||||
@@ -544,7 +550,10 @@ compute_nfs_common_args(struct nfs_commo
|
||||
if (nfs_version == NFS_VERSION && nap->rsize > 8192)
|
||||
nap->rsize = 8192;
|
||||
|
||||
- nap->wsize = hasmntval(mntp, MNTTAB_OPT_WSIZE);
|
||||
+ if (!hasmntval(mntp, MNTTAB_OPT_WSIZE, &val) || val <= 0)
|
||||
+ nap->wsize = 0;
|
||||
+ else
|
||||
+ nap->wsize = val;
|
||||
#ifdef MNT2_NFS_OPT_WSIZE
|
||||
if (nap->wsize)
|
||||
nap->flags |= MNT2_NFS_OPT_WSIZE;
|
||||
@@ -552,13 +561,19 @@ compute_nfs_common_args(struct nfs_commo
|
||||
if (nfs_version == NFS_VERSION && nap->wsize > 8192)
|
||||
nap->wsize = 8192;
|
||||
|
||||
- nap->timeo = hasmntval(mntp, MNTTAB_OPT_TIMEO);
|
||||
+ if (!hasmntval(mntp, MNTTAB_OPT_TIMEO, &val) || val <= 0)
|
||||
+ nap->timeo = 0;
|
||||
+ else
|
||||
+ nap->timeo = val;
|
||||
#ifdef MNT2_NFS_OPT_TIMEO
|
||||
if (nap->timeo)
|
||||
nap->flags |= MNT2_NFS_OPT_TIMEO;
|
||||
#endif /* MNT2_NFS_OPT_TIMEO */
|
||||
|
||||
- nap->retrans = hasmntval(mntp, MNTTAB_OPT_RETRANS);
|
||||
+ if (!hasmntval(mntp, MNTTAB_OPT_RETRANS, &val) || val <= 0)
|
||||
+ nap->retrans = 0;
|
||||
+ else
|
||||
+ nap->retrans = val;
|
||||
#ifdef MNT2_NFS_OPT_RETRANS
|
||||
if (nap->retrans)
|
||||
nap->flags |= MNT2_NFS_OPT_RETRANS;
|
||||
@@ -861,6 +876,7 @@ compute_nfs23_args(nfs_args_t *nap,
|
||||
char *host_name,
|
||||
char *fs_name)
|
||||
{
|
||||
+ int val;
|
||||
struct nfs_common_args a;
|
||||
/* initialize just in case */
|
||||
memset((voidp) nap, 0, sizeof(nfs_args_t));
|
||||
@@ -995,18 +1011,30 @@ compute_nfs23_args(nfs_args_t *nap,
|
||||
/************************************************************************/
|
||||
|
||||
#ifdef MNT2_NFS_OPT_BIODS
|
||||
- if ((nap->biods = hasmntval(mntp, MNTTAB_OPT_BIODS)))
|
||||
+ if (!hasmntval(mntp, MNTTAB_OPT_BIODS, &val) || val <= 0)
|
||||
+ nap->biods = 0;
|
||||
+ else {
|
||||
+ nap->biods = val;
|
||||
nap->flags |= MNT2_NFS_OPT_BIODS;
|
||||
+ }
|
||||
#endif /* MNT2_NFS_OPT_BIODS */
|
||||
|
||||
#ifdef MNTTAB_OPT_SYMTTL /* symlink cache time-to-live */
|
||||
- if ((nap->symttl = hasmntval(mntp, MNTTAB_OPT_SYMTTL)))
|
||||
+ if (!hasmntval(mntp, MNTTAB_OPT_SYMTTL, &val) || val <= 0)
|
||||
+ nap->symttl = 0;
|
||||
+ else {
|
||||
+ nap->symttl = val;
|
||||
nap->flags |= MNT2_NFS_OPT_SYMTTL;
|
||||
+ }
|
||||
#endif /* MNTTAB_OPT_SYMTTL */
|
||||
|
||||
#ifdef MNT2_NFS_OPT_PGTHRESH /* paging threshold */
|
||||
- if ((nap->pg_thresh = hasmntval(mntp, MNTTAB_OPT_PGTHRESH)))
|
||||
+ if (!hasmntval(mntp, MNTTAB_OPT_PGTHRESH, &val) || val <= 0)
|
||||
+ nap->pg_thresh = 0;
|
||||
+ else {
|
||||
+ nap->pg_thresh = val;
|
||||
nap->flags |= MNT2_NFS_OPT_PGTHRESH;
|
||||
+ }
|
||||
#endif /* MNT2_NFS_OPT_PGTHRESH */
|
||||
|
||||
#if defined(MNT2_NFS_OPT_POSIX) && defined(MNTTAB_OPT_POSIX)
|
||||
@@ -1020,7 +1048,7 @@ compute_nfs23_args(nfs_args_t *nap,
|
||||
|
||||
#ifdef HAVE_TRANSPORT_TYPE_TLI
|
||||
/* set up syncaddr field */
|
||||
- nap->syncaddr = (struct netbuf *) NULL;
|
||||
+ nap->syncaddr = NULL;
|
||||
|
||||
/* set up knconf field */
|
||||
if (get_knetconfig(&nap->knconf, nfsncp, nfs_proto) < 0) {
|
||||
@@ -1043,9 +1071,12 @@ compute_nfs23_args(nfs_args_t *nap,
|
||||
#endif /* HAVE_NFS_ARGS_T_OPTSTR */
|
||||
|
||||
#if defined(MNT2_NFS_OPT_MAXGRPS) && defined(MNTTAB_OPT_MAXGROUPS)
|
||||
- nap->maxgrouplist = hasmntval(mntp, MNTTAB_OPT_MAXGROUPS);
|
||||
- if (nap->maxgrouplist != 0)
|
||||
+ if (!hasmntval(mntp, MNTTAB_OPT_MAXGROUPS, &val) || val <= 0)
|
||||
+ nap->maxgrouplist = 0;
|
||||
+ else {
|
||||
+ nap->maxgrouplist = val;
|
||||
nap->flags |= MNT2_NFS_OPT_MAXGRPS;
|
||||
+ }
|
||||
#endif /* defined(MNT2_NFS_OPT_MAXGRPS) && defined(MNTTAB_OPT_MAXGROUPS) */
|
||||
|
||||
/************************************************************************/
|
||||
@@ -1267,6 +1298,7 @@ compute_nfs4_args(nfs4_args_t *nap,
|
||||
{
|
||||
char *s;
|
||||
struct nfs_common_args a;
|
||||
+ int val;
|
||||
uint16_t nfs_port;
|
||||
|
||||
/* initialize just in case */
|
||||
@@ -1304,11 +1336,10 @@ compute_nfs4_args(nfs4_args_t *nap,
|
||||
nap->host_addr = xmalloc(nap->host_addrlen);
|
||||
memcpy(nap->host_addr, ip_addr, nap->host_addrlen);
|
||||
|
||||
- nfs_port = hasmntval(mntp, MNTTAB_OPT_PORT);
|
||||
- if (nfs_port == 0)
|
||||
+ if (!hasmntval(mntp, MNTTAB_OPT_PORT, &val) || val <= 0 || val > 65536)
|
||||
nfs_port = htons(NFS_PORT);
|
||||
else
|
||||
- nfs_port = htons(nfs_port);
|
||||
+ nfs_port = htons(val);
|
||||
|
||||
((struct sockaddr_in *)nap->host_addr)->sin_port = nfs_port;
|
||||
|
||||
@@ -1341,9 +1372,13 @@ compute_nfs4_args(nfs4_args_t *nap,
|
||||
#endif /* MNT2_NFS_OPT_POSIX && MNTTAB_OPT_POSIX */
|
||||
|
||||
#if defined(MNT2_NFS_OPT_MAXGRPS) && defined(MNTTAB_OPT_MAXGROUPS)
|
||||
- nap->maxgrouplist = hasmntval(mntp, MNTTAB_OPT_MAXGROUPS);
|
||||
- if (nap->maxgrouplist != 0)
|
||||
+ nap->maxgrouplist =
|
||||
+ if (!hasmntval(mntp, MNTTAB_OPT_MAXGROUPS, &val) || val <= 0)
|
||||
+ nap->maxgrouplist = 0;
|
||||
+ else {
|
||||
+ nap->maxgrouplist = val;
|
||||
nap->flags |= MNT2_NFS_OPT_MAXGRPS;
|
||||
+ }
|
||||
#endif /* defined(MNT2_NFS_OPT_MAXGRPS) && defined(MNTTAB_OPT_MAXGROUPS) */
|
||||
|
||||
#ifdef HAVE_NFS_ARGS_T_OPTSTR
|
||||
--- am-utils-6.2.orig/libamu/mtab.c
|
||||
+++ am-utils-6.2/libamu/mtab.c
|
||||
@@ -133,22 +133,12 @@ hasmnteq(mntent_t *mnt, char *opt)
|
||||
|
||||
|
||||
/*
|
||||
- * Wrapper around hasmntvalerr(), which retains backwards compatibiliy with
|
||||
- * older use of hasmntval().
|
||||
- *
|
||||
- * XXX: eventually, all use of hasmntval() should be replaced with
|
||||
- * hasmntvalerr().
|
||||
+ * Wrapper around hasmntvaldelim(), which uses the standard "," delim
|
||||
*/
|
||||
int
|
||||
-hasmntval(mntent_t *mnt, char *opt)
|
||||
+hasmntval(mntent_t *mnt, char *opt, int *valp)
|
||||
{
|
||||
- int err, val = 0;
|
||||
-
|
||||
- err = hasmntvalerr(mnt, opt, &val);
|
||||
- if (err) /* if there was an error (hasmntvalerr returned 1) */
|
||||
- return 0; /* redundant: val==0 above, but leave here for clarity */
|
||||
- /* otherwise there was no error */
|
||||
- return val;
|
||||
+ return hasmntvaldelim(mnt, opt, ",", valp);
|
||||
}
|
||||
|
||||
|
||||
@@ -158,36 +148,31 @@ hasmntval(mntent_t *mnt, char *opt)
|
||||
* valp (argument won't be touched if no value is set, for example due to an
|
||||
* error).
|
||||
*
|
||||
- * Returns non-zero (1) on error; returns 0 on success.
|
||||
- *
|
||||
- * XXX: eventually, all use of hasmntval() should be replaced with
|
||||
- * hasmntvalerr().
|
||||
+ * Returns 0 on error; returns 1 on success.
|
||||
*/
|
||||
-unsigned int
|
||||
-hasmntvalerr(mntent_t *mnt, char *opt, int *valp)
|
||||
+int
|
||||
+hasmntvaldelim(mntent_t *mnt, char *opt, const char *delim, int *valp)
|
||||
{
|
||||
char *str = amu_hasmntopt(mnt, opt);
|
||||
- int err = 1; /* 1 means no good value was set (an error) */
|
||||
char *eq, *endptr;
|
||||
long int i;
|
||||
|
||||
/* exit if no option specificed */
|
||||
- if (!str) {
|
||||
- goto out;
|
||||
- }
|
||||
+ if (!str)
|
||||
+ return 0;
|
||||
|
||||
eq = hasmnteq(mnt, opt);
|
||||
|
||||
if (!eq) { /* no argument to option ('=' sign was missing) */
|
||||
plog(XLOG_MAP, "numeric option to \"%s\" missing", opt);
|
||||
- goto out;
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
/* if got here, then we had an '=' after option name */
|
||||
endptr = NULL;
|
||||
i = strtol(eq, &endptr, 0); /* hex and octal allowed ;-) */
|
||||
if (!endptr ||
|
||||
- (endptr != eq && (*endptr == ',' || *endptr == '\0'))) {
|
||||
+ (endptr != eq && (*endptr == '\0' || strchr(delim, *endptr)))) {
|
||||
/*
|
||||
* endptr set means strtol saw a non-digit. If the non-digit is a
|
||||
* comma, it's probably the start of the next option. If the comma is
|
||||
@@ -198,15 +183,13 @@ hasmntvalerr(mntent_t *mnt, char *opt, i
|
||||
* string.
|
||||
*/
|
||||
*valp = (int) i; /* set good value */
|
||||
- err = 0; /* no error */
|
||||
+ return 1;
|
||||
} else {
|
||||
/* whatever was after the '=' sign wasn't a number */
|
||||
plog(XLOG_MAP, "invalid numeric option in \"%s\": \"%s\"", opt, str);
|
||||
/* fall through to error/exit processing */
|
||||
+ return 0;
|
||||
}
|
||||
-
|
||||
- out:
|
||||
- return err;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,45 @@
|
|||
commit e7d1bd38b1d1de6b1bec603eeff915ebb57f3c37
|
||||
Author: zoulasc <christos@zoulas.com>
|
||||
Date: Thu Mar 10 17:50:34 2016 -0500
|
||||
|
||||
- There is really no ti-rpc nfsv4, so don't send one; instead send a v3 for now.
|
||||
|
||||
diff --git a/amd/srvr_nfs.c b/amd/srvr_nfs.c
|
||||
index b7c852c..1418a1a 100644
|
||||
--- a/amd/srvr_nfs.c
|
||||
+++ b/amd/srvr_nfs.c
|
||||
@@ -140,6 +140,7 @@ create_ping_payload(u_long nfs_version)
|
||||
{
|
||||
XDR ping_xdr;
|
||||
struct rpc_msg ping_msg;
|
||||
+ int rpc_version;
|
||||
|
||||
/*
|
||||
* Non nfs mounts like /afs/glue.umd.edu have ended up here.
|
||||
@@ -150,7 +151,17 @@ create_ping_payload(u_long nfs_version)
|
||||
} else
|
||||
plog(XLOG_INFO, "%s: nfs_version: %d", __func__, (int) nfs_version);
|
||||
|
||||
- rpc_msg_init(&ping_msg, NFS_PROGRAM, nfs_version, NFSPROC_NULL);
|
||||
+ /*
|
||||
+ * There is really no ti-rpc version for NFSv4; most servers respond
|
||||
+ * with "program unavailable", which is ok since we don't check the
|
||||
+ * payload, we just care about the pings. Some servers though are
|
||||
+ * antisocial (Isilon) and don't respond (which is their right to do).
|
||||
+ * Eventually we should make a new mechanism to do server pings for
|
||||
+ * NFSv4, but for now it is easiest to downgrade the RPC version to 3.
|
||||
+ */
|
||||
+ rpc_version = nfs_version == 4 ? 3 : nfs_version;
|
||||
+
|
||||
+ rpc_msg_init(&ping_msg, NFS_PROGRAM, rpc_version, NFSPROC_NULL);
|
||||
|
||||
/*
|
||||
* Create an XDR endpoint
|
||||
@@ -600,6 +611,7 @@ nfs_keepalive(voidp v)
|
||||
case ENETUNREACH:
|
||||
case EHOSTDOWN:
|
||||
case EHOSTUNREACH:
|
||||
+ dlog("Failed to NFS ping to %s (%d)", fs->fs_host, error);
|
||||
np->np_ping = MAX_ALLOWED_PINGS; /* immediately down */
|
||||
np->np_ttl = (time_t) 0;
|
||||
/*
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
commit ad416c8656c2dff6f1bcffee8517284de94c9d92
|
||||
Author: zoulasc <christos@zoulas.com>
|
||||
Date: Thu May 12 10:21:55 2016 -0400
|
||||
|
||||
Update the ctime of the directory too, since it changed. From Mark Davies
|
||||
|
||||
diff --git a/amd/autil.c b/amd/autil.c
|
||||
index 35d8708..f44a0e2 100644
|
||||
--- a/amd/autil.c
|
||||
+++ b/amd/autil.c
|
||||
@@ -183,6 +183,7 @@ forcibly_timeout_mp(am_node *mp)
|
||||
* more.
|
||||
*/
|
||||
clocktime(&mp->am_parent->am_fattr.na_mtime);
|
||||
+ mp->am_parent->am_fattr.na_ctime = mp->am_parent->am_fattr.na_mtime;
|
||||
reschedule_timeout_mp();
|
||||
}
|
||||
}
|
||||
@@ -312,8 +313,10 @@ am_mounted(am_node *mp)
|
||||
/*
|
||||
* Update mtime of parent node (copying "struct nfstime" in '=' below)
|
||||
*/
|
||||
- if (mp->am_parent && mp->am_parent->am_al->al_mnt)
|
||||
+ if (mp->am_parent && mp->am_parent->am_al->al_mnt) {
|
||||
mp->am_parent->am_fattr.na_mtime = mp->am_fattr.na_mtime;
|
||||
+ mp->am_parent->am_fattr.na_ctime = mp->am_fattr.na_mtime;
|
||||
+ }
|
||||
|
||||
/*
|
||||
* This is ugly, but essentially unavoidable
|
||||
241
am-utils-6.2-add-NFSv3-nfs_quick_reply-functionality.patch
Normal file
241
am-utils-6.2-add-NFSv3-nfs_quick_reply-functionality.patch
Normal file
|
|
@ -0,0 +1,241 @@
|
|||
am-utils-6.2 - add NFSv3 nfs_quick_reply() functionality
|
||||
|
||||
From: Ian Kent <raven@themaw.net>
|
||||
|
||||
The implementation of the NFS v3 server does not use the hack needed
|
||||
by the nfs_quick_reply() function.
|
||||
|
||||
Now that saving the current transort for later use by nfs_quick_reply()
|
||||
avoids concurrency races it should be ok to use it.
|
||||
|
||||
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||
---
|
||||
amd/nfs_prot_svc.c | 13 +++++
|
||||
amd/nfs_subr.c | 137 +++++++++++++++++++++++++++++++++++++++++-----------
|
||||
2 files changed, 120 insertions(+), 30 deletions(-)
|
||||
|
||||
diff --git a/amd/nfs_prot_svc.c b/amd/nfs_prot_svc.c
|
||||
index cbde172..29b7551 100644
|
||||
--- a/amd/nfs_prot_svc.c
|
||||
+++ b/amd/nfs_prot_svc.c
|
||||
@@ -180,7 +180,7 @@ nfs_program_2(struct svc_req *rqstp, SVCXPRT *transp)
|
||||
xdr_result = (xdrproc_t) xdr_diropres;
|
||||
local = (nfssvcproc_t) nfsproc_lookup_2_svc;
|
||||
/*
|
||||
- * Cheap way to pass transp down to amfs_auto_lookuppn so it can
|
||||
+ * Cheap way to pass transp down to amfs_auto_lookup so it can
|
||||
* be stored in the am_node structure and later used for
|
||||
* quick_reply().
|
||||
*/
|
||||
@@ -327,6 +327,8 @@ nfs_program_3(struct svc_req *rqstp, register SVCXPRT *transp)
|
||||
xdrproc_t _xdr_argument, _xdr_result;
|
||||
nfssvcproc_t local;
|
||||
|
||||
+ current_transp = NULL;
|
||||
+
|
||||
switch (rqstp->rq_proc) {
|
||||
case AM_NFS3_NULL:
|
||||
_xdr_argument = (xdrproc_t) xdr_void;
|
||||
@@ -350,6 +352,12 @@ nfs_program_3(struct svc_req *rqstp, register SVCXPRT *transp)
|
||||
_xdr_argument = (xdrproc_t) xdr_am_LOOKUP3args;
|
||||
_xdr_result = (xdrproc_t) xdr_am_LOOKUP3res;
|
||||
local = (nfssvcproc_t) (char *(*)(char *, struct svc_req *)) am_nfs3_lookup_3_svc;
|
||||
+ /*
|
||||
+ * Cheap way to pass transp down to amfs_auto_lookup so it can
|
||||
+ * be stored in the am_node structure and later used for
|
||||
+ * quick_reply().
|
||||
+ */
|
||||
+ current_transp = transp;
|
||||
break;
|
||||
|
||||
case AM_NFS3_ACCESS:
|
||||
@@ -476,6 +484,9 @@ nfs_program_3(struct svc_req *rqstp, register SVCXPRT *transp)
|
||||
}
|
||||
|
||||
result = (*local) (&argument, rqstp);
|
||||
+
|
||||
+ current_transp = NULL;
|
||||
+
|
||||
if (result != NULL && !svc_sendreply(transp, (xdrproc_t) _xdr_result, result)) {
|
||||
svcerr_systemerr (transp);
|
||||
}
|
||||
diff --git a/amd/nfs_subr.c b/amd/nfs_subr.c
|
||||
index 07d960d..a383618 100644
|
||||
--- a/amd/nfs_subr.c
|
||||
+++ b/amd/nfs_subr.c
|
||||
@@ -87,6 +87,9 @@ struct am_fh3 {
|
||||
};
|
||||
|
||||
/* forward declarations */
|
||||
+static int nfs_quick_reply2(am_node *mp, int error);
|
||||
+static int nfs_quick_reply3(am_node *mp, int error);
|
||||
+
|
||||
/* converting am-filehandles to mount-points */
|
||||
static am_node *fh_to_mp3(am_nfs_fh *fhp, int *rp, int vop);
|
||||
static am_node *fh_to_mp(am_nfs_fh *fhp);
|
||||
@@ -255,46 +258,65 @@ nfsproc_lookup_2_svc(nfsdiropargs *argp, struct svc_req *rqstp)
|
||||
return &res;
|
||||
}
|
||||
|
||||
-
|
||||
void
|
||||
nfs_quick_reply(am_node *mp, int error)
|
||||
{
|
||||
- SVCXPRT *transp = mp->am_transp;
|
||||
- nfsdiropres res;
|
||||
- xdrproc_t xdr_result = (xdrproc_t) xdr_diropres;
|
||||
+ int ret;
|
||||
|
||||
/*
|
||||
- * If there's a transp structure then we can reply to the client's
|
||||
- * nfs lookup request.
|
||||
+ * If there's no transp structure then we can't reply to the
|
||||
+ * client's nfs lookup request.
|
||||
*/
|
||||
- if (transp) {
|
||||
- if (error == 0) {
|
||||
- /*
|
||||
- * Construct a valid reply to a lookup request. Same
|
||||
- * code as in nfsproc_lookup_2_svc() above.
|
||||
- */
|
||||
- mp_to_fh(mp, &res.dr_u.dr_drok_u.drok_fhandle);
|
||||
- res.dr_u.dr_drok_u.drok_attributes = mp->am_fattr;
|
||||
- res.dr_status = NFS_OK;
|
||||
- } else
|
||||
- /*
|
||||
- * Return the error that was passed to us.
|
||||
- */
|
||||
- res.dr_status = nfs_error(error);
|
||||
+ if (!mp->am_transp)
|
||||
+ return;
|
||||
+
|
||||
+ if (nfs_dispatcher == nfs_program_2)
|
||||
+ ret = nfs_quick_reply2(mp, error);
|
||||
+ else
|
||||
+ ret = nfs_quick_reply3(mp, error);
|
||||
+
|
||||
+ if (!ret)
|
||||
+ svcerr_systemerr(mp->am_transp);
|
||||
+
|
||||
+ /*
|
||||
+ * Free up transp. It's only used for one reply.
|
||||
+ */
|
||||
+ put_nfs_xprt(mp->am_transp);
|
||||
+ mp->am_transp = NULL;
|
||||
+ dlog("Quick reply sent for %s", mp->am_al->al_mnt->mf_mount);
|
||||
+}
|
||||
|
||||
+
|
||||
+static int
|
||||
+nfs_quick_reply2(am_node *mp, int error)
|
||||
+{
|
||||
+ SVCXPRT *transp = mp->am_transp;
|
||||
+ nfsdiropres res;
|
||||
+ xdrproc_t xdr_result = (xdrproc_t) xdr_diropres;
|
||||
+ int ret;
|
||||
+
|
||||
+ if (error == 0) {
|
||||
/*
|
||||
- * Send off our reply
|
||||
+ * Construct a valid reply to a lookup request. Same
|
||||
+ * code as in nfsproc_lookup_2_svc() above.
|
||||
*/
|
||||
- if (!svc_sendreply(transp, (XDRPROC_T_TYPE) xdr_result, (SVC_IN_ARG_TYPE) & res))
|
||||
- svcerr_systemerr(transp);
|
||||
-
|
||||
+ mp_to_fh(mp, &res.dr_u.dr_drok_u.drok_fhandle);
|
||||
+ res.dr_u.dr_drok_u.drok_attributes = mp->am_fattr;
|
||||
+ res.dr_status = NFS_OK;
|
||||
+ } else
|
||||
/*
|
||||
- * Free up transp. It's only used for one reply.
|
||||
+ * Return the error that was passed to us.
|
||||
*/
|
||||
- put_nfs_xprt(mp->am_transp);
|
||||
- mp->am_transp = NULL;
|
||||
- dlog("Quick reply sent for %s", mp->am_al->al_mnt->mf_mount);
|
||||
- }
|
||||
+ res.dr_status = nfs_error(error);
|
||||
+
|
||||
+ /*
|
||||
+ * Send off our reply
|
||||
+ */
|
||||
+ ret = svc_sendreply(transp,
|
||||
+ (XDRPROC_T_TYPE) xdr_result,
|
||||
+ (SVC_IN_ARG_TYPE) & res);
|
||||
+
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -890,6 +912,8 @@ mp_to_fh(am_node *mp, am_nfs_fh *fhp)
|
||||
/* dlog("mp_to_fh: old filehandle: %d", fp->u.s.fhh_id); */
|
||||
}
|
||||
}
|
||||
+
|
||||
+
|
||||
void
|
||||
mp_to_fh3(am_node *mp, am_nfs_fh3 *fhp)
|
||||
{
|
||||
@@ -1257,6 +1281,61 @@ am_nfs3_lookup_3_svc(am_LOOKUP3args *argp, struct svc_req *rqstp)
|
||||
return &result;
|
||||
}
|
||||
|
||||
+
|
||||
+static int
|
||||
+nfs_quick_reply3(am_node *mp, int error)
|
||||
+{
|
||||
+ SVCXPRT *transp = mp->am_transp;
|
||||
+ xdrproc_t xdr_result = (xdrproc_t) xdr_am_LOOKUP3res;
|
||||
+ am_LOOKUP3res result;
|
||||
+ am_post_op_attr *post_op_dir;
|
||||
+ am_post_op_attr *post_op_obj;
|
||||
+ int ret;
|
||||
+
|
||||
+ if (error) {
|
||||
+ /*
|
||||
+ * Return the error that was passed to us.
|
||||
+ */
|
||||
+ post_op_dir->attributes_follow = 0;
|
||||
+ result.status = nfs_error(error);
|
||||
+ } else {
|
||||
+ post_op_dir = &result.res_u.ok.dir_attributes;
|
||||
+ post_op_obj = &result.res_u.ok.obj_attributes;
|
||||
+ am_fattr3 *fattr3;
|
||||
+ nfsfattr *fattr;
|
||||
+
|
||||
+ /*
|
||||
+ * Construct a valid reply to a lookup request. Same
|
||||
+ * code as in am_nfs3_lookup_3_svc() above.
|
||||
+ */
|
||||
+
|
||||
+ /* dir attributes */
|
||||
+ post_op_dir->attributes_follow = 1;
|
||||
+ fattr3 = &post_op_dir->am_post_op_attr_u.attributes;
|
||||
+ parent_fattr_to_fattr3(mp, fattr3);
|
||||
+
|
||||
+ mp_to_fh3(mp, &result.res_u.ok.object);
|
||||
+
|
||||
+ /* mount attributes */
|
||||
+ post_op_obj->attributes_follow = 1;
|
||||
+ fattr = &mp->am_fattr;
|
||||
+ fattr3 = &post_op_obj->am_post_op_attr_u.attributes;
|
||||
+ fattr_to_fattr3(fattr, fattr3);
|
||||
+
|
||||
+ result.status = AM_NFS3_OK;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Send off our reply
|
||||
+ */
|
||||
+ ret = svc_sendreply(transp,
|
||||
+ (XDRPROC_T_TYPE) xdr_result,
|
||||
+ (SVC_IN_ARG_TYPE) &result);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+
|
||||
am_ACCESS3res *
|
||||
am_nfs3_access_3_svc(am_ACCESS3args *argp, struct svc_req *rqstp)
|
||||
{
|
||||
127
am-utils-6.2-add-NFSv3-rpc-request-validation.patch
Normal file
127
am-utils-6.2-add-NFSv3-rpc-request-validation.patch
Normal file
|
|
@ -0,0 +1,127 @@
|
|||
am-utils-6.2 - add NFSv3 rpc request validation
|
||||
|
||||
From: Ian Kent <raven@themaw.net>
|
||||
|
||||
The NFS v2 internal server uses several validation checks for each
|
||||
RPC request it receives, also add this validation for the NFS v3
|
||||
internal server.
|
||||
|
||||
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||
---
|
||||
amd/nfs_prot_svc.c | 65 +++++++++++++++++++++++++++++++---------------------
|
||||
1 file changed, 39 insertions(+), 26 deletions(-)
|
||||
|
||||
diff --git a/amd/nfs_prot_svc.c b/amd/nfs_prot_svc.c
|
||||
index 29b7551..cae12d4 100644
|
||||
--- a/amd/nfs_prot_svc.c
|
||||
+++ b/amd/nfs_prot_svc.c
|
||||
@@ -71,30 +71,9 @@ dispatcher_t nfs_dispatcher = nfs_program_2;
|
||||
typedef char *(*nfssvcproc_t)(voidp, struct svc_req *);
|
||||
|
||||
|
||||
-void
|
||||
-nfs_program_2(struct svc_req *rqstp, SVCXPRT *transp)
|
||||
+static int
|
||||
+validate_rpc_request(struct svc_req *rqstp, SVCXPRT *transp)
|
||||
{
|
||||
- union {
|
||||
- am_nfs_fh nfsproc_getattr_2_arg;
|
||||
- nfssattrargs nfsproc_setattr_2_arg;
|
||||
- nfsdiropargs nfsproc_lookup_2_arg;
|
||||
- am_nfs_fh nfsproc_readlink_2_arg;
|
||||
- nfsreadargs nfsproc_read_2_arg;
|
||||
- nfswriteargs nfsproc_write_2_arg;
|
||||
- nfscreateargs nfsproc_create_2_arg;
|
||||
- nfsdiropargs nfsproc_remove_2_arg;
|
||||
- nfsrenameargs nfsproc_rename_2_arg;
|
||||
- nfslinkargs nfsproc_link_2_arg;
|
||||
- nfssymlinkargs nfsproc_symlink_2_arg;
|
||||
- nfscreateargs nfsproc_mkdir_2_arg;
|
||||
- nfsdiropargs fsproc_rmdir_2_arg;
|
||||
- nfsreaddirargs nfsproc_readdir_2_arg;
|
||||
- am_nfs_fh nfsproc_statfs_2_arg;
|
||||
- } argument;
|
||||
- char *result;
|
||||
- xdrproc_t xdr_argument, xdr_result;
|
||||
- nfssvcproc_t local;
|
||||
-
|
||||
#ifdef HAVE_TRANSPORT_TYPE_TLI
|
||||
/*
|
||||
* On TLI systems we don't use an INET network type, but a "ticlts" (see
|
||||
@@ -109,7 +88,7 @@ nfs_program_2(struct svc_req *rqstp, SVCXPRT *transp)
|
||||
extern int __rpc_get_local_uid(SVCXPRT *transp, uid_t *uid);
|
||||
if (__rpc_get_local_uid(transp, &u) >= 0 && u != 0) {
|
||||
plog(XLOG_WARNING, "ignoring request from UID %ld, must be 0", (long) u);
|
||||
- return;
|
||||
+ return 0;
|
||||
}
|
||||
# else /* not HAVE___RPC_GET_LOCAL_UID */
|
||||
dlog("cannot verify local uid for rpc request");
|
||||
@@ -126,7 +105,7 @@ nfs_program_2(struct svc_req *rqstp, SVCXPRT *transp)
|
||||
plog(XLOG_WARNING, "ignoring request from %s:%u, port not reserved",
|
||||
inet_dquad(dq, sizeof(dq), sinp->sin_addr.s_addr),
|
||||
ntohs(sinp->sin_port));
|
||||
- return;
|
||||
+ return 0;
|
||||
}
|
||||
# endif /* MNT2_NFS_OPT_RESVPORT */
|
||||
/* if the address does not match, ignore the request */
|
||||
@@ -136,16 +115,47 @@ nfs_program_2(struct svc_req *rqstp, SVCXPRT *transp)
|
||||
plog(XLOG_WARNING, "ignoring request from %s:%u, not a local interface",
|
||||
inet_dquad(dq, sizeof(dq), sinp->sin_addr.s_addr),
|
||||
ntohs(sinp->sin_port));
|
||||
+ return 0;
|
||||
}
|
||||
} else {
|
||||
plog(XLOG_WARNING, "ignoring request from %s:%u, expected %s",
|
||||
inet_dquad(dq, sizeof(dq), sinp->sin_addr.s_addr),
|
||||
ntohs(sinp->sin_port),
|
||||
inet_dquad(dq2, sizeof(dq2), myipaddr.s_addr));
|
||||
- return;
|
||||
+ return 0;
|
||||
}
|
||||
}
|
||||
#endif /* not HAVE_TRANPORT_TYPE_TLI */
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+void
|
||||
+nfs_program_2(struct svc_req *rqstp, SVCXPRT *transp)
|
||||
+{
|
||||
+ union {
|
||||
+ am_nfs_fh nfsproc_getattr_2_arg;
|
||||
+ nfssattrargs nfsproc_setattr_2_arg;
|
||||
+ nfsdiropargs nfsproc_lookup_2_arg;
|
||||
+ am_nfs_fh nfsproc_readlink_2_arg;
|
||||
+ nfsreadargs nfsproc_read_2_arg;
|
||||
+ nfswriteargs nfsproc_write_2_arg;
|
||||
+ nfscreateargs nfsproc_create_2_arg;
|
||||
+ nfsdiropargs nfsproc_remove_2_arg;
|
||||
+ nfsrenameargs nfsproc_rename_2_arg;
|
||||
+ nfslinkargs nfsproc_link_2_arg;
|
||||
+ nfssymlinkargs nfsproc_symlink_2_arg;
|
||||
+ nfscreateargs nfsproc_mkdir_2_arg;
|
||||
+ nfsdiropargs fsproc_rmdir_2_arg;
|
||||
+ nfsreaddirargs nfsproc_readdir_2_arg;
|
||||
+ am_nfs_fh nfsproc_statfs_2_arg;
|
||||
+ } argument;
|
||||
+ char *result;
|
||||
+ xdrproc_t xdr_argument, xdr_result;
|
||||
+ nfssvcproc_t local;
|
||||
+
|
||||
+ if (!validate_rpc_request(rqstp, transp))
|
||||
+ return;
|
||||
|
||||
current_transp = NULL;
|
||||
|
||||
@@ -327,6 +337,9 @@ nfs_program_3(struct svc_req *rqstp, register SVCXPRT *transp)
|
||||
xdrproc_t _xdr_argument, _xdr_result;
|
||||
nfssvcproc_t local;
|
||||
|
||||
+ if (!validate_rpc_request(rqstp, transp))
|
||||
+ return;
|
||||
+
|
||||
current_transp = NULL;
|
||||
|
||||
switch (rqstp->rq_proc) {
|
||||
25
am-utils-6.2-add-debug-log-trace-to-NFSv3-readdirplus.patch
Normal file
25
am-utils-6.2-add-debug-log-trace-to-NFSv3-readdirplus.patch
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
am-utils-6.2 - add debug log trace to NFSv3 readdirplus
|
||||
|
||||
From: Ian Kent <raven@themaw.net>
|
||||
|
||||
Add log trace print to NFSv3 readdirplus for debuging purposes.
|
||||
|
||||
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||
---
|
||||
amd/nfs_subr.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/amd/nfs_subr.c b/amd/nfs_subr.c
|
||||
index 30effba..ef07a4a 100644
|
||||
--- a/amd/nfs_subr.c
|
||||
+++ b/amd/nfs_subr.c
|
||||
@@ -1642,6 +1642,9 @@ am_nfs3_readdirplus_3_svc(am_READDIRPLUS3args *argp, struct svc_req *rqstp)
|
||||
am_node *mp;
|
||||
int retry;
|
||||
|
||||
+ if (amuDebug(D_TRACE))
|
||||
+ plog(XLOG_DEBUG, "readdirplus_3:");
|
||||
+
|
||||
mp = fh3_to_mp3(dir, &retry, VLOOK_CREATE);
|
||||
if (mp == NULL) {
|
||||
if (retry < 0) {
|
||||
170
am-utils-6.2-add-get_nfs_xprt-and-put_nfs_xprt-functions.patch
Normal file
170
am-utils-6.2-add-get_nfs_xprt-and-put_nfs_xprt-functions.patch
Normal file
|
|
@ -0,0 +1,170 @@
|
|||
am-utils-6.2 - add get_nfs_xprt() and put_nfs_xprt() functions
|
||||
|
||||
From: Ian Kent <raven@themaw.net>
|
||||
|
||||
The nfs_quick_reply() functionality relies on taking a copy of the
|
||||
current transport for later use.
|
||||
|
||||
The problem with this is the context of the RPC message is kept in
|
||||
the transport and if any RPC message arrives before nfs_quick_reply()
|
||||
is called that context will be corrupted.
|
||||
|
||||
So add a function get_nfs_xprt() to replace the current transport
|
||||
with a new one returning the passed in transort so nfs_quick_reply()
|
||||
can use it later.
|
||||
|
||||
A function put_nfs_xprt() is also added (although not really needed
|
||||
since it just destroys the now unused transport) for completeness.
|
||||
|
||||
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||
---
|
||||
conf/transp/transp_sockets.c | 44 ++++++++++++++++++++++++++++++++++++++++
|
||||
conf/transp/transp_tli.c | 46 +++++++++++++++++++++++++++++++++++++++++-
|
||||
include/am_utils.h | 2 ++
|
||||
3 files changed, 91 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/conf/transp/transp_sockets.c b/conf/transp/transp_sockets.c
|
||||
index 6326007..a6e0054 100644
|
||||
--- a/conf/transp/transp_sockets.c
|
||||
+++ b/conf/transp/transp_sockets.c
|
||||
@@ -45,6 +45,7 @@
|
||||
#include <am_defs.h>
|
||||
#include <amu.h>
|
||||
|
||||
+static int soNFS = RPC_ANYSOCK;
|
||||
|
||||
/*
|
||||
* find the IP address that can be used to connect to the local host
|
||||
@@ -273,9 +274,52 @@ create_nfs_service(int *soNFSp, u_short *nfs_portp, SVCXPRT **nfs_xprtp, void (*
|
||||
return 3;
|
||||
}
|
||||
|
||||
+ soNFS = *soNFSp;
|
||||
+
|
||||
return 0; /* all is well */
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Get a pointer to the current NFS SVCXPRT and replace it
|
||||
+ * with a new one.
|
||||
+ */
|
||||
+SVCXPRT *
|
||||
+get_nfs_xprt(SVCXPRT *nfs_xprt)
|
||||
+{
|
||||
+ SVCXPRT *newxprt;
|
||||
+ int newfd;
|
||||
+
|
||||
+ if (!nfs_xprt || soNFS == RPC_ANYSOCK)
|
||||
+ return NULL;
|
||||
+
|
||||
+ newfd = dup(soNFS);
|
||||
+ if (newfd < 0)
|
||||
+ return NULL;
|
||||
+
|
||||
+ xprt_unregister(nfs_xprt);
|
||||
+ newxprt = svcudp_create(newfd);
|
||||
+ if (!newxprt) {
|
||||
+ plog(XLOG_FATAL, "Can't switch to new transport");
|
||||
+ xprt_register(nfs_xprt);
|
||||
+ close(newfd);
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ soNFS = newfd;
|
||||
+
|
||||
+ return nfs_xprt;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * Destroy a transport previously obtained by get_nfs_xprt().
|
||||
+ */
|
||||
+void put_nfs_xprt(SVCXPRT *nfs_xprt)
|
||||
+{
|
||||
+ if (!nfs_xprt || soNFS == RPC_ANYSOCK)
|
||||
+ return;
|
||||
+
|
||||
+ svc_destroy(nfs_xprt);
|
||||
+}
|
||||
|
||||
/*
|
||||
* Create the amq service for amd (both TCP and UDP)
|
||||
diff --git a/conf/transp/transp_tli.c b/conf/transp/transp_tli.c
|
||||
index d26a511..bfdb526 100644
|
||||
--- a/conf/transp/transp_tli.c
|
||||
+++ b/conf/transp/transp_tli.c
|
||||
@@ -45,7 +45,8 @@
|
||||
#include <am_defs.h>
|
||||
#include <amu.h>
|
||||
|
||||
-struct netconfig *nfsncp;
|
||||
+struct netconfig *nfsncp = NULL;
|
||||
+static int soNFS = RPC_ANYSOCK;
|
||||
|
||||
|
||||
/*
|
||||
@@ -456,9 +457,52 @@ create_nfs_service(int *soNFSp, u_short *nfs_portp, SVCXPRT **nfs_xprtp, void (*
|
||||
return 1;
|
||||
}
|
||||
|
||||
+ soNFS = *soNFSp;
|
||||
+
|
||||
return 0; /* all is well */
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Get a pointer to the current NFS SVCXPRT and replace it
|
||||
+ * with a new one.
|
||||
+ */
|
||||
+SVCXPRT *
|
||||
+get_nfs_xprt(SVCXPRT *nfs_xprt)
|
||||
+{
|
||||
+ SVCXPRT *newxprt;
|
||||
+ int newfd;
|
||||
+
|
||||
+ if (!nfs_xprt || soNFS == RPC_ANYSOCK)
|
||||
+ return NULL;
|
||||
+
|
||||
+ newfd = dup(soNFS);
|
||||
+ if (newfd < 0)
|
||||
+ return NULL;
|
||||
+
|
||||
+ xprt_unregister(nfs_xprt);
|
||||
+ newxprt = svc_tli_create(newfd, nfsncp, NULL, 0, 0);
|
||||
+ if (!newxprt) {
|
||||
+ plog(XLOG_FATAL, "Can't switch to new transport");
|
||||
+ xprt_register(nfs_xprt);
|
||||
+ close(newfd);
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ soNFS = newfd;
|
||||
+
|
||||
+ return nfs_xprt;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * Destroy a transport previously obtained by get_nfs_xprt().
|
||||
+ */
|
||||
+void put_nfs_xprt(SVCXPRT *nfs_xprt)
|
||||
+{
|
||||
+ if (!nfs_xprt || soNFS == RPC_ANYSOCK)
|
||||
+ return;
|
||||
+
|
||||
+ svc_destroy(nfs_xprt);
|
||||
+}
|
||||
|
||||
/*
|
||||
* Bind to preferred AMQ port.
|
||||
diff --git a/include/am_utils.h b/include/am_utils.h
|
||||
index 0de881a..ff13c26 100644
|
||||
--- a/include/am_utils.h
|
||||
+++ b/include/am_utils.h
|
||||
@@ -378,6 +378,8 @@ extern void compute_nfs_args(void *nap, mntent_t *mntp, int genflags, struct net
|
||||
extern void destroy_nfs_args(void *nap, u_long nfs_version);
|
||||
extern int create_amq_service(int *udp_soAMQp, SVCXPRT **udp_amqpp, struct netconfig **udp_amqncpp, int *tcp_soAMQp, SVCXPRT **tcp_amqpp, struct netconfig **tcp_amqncpp, u_short preferred_amq_port);
|
||||
extern int create_nfs_service(int *soNFSp, u_short *nfs_portp, SVCXPRT **nfs_xprtp, void (*dispatch_fxn)(struct svc_req *rqstp, SVCXPRT *transp), u_long nfs_version);
|
||||
+extern SVCXPRT *get_nfs_xprt(SVCXPRT *nfs_xprt);
|
||||
+extern void put_nfs_xprt(SVCXPRT *nfs_xprt);
|
||||
extern int amu_svc_register(SVCXPRT *, u_long, u_long, void (*)(struct svc_req *, SVCXPRT *), u_long, struct netconfig *);
|
||||
|
||||
#ifdef HAVE_TRANSPORT_TYPE_TLI
|
||||
94
am-utils-6.2-add-more-debugging-in-the-unmount-path.patch
Normal file
94
am-utils-6.2-add-more-debugging-in-the-unmount-path.patch
Normal file
|
|
@ -0,0 +1,94 @@
|
|||
commit a5ea57a64a1d70486e8d8ab2da944e50ca51b836
|
||||
Author: zoulasc <christos@zoulas.com>
|
||||
Date: Tue Mar 8 23:31:26 2016 -0500
|
||||
|
||||
- add more debugging in the unmount path
|
||||
- if the EXPIRE_MULTI call fails, with EAGAIN, fail back to the EXPIRE call
|
||||
seems to fix unmounting with nfsv4 volumes.
|
||||
|
||||
diff --git a/conf/autofs/autofs_linux.c b/conf/autofs/autofs_linux.c
|
||||
index d543979..5b4ac06 100644
|
||||
--- a/conf/autofs/autofs_linux.c
|
||||
+++ b/conf/autofs/autofs_linux.c
|
||||
@@ -365,6 +365,7 @@ autofs_expire_one(am_node *mp, char *name, autofs_wqt_t token)
|
||||
|
||||
ap = find_ap(ap_path);
|
||||
if (ap == NULL) {
|
||||
+ dlog("%s: could not find %s", __func__, ap_path);
|
||||
/* not found??? not sure what to do here... */
|
||||
send_fail(fh->ioctlfd, token);
|
||||
goto out;
|
||||
@@ -376,6 +377,7 @@ autofs_expire_one(am_node *mp, char *name, autofs_wqt_t token)
|
||||
p->next = fh->pending_umounts;
|
||||
fh->pending_umounts = p;
|
||||
|
||||
+ dlog("%s: unmount for %s", __func__, ap_path);
|
||||
unmount_mp(ap);
|
||||
|
||||
out:
|
||||
@@ -426,6 +428,7 @@ autofs_missing_one(am_node *mp, autofs_wqt_t wait_queue_token, char *name)
|
||||
dlog("Mount still pending, not sending autofs reply yet");
|
||||
return;
|
||||
}
|
||||
+ dlog("%s: lookup failed for %s/%s", __func__, mp->am_path, name);
|
||||
autofs_lookup_failed(mp, name);
|
||||
}
|
||||
mp->am_stats.s_lookup++;
|
||||
@@ -872,15 +875,42 @@ autofs_compute_mount_flags(mntent_t *mnt)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int autofs_expire_4(am_node *mp)
|
||||
+{
|
||||
+ struct autofs_packet_expire pkt;
|
||||
+ autofs_fh_t *fh = mp->am_autofs_fh;
|
||||
+
|
||||
+ dlog("Calling AUTOFS_IOC_EXPIRE");
|
||||
+ if (ioctl(fh->ioctlfd, AUTOFS_IOC_EXPIRE, &pkt) == -1)
|
||||
+ {
|
||||
+ dlog("AUTOFS_IOC_EXPIRE for %s failed %d", mp->am_path, errno);
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ autofs_handle_expire(mp, &pkt);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
|
||||
#if AUTOFS_MAX_PROTO_VERSION >= 4
|
||||
static int autofs_timeout_mp_task(void *arg)
|
||||
{
|
||||
am_node *mp = (am_node *)arg;
|
||||
autofs_fh_t *fh = mp->am_autofs_fh;
|
||||
- int now = 0;
|
||||
-
|
||||
- while (ioctl(fh->ioctlfd, AUTOFS_IOC_EXPIRE_MULTI, &now) == 0);
|
||||
+ int how = AUTOFS_EXP_IMMEDIATE;
|
||||
+
|
||||
+ for (;;)
|
||||
+ {
|
||||
+ dlog("Calling AUTOFS_IOC_EXPIRE_MULTI");
|
||||
+ if (ioctl(fh->ioctlfd, AUTOFS_IOC_EXPIRE_MULTI, &how) == -1)
|
||||
+ {
|
||||
+ dlog("AUTOFS_IOC_EXPIRE_MULTI for %s failed %d", mp->am_path, errno);
|
||||
+ if (errno != EAGAIN)
|
||||
+ break;
|
||||
+ if (autofs_expire_4(mp) == -1)
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
return 0;
|
||||
}
|
||||
#endif /* AUTOFS_MAX_PROTO_VERSION >= 4 */
|
||||
@@ -895,9 +925,8 @@ void autofs_timeout_mp(am_node *mp)
|
||||
mp->am_autofs_ttl = now + gopt.am_timeo_w;
|
||||
|
||||
if (fh->version < 4) {
|
||||
- struct autofs_packet_expire pkt;
|
||||
- while (ioctl(fh->ioctlfd, AUTOFS_IOC_EXPIRE, &pkt) == 0)
|
||||
- autofs_handle_expire(mp, &pkt);
|
||||
+ while (autofs_expire_4(mp) == 0)
|
||||
+ continue;
|
||||
return;
|
||||
}
|
||||
|
||||
12
am-utils-6.2-allow-old-autoconf-version.patch
Normal file
12
am-utils-6.2-allow-old-autoconf-version.patch
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
diff -up am-utils-6.2/bootstrap.autoconf-version am-utils-6.2/bootstrap
|
||||
--- am-utils-6.2/bootstrap.autoconf-version 2016-01-24 10:15:30.064158815 +0800
|
||||
+++ am-utils-6.2/bootstrap 2016-01-24 10:16:00.884635887 +0800
|
||||
@@ -8,7 +8,7 @@
|
||||
validateversion() {
|
||||
local v="$(autoreconf --version 2>&1 | head -1)"
|
||||
case "$v" in
|
||||
- *2.69) ;;
|
||||
+ *2.63) ;;
|
||||
*) echo "am-utils requires autoconf 2.69, you have:"
|
||||
echo " $v"
|
||||
exit 1;;
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,19 @@
|
|||
commit a187041e062c5b656def30a3ec282156360003f3
|
||||
Author: Christos Zoulas <christos@zoulas.com>
|
||||
Date: Wed Jan 21 23:28:46 2015 -0500
|
||||
|
||||
don't use logical && when & is meant
|
||||
|
||||
diff --git a/amd/map.c b/amd/map.c
|
||||
index fce8273..0d404cf 100644
|
||||
--- a/amd/map.c
|
||||
+++ b/amd/map.c
|
||||
@@ -752,7 +752,7 @@ umount_exported(void)
|
||||
} else {
|
||||
am_unmounted(mp);
|
||||
}
|
||||
- if (!(mf->mf_flags && (MFF_UNMOUNTING|MFF_MOUNTED)))
|
||||
+ if (!(mf->mf_flags & (MFF_UNMOUNTING|MFF_MOUNTED)))
|
||||
exported_ap[i] = NULL;
|
||||
} else {
|
||||
/*
|
||||
39
am-utils-6.2-fix-Linux-NFS-recognition-of-umounts.patch
Normal file
39
am-utils-6.2-fix-Linux-NFS-recognition-of-umounts.patch
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
am-utils-6.2 - fix Linux NFS recognition of umounts
|
||||
|
||||
From: Ian Kent <raven@themaw.net>
|
||||
|
||||
Recent Linux NFS uses a simulated attibute cache change detection
|
||||
method based on ctime. Consequenty the amd use of mtime for this
|
||||
doesn't work properly for some kernel versions.
|
||||
|
||||
The problem seen with some kernel versions is a failure to recognize
|
||||
umounts.
|
||||
|
||||
Updating the parent ctime in step with mtime during umount appears
|
||||
to fix the problem.
|
||||
|
||||
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||
---
|
||||
amd/autil.c | 7 +++++--
|
||||
1 file changed, 5 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/amd/autil.c b/amd/autil.c
|
||||
index cd9514d..efd18ef 100644
|
||||
--- a/amd/autil.c
|
||||
+++ b/amd/autil.c
|
||||
@@ -709,10 +709,13 @@ am_unmounted(am_node *mp)
|
||||
--mp->am_parent->am_fattr.na_nlink;
|
||||
|
||||
/*
|
||||
- * Update mtime of parent node
|
||||
+ * Update mtime and ctime of parent node (as ctime is needed for some
|
||||
+ * Linux NFS kernel versions to properly recognize attribute changes).
|
||||
*/
|
||||
- if (mp->am_parent && mp->am_parent->am_al->al_mnt)
|
||||
+ if (mp->am_parent && mp->am_parent->am_al->al_mnt) {
|
||||
clocktime(&mp->am_parent->am_fattr.na_mtime);
|
||||
+ mp->am_parent->am_fattr.na_ctime = mp->am_parent->am_fattr.na_mtime;
|
||||
+ }
|
||||
|
||||
if (mp->am_parent && (mp->am_flags & AMF_REMOUNT)) {
|
||||
char *fname = xstrdup(mp->am_name);
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
am-utils-6.2 - fix NFSv3 access method return on non-existent mount point
|
||||
|
||||
From: Ian Kent <raven@themaw.net>
|
||||
|
||||
When the NFS v3 access method is called and there is no mount point
|
||||
corresponding to the path ESTALE needs to be returned the kernel NFS
|
||||
client so an NFS lookup will be done and the mount point re-mounted.
|
||||
|
||||
If there is no map entry to mount the NFS v3 lookup method can then
|
||||
return the failure.
|
||||
|
||||
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||
---
|
||||
amd/nfs_subr.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/amd/nfs_subr.c b/amd/nfs_subr.c
|
||||
index ef07a4a..85cf98c 100644
|
||||
--- a/amd/nfs_subr.c
|
||||
+++ b/amd/nfs_subr.c
|
||||
@@ -1239,9 +1239,9 @@ am_nfs3_access_3_svc(am_ACCESS3args *argp, struct svc_req *rqstp)
|
||||
if (!mp) {
|
||||
post_op_obj = &result.res_u.fail.obj_attributes;
|
||||
post_op_obj->attributes_follow = 0;
|
||||
- result.status = nfs_error(ENOENT);
|
||||
+ result.status = nfs_error(ESTALE);
|
||||
if (amuDebug(D_TRACE))
|
||||
- plog(XLOG_DEBUG, "access_3: ENOENT");
|
||||
+ plog(XLOG_DEBUG, "access_3: ESTALE");
|
||||
} else {
|
||||
nfsfattr *fattr = &mp->am_fattr;
|
||||
am_fattr3 *fattr3;
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
am-utils-6.2 - fix NFSv3 lookup dir attribute return value
|
||||
|
||||
From: Ian Kent <raven@themaw.net>
|
||||
|
||||
The NFS v3 lookup method, which returns attributes for the directory
|
||||
containing the object to be looked up, used incorrect mount point
|
||||
attributes which was causing unusual file system object visibility
|
||||
problems.
|
||||
|
||||
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||
---
|
||||
amd/nfs_subr.c | 29 +++++++++++++++++++++++++++--
|
||||
1 file changed, 27 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/amd/nfs_subr.c b/amd/nfs_subr.c
|
||||
index 85cf98c..6a1b717 100644
|
||||
--- a/amd/nfs_subr.c
|
||||
+++ b/amd/nfs_subr.c
|
||||
@@ -978,6 +978,29 @@ static void fattr_to_wcc_attr(nfsfattr *fattr, am_wcc_attr *wcc_attr)
|
||||
nfstime_to_am_nfstime3(&fattr->na_ctime, &wcc_attr->ctime);
|
||||
}
|
||||
|
||||
+static nfsfattr *get_parent_fattr(am_node *mp)
|
||||
+{
|
||||
+ nfsfattr *fattr;
|
||||
+
|
||||
+ /* Set attributes to those of the parent only if this
|
||||
+ * isn't topvol otherwise just use the mp attributes.
|
||||
+ */
|
||||
+ fattr = &mp->am_fattr;
|
||||
+ if (mp->am_parent && mp->am_parent->am_parent &&
|
||||
+ !(mp->am_parent->am_parent->am_flags & AMF_ROOT))
|
||||
+ fattr = &mp->am_parent->am_fattr;
|
||||
+
|
||||
+ return fattr;
|
||||
+}
|
||||
+
|
||||
+static void parent_fattr_to_fattr3(am_node *mp, am_fattr3 *fattr3)
|
||||
+{
|
||||
+ nfsfattr *fattr;
|
||||
+
|
||||
+ fattr = get_parent_fattr(mp);
|
||||
+ fattr_to_fattr3(fattr, fattr3);
|
||||
+}
|
||||
+
|
||||
static am_nfsstat3 return_estale_or_rofs(am_nfs_fh3 *fh,
|
||||
am_pre_op_attr *pre_op,
|
||||
am_post_op_attr *post_op)
|
||||
@@ -1177,9 +1200,7 @@ am_nfs3_lookup_3_svc(am_LOOKUP3args *argp, struct svc_req *rqstp)
|
||||
|
||||
/* dir attributes */
|
||||
post_op_dir->attributes_follow = 1;
|
||||
- fattr = &mp->am_fattr;
|
||||
fattr3 = &post_op_dir->am_post_op_attr_u.attributes;
|
||||
- fattr_to_fattr3(fattr, fattr3);
|
||||
|
||||
post_op_obj->attributes_follow = 0;
|
||||
|
||||
@@ -1196,6 +1217,7 @@ am_nfs3_lookup_3_svc(am_LOOKUP3args *argp, struct svc_req *rqstp)
|
||||
amd_stats.d_drops++;
|
||||
return 0;
|
||||
}
|
||||
+ parent_fattr_to_fattr3(mp, fattr3);
|
||||
result.status = nfs_error(error);
|
||||
} else {
|
||||
/*
|
||||
@@ -1206,6 +1228,9 @@ am_nfs3_lookup_3_svc(am_LOOKUP3args *argp, struct svc_req *rqstp)
|
||||
if (ap->am_ttl < mp->am_ttl)
|
||||
ap->am_ttl = mp->am_ttl;
|
||||
|
||||
+ /* dir attrs, update after mount */
|
||||
+ parent_fattr_to_fattr3(mp, fattr3);
|
||||
+
|
||||
mp_to_fh3(ap, &result.res_u.ok.object);
|
||||
|
||||
/* mount attributes */
|
||||
|
|
@ -0,0 +1,53 @@
|
|||
am-utils-6.2 - fix NFSv3 readdir post_op_dir attributes return
|
||||
|
||||
From: Ian Kent <raven@themaw.net>
|
||||
|
||||
The NFS v3 readdir method is expected to return the attributes of
|
||||
the directory being read for both success and fail cases.
|
||||
|
||||
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||
---
|
||||
amd/nfs_subr.c | 15 ++++++++-------
|
||||
1 file changed, 8 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/amd/nfs_subr.c b/amd/nfs_subr.c
|
||||
index 6a1b717..00a1dc0 100644
|
||||
--- a/amd/nfs_subr.c
|
||||
+++ b/amd/nfs_subr.c
|
||||
@@ -1627,28 +1627,29 @@ am_nfs3_readdir_3_svc(am_READDIR3args *argp, struct svc_req *rqstp)
|
||||
result.status = nfs_error(retry);
|
||||
} else {
|
||||
am_dirlist3 *list = &result.res_u.ok.reply;
|
||||
+ nfsfattr *fattr;
|
||||
+ am_fattr3 *fattr3;
|
||||
am_nfsstat3 status;
|
||||
|
||||
if (amuDebug(D_TRACE))
|
||||
plog(XLOG_DEBUG, "\treaddir_3(%s)", mp->am_path);
|
||||
|
||||
+ fattr = &mp->am_fattr;
|
||||
+
|
||||
status = mp->am_al->al_mnt->mf_ops->readdir(mp,
|
||||
(voidp)&cookie, list, entries, count);
|
||||
if (status == 0) {
|
||||
post_op_dir = &result.res_u.ok.dir_attributes;
|
||||
- nfsfattr *fattr;
|
||||
- am_fattr3 *fattr3;
|
||||
-
|
||||
- fattr = &mp->am_fattr;
|
||||
- fattr3 = &post_op_dir->am_post_op_attr_u.attributes;
|
||||
post_op_dir->attributes_follow = 1;
|
||||
- fattr_to_fattr3(fattr, fattr3);
|
||||
+ fattr3 = &post_op_dir->am_post_op_attr_u.attributes;
|
||||
result.status = AM_NFS3_OK;
|
||||
} else {
|
||||
post_op_dir = &result.res_u.fail.dir_attributes;
|
||||
- post_op_dir->attributes_follow = 0;
|
||||
+ post_op_dir->attributes_follow = 1;
|
||||
+ fattr3 = &post_op_dir->am_post_op_attr_u.attributes;
|
||||
result.status = nfs_error(status);
|
||||
}
|
||||
+ fattr_to_fattr3(fattr, fattr3);
|
||||
|
||||
mp->am_stats.s_readdir++;
|
||||
}
|
||||
|
|
@ -0,0 +1,62 @@
|
|||
am-utils-6.2 - fix NFSv3 unlink3_or_rmdir3() post_op attributes return
|
||||
|
||||
From: Ian Kent <raven@themaw.net>
|
||||
|
||||
The function unlink3_or_rmdir3() is called by both NFS v3 remove and
|
||||
rmdir methods. Both of these methods require post op wcc attributes
|
||||
to be returned but unlink3_or_rmdir3() was returning only the pre op
|
||||
wcc attributes.
|
||||
|
||||
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||
---
|
||||
amd/nfs_subr.c | 16 +++++++++++++---
|
||||
1 file changed, 13 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/amd/nfs_subr.c b/amd/nfs_subr.c
|
||||
index 00a1dc0..0a43b98 100644
|
||||
--- a/amd/nfs_subr.c
|
||||
+++ b/amd/nfs_subr.c
|
||||
@@ -1033,7 +1033,7 @@ static am_nfsstat3 unlink3_or_rmdir3(am_diropargs3 *argp,
|
||||
am_pre_op_attr *pre_op_dir = &wcc_data->before;
|
||||
am_post_op_attr *post_op_dir = &wcc_data->after;
|
||||
nfsfattr *fattr;
|
||||
- am_wcc_attr *wcc_attr;
|
||||
+ am_wcc_attr *pre_op_wcc_attr, *post_op_wcc_attr;
|
||||
am_node *mp, *ap;
|
||||
int retry;
|
||||
|
||||
@@ -1050,12 +1050,17 @@ static am_nfsstat3 unlink3_or_rmdir3(am_diropargs3 *argp,
|
||||
goto out;
|
||||
}
|
||||
|
||||
+ post_op_dir->attributes_follow = 1;
|
||||
+ post_op_wcc_attr = &post_op_dir->am_post_op_attr_u.attributes;
|
||||
+
|
||||
pre_op_dir->attributes_follow = 1;
|
||||
+ pre_op_wcc_attr = &pre_op_dir->am_pre_op_attr_u.attributes;
|
||||
+
|
||||
fattr = &mp->am_fattr;
|
||||
- wcc_attr = &pre_op_dir->am_pre_op_attr_u.attributes;
|
||||
- fattr_to_wcc_attr(fattr, wcc_attr);
|
||||
+ fattr_to_wcc_attr(fattr, pre_op_wcc_attr);
|
||||
|
||||
if (mp->am_fattr.na_type != NFDIR) {
|
||||
+ fattr_to_wcc_attr(fattr, post_op_wcc_attr);
|
||||
res = nfs_error(ENOTDIR);
|
||||
goto out;
|
||||
}
|
||||
@@ -1075,9 +1080,14 @@ static am_nfsstat3 unlink3_or_rmdir3(am_diropargs3 *argp,
|
||||
*/
|
||||
else if (retry == ENOENT)
|
||||
retry = 0;
|
||||
+ fattr_to_wcc_attr(fattr, post_op_wcc_attr);
|
||||
res = nfs_error(retry);
|
||||
} else {
|
||||
forcibly_timeout_mp(mp);
|
||||
+ /* we can't wait for the expire so use the attributes as
|
||||
+ * they are now for the post op wcc attributes.
|
||||
+ */
|
||||
+ fattr_to_wcc_attr(fattr, post_op_wcc_attr);
|
||||
res = AM_NFS3_OK;
|
||||
}
|
||||
|
||||
13
am-utils-6.2-fix-autoconf-check-in-bootstrap.patch
Normal file
13
am-utils-6.2-fix-autoconf-check-in-bootstrap.patch
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
diff -up am-utils-6.2/bootstrap.autoconf am-utils-6.2/bootstrap
|
||||
--- am-utils-6.2/bootstrap.autoconf 2016-11-30 14:57:05.419388173 +0800
|
||||
+++ am-utils-6.2/bootstrap 2016-11-30 14:57:40.177131005 +0800
|
||||
@@ -9,7 +9,8 @@ validateversion() {
|
||||
local v="$(autoreconf --version 2>&1 | head -1)"
|
||||
case "$v" in
|
||||
*2.63) ;;
|
||||
- *) echo "am-utils requires autoconf 2.69, you have:"
|
||||
+ *2.69) ;;
|
||||
+ *) echo "am-utils requires autoconf 2.69 or 2.63, you have:"
|
||||
echo " $v"
|
||||
exit 1;;
|
||||
esac
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
am-utils-6.2 - fix compiler assignment warning due to libtirpc
|
||||
|
||||
From: Ian Kent <raven@themaw.net>
|
||||
|
||||
When using libtirpc there is a compiler warning on an assignment in
|
||||
the amq_program_1() function.
|
||||
|
||||
This warning was due to libtirpc using struct sockaddr_in6 for some
|
||||
address fields in the transport structure as it is backward compatible
|
||||
with struct sockaddr_in when IPv4 is in use.
|
||||
|
||||
But if TLI is in use svc_getcaller() may not be defined or, if it is,
|
||||
doesn't work as expected.
|
||||
|
||||
So change to using amu_svc_getcaller(), which deals with the needed
|
||||
cast for libtirpc, and handle the NULL return if TLI is being used.
|
||||
|
||||
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||
---
|
||||
amd/amq_svc.c | 24 +++++++++++++++---------
|
||||
1 file changed, 15 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/amd/amq_svc.c b/amd/amq_svc.c
|
||||
index 1f2b3d6..40f79fa 100644
|
||||
--- a/amd/amq_svc.c
|
||||
+++ b/amd/amq_svc.c
|
||||
@@ -162,15 +162,21 @@ amq_program_1(struct svc_req *rqstp, SVCXPRT *transp)
|
||||
|
||||
#if defined(HAVE_TCPD_H) && defined(HAVE_LIBWRAP)
|
||||
if (gopt.flags & CFM_USE_TCPWRAPPERS) {
|
||||
- struct sockaddr_in *remote_addr = svc_getcaller(rqstp->rq_xprt);
|
||||
- char *remote_hostname = inet_ntoa(remote_addr->sin_addr);
|
||||
-
|
||||
- if (!amqsvc_is_client_allowed(remote_addr)) {
|
||||
- plog(XLOG_WARNING, "Amd denied remote amq service to %s", remote_hostname);
|
||||
- svcerr_auth(transp, AUTH_FAILED);
|
||||
- return;
|
||||
- } else {
|
||||
- dlog("Amd allowed remote amq service to %s", remote_hostname);
|
||||
+ struct sockaddr_in *remote_addr = amu_svc_getcaller(rqstp->rq_xprt);
|
||||
+ char *remote_hostname;
|
||||
+
|
||||
+ /* Check the return from amu_svc_getcaller() becuase it's always NULL
|
||||
+ * if TLI is in use.
|
||||
+ */
|
||||
+ if (remote_addr) {
|
||||
+ remote_hostname = inet_ntoa(remote_addr->sin_addr);
|
||||
+ if (!amqsvc_is_client_allowed(remote_addr)) {
|
||||
+ plog(XLOG_WARNING, "Amd denied remote amq service to %s", remote_hostname);
|
||||
+ svcerr_auth(transp, AUTH_FAILED);
|
||||
+ return;
|
||||
+ } else {
|
||||
+ dlog("Amd allowed remote amq service to %s", remote_hostname);
|
||||
+ }
|
||||
}
|
||||
}
|
||||
#endif /* defined(HAVE_TCPD_H) && defined(HAVE_LIBWRAP) */
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
am-utils-6.2 - fix logical not comparison in get_ldap_timestamp()
|
||||
|
||||
From: Ian Kent <raven@themaw.net>
|
||||
|
||||
Looks like the not in this comparison is not meant to be applied to *ts.
|
||||
|
||||
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||
---
|
||||
amd/info_ldap.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/amd/info_ldap.c b/amd/info_ldap.c
|
||||
index cfed6fd..ecfc210 100644
|
||||
--- a/amd/info_ldap.c
|
||||
+++ b/amd/info_ldap.c
|
||||
@@ -446,7 +446,7 @@ get_ldap_timestamp(ALD *a, char *map, time_t *ts)
|
||||
vals[0], map);
|
||||
err = ENOENT;
|
||||
}
|
||||
- if (!*ts > 0) {
|
||||
+ if (!(*ts > 0)) {
|
||||
plog(XLOG_USER, "Nonpositive timestamp %ld for map %s\n",
|
||||
(u_long) *ts, map);
|
||||
err = ENOENT;
|
||||
26
am-utils-6.2-fix-nfsv3-fh-length-in-NFS_FH_DREF.patch
Normal file
26
am-utils-6.2-fix-nfsv3-fh-length-in-NFS_FH_DREF.patch
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
am-utils-6.2 - fix nfsv3 fh length in NFS_FH_DREF()
|
||||
|
||||
From: Ian Kent <ikent@redhat.com>
|
||||
|
||||
The NFS_FH_DREF() macro for linux uses sizeof(struct nfs_fh) for the
|
||||
length of the file handle copy regardless of the version of NFS used.
|
||||
|
||||
But NFSv3 file handles are 64 bytes and not copying the whole file
|
||||
handle can cause automounts to fail.
|
||||
|
||||
Changing this to use the size of the passed nfs file handle fixes
|
||||
the problem.
|
||||
|
||||
Signed-off-by: Ian Kent <ikent@redhat.com>
|
||||
---
|
||||
conf/fh_dref/fh_dref_linux.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/conf/fh_dref/fh_dref_linux.h b/conf/fh_dref/fh_dref_linux.h
|
||||
index 7ffa5b50..f8fb1a89 100644
|
||||
--- a/conf/fh_dref/fh_dref_linux.h
|
||||
+++ b/conf/fh_dref/fh_dref_linux.h
|
||||
@@ -1,2 +1,2 @@
|
||||
/* $srcdir/conf/fh_dref/fh_dref_linux.h */
|
||||
-#define NFS_FH_DREF(dst, src) memcpy((char *) &(dst.data), (char *) src, sizeof(struct nfs_fh))
|
||||
+#define NFS_FH_DREF(dst, src) memcpy((char *) &(dst.data), (char *) src, sizeof(*src))
|
||||
123
am-utils-6.2-fix-umount-to-mount-race.patch
Normal file
123
am-utils-6.2-fix-umount-to-mount-race.patch
Normal file
|
|
@ -0,0 +1,123 @@
|
|||
am-utils-6.2 - fix umount to mount race
|
||||
|
||||
From: Ian Kent <raven@themaw.net>
|
||||
|
||||
If a mount request arrives while its mount fs is being umounted the
|
||||
the reference count of the mount fs never reaches 1 so the location
|
||||
MF_MOUNTED is not cleared and the mount fs instance is not freed.
|
||||
|
||||
This leads to amd thinking the mount fs is still mounted and the
|
||||
mount request succeeds without its corresponding target being
|
||||
mounted.
|
||||
|
||||
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||
---
|
||||
amd/amd.h | 1 +
|
||||
amd/amfs_generic.c | 10 +++++++---
|
||||
amd/autil.c | 9 +++++++++
|
||||
amd/map.c | 13 ++++++++++++-
|
||||
4 files changed, 29 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/amd/amd.h b/amd/amd.h
|
||||
index f66f5b7..504bcf7 100644
|
||||
--- a/amd/amd.h
|
||||
+++ b/amd/amd.h
|
||||
@@ -112,6 +112,7 @@
|
||||
#define AMF_AUTOFS 0x0004 /* This node is part of an autofs filesystem */
|
||||
#define AMF_REMOUNT 0x0008 /* This node needs to be remounted */
|
||||
#define AMF_SOFTLOOKUP 0x0010 /* This node returns EIO if server is down */
|
||||
+#define AMF_SOFTUNMOUNT 0x0020 /* unmount_node() returned EAGAIN, mount still referenced */
|
||||
|
||||
/*
|
||||
* macros for struct mntfs (list of mounted filesystems)
|
||||
diff --git a/amd/amfs_generic.c b/amd/amfs_generic.c
|
||||
index 86d0ab7..7ab2829 100644
|
||||
--- a/amd/amfs_generic.c
|
||||
+++ b/amd/amfs_generic.c
|
||||
@@ -178,7 +178,7 @@ amfs_lookup_node(am_node *mp, char *fname, int *error_return)
|
||||
error = mf->mf_error;
|
||||
continue;
|
||||
}
|
||||
- if (!(mf->mf_flags & MFF_MOUNTED) || (mf->mf_flags & MFF_UNMOUNTING)) {
|
||||
+ if (mf->mf_flags & (MFF_MOUNTING | MFF_UNMOUNTING)) {
|
||||
in_progrss:
|
||||
/*
|
||||
* If the fs is not mounted or it is unmounting then there
|
||||
@@ -743,9 +743,13 @@ amfs_bgmount(struct continuation *cp)
|
||||
|
||||
if (mf->mf_flags & (MFF_MOUNTING | MFF_UNMOUNTING)) {
|
||||
/*
|
||||
- * Still mounting - retry later
|
||||
+ * Still mounting or umounting - retry later
|
||||
*/
|
||||
- dlog("mount of \"%s\" already pending", mf->mf_info);
|
||||
+ if (mf->mf_flags & MFF_MOUNTING) {
|
||||
+ dlog("mount of \"%s\" already pending", mf->mf_info);
|
||||
+ } else {
|
||||
+ dlog("unmount of \"%s\" already pending", mf->mf_info);
|
||||
+ }
|
||||
goto retry;
|
||||
}
|
||||
|
||||
diff --git a/amd/autil.c b/amd/autil.c
|
||||
index f44a0e2..1962c71 100644
|
||||
--- a/amd/autil.c
|
||||
+++ b/amd/autil.c
|
||||
@@ -703,6 +703,15 @@ am_unmounted(am_node *mp)
|
||||
}
|
||||
|
||||
/*
|
||||
+ * Clear the mounted flag in case there is a pending mount with
|
||||
+ * the same target fs and this is the last reference to it.
|
||||
+ */
|
||||
+ if (mp->am_flags & AMF_SOFTUNMOUNT)
|
||||
+ mp->am_flags &= ~AMF_SOFTUNMOUNT;
|
||||
+ else
|
||||
+ mf->mf_flags &= ~MFF_MOUNTED;
|
||||
+
|
||||
+ /*
|
||||
* If this is a pseudo-directory then adjust the link count
|
||||
* in the parent
|
||||
*/
|
||||
diff --git a/amd/map.c b/amd/map.c
|
||||
index a6df44b..cf5263e 100644
|
||||
--- a/amd/map.c
|
||||
+++ b/amd/map.c
|
||||
@@ -819,11 +819,17 @@ unmount_node(opaque_t arg)
|
||||
#endif /* HAVE_FS_AUTOFS */
|
||||
if (mf->mf_refc == 1)
|
||||
error = mf->mf_ops->umount_fs(mp, mf);
|
||||
+
|
||||
+ /* Mount was not actually unmounted, soft umount.
|
||||
+ * Tell the caller about it.
|
||||
+ */
|
||||
+ if (!error && mf->mf_refc > 1)
|
||||
+ error = EAGAIN;
|
||||
}
|
||||
|
||||
/* do this again, it might have changed */
|
||||
mf = mp->am_al->al_mnt;
|
||||
- if (error) {
|
||||
+ if (error && error != EAGAIN) {
|
||||
errno = error; /* XXX */
|
||||
dlog("%s: unmount: %m", mf->mf_mount);
|
||||
}
|
||||
@@ -870,6 +876,10 @@ free_map_if_success(int rc, int term, opaque_t arg)
|
||||
#endif /* HAVE_FS_AUTOFS */
|
||||
amd_stats.d_uerr++;
|
||||
} else if (rc) {
|
||||
+ if (rc == EAGAIN) {
|
||||
+ mp->am_flags |= AMF_SOFTUNMOUNT;
|
||||
+ goto done;
|
||||
+ }
|
||||
notify_child(mp, AMQ_UMNT_FAILED, rc, 0);
|
||||
if (mf->mf_ops == &amfs_program_ops || rc == EBUSY)
|
||||
plog(XLOG_STATS, "\"%s\" on %s still active", mp->am_path, mf->mf_mount);
|
||||
@@ -885,6 +895,7 @@ free_map_if_success(int rc, int term, opaque_t arg)
|
||||
#endif /* HAVE_FS_AUTOFS */
|
||||
amd_stats.d_uerr++;
|
||||
} else {
|
||||
+done:
|
||||
/*
|
||||
* am_unmounted() will call notify_child() appropriately.
|
||||
*/
|
||||
52
am-utils-6.2-fix-wcc-attr-usage-in-unlink3_or_rmdir3.patch
Normal file
52
am-utils-6.2-fix-wcc-attr-usage-in-unlink3_or_rmdir3.patch
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
am-utils-6.2 - fix wcc attr usage in unlink3_or_rmdir3()
|
||||
|
||||
From: Ian Kent <raven@themaw.net>
|
||||
|
||||
The definition of the wcc post op attributes should be am_fattr3 not
|
||||
am_wcc_attr in unlink3_or_rmdir3().
|
||||
|
||||
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||
---
|
||||
amd/nfs_subr.c | 9 +++++----
|
||||
1 file changed, 5 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/amd/nfs_subr.c b/amd/nfs_subr.c
|
||||
index a383618..b88a40c 100644
|
||||
--- a/amd/nfs_subr.c
|
||||
+++ b/amd/nfs_subr.c
|
||||
@@ -1058,7 +1058,8 @@ static am_nfsstat3 unlink3_or_rmdir3(am_diropargs3 *argp,
|
||||
am_pre_op_attr *pre_op_dir = &wcc_data->before;
|
||||
am_post_op_attr *post_op_dir = &wcc_data->after;
|
||||
nfsfattr *fattr;
|
||||
- am_wcc_attr *pre_op_wcc_attr, *post_op_wcc_attr;
|
||||
+ am_wcc_attr *pre_op_wcc_attr;
|
||||
+ am_fattr3 *post_op_wcc_attr;
|
||||
am_node *mp, *ap;
|
||||
int retry;
|
||||
|
||||
@@ -1085,7 +1086,7 @@ static am_nfsstat3 unlink3_or_rmdir3(am_diropargs3 *argp,
|
||||
fattr_to_wcc_attr(fattr, pre_op_wcc_attr);
|
||||
|
||||
if (mp->am_fattr.na_type != NFDIR) {
|
||||
- fattr_to_wcc_attr(fattr, post_op_wcc_attr);
|
||||
+ fattr_to_fattr3(fattr, post_op_wcc_attr);
|
||||
res = nfs_error(ENOTDIR);
|
||||
goto out;
|
||||
}
|
||||
@@ -1105,14 +1106,14 @@ static am_nfsstat3 unlink3_or_rmdir3(am_diropargs3 *argp,
|
||||
*/
|
||||
else if (retry == ENOENT)
|
||||
retry = 0;
|
||||
- fattr_to_wcc_attr(fattr, post_op_wcc_attr);
|
||||
+ fattr_to_fattr3(fattr, post_op_wcc_attr);
|
||||
res = nfs_error(retry);
|
||||
} else {
|
||||
forcibly_timeout_mp(mp);
|
||||
/* we can't wait for the expire so use the attributes as
|
||||
* they are now for the post op wcc attributes.
|
||||
*/
|
||||
- fattr_to_wcc_attr(fattr, post_op_wcc_attr);
|
||||
+ fattr_to_fattr3(fattr, post_op_wcc_attr);
|
||||
res = AM_NFS3_OK;
|
||||
}
|
||||
|
||||
20
am-utils-6.2-make-sure-variables-are-initialized.patch
Normal file
20
am-utils-6.2-make-sure-variables-are-initialized.patch
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
commit 54da7c8206e38d0bf08a250835553754a1235360
|
||||
Author: Christos Zoulas <christos@zoulas.com>
|
||||
Date: Wed Jan 21 23:28:33 2015 -0500
|
||||
|
||||
make sure variables are initialized
|
||||
|
||||
diff --git a/amd/nfs_subr.c b/amd/nfs_subr.c
|
||||
index 7192a6a..30effba 100644
|
||||
--- a/amd/nfs_subr.c
|
||||
+++ b/amd/nfs_subr.c
|
||||
@@ -1711,6 +1711,9 @@ am_nfs3_fsstat_3_svc(am_FSSTAT3args *argp, struct svc_req *rqstp)
|
||||
if ((gopt.flags & CFM_SHOW_STATFS_ENTRIES) &&
|
||||
mp->am_al->al_mnt && mp->am_al->al_mnt->mf_mopts) {
|
||||
mnt.mnt_opts = mp->am_al->al_mnt->mf_mopts;
|
||||
+ blocks = 0;
|
||||
+ bfree = 0;
|
||||
+ bavail = 0;
|
||||
if (amu_hasmntopt(&mnt, "browsable")) {
|
||||
count_map_entries(mp, &blocks, &bfree, &bavail);
|
||||
}
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
commit 116309607c437e302dafa1efb60330f54f815761
|
||||
Author: Christos Zoulas <christos@zoulas.com>
|
||||
Date: Sat Jan 17 12:21:24 2015 -0500
|
||||
|
||||
print_nfs_common_args() is only needed with DEBUG
|
||||
|
||||
diff --git a/libamu/mount_fs.c b/libamu/mount_fs.c
|
||||
index b5576bd..b577bab 100644
|
||||
--- a/libamu/mount_fs.c
|
||||
+++ b/libamu/mount_fs.c
|
||||
@@ -647,6 +647,7 @@ compute_nfs_common_args(struct nfs_common_args *nap, mntent_t *mntp,
|
||||
#endif /* defined(MNT2_NFS_OPT_XLATECOOKIE) && defined(MNTTAB_OPT_XLATECOOKIE) */
|
||||
}
|
||||
|
||||
+#ifdef DEBUG
|
||||
static void
|
||||
print_nfs_common_args(const struct nfs_common_args *a)
|
||||
{
|
||||
@@ -664,6 +665,7 @@ print_nfs_common_args(const struct nfs_common_args *a)
|
||||
plog(XLOG_DEBUG, "NA->acdirmax = %lu", a->acdirmax);
|
||||
#endif /* HAVE_NFS_ARGS_T_ACREGMIN */
|
||||
}
|
||||
+#endif
|
||||
|
||||
static void
|
||||
discard_nfs23_args(nfs_args_t *nap)
|
||||
26
am-utils-6.2-remove-set-but-not-used-variable-again.patch
Normal file
26
am-utils-6.2-remove-set-but-not-used-variable-again.patch
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
commit a87188b9f0596651ce987253a6af23aca4b08b75
|
||||
Author: Christos Zoulas <christos@zoulas.com>
|
||||
Date: Sat Jan 17 12:42:55 2015 -0500
|
||||
|
||||
remove set but not used variable
|
||||
|
||||
diff --git a/conf/transp/transp_sockets.c b/conf/transp/transp_sockets.c
|
||||
index b3ad5fc..6326007 100644
|
||||
--- a/conf/transp/transp_sockets.c
|
||||
+++ b/conf/transp/transp_sockets.c
|
||||
@@ -418,7 +418,6 @@ u_long
|
||||
get_nfs_version(char *host, struct sockaddr_in *sin, u_long nfs_version, const char *proto, u_long def)
|
||||
{
|
||||
CLIENT *clnt;
|
||||
- int again = 0;
|
||||
enum clnt_stat clnt_stat;
|
||||
struct timeval tv;
|
||||
int sock;
|
||||
@@ -433,7 +432,6 @@ get_nfs_version(char *host, struct sockaddr_in *sin, u_long nfs_version, const c
|
||||
nfs_version = def;
|
||||
else
|
||||
nfs_version = NFS_VERS_MAX;
|
||||
- again = 1;
|
||||
}
|
||||
tv.tv_sec = 2; /* retry every 2 seconds, but also timeout */
|
||||
tv.tv_usec = 0;
|
||||
28
am-utils-6.2-remove-set-but-not-used-variable-mp_error.patch
Normal file
28
am-utils-6.2-remove-set-but-not-used-variable-mp_error.patch
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
commit ed717dad0fee421744a24e6fb43e09d62b3f898d
|
||||
Author: Christos Zoulas <christos@zoulas.com>
|
||||
Date: Sat Jan 17 12:45:22 2015 -0500
|
||||
|
||||
remove set but not used variable
|
||||
|
||||
diff --git a/amd/amfs_generic.c b/amd/amfs_generic.c
|
||||
index 25d734b..c352a32 100644
|
||||
--- a/amd/amfs_generic.c
|
||||
+++ b/amd/amfs_generic.c
|
||||
@@ -1153,7 +1153,6 @@ amfs_generic_lookup_child(am_node *mp, char *fname, int *error_return, int op)
|
||||
{
|
||||
am_node *new_mp;
|
||||
am_loc **al_array;
|
||||
- int mp_error;
|
||||
|
||||
dlog("in amfs_generic_lookup_child");
|
||||
|
||||
@@ -1178,9 +1177,6 @@ amfs_generic_lookup_child(am_node *mp, char *fname, int *error_return, int op)
|
||||
return new_mp;
|
||||
}
|
||||
|
||||
- /* save error_return */
|
||||
- mp_error = *error_return;
|
||||
-
|
||||
al_array = amfs_lookup_loc(new_mp, error_return);
|
||||
if (!al_array) {
|
||||
new_mp->am_error = new_mp->am_al->al_mnt->mf_error = *error_return;
|
||||
38
am-utils-6.2-remove-set-but-not-used-variable-s.patch
Normal file
38
am-utils-6.2-remove-set-but-not-used-variable-s.patch
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
commit 79bb90caf12d2713b4736c3820135f0f00424f10
|
||||
Author: Christos Zoulas <christos@zoulas.com>
|
||||
Date: Sat Jan 17 12:29:03 2015 -0500
|
||||
|
||||
remove set but not used variable
|
||||
|
||||
diff --git a/hlfsd/hlfsd.c b/hlfsd/hlfsd.c
|
||||
index 686bb63..701abcd 100644
|
||||
--- a/hlfsd/hlfsd.c
|
||||
+++ b/hlfsd/hlfsd.c
|
||||
@@ -144,7 +144,6 @@ main(int argc, char *argv[])
|
||||
int opterrs = 0;
|
||||
int retry;
|
||||
int soNFS; /* NFS socket */
|
||||
- int s = -99;
|
||||
mntent_t mnt;
|
||||
nfs_args_t nfs_args;
|
||||
am_nfs_handle_t anh;
|
||||
@@ -449,17 +448,16 @@ main(int argc, char *argv[])
|
||||
* set this signal handler.
|
||||
*/
|
||||
if (amuDebug(D_DAEMON)) {
|
||||
- s = -99;
|
||||
while (stoplight != SIGUSR2) {
|
||||
plog(XLOG_INFO, "parent waits for child to setup (stoplight=%d)", stoplight);
|
||||
#ifdef HAVE_SIGSUSPEND
|
||||
{
|
||||
sigset_t mask;
|
||||
sigemptyset(&mask);
|
||||
- s = sigsuspend(&mask); /* wait for child to set up */
|
||||
+ (void)sigsuspend(&mask); /* wait for child to set up */
|
||||
}
|
||||
#else /* not HAVE_SIGSUSPEND */
|
||||
- s = sigpause(0); /* wait for child to set up */
|
||||
+ (void)sigpause(0); /* wait for child to set up */
|
||||
#endif /* not HAVE_SIGSUSPEND */
|
||||
sleep(1);
|
||||
}
|
||||
22
am-utils-6.2-remove-unused-function-show_map.patch
Normal file
22
am-utils-6.2-remove-unused-function-show_map.patch
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
commit f61becdba8df1d6d515f5476d312d3cf4e933946
|
||||
Author: Christos Zoulas <christos@zoulas.com>
|
||||
Date: Sat Jan 17 12:43:32 2015 -0500
|
||||
|
||||
remove unused function
|
||||
|
||||
diff --git a/amq/amq.c b/amq/amq.c
|
||||
index e99732f..5d4ed7a 100644
|
||||
--- a/amq/amq.c
|
||||
+++ b/amq/amq.c
|
||||
@@ -256,11 +256,6 @@ show_mi(amq_mount_info_list *ml, enum show_opt e, int *mwid, int *dwid, int *twi
|
||||
}
|
||||
|
||||
static void
|
||||
-show_map(amq_map_info *mi)
|
||||
-{
|
||||
-}
|
||||
-
|
||||
-static void
|
||||
show_mapinfo(amq_map_info_list *ml, enum show_opt e, int *nwid, int *wwid)
|
||||
{
|
||||
u_int i;
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
commit 76e1a5ddc9ef9730205b2da2ed6b654d8fbaef40
|
||||
Author: Christos Zoulas <christos@zoulas.com>
|
||||
Date: Sat Jan 17 12:27:56 2015 -0500
|
||||
|
||||
uid_t might be a different size than unsigned int, so XXX: truncate.
|
||||
|
||||
diff --git a/hlfsd/stubs.c b/hlfsd/stubs.c
|
||||
index b26e5f4..70876b7 100644
|
||||
--- a/hlfsd/stubs.c
|
||||
+++ b/hlfsd/stubs.c
|
||||
@@ -60,6 +60,21 @@ static int started;
|
||||
static am_nfs_fh slink;
|
||||
static am_nfs_fh un_fhandle;
|
||||
|
||||
+static void
|
||||
+xgetuid(uid_t *uid, const void *p)
|
||||
+{
|
||||
+ u_int xuid;
|
||||
+ (void)memcpy(&xuid, p, sizeof(xuid));
|
||||
+ *uid = xuid;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+xputuid(void *p, uid_t uid)
|
||||
+{
|
||||
+ u_int xuid = uid;
|
||||
+ (void)memcpy(p, &xuid, sizeof(xuid));
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* GLOBALS:
|
||||
*/
|
||||
@@ -160,7 +175,7 @@ nfsproc_getattr_2_svc(am_nfs_fh *argp, struct svc_req *rqstp)
|
||||
if (gid != hlfs_gid) {
|
||||
res.ns_status = NFSERR_STALE;
|
||||
} else {
|
||||
- (void)memcpy(&uid, argp->fh_data, sizeof(uid));
|
||||
+ xgetuid(&uid, argp->fh_data);
|
||||
if (plt_search(uid) != (uid2home_t *) NULL) {
|
||||
res.ns_status = NFS_OK;
|
||||
un_fattr.na_fileid = uid;
|
||||
@@ -278,7 +293,7 @@ nfsproc_lookup_2_svc(nfsdiropargs *argp, struct svc_req *rqstp)
|
||||
un_fattr.na_fileid = untab[idx].uid;
|
||||
res.dr_u.dr_drok_u.drok_attributes = un_fattr;
|
||||
memset(&un_fhandle, 0, sizeof(un_fhandle));
|
||||
- memcpy(un_fhandle.fh_data, &untab[idx].uid, sizeof(untab[idx].uid));
|
||||
+ xputuid(un_fhandle.fh_data, untab[idx].uid);
|
||||
xstrlcpy((char *) &un_fhandle.fh_data[sizeof(int)],
|
||||
untab[idx].username,
|
||||
sizeof(am_nfs_fh) - sizeof(int));
|
||||
@@ -333,7 +348,7 @@ nfsproc_readlink_2_svc(am_nfs_fh *argp, struct svc_req *rqstp)
|
||||
}
|
||||
|
||||
if (groupid == hlfs_gid) {
|
||||
- memcpy(&userid, argp->fh_data, sizeof(userid));
|
||||
+ xgetuid(&userid, argp->fh_data);
|
||||
username = (char *) &argp->fh_data[sizeof(int)];
|
||||
if (!(res.rlr_u.rlr_data_u = mailbox(userid, username)))
|
||||
return (nfsreadlinkres *) NULL;
|
||||
93
am-utils-6.2-use-linux-libtirpc-if-present.patch
Normal file
93
am-utils-6.2-use-linux-libtirpc-if-present.patch
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
am-utils-6.2 - use Linux libtirpc if present
|
||||
|
||||
From: Ian Kent <raven@themaw.net>
|
||||
|
||||
For Linux systems, if the header files and shared libraries of libtirpc
|
||||
are present use them instead of the glibc RPC implementation.
|
||||
|
||||
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||
---
|
||||
Makefile.am | 3 ++-
|
||||
configure.ac | 4 ++++
|
||||
include/am_compat.h | 8 ++++++--
|
||||
m4/macros/check_linux_libtirpc.m4 | 13 +++++++++++++
|
||||
4 files changed, 25 insertions(+), 3 deletions(-)
|
||||
create mode 100644 m4/macros/check_linux_libtirpc.m4
|
||||
|
||||
diff --git a/Makefile.am b/Makefile.am
|
||||
index bae4615..e094e95 100644
|
||||
--- a/Makefile.am
|
||||
+++ b/Makefile.am
|
||||
@@ -146,7 +146,8 @@ EXTRA_DIST_M4 = \
|
||||
m4/macros/type_xdrproc_t.m4 \
|
||||
m4/macros/type_xfs_args.m4 \
|
||||
m4/macros/type_yp_order_outorder.m4 \
|
||||
- m4/macros/with_addon.m4
|
||||
+ m4/macros/with_addon.m4 \
|
||||
+ m4/macros/check_linux_libtirpc.m4
|
||||
|
||||
EXTRA_DIST_CONF = \
|
||||
conf/autofs/autofs_default.h \
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index ce61925..98b444d 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -222,6 +222,9 @@ dnl lots of code. So I am forced to use a special purpose macro that sets
|
||||
dnl the libraries based on the OS. Sigh. -Erez.
|
||||
AMU_CHECK_OS_LIBS
|
||||
|
||||
+dnl use Linux libtirpc if possible
|
||||
+AMU_CHECK_LIBTIRPC
|
||||
+
|
||||
dnl librpc and librpcsvc are needed on Solaris
|
||||
AC_CHECK_LIB(rpc, clnt_sperrno)
|
||||
AC_CHECK_LIB(rpcsvc, xdr_fhandle)
|
||||
@@ -433,6 +436,7 @@ AC_CHECK_HEADERS( \
|
||||
arpa/nameser.h \
|
||||
arpa/inet.h \
|
||||
bsd/rpc/rpc.h \
|
||||
+ tirpc/netconfig.h \
|
||||
cdfs/cdfsmount.h \
|
||||
cdfs/cdfs_mount.h \
|
||||
fs/udf/udf_mount.h \
|
||||
diff --git a/include/am_compat.h b/include/am_compat.h
|
||||
index 3463f3f..d6826fc 100644
|
||||
--- a/include/am_compat.h
|
||||
+++ b/include/am_compat.h
|
||||
@@ -454,11 +454,15 @@ struct hsfs_args {
|
||||
/*
|
||||
* Define a dummy struct netconfig for non-TLI systems
|
||||
*/
|
||||
-#if !defined(HAVE_NETCONFIG_H) && !defined(HAVE_SYS_NETCONFIG_H)
|
||||
+#if !defined(HAVE_NETCONFIG_H)
|
||||
+# if !defined(HAVE_SYS_NETCONFIG_H)
|
||||
+# if !defined(HAVE_TIRPC_NETCONFIG_H)
|
||||
struct netconfig {
|
||||
int dummy;
|
||||
};
|
||||
-#endif /* not HAVE_NETCONFIG_H and not HAVE_SYS_NETCONFIG_H */
|
||||
+# endif /* not HAVE_TIRPC_NETCONFIG_H */
|
||||
+# endif /* not HAVE_SYS_NETCONFIG_H */
|
||||
+#endif /* not HAVE_NETCONFIG_H */
|
||||
|
||||
/* some OSs don't define INADDR_NONE and assume it's unsigned -1 */
|
||||
#ifndef INADDR_NONE
|
||||
diff --git a/m4/macros/check_linux_libtirpc.m4 b/m4/macros/check_linux_libtirpc.m4
|
||||
new file mode 100644
|
||||
index 0000000..918423c
|
||||
--- /dev/null
|
||||
+++ b/m4/macros/check_linux_libtirpc.m4
|
||||
@@ -0,0 +1,13 @@
|
||||
+dnl ######################################################################
|
||||
+dnl Check for Linux libtirpc library
|
||||
+AC_DEFUN([AMU_CHECK_LIBTIRPC],[
|
||||
+TIRPC_CPPFLAGS=""
|
||||
+TIRPC_LIBS=""
|
||||
+
|
||||
+AC_CHECK_HEADER(tirpc/netconfig.h,[
|
||||
+ TIRPC_CPPFLAGS="-I/usr/include/tirpc"
|
||||
+ AC_DEFINE(HAVE_LIBTIRPC, 1, [Define to 1 if you have libtirpc headers installed])
|
||||
+ AC_CHECK_LIB(tirpc, clnt_tli_create, [TIRPC_LIBS="-ltirpc"], [TIRPC_CPPFLAGS=""])])
|
||||
+ AMU_CFLAGS="$AMU_CFLAGS $TIRPC_CPPFLAGS"
|
||||
+ LIBS="$LIBS $TIRPC_LIBS"
|
||||
+])
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
am-utils-6.2 - use new get_nfs_xprt() and put_nfs_xprt() functions
|
||||
|
||||
From: Ian Kent <raven@themaw.net>
|
||||
|
||||
The nfs_quick_reply() function needs to know the current RPC transport
|
||||
outside of the NFS LOOKUP method call. It needs this to reply to the
|
||||
NFS LOOKUP call that initiated the mount.
|
||||
|
||||
Now there are functions that avoid transport corruption if another
|
||||
request comes in during the backgroud mount make nfs_quick_reply()
|
||||
use them.
|
||||
|
||||
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||
---
|
||||
amd/amfs_generic.c | 3 +--
|
||||
amd/map.c | 2 +-
|
||||
amd/nfs_subr.c | 3 ++-
|
||||
3 files changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/amd/amfs_generic.c b/amd/amfs_generic.c
|
||||
index c352a32..86d0ab7 100644
|
||||
--- a/amd/amfs_generic.c
|
||||
+++ b/amd/amfs_generic.c
|
||||
@@ -1129,8 +1129,7 @@ amfs_generic_mount_child(am_node *new_mp, int *error_return)
|
||||
*/
|
||||
if (current_transp && !new_mp->am_transp) {
|
||||
dlog("Saving RPC transport for %s", new_mp->am_path);
|
||||
- new_mp->am_transp = (SVCXPRT *) xmalloc(sizeof(SVCXPRT));
|
||||
- *(new_mp->am_transp) = *current_transp;
|
||||
+ new_mp->am_transp = get_nfs_xprt(current_transp);
|
||||
}
|
||||
if (error && new_mp->am_al && new_mp->am_al->al_mnt &&
|
||||
(new_mp->am_al->al_mnt->mf_ops == &amfs_error_ops))
|
||||
diff --git a/amd/map.c b/amd/map.c
|
||||
index 0d404cf..bcb2156 100644
|
||||
--- a/amd/map.c
|
||||
+++ b/amd/map.c
|
||||
@@ -471,7 +471,7 @@ free_map(am_node *mp)
|
||||
XFREE(mp->am_name);
|
||||
XFREE(mp->am_path);
|
||||
XFREE(mp->am_pref);
|
||||
- XFREE(mp->am_transp);
|
||||
+ put_nfs_xprt(mp->am_transp);
|
||||
|
||||
if (mp->am_al)
|
||||
free_loc(mp->am_al);
|
||||
diff --git a/amd/nfs_subr.c b/amd/nfs_subr.c
|
||||
index 0a43b98..07d960d 100644
|
||||
--- a/amd/nfs_subr.c
|
||||
+++ b/amd/nfs_subr.c
|
||||
@@ -291,7 +291,8 @@ nfs_quick_reply(am_node *mp, int error)
|
||||
/*
|
||||
* Free up transp. It's only used for one reply.
|
||||
*/
|
||||
- XFREE(mp->am_transp);
|
||||
+ put_nfs_xprt(mp->am_transp);
|
||||
+ mp->am_transp = NULL;
|
||||
dlog("Quick reply sent for %s", mp->am_al->al_mnt->mf_mount);
|
||||
}
|
||||
}
|
||||
35
am-utils.conf
Normal file
35
am-utils.conf
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
#
|
||||
# amd default config file
|
||||
#
|
||||
# check amd.conf(5) man page for details about options in this file
|
||||
#
|
||||
|
||||
# GLOBAL OPTIONS SECTION
|
||||
[ global ]
|
||||
normalize_hostnames = no
|
||||
print_pid = yes
|
||||
pid_file = /var/run/amd.pid
|
||||
restart_mounts = yes
|
||||
auto_dir = /.automount
|
||||
#log_file = /var/log/amd
|
||||
log_file = syslog
|
||||
log_options = all
|
||||
#debug_options = all
|
||||
plock = no
|
||||
selectors_on_default = yes
|
||||
print_version = no
|
||||
# set map_type to "nis" for NIS maps, or comment it out to search for all
|
||||
# types
|
||||
map_type = file
|
||||
search_path = /etc
|
||||
browsable_dirs = yes
|
||||
show_statfs_entries = no
|
||||
fully_qualified_hosts = no
|
||||
cache_duration = 300
|
||||
# Fedora doesn't support NFSv2, use the amd NFSv3 server.
|
||||
auto_nfs_version = 3
|
||||
|
||||
# DEFINE AN AMD MOUNT POINT
|
||||
[ /net ]
|
||||
map_name = amd.net
|
||||
map_type = file
|
||||
95
am-utils.init
Executable file
95
am-utils.init
Executable file
|
|
@ -0,0 +1,95 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Version: 1.3
|
||||
#
|
||||
# chkconfig: - 72 28
|
||||
# description: Runs the automount daemon that mounts devices and NFS hosts \
|
||||
# on demand.
|
||||
# processname: amd
|
||||
# config: /etc/amd.conf
|
||||
#
|
||||
|
||||
# We require the /etc/amd.conf file, but supply it in the package, so it
|
||||
# should always be there.
|
||||
[ -f /etc/amd.conf ] || exit $?
|
||||
[ -f /etc/sysconfig/amd ] || exit $?
|
||||
|
||||
# Source function library.
|
||||
. /etc/init.d/functions
|
||||
|
||||
# Recover AMDOPTS from /etc/sysconfig/amd.
|
||||
if [ -f /etc/sysconfig/amd ] ; then
|
||||
. /etc/sysconfig/amd
|
||||
fi
|
||||
|
||||
RETVAL=0
|
||||
prog=amd
|
||||
amd=/usr/sbin/amd
|
||||
|
||||
start() {
|
||||
echo -n $"Starting $prog: "
|
||||
daemon $amd -F /etc/amd.conf $AMDOPTS $OPTIONS $MOUNTPTS
|
||||
RETVAL=$?
|
||||
echo
|
||||
[ $RETVAL = 0 ] && touch /var/lock/subsys/amd
|
||||
return $RETVAL
|
||||
}
|
||||
|
||||
stop() {
|
||||
echo -n $"Stopping $prog: "
|
||||
killproc $amd -TERM
|
||||
# this part is from wait4amd2die
|
||||
delay=3
|
||||
count=10
|
||||
i=1
|
||||
maxcount=`expr $count + 1`
|
||||
while [ $i != $maxcount ]; do
|
||||
# run amq
|
||||
/usr/sbin/amq > /dev/null 2>&1
|
||||
if [ $? != 0 ]
|
||||
then
|
||||
# amq failed to run (because amd is dead)
|
||||
rm -f /var/lock/subsys/amd /var/run/amd.pid
|
||||
echo
|
||||
return 0
|
||||
fi
|
||||
sleep $delay
|
||||
i=`expr $i + 1`
|
||||
done
|
||||
failure $"amd shutdown"
|
||||
echo
|
||||
echo "amd is still up"
|
||||
return 1
|
||||
}
|
||||
|
||||
# See how we were called.
|
||||
case "$1" in
|
||||
start)
|
||||
start
|
||||
;;
|
||||
stop)
|
||||
stop
|
||||
;;
|
||||
status)
|
||||
status $amd
|
||||
RETVAL=$?
|
||||
;;
|
||||
restart)
|
||||
stop
|
||||
start
|
||||
;;
|
||||
condrestart)
|
||||
if [ -f /var/lock/subsys/amd ]; then
|
||||
stop
|
||||
start
|
||||
fi
|
||||
;;
|
||||
reload)
|
||||
action $"Reloading $prog:" killall -HUP $amd
|
||||
;;
|
||||
*)
|
||||
echo $"Usage: $0 {start|stop|restart|reload|condrestart|status}"
|
||||
exit 1
|
||||
esac
|
||||
|
||||
exit $RETVAL
|
||||
5
am-utils.net.map
Normal file
5
am-utils.net.map
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
localhost type:=link;fs:=/
|
||||
* host==${key};type:=link;fs:=/ \
|
||||
hostd==${key};type:=link;fs:=/ \
|
||||
fs:=${autodir}/${rhost}/root/${rfs};type:=host;rhost:=${key};rfs:=/;opts:=nosuid,nodev
|
||||
|
||||
702
am-utils.spec
Normal file
702
am-utils.spec
Normal file
|
|
@ -0,0 +1,702 @@
|
|||
Summary: Automount utilities including an updated version of Amd
|
||||
Name: am-utils
|
||||
Version: 6.2.0
|
||||
%define upstream_version 6.2
|
||||
Release: 27%{?dist}
|
||||
License: BSD
|
||||
Epoch: 5
|
||||
Group: System Environment/Daemons
|
||||
URL: http://am-utils.org
|
||||
# Git repository git://git.fsl.cs.sunysb.edu/am-utils-6.2.git
|
||||
Source: ftp://ftp.am-utils.org/pub/am-utils/am-utils-%{upstream_version}.tar.gz
|
||||
Source1: am-utils.init
|
||||
Source2: am-utils.conf
|
||||
Source3: am-utils.sysconf
|
||||
Source4: am-utils.net.map
|
||||
|
||||
BuildRequires: gdbm-devel
|
||||
BuildRequires: hesiod-devel
|
||||
BuildRequires: openldap-devel
|
||||
BuildRequires: autoconf
|
||||
BuildRequires: automake
|
||||
BuildRequires: libtool
|
||||
BuildRequires: bison
|
||||
BuildRequires: flex
|
||||
BuildRequires: tcp_wrappers-devel
|
||||
BuildRequires: texinfo
|
||||
BuildRequires: gcc
|
||||
BuildRequires: m4
|
||||
BuildRequires: libtirpc-devel
|
||||
|
||||
Requires: portmap
|
||||
Requires: grep
|
||||
Requires: gawk
|
||||
Requires: findutils
|
||||
Requires: libtirpc
|
||||
|
||||
Requires(pre): /bin/grep
|
||||
Requires(post): /sbin/install-info
|
||||
Requires(preun): /sbin/install-info
|
||||
|
||||
# Fix problems with possible future libtool rebases (#1181698)
|
||||
Patch1: am-utils-6.2-dont-include-auto-generated-macros-in-aclinlude_m4.patch
|
||||
Patch2: am-utils-6.2-print_nfs_common_args-is-only-needed-with-DEBUG.patch
|
||||
Patch3: am-utils-6.2-uid_t-might-be-a-different-size-than-unsigned-int.patch
|
||||
Patch4: am-utils-6.2-remove-set-but-not-used-variable-s.patch
|
||||
Patch5: am-utils-6.2-remove-set-but-not-used-variable-again.patch
|
||||
Patch6: am-utils-6.2-remove-unused-function-show_map.patch
|
||||
Patch7: am-utils-6.2-remove-set-but-not-used-variable-mp_error.patch
|
||||
Patch8: am-utils-6.2-32-bit-fixes.patch
|
||||
Patch9: am-utils-6.2-make-sure-variables-are-initialized.patch
|
||||
Patch10: am-utils-6.2-dont-use-logical-double-ampersand-when-ampersand-is-meant.patch
|
||||
Patch11: am-utils-6.2-Fix-nfs-args-setting-code.patch
|
||||
|
||||
Patch12: am-utils-6.2-add-debug-log-trace-to-NFSv3-readdirplus.patch
|
||||
Patch13: am-utils-6.2-fix-NFSv3-access-method-return-on-non-existent-mount-point.patch
|
||||
Patch14: am-utils-6.2-fix-NFSv3-lookup-dir-attribute-return-value.patch
|
||||
Patch15: am-utils-6.2-fix-NFSv3-readdir-post_op_dir-attributes-return.patch
|
||||
Patch16: am-utils-6.2-fix-NFSv3-unlink3_or_rmdir3-post_op-attributes-return.patch
|
||||
|
||||
# The git changelog entry doesn't say why autoconf 2.69 is required.
|
||||
# Changing the check to require RHEL-6 autoconf version 2.63 does
|
||||
# build cleanly and appears to work ok. Perhaps the libtool change
|
||||
# (ie. patch1 above) resolves whatever problem that commit was meant
|
||||
# to deal with.
|
||||
Patch17: am-utils-6.2-allow-old-autoconf-version.patch
|
||||
|
||||
Patch18: am-utils-6.2-fix-Linux-NFS-recognition-of-umounts.patch
|
||||
Patch19: am-utils-6.2-add-get_nfs_xprt-and-put_nfs_xprt-functions.patch
|
||||
Patch20: am-utils-6.2-use-new-get_nfs_xprt-and-put_nfs_xprt-functions.patch
|
||||
Patch21: am-utils-6.2-add-NFSv3-nfs_quick_reply-functionality.patch
|
||||
Patch22: am-utils-6.2-add-NFSv3-rpc-request-validation.patch
|
||||
Patch23: am-utils-6.2-fix-wcc-attr-usage-in-unlink3_or_rmdir3.patch
|
||||
|
||||
Patch24: am-utils-6.2-Add-the-sys-alias-for-unix-as-well-as-none-and-null.patch
|
||||
Patch25: am-utils-6.2-Default-to-string-mount-options-for-NFSv4.patch
|
||||
Patch26: am-utils-6.2-Improve-debugging-for-unmounting.patch
|
||||
Patch27: am-utils-6.2-add-more-debugging-in-the-unmount-path.patch
|
||||
Patch28: am-utils-6.2-There-is-really-no-ti-rpc-nfsv4-so-dont-send-one.patch
|
||||
Patch29: am-utils-6.2-Fix-SEGV-on-amq-entries-that-print-times.patch
|
||||
Patch30: am-utils-6.2-Make-hasmntval-return-an-0-on-error-1-on-success.patch
|
||||
Patch31: am-utils-6.2-Update-the-ctime-of-the-directory-too-since-it-changed.patch
|
||||
|
||||
Patch32: am-utils-6.2-use-linux-libtirpc-if-present.patch
|
||||
Patch33: am-utils-6.2-fix-compiler-assignment-warning-due-to-libtirpc.patch
|
||||
Patch34: am-utils-6.2-fix-logical-not-comparison-in-get_ldap_timestamp.patch
|
||||
Patch35: am-utils-6.2-fix-umount-to-mount-race.patch
|
||||
|
||||
# So I can work on this with other than RHEL-6.
|
||||
Patch36: am-utils-6.2-fix-autoconf-check-in-bootstrap.patch
|
||||
|
||||
Patch37: am-utils-6.2-fix-nfsv3-fh-length-in-NFS_FH_DREF.patch
|
||||
|
||||
# Not needed since autoreconf/libtool appear to do this automatically
|
||||
# Leaving it set doesn't appear to be a problem so leave it set in
|
||||
# case this changes.
|
||||
%global _hardened_build 1
|
||||
|
||||
# We need to filter out some perl requirements for now.
|
||||
%define _use_internal_dependency_generator 0
|
||||
%define old_find_requires %{__find_requires}
|
||||
|
||||
%description
|
||||
Am-utils includes an updated version of Amd, the popular BSD
|
||||
automounter. An automounter is a program which maintains a cache
|
||||
of mounted filesystems. Filesystems are mounted when they are
|
||||
first referenced by the user and unmounted after a certain period of
|
||||
inactivity. Amd supports a variety of filesystems, including NFS, UFS,
|
||||
CD-ROMS and local drives.
|
||||
|
||||
You should install am-utils if you need a program for automatically
|
||||
mounting and unmounting filesystems.
|
||||
|
||||
%prep
|
||||
%setup -q -n %{name}-%{upstream_version}
|
||||
|
||||
%patch1 -p1
|
||||
%patch2 -p1
|
||||
%patch3 -p1
|
||||
%patch4 -p1
|
||||
%patch5 -p1
|
||||
%patch6 -p1
|
||||
%patch7 -p1
|
||||
%patch8 -p1
|
||||
%patch9 -p1
|
||||
%patch10 -p1
|
||||
%patch11 -p1
|
||||
%patch12 -p1
|
||||
%patch13 -p1
|
||||
%patch14 -p1
|
||||
%patch15 -p1
|
||||
%patch16 -p1
|
||||
%patch17 -p1
|
||||
%patch18 -p1
|
||||
%patch19 -p1
|
||||
%patch20 -p1
|
||||
%patch21 -p1
|
||||
%patch22 -p1
|
||||
%patch23 -p1
|
||||
%patch24 -p1
|
||||
%patch25 -p1
|
||||
%patch26 -p1
|
||||
%patch27 -p1
|
||||
%patch28 -p1
|
||||
%patch29 -p1
|
||||
%patch30 -p1
|
||||
%patch31 -p1
|
||||
%patch32 -p1
|
||||
%patch33 -p1
|
||||
%patch34 -p1
|
||||
%patch35 -p1
|
||||
%patch36 -p1
|
||||
%patch37 -p1
|
||||
|
||||
./bootstrap
|
||||
|
||||
find_requires=%{old_find_requires}
|
||||
echo "$find_requires | grep -v lostaltmail.conf" > find-requires
|
||||
chmod +x find-requires
|
||||
|
||||
%build
|
||||
%configure \
|
||||
--enable-shared \
|
||||
--enable-am-cflags="-DHAVE_LINUX_NFS_MOUNT_H" \
|
||||
--enable-libs="-lnsl -lresolv" \
|
||||
--enable-debug
|
||||
|
||||
sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' libtool
|
||||
sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool
|
||||
|
||||
make %{?_smp_flags}
|
||||
|
||||
%install
|
||||
%makeinstall
|
||||
|
||||
mkdir -p ${RPM_BUILD_ROOT}/%{_sysconfdir}/{sysconfig,rc.d/init.d}
|
||||
|
||||
install -m 755 $RPM_SOURCE_DIR/am-utils.init $RPM_BUILD_ROOT/etc/rc.d/init.d/amd
|
||||
install -m 644 %{SOURCE2} ${RPM_BUILD_ROOT}/%{_sysconfdir}/amd.conf
|
||||
install -m 644 %{SOURCE3} ${RPM_BUILD_ROOT}/%{_sysconfdir}/sysconfig/amd
|
||||
install -m 640 %{SOURCE4} ${RPM_BUILD_ROOT}/%{_sysconfdir}/amd.net
|
||||
|
||||
gzip -q9f ${RPM_BUILD_ROOT}/%{_infodir}/*info*
|
||||
mkdir -p ${RPM_BUILD_ROOT}/.automount
|
||||
|
||||
rm -f ${RPM_BUILD_ROOT}/usr/sbin/ctl-amd
|
||||
|
||||
# add symlinks to shared libs
|
||||
/sbin/ldconfig -n ${RPM_BUILD_ROOT}/%{_libdir}
|
||||
|
||||
# deprecated files
|
||||
for I in %{_libdir}/libamu.a \
|
||||
%{_libdir}/libamu.la \
|
||||
%{_libdir}/libamu.so \
|
||||
%{_infodir}/dir \
|
||||
%{_sysconfdir}/amd.conf-sample \
|
||||
%{_sysconfdir}/lostaltmail.conf-sample; do
|
||||
|
||||
rm -f $RPM_BUILD_ROOT$I
|
||||
done
|
||||
|
||||
%define __find_requires %{_builddir}/%{name}-%{version}/find-requires
|
||||
|
||||
%pre
|
||||
# Check if we have an old fashioned amd.conf and rename if to amd.net
|
||||
if test "$1" -ne 0; then
|
||||
if test -r /etc/amd.conf; then
|
||||
if grep -v -q "auto_dir" /etc/amd.conf; then
|
||||
if test ! -e /etc/amd.net; then
|
||||
mv -f /etc/amd.conf /etc/amd.net
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
%post
|
||||
/sbin/ldconfig
|
||||
/sbin/chkconfig --add amd
|
||||
if [ -f %{_infodir}/am-utils.info.gz ]; then
|
||||
/sbin/install-info %{_infodir}/am-utils.info.gz %{_infodir}/dir || :
|
||||
fi
|
||||
|
||||
%preun
|
||||
if [ $1 -eq 0 ]; then
|
||||
# Package removal, not upgrade
|
||||
if [ -f %{_infodir}/am-utils.info.gz ]; then
|
||||
/sbin/install-info --delete %{_infodir}/am-utils.info.gz %{_infodir}/dir || :
|
||||
fi
|
||||
/sbin/service amd stop >/dev/null 2>&1
|
||||
/sbin/chkconfig --del amd
|
||||
fi
|
||||
|
||||
%postun
|
||||
if [ $1 -ge 1 ]; then
|
||||
/sbin/service amd condrestart >/dev/null 2>&1
|
||||
fi
|
||||
/sbin/ldconfig
|
||||
|
||||
%files
|
||||
%doc doc/*.ps AUTHORS BUGS ChangeLog NEWS README* scripts/*-sample
|
||||
%dir /.automount
|
||||
%{_bindir}/pawd
|
||||
%{_sbindir}/*
|
||||
%{_mandir}/man[58]/*
|
||||
%{_mandir}/man1/pawd.1*
|
||||
%config(noreplace) %{_sysconfdir}/amd.net
|
||||
%config(noreplace) %{_sysconfdir}/amd.conf
|
||||
%config(noreplace) %{_sysconfdir}/sysconfig/amd
|
||||
%config /etc/rc.d/init.d/amd
|
||||
%{_infodir}/*info*.gz
|
||||
%{_libdir}/libamu.so*
|
||||
|
||||
%changelog
|
||||
* Thu Aug 29 2017 Ian Kent <ikent@redhat.com> - 5:6.2.0-27
|
||||
- fix nfsv3 fh length in NFS_FH_DREF().
|
||||
|
||||
* Thu Dec 1 2016 Ian Kent <ikent@redhat.com> - 5:6.2.0-23
|
||||
- change bootstrap script to not object to different autoconf version.
|
||||
- fix fix-umount-to-mount-race patch (bug 1399213).
|
||||
|
||||
* Mon Oct 3 2016 Ian Kent <ikent@redhat.com> - 5:6.2.0-22
|
||||
- fix ambiguous else due to dlog() macro usage.
|
||||
|
||||
* Mon Oct 3 2016 Ian Kent <ikent@redhat.com> - 5:6.2.0-21
|
||||
- fix typo in libtirpc configure macro.
|
||||
|
||||
* Mon Oct 3 2016 Ian Kent <ikent@redhat.com> - 5:6.2.0-20
|
||||
- print_nfs_common_args() is only needed with DEBUG.
|
||||
- uid_t might be a different size than unsigned int.
|
||||
- remove set but not used variable s.
|
||||
- remove set but not used variable again.
|
||||
- remove unused function show_map().
|
||||
- remove set but not used variable mp_error.
|
||||
- 32 bit fixes.
|
||||
- make sure variables are initialized.
|
||||
- dont use logical double ampersand when ampersand is meant.
|
||||
- Fix nfs args setting code.
|
||||
- Add the sys alias for unix as well as none and null.
|
||||
- Default to string mount options for NFSv4.
|
||||
- Improve debugging for unmounting.
|
||||
- add more debugging in the unmount path.
|
||||
- There is really no ti-rpc nfsv4 so dont send one.
|
||||
- Fix SEGV on amq entries that print times.
|
||||
- Make hasmntval return an 0 on error 1 on success.
|
||||
- Update the ctime of the directory too since it changed.
|
||||
- fix compiler assignment warning due to libtirpc.
|
||||
- fix logical not comparison in get_ldap_timestamp().
|
||||
- fix umount to mount race.
|
||||
|
||||
* Wed Mar 2 2016 Ian Kent <ikent@redhat.com> - 5:6.2.0-8
|
||||
- add get_nfs_xprt() and put_nfs_xprt() functions.
|
||||
- use new get_nfs_xprt() and put_nfs_xprt() functions.
|
||||
- add NFSv3 nfs_quick_reply() functionality.
|
||||
- add NFSv3 rpc request validation.
|
||||
- fix wcc attr usage in unlink3_or_rmdir3().
|
||||
- use Linux libtirpc if present.
|
||||
|
||||
* Mon Feb 29 2016 Ian Kent <ikent@redhat.com> - 5:6.2.0-7
|
||||
- fix Linux NFS recognition of umounts.
|
||||
|
||||
* Tue Feb 2 2016 Ian Kent <ikent@redhat.com> - 5:6.2.0-6
|
||||
- fix permissions on amd.conf.
|
||||
|
||||
* Sun Jan 24 2016 Ian Kent <ikent@redhat.com> - 5:6.2.0-5
|
||||
- update to upstream source release 6.2.
|
||||
- use starting revision 5 to ensure package will update from previous package.
|
||||
- add configure option enable-debug so we can get logs of any problems with
|
||||
the new amd NFS v3 service.
|
||||
- remove BuildRequires: perl-Unicode-EastAsianWidth.
|
||||
- move libtool macro functions from m4/macros to m4 and delete.
|
||||
- add debug log trace to NFSv3 readdirplus
|
||||
- fix NFSv3 access method return on non-existent mount point.
|
||||
- fix NFSv3 lookup dir attribute return value.
|
||||
- fix NFSv3 readdir post_op_dir attributes return.
|
||||
- fix NFSv3 unlink3_or_rmdir3() post_op attributes return.
|
||||
- fix mtime update on NFSv3 lookup.
|
||||
- allow old autoconf version.
|
||||
|
||||
* Tue Jun 16 2015 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 5:6.2.0-4.20140906gitbb13dea6
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
|
||||
|
||||
* Fri Jun 12 2015 Ian Kent <ikent@redhat.com> - 5:6.2.0-3.20140906gitbb13dea6
|
||||
- add build requires for gcc and m4.
|
||||
|
||||
* Tue Oct 21 2014 Ian Kent <ikent@redhat.com> - 5:6.2.0-2.20140906gitbb13dea6
|
||||
- fix libtool-2.4.4 build failure, bug 1181698.
|
||||
|
||||
* Tue Oct 21 2014 Ian Kent <ikent@redhat.com> - 5:6.2.0-1.20140906gitbb13dea6
|
||||
- add perl-Unicode-EastAsianWidth to BuildRequires.
|
||||
|
||||
* Tue Oct 21 2014 Ian Kent <ikent@redhat.com> - 5:6.2.0-1.20140906gitbb13dea6
|
||||
- Update am-utils to current git to get needed NFSv3 functionality.
|
||||
|
||||
* Fri Aug 15 2014 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 5:6.1.5-32
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
|
||||
|
||||
* Sat Jun 07 2014 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 5:6.1.5-31
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
|
||||
|
||||
* Fri Mar 20 2014 Ian Kent <ikent@redhat.com> - 5:6.1.5-30
|
||||
- bz1074376 - am-utils will no longer start due to missing NFSv2
|
||||
- dont background autofs umount.
|
||||
- check fh on umount succeeded.
|
||||
- handle ENOENT umount return for autofs mounts.
|
||||
- fix get_nfs_version() message.
|
||||
- fix debug log deadlock.
|
||||
- linux umount wait on ebusy.
|
||||
- make sure to remove nodes in the proper order when going down.
|
||||
- fix handle failed umount on exit.
|
||||
- fix autofs proto version define.
|
||||
|
||||
* Sat Aug 03 2013 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 5:6.1.5-29
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild
|
||||
|
||||
* Sun Apr 28 2013 Ian Kent <ikent@redhat.com> - 5:6.1.5-28
|
||||
- texinfo documentation build fixes.
|
||||
|
||||
* Sun Apr 28 2013 Ian Kent <ikent@redhat.com> - 5:6.1.5-27
|
||||
- bz955445 - am-utils package should be built with PIE flags
|
||||
- use _hardened_build flag.
|
||||
|
||||
* Mon Feb 18 2013 Ian Kent <ikent@redhat.com> - 5:6.1.5-26
|
||||
- add BuildRequires for texinfo.
|
||||
|
||||
* Wed Feb 13 2013 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 5:6.1.5-25
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild
|
||||
|
||||
* Wed Aug 22 2012 Václav Pavlín <vpavlin@redhat.com> - 5:6.1.5-24
|
||||
- Scriptlets replaced with new systemd macros (#850023)
|
||||
|
||||
* Wed Jul 18 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 5:6.1.5-23
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
|
||||
|
||||
* Tue Jan 24 2012 Karel Zak <kzak@redhat.com> - 5:6.1.5-22
|
||||
- fix #784235 - amd immediately exits after starting with systemd
|
||||
|
||||
* Thu Jan 12 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 5:6.1.5-21
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild
|
||||
|
||||
* Fri Sep 09 2011 Tom Callaway <spot@fedoraproject.org> - 5:6.1.5-20
|
||||
- add missing systemd scriptlets
|
||||
|
||||
* Thu Sep 08 2011 Tom Callaway <spot@fedoraproject.org> - 5:6.1.5-19
|
||||
- convert from sysvinit to systemd
|
||||
|
||||
* Mon Feb 07 2011 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 5:6.1.5-18
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
|
||||
|
||||
* Wed Oct 6 2010 Karel Zak <kzak@redhat.com> 5:6.1.5-17
|
||||
- fix #602938 - am-utils fails on f13 with amfs_toplvl_mount
|
||||
- fix #640383 - am-utils doesn't work in Fedora 13
|
||||
|
||||
* Mon Mar 1 2010 Karel Zak <kzak@redhat.com> 5:6.1.5-16
|
||||
- fix #566711 - am-utils: incorrect use of tcp_wrapper
|
||||
|
||||
* Wed Feb 24 2010 Karel Zak <kzak@redhat.com> 5:6.1.5-15
|
||||
- fix #523221 - initscript collected problems LSB-compilant
|
||||
|
||||
* Fri Jul 24 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 5:6.1.5-14
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild
|
||||
|
||||
* Mon Feb 23 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 5:6.1.5-13
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild
|
||||
|
||||
* Tue Dec 2 2008 Karel Zak <kzak@redhat.com> 5:6.1.5-12
|
||||
- fix #450754 - Amd does not work with 2.6.25 (thanks to Philippe Troin)
|
||||
|
||||
* Thu May 29 2008 Karel Zak <kzak@redhat.com> 5:6.1.5-11
|
||||
- review & cleanup init script
|
||||
|
||||
* Thu May 29 2008 Karel Zak <kzak@redhat.com> 5:6.1.5-10
|
||||
- fix #435420 - CVE-2008-1078 am-utils: insecure usage of temporary files
|
||||
|
||||
* Tue May 20 2008 Karel Zak <kzak@redhat.com> 5:6.1.5-9
|
||||
- spec file cleanup according to rpmlint
|
||||
- fix autotools stuff
|
||||
|
||||
* Tue Feb 19 2008 Fedora Release Engineering <rel-eng@fedoraproject.org> - 5:6.1.5-8
|
||||
- Autorebuild for GCC 4.3
|
||||
|
||||
* Wed Dec 05 2007 Release Engineering <rel-eng at fedoraproject dot org> - 6.1.5-7
|
||||
- Rebuild for deps
|
||||
|
||||
* Tue Mar 13 2007 Karel Zak <kzak@redhat.com> 5:6.1.5-6
|
||||
- fix #223675 - am-utils: non-failsafe install-info
|
||||
- fix #231843 - missing build dependency on tcp_wrappers
|
||||
- cleanup spec file
|
||||
|
||||
* Mon Dec 18 2006 Karel Zak <kzak@redhat.com> 5:6.1.5-5
|
||||
- fix #219437 - amd: stopping service will pop up an error dialog in
|
||||
system-config-services app.
|
||||
- fix build (m4 stuff) of the package (UTS_RELEASE macro has been removed
|
||||
from the latest kernel-headers)
|
||||
|
||||
* Tue Aug 24 2006 Karel Zak <kzak@redhat.com> 5:6.1.5-4
|
||||
- fix #203193 - tmpfile usage
|
||||
- fix #202180 - amd service doesn't work
|
||||
|
||||
* Wed Jul 12 2006 Jesse Keating <jkeating@redhat.com> - 5:6.1.5-3
|
||||
- rebuild
|
||||
- Add missing br flex
|
||||
|
||||
* Thu Jun 01 2006 Peter Vrabec <pvrabec@redhat.com> 5:6.1.5-2
|
||||
- force to use HAVE_LINUX_NFS_MOUNT_H macro, because linux/nfs_mount.h
|
||||
check in configure fails on s390x
|
||||
|
||||
* Mon May 29 2006 Peter Vrabec <pvrabec@redhat.com> 5:6.1.5-1
|
||||
- upgrade
|
||||
- add build depency
|
||||
|
||||
* Fri Feb 10 2006 Jesse Keating <jkeating@redhat.com> - 5:6.1.3-1.2.1
|
||||
- bump again for double-long bug on ppc(64)
|
||||
|
||||
* Tue Feb 07 2006 Jesse Keating <jkeating@redhat.com> - 5:6.1.3-1.2
|
||||
- rebuilt for new gcc4.1 snapshot and glibc changes
|
||||
|
||||
* Fri Dec 09 2005 Jesse Keating <jkeating@redhat.com>
|
||||
- rebuilt
|
||||
|
||||
* Fri Oct 20 2005 Peter Vrabec <pvrabec@redhat.com> 6.1.3-1
|
||||
- upgrade
|
||||
|
||||
* Wed Oct 04 2005 Peter Vrabec <pvrabec@redhat.com> 6.1.2.1-1
|
||||
- upgrade
|
||||
- fix amd shutdown(#158268,#54246)
|
||||
- enhancement, /host/localhost and /host/<localmachinename>
|
||||
are symlinks to / (#11843)
|
||||
|
||||
* Thu Aug 25 2005 Peter Vrabec <pvrabec@redhat.com> 6.1.1-2
|
||||
- use generic linux/nfs_mount.h check
|
||||
|
||||
* Fri Aug 19 2005 Peter Vrabec <pvrabec@redhat.com> 6.1.1-1
|
||||
- upgrade 6.1.1
|
||||
|
||||
* Wed Aug 17 2005 Peter Vrabec <pvrabec@redhat.com> 6.0.9-13
|
||||
- fix the regression introduced with (#143118) fix
|
||||
|
||||
* Thu Mar 24 2005 Peter Vrabec <pvrabec@redhat.com> 6.0.9-12
|
||||
- fix the am-utils part of #143118 by implementing the util-linux
|
||||
mtab locking scheme into am-utils automounter, patch and testing
|
||||
by Daniel Berrange <berrange@redhat.com>, improved locking
|
||||
algorithm by <prockai@redhat.com> (which allows for several
|
||||
hundred or even thousand of parallel makes to finish
|
||||
successfully and keep /etc/mtab in sync with /proc/mounts as well)
|
||||
|
||||
* Thu Mar 17 2005 Peter Vrabec <pvrabec@redhat.com>
|
||||
- rebuild by gcc4
|
||||
|
||||
* Tue Oct 12 2004 Adrian Havill <havill@redhat.com> 6.0.9-10
|
||||
- cleanup %%pre script so amd.conf won't get stat()ed if it doesn't
|
||||
exist (#126656)
|
||||
|
||||
* Wed Sep 1 2004 Nalin Dahyabhai <nalin@redhat.com> 6.0.9-9
|
||||
- really fix %%preun this time
|
||||
|
||||
* Tue Aug 31 2004 Nalin Dahyabhai <nalin@redhat.com> 6.0.9-8
|
||||
- rebuild
|
||||
|
||||
* Tue Jun 15 2004 Elliot Lee <sopwith@redhat.com>
|
||||
- rebuilt
|
||||
|
||||
* Mon Mar 15 2004 Nalin Dahyabhai <nalin@redhat.com>
|
||||
- fix incorrect invocation of test in %%pre and %%preun
|
||||
|
||||
* Tue Mar 02 2004 Elliot Lee <sopwith@redhat.com>
|
||||
- rebuilt
|
||||
|
||||
* Fri Feb 13 2004 Elliot Lee <sopwith@redhat.com>
|
||||
- rebuilt
|
||||
|
||||
* Tue Nov 11 2003 Nalin Dahyabhai <nalin@redhat.com> 6.0.9-5
|
||||
- change permissions on /etc/sysconfig/amd from 0755 to 0644 (#109681)
|
||||
|
||||
* Tue Aug 5 2003 Elliot Lee <sopwith@redhat.com> 6.0.9-4
|
||||
- Fix libtool
|
||||
|
||||
* Wed Jun 04 2003 Elliot Lee <sopwith@redhat.com>
|
||||
- rebuilt
|
||||
|
||||
* Tue Feb 04 2003 Florian La Roche <Florian.LaRoche@redhat.de>
|
||||
- add symlink to shared lib
|
||||
|
||||
* Fri Jan 31 2003 Nalin Dahyabhai <nalin@redhat.com> 6.0.9-1
|
||||
- update to 6.0.9
|
||||
- disable RPM's internal dependency calculation so that we can filter out
|
||||
dependencies which are expected to be filled in by the site administrator
|
||||
|
||||
* Wed Jan 22 2003 Tim Powers <timp@redhat.com>
|
||||
- rebuilt
|
||||
|
||||
* Tue Jan 7 2003 Nalin Dahyabhai <nalin@redhat.com> 6.0.8-3
|
||||
- rebuild
|
||||
|
||||
* Wed Oct 30 2002 Nalin Dahyabhai <nalin@redhat.com> 6.0.8-1
|
||||
- update to 6.0.8
|
||||
|
||||
* Tue Aug 27 2002 Nalin Dahyabhai <nalin@redhat.com> 6.0.7-9
|
||||
- rebuild
|
||||
|
||||
* Fri Jun 21 2002 Tim Powers <timp@redhat.com>
|
||||
- automated rebuild
|
||||
|
||||
* Wed May 29 2002 Nalin Dahyabhai <nalin@redhat.com> 6.0.7-7
|
||||
- adjust the perl reqs so that the lostaltmail config files aren't required
|
||||
by RPM
|
||||
|
||||
* Sun May 26 2002 Tim Powers <timp@redhat.com>
|
||||
- automated rebuild
|
||||
|
||||
* Thu May 9 2002 Nalin Dahyabhai <nalin@redhat.com> 6.0.7-5
|
||||
- rebuild in new environment
|
||||
|
||||
* Fri Feb 22 2002 Nalin Dahyabhai <nalin@redhat.com> 6.0.7-4
|
||||
- rebuild in new environment
|
||||
|
||||
* Sat Jan 26 2002 Jeff Johnson <jbj@redhat.com>
|
||||
- add Provides: to white out certain perl Requires:
|
||||
|
||||
* Wed Jan 23 2002 Nalin Dahyabhai <nalin@redhat.com> 6.0.7-2
|
||||
- rebuild in new environment
|
||||
- require gdbm-devel at build-time instead of db1-devel
|
||||
|
||||
* Thu Sep 6 2001 Nalin Dahyabhai <nalin@redhat.com> 6.0.7-1
|
||||
- update to 6.0.7, fixing EIO on access bugs (#53251)
|
||||
- back out nfs3 patch; no longer needed for current kernels
|
||||
- don't explicitly strip binaries; let the buildroot policies handle it
|
||||
|
||||
* Wed Jul 18 2001 Nalin Dahyabhai <nalin@redhat.com>
|
||||
- rebuild
|
||||
|
||||
* Mon Jun 25 2001 Nalin Dahyabhai <nalin@redhat.com>
|
||||
- add BuildPrereq: db1-devel (#44987)
|
||||
- use FHS macros
|
||||
- return error codes correctly from init script (#44597)
|
||||
|
||||
* Tue May 22 2001 Nalin Dahyabhai <nalin@redhat.com>
|
||||
- update to 6.0.6
|
||||
|
||||
* Sat Apr 7 2001 Nalin Dahyabhai <nalin@redhat.com>
|
||||
- update to 6.0.5
|
||||
- remove /net from the default MOUNTPTS
|
||||
|
||||
* Tue Mar 13 2001 Nalin Dahyabhai <nalin@redhat.com>
|
||||
- use MOUNTPTS when starting
|
||||
|
||||
* Fri Mar 2 2001 Nalin Dahyabhai <nalin@redhat.com>
|
||||
- rebuild in new environment
|
||||
|
||||
* Wed Feb 14 2001 Nalin Dahyabhai <nalin@redhat.com>
|
||||
- redo i18n for the init script (#24082)
|
||||
|
||||
* Tue Jan 23 2001 Nalin Dahyabhai <nalin@redhat.com>
|
||||
- re-do workaround from advice from the am-utils maintainers
|
||||
- redo i18n for the init script
|
||||
|
||||
* Sat Jan 20 2001 Nalin Dahyabhai <nalin@redhat.com>
|
||||
- work around clash with nfs3_fh definition in 2.4
|
||||
|
||||
* Tue Jan 16 2001 Nalin Dahyabhai <nalin@redhat.com>
|
||||
- gettextize the init script (#24087)
|
||||
|
||||
* Tue Dec 19 2000 Nalin Dahyabhai <nalin@redhat.com>
|
||||
- add ldconfig to %%postun
|
||||
- chuck the hesiod patch -- new bind-utils doesn't have the support for it
|
||||
|
||||
* Fri Sep 8 2000 Nalin Dahyabhai <nalin@redhat.com>
|
||||
- rebuild in new environment
|
||||
|
||||
* Sat Jul 15 2000 Bill Nottingham <notting@redhat.com>
|
||||
- move initscript back
|
||||
|
||||
* Wed Jul 12 2000 Prospector <bugzilla@redhat.com>
|
||||
- automatic rebuild
|
||||
|
||||
* Thu Jul 6 2000 Nalin Dahyabhai <nalin@redhat.com>
|
||||
- only create /var/lock/subsys/amd if startup succeeds
|
||||
- revamp shutdown procedure to minimize time spent just spinning
|
||||
- change initscripts dependency to /etc/init.d
|
||||
|
||||
* Tue Jul 4 2000 Florian La Roche <Florian.LaRoche@redhat.com>
|
||||
- delete noreplace from initscript
|
||||
|
||||
* Wed Jun 28 2000 Nalin Dahyabhai <nalin@redhat.com>
|
||||
- fix postun script
|
||||
- add requires: initscripts
|
||||
|
||||
* Tue Jun 27 2000 Nalin Dahyabhai <nalin@redhat.com>
|
||||
- remove unnecessary libamu.so symlink
|
||||
|
||||
* Mon Jun 26 2000 Nalin Dahyabhai <nalin@redhat.com>
|
||||
- move init script to /etc/init.d
|
||||
- add URL: tag
|
||||
|
||||
* Wed Jun 21 2000 Preston Brown <pbrown@redhat.com>
|
||||
- noreplace config files
|
||||
- gracefully stop/restart service
|
||||
|
||||
* Fri Jun 16 2000 Matt Wilson <msw@redhat.com>
|
||||
- FHS paths
|
||||
- 6.0.4 snapshot (as it builds against kernel 2.4 headers)
|
||||
|
||||
* Wed Feb 16 2000 Cristian Gafton <gafton@redhat.com>
|
||||
- version 6.0.3
|
||||
- enhance init script to be more wait4amd2die-like
|
||||
- make default map type to be file (#9185)
|
||||
- get rid of the kludges
|
||||
|
||||
* Thu Feb 03 2000 Cristian Gafton <gafton@redhat.com>
|
||||
- man pages are compressed
|
||||
- version 6.0.2
|
||||
- fix descriptions
|
||||
|
||||
* Mon Sep 13 1999 Cristian Gafton <gafton@redhat.com>
|
||||
- version 6.0.1 final
|
||||
|
||||
* Tue Aug 24 1999 Cristian Gafton <gafton@redhat.com>
|
||||
- remove the noldap patch
|
||||
- add amd.net file as the default config map file
|
||||
- change the config file to teh new config file format instead of a
|
||||
simple map file name.
|
||||
- try to avoid some damage with a new %%pre script
|
||||
- prereq grep now
|
||||
- modify the init file so it calls amd -F /etc/amd.conf now
|
||||
|
||||
* Tue Aug 24 1999 Bill Nottingham <notting@redhat.com>
|
||||
- update to 6.0.1s11
|
||||
|
||||
* Fri Jun 19 1999 Bill Nottingham <notting@redhat.com>
|
||||
- don't run by default
|
||||
|
||||
* Mon May 31 1999 Kenneth Skaar <kenneths@regina.uio.no>
|
||||
- Fixed amd -F core dump and related dumps by other programs
|
||||
|
||||
* Thu Apr 08 1999 Preston Brown <pbrown@redhat.com>
|
||||
- kill -HUP on reload, restart does a real restart.
|
||||
|
||||
* Fri Mar 26 1999 Bill Nottingham <notting@redhat.com>
|
||||
- twiddle an echo in initscript
|
||||
|
||||
* Tue Mar 23 1999 Cristian Gafton <gafton@redhat.com>
|
||||
- version 6.0 proper
|
||||
- Serial:1 because to enforce versioning
|
||||
|
||||
* Sun Mar 21 1999 Cristian Gafton <gafton@redhat.com>
|
||||
- auto rebuild in the new build environment (release 6)
|
||||
|
||||
* Wed Jan 06 1999 Cristian Gafton <gafton@redhat.com>
|
||||
- rebuild for glibc 2.1
|
||||
- strip all binaries
|
||||
|
||||
* Thu Aug 13 1998 Jeff Johnson <jbj@redhat.com>
|
||||
- add missing ':' to default 'opts:=nosuid,nodev'
|
||||
- install info pages
|
||||
|
||||
* Mon Jul 13 1998 Cristian Gafton <gafton@redhat.com>
|
||||
- added the NIS support that the broken configure script failed to detect
|
||||
|
||||
* Tue May 05 1998 Cristian Gafton <gafton@redhat.com>
|
||||
- disabled autofs support on alpha
|
||||
- run ldconfig in postinstall
|
||||
|
||||
* Mon May 04 1998 Cristian Gafton <gafton@redhat.com>
|
||||
- new package to replace the old and unmaintained amd
|
||||
3
am-utils.sysconf
Normal file
3
am-utils.sysconf
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#MOUNTPTS='/net /etc/amd.net'
|
||||
ADIR=/.automount
|
||||
AMDOPTS=
|
||||
1
sources
1
sources
|
|
@ -0,0 +1 @@
|
|||
4b2ada9cadd24f8a231601274d6fb036 am-utils-6.2.tar.gz
|
||||
Loading…
Add table
Add a link
Reference in a new issue