1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-27 11:55:06 +00:00

Add a new "-m" option to pnfsdsfile(8) to prepare a file for mirroring.

When pnfsdscopymr(8) is used to create a mirror of a file on a mirrored
pNFS service, it expects to find an entry in the extended attribute for
IP address 0.0.0.0.
This patch adds a "-m" option which can be used to create these entrie(s).
It also tightens up the checks for use of incompatible command line options.
This commit is contained in:
Rick Macklem 2018-07-01 17:49:02 +00:00
parent 0dea6e3c98
commit 7c126cfa95
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=335845

View File

@ -50,6 +50,7 @@ static void usage(void);
static struct option longopts[] = { static struct option longopts[] = {
{ "changeds", required_argument, NULL, 'c' }, { "changeds", required_argument, NULL, 'c' },
{ "mirror", required_argument, NULL, 'm' },
{ "quiet", no_argument, NULL, 'q' }, { "quiet", no_argument, NULL, 'q' },
{ "zerods", required_argument, NULL, 'r' }, { "zerods", required_argument, NULL, 'r' },
{ "ds", required_argument, NULL, 's' }, { "ds", required_argument, NULL, 's' },
@ -71,27 +72,27 @@ main(int argc, char *argv[])
struct sockaddr_in6 *sin6, adsin6; struct sockaddr_in6 *sin6, adsin6;
char hostn[2 * NI_MAXHOST + 2], *cp; char hostn[2 * NI_MAXHOST + 2], *cp;
struct pnfsdsfile dsfile[NFSDEV_MAXMIRRORS]; struct pnfsdsfile dsfile[NFSDEV_MAXMIRRORS];
int ch, dosetxattr, i, mirrorcnt, quiet, zerods, zerofh; int ch, dosetxattr, i, mirrorcnt, mirrorit, quiet, zerods, zerofh;
in_port_t tport; in_port_t tport;
ssize_t xattrsize, xattrsize2; ssize_t xattrsize, xattrsize2;
zerods = 0; zerods = 0;
zerofh = 0; zerofh = 0;
mirrorit = 0;
quiet = 0; quiet = 0;
dosetxattr = 0; dosetxattr = 0;
res = NULL; res = NULL;
newres = NULL; newres = NULL;
cp = NULL; cp = NULL;
while ((ch = getopt_long(argc, argv, "c:qr:s:z", longopts, NULL)) != -1) while ((ch = getopt_long(argc, argv, "c:m:qr:s:z", longopts, NULL)) !=
{ -1) {
switch (ch) { switch (ch) {
case 'c': case 'c':
/* Replace the first DS server with the second one. */ /* Replace the first DS server with the second one. */
if (zerofh != 0 || zerods != 0) if (zerofh != 0 || zerods != 0 || mirrorit != 0 ||
errx(1, "-c, -r and -z are mutually " newres != NULL || res != NULL)
"exclusive"); errx(1, "-c, -m, -r, -s and -z are mutually "
if (res != NULL) "exclusive and only can be used once");
errx(1, "-c and -s are mutually exclusive");
strlcpy(hostn, optarg, 2 * NI_MAXHOST + 2); strlcpy(hostn, optarg, 2 * NI_MAXHOST + 2);
cp = strchr(hostn, ','); cp = strchr(hostn, ',');
if (cp == NULL) if (cp == NULL)
@ -103,31 +104,44 @@ main(int argc, char *argv[])
if (getaddrinfo(cp, NULL, NULL, &newres) != 0) if (getaddrinfo(cp, NULL, NULL, &newres) != 0)
errx(1, "Can't get IP# for %s", cp); errx(1, "Can't get IP# for %s", cp);
break; break;
case 'm':
/* Add 0.0.0.0 entries up to mirror level. */
if (zerofh != 0 || zerods != 0 || mirrorit != 0 ||
newres != NULL || res != NULL)
errx(1, "-c, -m, -r, -s and -z are mutually "
"exclusive and only can be used once");
mirrorit = atoi(optarg);
if (mirrorit < 2 || mirrorit > NFSDEV_MAXMIRRORS)
errx(1, "-m %d out of range", mirrorit);
break;
case 'q': case 'q':
quiet = 1; quiet = 1;
break; break;
case 'r': case 'r':
/* Reset the DS server in a mirror with 0.0.0.0. */ /* Reset the DS server in a mirror with 0.0.0.0. */
if (zerofh != 0 || res != NULL || newres != NULL) if (zerofh != 0 || zerods != 0 || mirrorit != 0 ||
errx(1, "-r and -s, -z or -c are mutually " newres != NULL || res != NULL)
"exclusive"); errx(1, "-c, -m, -r, -s and -z are mutually "
"exclusive and only can be used once");
zerods = 1; zerods = 1;
/* Translate the server name to an IP address. */ /* Translate the server name to an IP address. */
if (getaddrinfo(optarg, NULL, NULL, &res) != 0) if (getaddrinfo(optarg, NULL, NULL, &res) != 0)
errx(1, "Can't get IP# for %s", optarg); errx(1, "Can't get IP# for %s", optarg);
break; break;
case 's': case 's':
if (res != NULL)
errx(1, "-s, -c and -r are mutually "
"exclusive");
/* Translate the server name to an IP address. */ /* Translate the server name to an IP address. */
if (zerods != 0 || mirrorit != 0 || newres != NULL ||
res != NULL)
errx(1, "-c, -m and -r are mutually exclusive "
"from use with -s and -z");
if (getaddrinfo(optarg, NULL, NULL, &res) != 0) if (getaddrinfo(optarg, NULL, NULL, &res) != 0)
errx(1, "Can't get IP# for %s", optarg); errx(1, "Can't get IP# for %s", optarg);
break; break;
case 'z': case 'z':
if (newres != NULL || zerods != 0) if (zerofh != 0 || zerods != 0 || mirrorit != 0 ||
errx(1, "-c, -r and -z are mutually " newres != NULL)
"exclusive"); errx(1, "-c, -m and -r are mutually exclusive "
"from use with -s and -z");
zerofh = 1; zerofh = 1;
break; break;
default: default:
@ -309,8 +323,26 @@ main(int argc, char *argv[])
dsfile[i].dsf_filename); dsfile[i].dsf_filename);
} }
} }
/* Add entrie(s) with IP address set to 0.0.0.0, as required. */
for (i = mirrorcnt; i < mirrorit; i++) {
dsfile[i] = dsfile[0];
dsfile[i].dsf_sin.sin_family = AF_INET;
dsfile[i].dsf_sin.sin_len = sizeof(struct sockaddr_in);
dsfile[i].dsf_sin.sin_addr.s_addr = 0;
dsfile[i].dsf_sin.sin_port = 0;
if (quiet == 0) {
/* Print out the 0.0.0.0 entry. */
printf("\t0.0.0.0\tds%d/%s", dsfile[i].dsf_dir,
dsfile[i].dsf_filename);
}
}
if (mirrorit > mirrorcnt) {
xattrsize = mirrorit * sizeof(struct pnfsdsfile);
dosetxattr = 1;
}
if (quiet == 0) if (quiet == 0)
printf("\n"); printf("\n");
if (dosetxattr != 0 && extattr_set_file(*argv, EXTATTR_NAMESPACE_SYSTEM, if (dosetxattr != 0 && extattr_set_file(*argv, EXTATTR_NAMESPACE_SYSTEM,
"pnfsd.dsfile", dsfile, xattrsize) != xattrsize) "pnfsd.dsfile", dsfile, xattrsize) != xattrsize)
err(1, "Can't set pnfsd.dsfile"); err(1, "Can't set pnfsd.dsfile");