Date: Wed, 23 Oct 2013 17:17:57 +0000 (UTC) From: Will Andrews <will@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r256992 - in projects/vps: sys/vps usr.sbin/vpsctl Message-ID: <201310231717.r9NHHvQv065280@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: will Date: Wed Oct 23 17:17:57 2013 New Revision: 256992 URL: http://svnweb.freebsd.org/changeset/base/256992 Log: Sync with svn.7he.at/vps/trunk r193. r193 | klaus | 2013-07-19 09:26:49 -0600 (Fri, 19 Jul 2013) | 3 lines Some modifications in order to allow migration of vps with nfs root. Submitted by: Klaus P. Ohrhallinger <k@7he.at> Modified: projects/vps/sys/vps/vps_libdump.h projects/vps/sys/vps/vps_restore.c projects/vps/sys/vps/vps_snapst.c projects/vps/usr.sbin/vpsctl/vpsctl.c Modified: projects/vps/sys/vps/vps_libdump.h ============================================================================== --- projects/vps/sys/vps/vps_libdump.h Wed Oct 23 17:13:07 2013 (r256991) +++ projects/vps/sys/vps/vps_libdump.h Wed Oct 23 17:17:57 2013 (r256992) @@ -131,7 +131,7 @@ void vps_libdump_printheader(struct vps_ #define VPS_DUMPOBJT_UCRED 120 #define VPS_DUMPH_MAGIC 0xc0debabe -#define VPS_DUMPH_VERSION 0x20130715 +#define VPS_DUMPH_VERSION 0x20130719 #define VPS_DUMPH_MSB 12 #define VPS_DUMPH_LSB 21 #define VPS_DUMPH_32BIT 32 @@ -318,11 +318,19 @@ struct vps_dump_mount { char mnton[0x80]; char fstype[0x10]; uint8 vpsmount; - uint8 _pad0[7]; + uint8 optcnt; + uint8 _pad0[6]; uint64 flags; PTR(mnt_cred); }; +struct vps_dump_mount_opt { + char name[0x40]; + char value[0x100]; + uint16 len; + uint16 _pad0[3]; +}; + struct vps_dump_vnet { PTR(orig_ptr); }; Modified: projects/vps/sys/vps/vps_restore.c ============================================================================== --- projects/vps/sys/vps/vps_restore.c Wed Oct 23 17:13:07 2013 (r256991) +++ projects/vps/sys/vps/vps_restore.c Wed Oct 23 17:17:57 2013 (r256992) @@ -4161,6 +4161,7 @@ static int vps_restore_mounts(struct vps_snapst_ctx *ctx, struct vps *vps, char *rootfspath) { + struct vps_dump_mount_opt *dvmopt; struct vps_dump_mount *dvm; struct vps_dumpobj *o1; struct vps *savevps; @@ -4171,6 +4172,7 @@ vps_restore_mounts(struct vps_snapst_ctx char *fspath; char *errmsg; int error = 0; + int i; ncr = NULL; @@ -4185,7 +4187,7 @@ vps_restore_mounts(struct vps_snapst_ctx save_rdir = save_cdir = NULL; } - errmsg_len = 0x100; + errmsg_len = 0xf0; errmsg = malloc(errmsg_len, M_TEMP, M_WAITOK); while (vdo_typeofnext(ctx) == VPS_DUMPOBJT_MOUNT) { @@ -4204,6 +4206,34 @@ vps_restore_mounts(struct vps_snapst_ctx if (vps != NULL && !strcmp(dvm->mnton, rootfspath)) continue; + ma = NULL; + + if (dvm->optcnt * sizeof(*dvmopt) > + (o1->size - sizeof(*dvm))) { + ERRMSG(ctx, "%s: dvm->optcnt=%d seems invalid !\n", + __func__, dvm->optcnt); + error = EINVAL; + goto out; + } + dvmopt = (struct vps_dump_mount_opt *)(dvm+1); + for (i = 0; i < dvm->optcnt; i++) { + DBGR("%s: opt name=[%s] value=%p len=%u\n", + __func__, dvmopt->name, dvmopt->value, + dvmopt->len); + + if (!strcmp(dvm->fstype, "nfs")) { + /* + if (!strcmp(dvmopt->name, "addr") || + !strcmp(dvmopt->name, "fh") || + !strcmp(dvmopt->name, "hostname")) + */ + if (1) + ma = mount_arg(ma, dvmopt->name, + dvmopt->value, dvmopt->len); + } + dvmopt += 1; + } + if (vdo_typeofnext(ctx) == VPS_DUMPOBJT_UCRED) { vdo_next(ctx); } @@ -4236,24 +4266,11 @@ vps_restore_mounts(struct vps_snapst_ctx if (dvm->vpsmount) /* dvm->mnton is always absolute, so we have to strip it. */ - fspath = dvm->mnton + strlen (rootfspath); + fspath = dvm->mnton + strlen(rootfspath); else fspath = dvm->mnton; + /*DBGR("%s: fspath=[%s]\n", __func__, fspath);*/ -#if 0 - error = kernel_vmount( - dvm->flags, - "fstype", dvm->fstype, - /* "fspath", dvm->mnton, */ - "fspath", fspath, - /* --> nullfs */ - "target", dvm->mntfrom, - "from", dvm->mntfrom, - "errmsg", errmsg, - NULL - ); -#endif - ma = NULL; ma = mount_arg(ma, "fstype", dvm->fstype, -1); ma = mount_arg(ma, "fspath", fspath, -1); if (!strcmp(dvm->fstype, "nullfs") || @@ -4262,11 +4279,11 @@ vps_restore_mounts(struct vps_snapst_ctx ma = mount_arg(ma, "from", dvm->mntfrom, -1); ma = mount_arg(ma, "errmsg", errmsg, errmsg_len); memset(errmsg, 0, errmsg_len); - error = kernel_mount(ma, dvm->flags); + error = kernel_mount(ma, dvm->flags); if (error) { ERRMSG(ctx, "%s: kernel_mount() error: %d [%s]\n", - __func__, error, errmsg); + __func__, error, errmsg); goto out; } Modified: projects/vps/sys/vps/vps_snapst.c ============================================================================== --- projects/vps/sys/vps/vps_snapst.c Wed Oct 23 17:13:07 2013 (r256991) +++ projects/vps/sys/vps/vps_snapst.c Wed Oct 23 17:17:57 2013 (r256992) @@ -677,6 +677,8 @@ vps_snapshot_vnodepath(struct vps_snapst if (error != 0) { free(buf, M_TEMP); vrele(vp); + ERRMSG(ctx, "%s: vn_fullpath1() failed for vp=%p\n", + __func__, vp); return (error); } @@ -907,8 +909,10 @@ static int vps_snapshot_mounts(struct vps_snapst_ctx *ctx, struct vps *vps) { int error = 0; - struct vps_dumpobj *o1; + struct vps_dumpobj *o1, *o2; struct vps_dump_mount *vdm; + struct vps_dump_mount_opt *vdmopt; + struct vfsopt *opt; struct mount *mp; char *mntfrom, *mnton, *fstype, *vpsroot; int len; @@ -924,7 +928,7 @@ vps_snapshot_mounts(struct vps_snapst_ct */ DBGS("%s: vps's rootpath=[%s] vnode=%p\n", - __func__, vps->_rootpath, vps->_rootvnode); + __func__, vps->_rootpath, vps->_rootvnode); vpsroot = strdup(vps->_rootpath, M_TEMP); if (vpsroot[strlen(vpsroot) - 1] == '/') @@ -932,7 +936,8 @@ vps_snapshot_mounts(struct vps_snapst_ct len = strlen(vpsroot); /* If we ran out of memory previously, we try again. */ - again: + again: + o1 = NULL; mtx_lock(&mountlist_mtx); TAILQ_FOREACH(mp, &mountlist, mnt_list) { @@ -958,11 +963,20 @@ vps_snapshot_mounts(struct vps_snapst_ct return (EINVAL); } #endif - o1 = vdo_create(ctx, VPS_DUMPOBJT_MOUNT, M_WAITOK); + if ((o2 = vdo_create(ctx, VPS_DUMPOBJT_MOUNT, M_NOWAIT)) + == NULL) { + mtx_unlock(&mountlist_mtx); + if (o1 != NULL) + vdo_discard(ctx, o1); + goto again; + } + /* Remember the dump object of the first mount. */ + if (o1 == NULL) + o1 = o2; vdm = vdo_space(ctx, sizeof(*vdm), M_NOWAIT); - if (vdm == NULL) { + mtx_unlock(&mountlist_mtx); vdo_discard(ctx, o1); goto again; } @@ -970,12 +984,35 @@ vps_snapshot_mounts(struct vps_snapst_ct strlcpy(vdm->mnton, mnton, sizeof(vdm->mnton)); strlcpy(vdm->fstype, fstype, sizeof(vdm->fstype)); vdm->flags = mp->mnt_flag; + vdm->optcnt = 0; /* Mounted from inside vps ? */ if (mp->mnt_cred->cr_vps == vps) vdm->vpsmount = 1; else vdm->vpsmount = 0; + TAILQ_FOREACH(opt, mp->mnt_opt, link) { + vdmopt = vdo_space(ctx, sizeof(*vdmopt), M_NOWAIT); + if (vdmopt == NULL) { + mtx_unlock(&mountlist_mtx); + vdo_discard(ctx, o1); + goto again; + } + if (opt->len >= sizeof(vdmopt->value)) { + ERRMSG(ctx, "%s: opt->len=%d (name=[%s]) too big\n", + __func__, opt->len, opt->name); + mtx_unlock(&mountlist_mtx); + free(vpsroot, M_TEMP); + return (EINVAL); + } + strlcpy(vdmopt->name, opt->name, sizeof(vdmopt->name)); + memcpy(vdmopt->value, opt->value, opt->len); + vdmopt->len = opt->len; + vdm->optcnt += 1; + DBGS("%s: opt name=[%s] value=%p len=%d\n", + __func__, opt->name, opt->value, opt->len); + } + if (vdm->vpsmount) { vdm->mnt_cred = mp->mnt_cred; Modified: projects/vps/usr.sbin/vpsctl/vpsctl.c ============================================================================== --- projects/vps/usr.sbin/vpsctl/vpsctl.c Wed Oct 23 17:13:07 2013 (r256991) +++ projects/vps/usr.sbin/vpsctl/vpsctl.c Wed Oct 23 17:17:57 2013 (r256992) @@ -55,6 +55,7 @@ #include <sys/priv.h> #include <sys/sysctl.h> #include <sys/param.h> +#include <sys/mount.h> #include <signal.h> #include <net/if.h> #include <netinet/in.h> @@ -308,7 +309,7 @@ vc_usage(FILE *out) " snapshot <id> <file> \n" " abort <id> \n" " restore <id> <file> \n" - " migrate <id> <remote-host> [norsync|onersync]\n" + " migrate <id> <remote-host> [norsync|onersync|tworsync]\n" " \n" " argshow <id> \n" " ipnet <id> add <address/network, ...> \n" @@ -1297,8 +1298,7 @@ vc_migrate(int argc, char **argv) char *fsroot; char cmd[0x100]; char file_n[MAXPATHLEN]; - char f_norsync = 0; - char f_onersync = 0; + char cnt_rsync; char str_suspend[] = "suspend"; char str_abort[] = "abort"; int pid, rfd, wfd; @@ -1309,12 +1309,6 @@ vc_migrate(int argc, char **argv) if (argc < 2) return (vc_usage(stderr)); - if (argc > 2 && strcmp(argv[2], "norsync") == 0) - f_norsync = 1; - - if (argc > 2 && strcmp(argv[2], "onersync") == 0) - f_onersync = 1; - mig_did_suspend = 0; mig_did_revoke = 0; signal(SIGINT, vc_migrate_sighandler); @@ -1341,6 +1335,28 @@ vc_migrate(int argc, char **argv) else fsroot = vc.fsroot; + if (1) { + struct statfs stf; + + if ((error = statfs(fsroot, &stf)) != 0) { + fprintf(stderr, "statfs([%s]): error: %s\n", + fsroot, strerror(errno)); + return (1); + } + + if (stf.f_flags & MNT_LOCAL) + cnt_rsync = 2; + else + cnt_rsync = 0; + } + + if (argc > 2 && strcmp(argv[2], "norsync") == 0) + cnt_rsync = 0; + else if (argc > 2 && strcmp(argv[2], "onersync") == 0) + cnt_rsync = 1; + else if (argc > 2 && strcmp(argv[2], "tworsync") == 0) + cnt_rsync = 2; + fprintf(stderr, "Opening ssh transport ... "); if ((error = vc_get_ssh_transport(host, &pid, &rfd, &wfd))) @@ -1348,43 +1364,44 @@ vc_migrate(int argc, char **argv) fprintf(stderr, "done\n"); - if (f_norsync == 0) { - - fprintf(stderr, "Copying config file ... "); - snprintf(cmd, sizeof(cmd), "vpsctl rsyncserver %s/\n", _PATH_CONFDIR); - write(wfd, cmd, strlen(cmd)); - if ((error = vc_rsync(RSYNC_MODE_CLIENT, rfd, wfd, file_n))) - goto resume; + /* Always syncing config file. */ +#if 1 + fprintf(stderr, "Copying config file ... "); + snprintf(cmd, sizeof(cmd), "vpsctl rsyncserver %s/\n", _PATH_CONFDIR); + write(wfd, cmd, strlen(cmd)); + if ((error = vc_rsync(RSYNC_MODE_CLIENT, rfd, wfd, file_n))) + goto resume; - fprintf(stderr, "done\n"); + fprintf(stderr, "done\n"); +#else + /* XXX transfer without using rsync */ +#endif - /* Always create directories. */ - if (vc.fsroot_priv[0] != '\0') { - /* Create vps' private root directory. */ - snprintf(cmd, sizeof(cmd), "mkdir -p %s\n", vc.fsroot_priv); - write(wfd, cmd, strlen(cmd)); - //len = read(rfd, cmd, sizeof(cmd)); - } - /* Create vps' mountpoint directory. */ - snprintf(cmd, sizeof(cmd), "mkdir -p %s\n", vc.fsroot); + /* Always create directories. */ + if (vc.fsroot_priv[0] != '\0') { + /* Create vps' private root directory. */ + snprintf(cmd, sizeof(cmd), "mkdir -p %s\n", vc.fsroot_priv); write(wfd, cmd, strlen(cmd)); //len = read(rfd, cmd, sizeof(cmd)); + } + /* Create vps' mountpoint directory. */ + snprintf(cmd, sizeof(cmd), "mkdir -p %s\n", vc.fsroot); + write(wfd, cmd, strlen(cmd)); + //len = read(rfd, cmd, sizeof(cmd)); - if (f_onersync == 0) { - - /* Start a first filesystem sync while vps is still running. */ + if (cnt_rsync == 2) { - fprintf(stderr, "Performing first filesystem sync ... "); + /* Start a first filesystem sync while vps is still running. */ - snprintf(cmd, sizeof(cmd), "vpsctl rsyncserver %s/\n", fsroot); - write(wfd, cmd, strlen(cmd)); - snprintf(cmd, sizeof(cmd), "%s/", fsroot); - if ((error = vc_rsync(RSYNC_MODE_CLIENT, rfd, wfd, cmd))) - goto resume; + fprintf(stderr, "Performing first filesystem sync ... "); - fprintf(stderr, "done\n"); + snprintf(cmd, sizeof(cmd), "vpsctl rsyncserver %s/\n", fsroot); + write(wfd, cmd, strlen(cmd)); + snprintf(cmd, sizeof(cmd), "%s/", fsroot); + if ((error = vc_rsync(RSYNC_MODE_CLIENT, rfd, wfd, cmd))) + goto resume; - } + fprintf(stderr, "done\n"); } @@ -1401,18 +1418,18 @@ vc_migrate(int argc, char **argv) fprintf(stderr, "done\n"); - if (f_norsync == 0) { + if (cnt_rsync > 0) { - fprintf(stderr, "Performing final filesystem sync ... "); + fprintf(stderr, "Performing final filesystem sync ... "); - /* After suspending do the final filesystem sync. */ - snprintf(cmd, sizeof(cmd), "vpsctl rsyncserver %s/\n", fsroot); - write(wfd, cmd, strlen(cmd)); - snprintf(cmd, sizeof(cmd), "%s/", fsroot); - if ((error = vc_rsync(RSYNC_MODE_CLIENT, rfd, wfd, cmd))) - goto resume; + /* After suspending do the final filesystem sync. */ + snprintf(cmd, sizeof(cmd), "vpsctl rsyncserver %s/\n", fsroot); + write(wfd, cmd, strlen(cmd)); + snprintf(cmd, sizeof(cmd), "%s/", fsroot); + if ((error = vc_rsync(RSYNC_MODE_CLIENT, rfd, wfd, cmd))) + goto resume; - fprintf(stderr, "done\n"); + fprintf(stderr, "done\n"); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201310231717.r9NHHvQv065280>