Date: Mon, 13 Aug 2007 07:02:36 GMT From: Marko Zec <zec@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 125099 for review Message-ID: <200708130702.l7D72aHi000773@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=125099 Change 125099 by zec@zec_tpx32 on 2007/08/13 07:01:54 A hack to resolve character "@" to vimage name when following symbolic links. This is controlled on per-vimage basis via the new vfs.morphing_symlinks sysctl and is off by default. The primary use of this will be in IMUNES network topology emulator to allow running of multiple instances of unmodified applications with some hard coded filesystem paths, most notably quagga. While here, slightly change the format of warning messages displayed if / when vnet "stacking" occurs. Affected files ... .. //depot/projects/vimage/src/sys/kern/vfs_lookup.c#6 edit .. //depot/projects/vimage/src/sys/sys/vimage.h#33 edit Differences ... ==== //depot/projects/vimage/src/sys/kern/vfs_lookup.c#6 (text+ko) ==== @@ -40,6 +40,7 @@ #include "opt_ktrace.h" #include "opt_mac.h" #include "opt_vfs.h" +#include "opt_vimage.h" #include <sys/param.h> #include <sys/systm.h> @@ -53,6 +54,7 @@ #include <sys/proc.h> #include <sys/syscallsubr.h> #include <sys/sysctl.h> +#include <sys/vimage.h> #ifdef KTRACE #include <sys/ktrace.h> #endif @@ -65,6 +67,15 @@ #define NAMEI_DIAGNOSTIC 1 #undef NAMEI_DIAGNOSTIC +#ifdef VIMAGE +#define IMUNES_SYMLINK_HACK +#endif + +#ifdef IMUNES_SYMLINK_HACK +SYSCTL_V_INT(V_PROCG, vprocg, _vfs, OID_AUTO, morphing_symlinks, CTLFLAG_RW, + morphing_symlinks, 0, "Resolve @ to vimage name in symlinks"); +#endif + /* * Allocation zone for namei */ @@ -129,6 +140,9 @@ struct thread *td = cnp->cn_thread; struct proc *p = td->td_proc; int vfslocked; +#ifdef IMUNES_SYMLINK_HACK + INIT_VPROCG(td->td_ucred->cr_vimage->v_procg); +#endif KASSERT((cnp->cn_flags & MPSAFE) != 0 || mtx_owned(&Giant) != 0, ("NOT MPSAFE and Giant not held")); @@ -284,6 +298,26 @@ error = ENOENT; break; } +#ifdef IMUNES_SYMLINK_HACK + if (V_morphing_symlinks) { + char *sp = strchr(cp, '@'); + int vnamelen = strlen(td->td_ucred->cr_vimage->vi_name); + + if (sp) { + if (vnamelen >= auio.uio_resid) { + if (ndp->ni_pathlen > 1) + uma_zfree(namei_zone, cp); + error = ENAMETOOLONG; + break; + } + bcopy(sp + 1, sp + vnamelen, + vnamelen - (sp - cp)); + bcopy(td->td_ucred->cr_vimage->vi_name, sp, + vnamelen); + linklen += (vnamelen - 1); + } + } +#endif /* IMUNES_SYMLINK_HACK */ if (linklen + ndp->ni_pathlen >= MAXPATHLEN) { if (ndp->ni_pathlen > 1) uma_zfree(namei_zone, cp); ==== //depot/projects/vimage/src/sys/sys/vimage.h#33 (text+ko) ==== @@ -197,9 +197,9 @@ #define CURVNET_SET_VERBOSE(arg) \ CURVNET_SET_QUIET(arg) \ if (saved_vnet) \ - printf("curvnet_set(%p) in %s() on cpu %d, prev %s(%p)\n", \ + printf("curvnet_set(%p) in %s() on cpu %d, prev %p in %s()\n", \ curvnet, curthread->td_vnet_lpush, curcpu, \ - saved_vnet_lpush, saved_vnet); + saved_vnet, saved_vnet_lpush); #define CURVNET_SET(arg) CURVNET_SET_VERBOSE(arg) @@ -291,6 +291,7 @@ #define V_cp_time VPROCG(cp_time) #define V_hostname VPROCG(hostname) #define V_domainname VPROCG(domainname) +#define V_morphing_symlinks VPROCG(morphing_symlinks) #ifdef VIMAGE void vnet_mod_register(const struct vnet_modinfo *); @@ -355,6 +356,8 @@ char _hostname[MAXHOSTNAMELEN]; char _domainname[MAXHOSTNAMELEN]; + int _morphing_symlinks; + #if 0 struct loadavg averunnable; /* from kern/kern_synch.c */ int nrun; @@ -374,9 +377,6 @@ struct timeval boottime; long boottdelta_sec; - int hostnamelen; - int domainnamelen; - char chroot[MAXPATHLEN]; /* assigned/inherited from parent */ int big_brother; /* manage procs in all child vprocgs */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200708130702.l7D72aHi000773>