Hi all again,
Further to yesterdays replicated server patch I have done some cleanup to
it.
This patch replaces the previous patch so you will need to back out the
previous one before applying this one.
I have:
- corrected some inconsistent messages.
- cleaned up paths (there were some double slashes,
function was OK though)
One problem remains and seems not to be easily fixed. For multi mount
maps dead mount point directories (from failed mounts) are left. This is
not simple to fix without breaking other functionality. I believe it is
better than those "BUG" messages though. So we`ll have to live with it for
now.
If anyone is able to test this also that would be great.
Thanks
Ian
diff -Bu autofs-4.1.3/modules/mount_bind.c
autofs-4.1.3.replicated_server_cleanup/modules/mount_bind.c
--- autofs-4.1.3/modules/mount_bind.c 2004-05-02 20:47:53.000000000 +0800
+++ autofs-4.1.3.replicated_server_cleanup/modules/mount_bind.c 2004-05-04
19:35:49.000000000 +0800
@@ -96,7 +96,12 @@
error(MODPREFIX "alloca: %m");
return 1;
}
- sprintf(fullpath, "%s/%s", root, name);
+
+ if (name_len)
+ sprintf(fullpath, "%s/%s", root, name);
+ else
+ sprintf(fullpath, "%s", root);
+
i = strlen(fullpath);
while (--i > 0 && fullpath[i] == '/')
fullpath[i] = '\0';
@@ -125,8 +130,8 @@
unlink(AUTOFS_LOCK);
if (err) {
- if (!ap.ghost || (ap.ghost && !status))
- rmdir_path(fullpath);
+ if (!ap.ghost && name_len)
+ rmdir_path(name);
return 1;
} else {
debug(MODPREFIX "mounted %s type %s on %s",
diff -Bu autofs-4.1.3/modules/mount_changer.c
autofs-4.1.3.replicated_server_cleanup/modules/mount_changer.c
--- autofs-4.1.3/modules/mount_changer.c 2004-05-02 20:50:53.000000000 +0800
+++ autofs-4.1.3.replicated_server_cleanup/modules/mount_changer.c 2004-05-04
19:35:49.000000000 +0800
@@ -61,7 +61,11 @@
error(MODPREFIX "alloca: %m");
return 1;
}
- sprintf(fullpath, "%s/%s", root, name);
+
+ if (name_len)
+ sprintf(fullpath, "%s/%s", root, name);
+ else
+ sprintf(fullpath, "%s", root);
debug(MODPREFIX "calling umount %s", what);
@@ -77,7 +81,7 @@
debug(MODPREFIX "calling mkdir_path %s", fullpath);
if ((status = mkdir_path(fullpath, 0555)) && errno != EEXIST) {
- error(MODPREFIX "mkdir_path %s failed: %m", name);
+ error(MODPREFIX "mkdir_path %s failed: %m", fullpath);
return 1;
}
@@ -105,9 +109,10 @@
"-t", fstype, what, fullpath, NULL);
}
unlink(AUTOFS_LOCK);
+
if (err) {
- if (!ap.ghost || (ap.ghost && !status))
- rmdir_path(fullpath);
+ if (!ap.ghost && name_len)
+ rmdir_path(name);
error(MODPREFIX "failed to mount %s (type %s) on %s",
what, fstype, fullpath);
diff -Bu autofs-4.1.3/modules/mount_ext2.c
autofs-4.1.3.replicated_server_cleanup/modules/mount_ext2.c
--- autofs-4.1.3/modules/mount_ext2.c 2004-05-02 20:53:00.000000000 +0800
+++ autofs-4.1.3.replicated_server_cleanup/modules/mount_ext2.c 2004-05-04
19:35:49.000000000 +0800
@@ -55,12 +55,16 @@
error(MODPREFIX "alloca: %m");
return 1;
}
- sprintf(fullpath, "%s/%s", root, name);
+
+ if (name_len)
+ sprintf(fullpath, "%s/%s", root, name);
+ else
+ sprintf(fullpath, "%s", root);
debug(MODPREFIX "calling mkdir_path %s", fullpath);
if ((status = mkdir_path(fullpath, 0555)) && errno != EEXIST) {
- error(MODPREFIX "mkdir_path %s failed: %m", name);
+ error(MODPREFIX "mkdir_path %s failed: %m", fullpath);
return 1;
}
@@ -116,8 +120,8 @@
unlink(AUTOFS_LOCK);
if (err) {
- if (!ap.ghost || (ap.ghost && !status))
- rmdir_path(fullpath);
+ if (!ap.ghost && name_len)
+ rmdir_path(name);
error(MODPREFIX "failed to mount %s (type %s) on %s",
what, fstype, fullpath);
return 1;
diff -Bu autofs-4.1.3/modules/mount_generic.c
autofs-4.1.3.replicated_server_cleanup/modules/mount_generic.c
--- autofs-4.1.3/modules/mount_generic.c 2004-05-02 20:54:10.000000000 +0800
+++ autofs-4.1.3.replicated_server_cleanup/modules/mount_generic.c 2004-05-04
19:35:49.000000000 +0800
@@ -53,12 +53,16 @@
error(MODPREFIX "alloca: %m");
return 1;
}
- sprintf(fullpath, "%s/%s", root, name);
+
+ if (name_len)
+ sprintf(fullpath, "%s/%s", root, name);
+ else
+ sprintf(fullpath, "%s", root);
debug(MODPREFIX "calling mkdir_path %s", fullpath);
if ((status = mkdir_path(fullpath, 0555)) && errno != EEXIST) {
- error(MODPREFIX "mkdir_path %s failed: %m", name);
+ error(MODPREFIX "mkdir_path %s failed: %m", fullpath);
return 1;
}
@@ -85,8 +89,8 @@
unlink(AUTOFS_LOCK);
if (err) {
- if (!ap.ghost || (ap.ghost && !status))
- rmdir_path(fullpath);
+ if (!ap.ghost && name_len)
+ rmdir_path(name);
error(MODPREFIX "failed to mount %s (type %s) on %s",
what, fstype, fullpath);
diff -Bu autofs-4.1.3/modules/mount_nfs.c
autofs-4.1.3.replicated_server_cleanup/modules/mount_nfs.c
--- autofs-4.1.3/modules/mount_nfs.c 2004-05-02 21:11:53.000000000 +0800
+++ autofs-4.1.3.replicated_server_cleanup/modules/mount_nfs.c 2004-05-04
19:35:49.000000000 +0800
@@ -131,7 +131,6 @@
while (p && *p) {
char *next;
- int alive = -1;
p += strspn(p, " \t,");
delim = strpbrk(p, "(, \t:");
@@ -187,29 +186,32 @@
for (haddr = he->h_addr_list; *haddr; haddr++) {
local = is_local_addr(p, *haddr, he->h_length);
- if (local < 0) {
- local = 0;
- p = next;
- }
+ if (local < 0)
+ continue;
if (local) {
- alive = rpc_ping(p, sec, micros);
- if (alive) {
- winner = p;
- break;
- }
- local = 0;
+ winner = p;
+ break;
}
}
+
+ if (local < 0) {
+ local = 0;
+ p = next;
+ continue;
+ }
+
+ if (local)
+ break;
}
- /* Are we actually alive */
- if (!alive || (alive < 0 && !rpc_ping(p, sec, micros))) {
+ /* If it's not local is it alive */
+ if (!local && !rpc_ping(p, sec, micros)) {
p = next;
continue;
}
- /* Not local, see if we have a previous 'winner' */
+ /* see if we have a previous 'winner' */
if (!winner) {
winner = p;
}
@@ -391,7 +393,11 @@
error(MODPREFIX "alloca: %m");
return 1;
}
- sprintf(fullpath, "%s/%s", root, name);
+
+ if (name_len)
+ sprintf(fullpath, "%s/%s", root, name);
+ else
+ sprintf(fullpath, "%s", root);
if (local) {
/* Local host -- do a "bind" */
@@ -406,7 +412,7 @@
debug(MODPREFIX "calling mkdir_path %s", fullpath);
if ((status = mkdir_path(fullpath, 0555)) && errno != EEXIST) {
- error(MODPREFIX "mkdir_path %s failed: %m", name);
+ error(MODPREFIX "mkdir_path %s failed: %m", fullpath);
return 1;
}
@@ -434,8 +440,8 @@
unlink(AUTOFS_LOCK);
if (err) {
- if (!ap.ghost || (ap.ghost && !status))
- rmdir_path(fullpath);
+ if (!ap.ghost && name_len)
+ rmdir_path(name);
error(MODPREFIX "nfs: mount failure %s on %s",
whatstr, fullpath);
return 1;
diff -Bu autofs-4.1.3/modules/parse_sun.c
autofs-4.1.3.replicated_server_cleanup/modules/parse_sun.c
--- autofs-4.1.3/modules/parse_sun.c 2004-05-02 20:31:32.000000000 +0800
+++ autofs-4.1.3.replicated_server_cleanup/modules/parse_sun.c 2004-05-04
19:35:49.000000000 +0800
@@ -514,7 +514,6 @@
}
static int sun_mount(const char *root, const char *name, int namelen,
- const char *path, int pathlen,
const char *loc, int loclen, const char *options)
{
char *fstype = "nfs"; /* Default filesystem type */
@@ -565,17 +564,13 @@
options = noptions;
}
- while (*path == '/') {
- path++;
- pathlen--;
+ while (*name == '/') {
+ name++;
+ namelen--;
}
- mountpoint = alloca(namelen + pathlen + 2);
-
- if (pathlen)
- sprintf(mountpoint, "%.*s/%.*s", namelen, name, pathlen, path);
- else
- sprintf(mountpoint, "%.*s", namelen, name);
+ mountpoint = alloca(namelen + 1);
+ sprintf(mountpoint, "%.*s", namelen, name);
what = alloca(loclen + 1);
memcpy(what, loc, loclen);
@@ -615,15 +610,15 @@
/*
* syntax is:
- * [-options] location
- * [-options] [mountpoint [-options] location]...
+ * [-options] location [location] ...
+ * [-options] [mountpoint [-options] location [location] ... ]...
*/
int parse_mount(const char *root, const char *name,
int name_len, const char *mapent, void *context)
{
struct parse_context *ctxt = (struct parse_context *) context;
char *pmapent, *options;
- const char *p;
+ const char *p, *q;
int mapent_len, rv;
int optlen;
@@ -667,6 +662,18 @@
if (*p == '/') {
int l;
+ char *multi_root;
+
+ multi_root = alloca(strlen(root) + name_len + 2);
+ if (!multi_root) {
+ error(MODPREFIX "alloca: %m");
+ free(options);
+ return 1;
+ }
+
+ strcpy(multi_root, root);
+ strcat(multi_root, "/");
+ strcat(multi_root, name);
/* It's a multi-mount; deal with it */
do {
@@ -705,7 +712,15 @@
} while (*p == '-');
}
- loc = dequote(p, l = chunklen(p, 1));
+ q = p;
+ while (*q && *q != '/') {
+ l = chunklen(q, 1);
+ q += l;
+ q = skipspace(q);
+ }
+ l = q - p;
+
+ loc = dequote(p, l);
loclen = strlen(loc);
if (loc == NULL || path == NULL) {
@@ -723,7 +738,7 @@
"multimount: %.*s on %.*s with options %s",
loclen, loc, pathlen, path, myoptions);
- rv = sun_mount(root, name, name_len, path, pathlen, loc,
loclen,
+ rv = sun_mount(multi_root, path, pathlen, loc, loclen,
myoptions);
free(path);
free(loc);
@@ -739,12 +754,20 @@
} else {
/* Normal (non-multi) entries */
char *loc;
- int loclen;
+ int loclen, l;
if (*p == ':')
p++; /* Sun escape for entries starting with / */
- loc = dequote(p, chunklen(p, 1));
+ q = p;
+ while (*q) {
+ l = chunklen(q, 1);
+ q += l;
+ q = skipspace(q);
+ }
+ l = q - p;
+
+ loc = dequote(p, l);
loclen = strlen(loc);
if (loc == NULL) {
@@ -763,7 +786,7 @@
debug(MODPREFIX "core of entry: options=%s, loc=%.*s",
options, loclen, loc);
- rv = sun_mount(root, name, name_len, "/", 1, loc, loclen, options);
+ rv = sun_mount(root, name, name_len, loc, loclen, options);
free(loc);
free(options);
}
_______________________________________________
autofs mailing list
[EMAIL PROTECTED]
http://linux.kernel.org/mailman/listinfo/autofs