* Re: [PATCH 3/7] uts namespaces: use init_utsname when appropriate [not found] ` <20060408045206.EAA8E19B8FF@sergelap.hallyn.com> @ 2006-04-08 7:09 ` Eric W. Biederman 2006-04-08 20:27 ` Serge E. Hallyn 2006-04-08 23:44 ` Sam Vilain 0 siblings, 2 replies; 15+ messages in thread From: Eric W. Biederman @ 2006-04-08 7:09 UTC (permalink / raw) To: Serge E. Hallyn Cc: linux-kernel, Kirill Korotaev, herbert, devel, sam, xemul, James Morris "Serge E. Hallyn" <serue@us.ibm.com> writes: > diff --git a/include/asm-i386/elf.h b/include/asm-i386/elf.h > index 4153d80..8d455e2 100644 > --- a/include/asm-i386/elf.h > +++ b/include/asm-i386/elf.h > @@ -108,7 +108,7 @@ typedef struct user_fxsr_struct elf_fpxr > For the moment, we have only optimizations for the Intel generations, > but that could change... */ > > -#define ELF_PLATFORM (system_utsname.machine) > +#define ELF_PLATFORM (init_utsname()->machine) > > #ifdef __KERNEL__ > #define SET_PERSONALITY(ex, ibcs2) do { } while (0) I think this one needs to be utsname()->machine. Currently it doesn't matter. But Herbert has expressed the desire to make a machine appear like an older one. > diff --git a/net/ipv4/ipconfig.c b/net/ipv4/ipconfig.c > index cb8a92f..81db372 100644 > --- a/net/ipv4/ipconfig.c > +++ b/net/ipv4/ipconfig.c > @@ -367,7 +367,7 @@ static int __init ic_defaults(void) > */ > > if (!ic_host_name_set) > - sprintf(system_utsname.nodename, "%u.%u.%u.%u", NIPQUAD(ic_myaddr)); > + sprintf(init_utsname()->nodename, "%u.%u.%u.%u", NIPQUAD(ic_myaddr)); > > if (root_server_addr == INADDR_NONE) > root_server_addr = ic_servaddr; > @@ -806,7 +806,7 @@ static void __init ic_do_bootp_ext(u8 *e > } > break; > case 12: /* Host name */ > - ic_bootp_string(system_utsname.nodename, ext+1, *ext, __NEW_UTS_LEN); > + ic_bootp_string(init_utsname()->nodename, ext+1, *ext, __NEW_UTS_LEN); > ic_host_name_set = 1; > break; > case 15: /* Domain name (DNS) */ > @@ -817,7 +817,7 @@ static void __init ic_do_bootp_ext(u8 *e > ic_bootp_string(root_server_path, ext+1, *ext, > sizeof(root_server_path)); > break; > case 40: /* NIS Domain name (_not_ DNS) */ > - ic_bootp_string(system_utsname.domainname, ext+1, *ext, __NEW_UTS_LEN); > + ic_bootp_string(init_utsname()->domainname, ext+1, *ext, __NEW_UTS_LEN); > break; > } > } > @@ -1369,7 +1369,7 @@ static int __init ip_auto_config(void) > printk(", mask=%u.%u.%u.%u", NIPQUAD(ic_netmask)); > printk(", gw=%u.%u.%u.%u", NIPQUAD(ic_gateway)); > printk(",\n host=%s, domain=%s, nis-domain=%s", > - system_utsname.nodename, ic_domain, system_utsname.domainname); > + init_utsname()->nodename, ic_domain, init_utsname()->domainname); > printk(",\n bootserver=%u.%u.%u.%u", NIPQUAD(ic_servaddr)); > printk(", rootserver=%u.%u.%u.%u", NIPQUAD(root_server_addr)); > printk(", rootpath=%s", root_server_path); > @@ -1479,11 +1479,11 @@ static int __init ip_auto_config_setup(c > case 4: > if ((dp = strchr(ip, '.'))) { > *dp++ = '\0'; > - strlcpy(system_utsname.domainname, dp, > - sizeof(system_utsname.domainname)); > + strlcpy(init_utsname()->domainname, dp, > + sizeof(init_utsname()->domainname)); > } > - strlcpy(system_utsname.nodename, ip, > - sizeof(system_utsname.nodename)); > + strlcpy(init_utsname()->nodename, ip, > + sizeof(init_utsname()->nodename)); > ic_host_name_set = 1; > break; > case 5: This also probably makes sense as utsname(). It doesn't really matter as this is before init is executed. But logically this is a user space or per namespace action. > diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c > index aa8965e..97c8439 100644 > --- a/net/sunrpc/clnt.c > +++ b/net/sunrpc/clnt.c > @@ -176,10 +176,10 @@ rpc_new_client(struct rpc_xprt *xprt, ch > } > > /* save the nodename */ > - clnt->cl_nodelen = strlen(system_utsname.nodename); > + clnt->cl_nodelen = strlen(init_utsname()->nodename); > if (clnt->cl_nodelen > UNX_MAXNODENAME) > clnt->cl_nodelen = UNX_MAXNODENAME; > - memcpy(clnt->cl_nodename, system_utsname.nodename, clnt->cl_nodelen); > + memcpy(clnt->cl_nodename, init_utsname()->nodename, clnt->cl_nodelen); > return clnt; > > out_no_auth: Using nodename is practically the definition of something that should per namespace I think. Plus it would be really inconsistent to use utsname() and the init_utsname for the nfs rpc calls. Unless I am missing something. Eric ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 3/7] uts namespaces: use init_utsname when appropriate 2006-04-08 7:09 ` [PATCH 3/7] uts namespaces: use init_utsname when appropriate Eric W. Biederman @ 2006-04-08 20:27 ` Serge E. Hallyn 2006-04-09 9:44 ` Eric W. Biederman 2006-04-08 23:44 ` Sam Vilain 1 sibling, 1 reply; 15+ messages in thread From: Serge E. Hallyn @ 2006-04-08 20:27 UTC (permalink / raw) To: Eric W. Biederman Cc: Serge E. Hallyn, linux-kernel, Kirill Korotaev, herbert, devel, sam, xemul, James Morris Quoting Eric W. Biederman (ebiederm@xmission.com): > "Serge E. Hallyn" <serue@us.ibm.com> writes: > > > diff --git a/include/asm-i386/elf.h b/include/asm-i386/elf.h > > index 4153d80..8d455e2 100644 > > --- a/include/asm-i386/elf.h > > +++ b/include/asm-i386/elf.h > > @@ -108,7 +108,7 @@ typedef struct user_fxsr_struct elf_fpxr > > For the moment, we have only optimizations for the Intel generations, > > but that could change... */ > > > > -#define ELF_PLATFORM (system_utsname.machine) > > +#define ELF_PLATFORM (init_utsname()->machine) > > > > #ifdef __KERNEL__ > > #define SET_PERSONALITY(ex, ibcs2) do { } while (0) > > I think this one needs to be utsname()->machine. > > Currently it doesn't matter. But Herbert has expressed > the desire to make a machine appear like an older one. Ok. > > diff --git a/net/ipv4/ipconfig.c b/net/ipv4/ipconfig.c > > index cb8a92f..81db372 100644 ... > > @@ -1479,11 +1479,11 @@ static int __init ip_auto_config_setup(c > > case 4: > > if ((dp = strchr(ip, '.'))) { > > *dp++ = '\0'; > > - strlcpy(system_utsname.domainname, dp, > > - sizeof(system_utsname.domainname)); > > + strlcpy(init_utsname()->domainname, dp, > > + sizeof(init_utsname()->domainname)); > > } > > - strlcpy(system_utsname.nodename, ip, > > - sizeof(system_utsname.nodename)); > > + strlcpy(init_utsname()->nodename, ip, > > + sizeof(init_utsname()->nodename)); > > ic_host_name_set = 1; > > break; > > case 5: > > This also probably makes sense as utsname(). It doesn't > really matter as this is before init is executed. But logically > this is a user space or per namespace action. Right, I was kind of favoring using init_utsname() for anything __init. But utsname() will of course work just as well there. > > diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c > > index aa8965e..97c8439 100644 > > --- a/net/sunrpc/clnt.c > > +++ b/net/sunrpc/clnt.c > > @@ -176,10 +176,10 @@ rpc_new_client(struct rpc_xprt *xprt, ch > > } > > > > /* save the nodename */ > > - clnt->cl_nodelen = strlen(system_utsname.nodename); > > + clnt->cl_nodelen = strlen(init_utsname()->nodename); > > if (clnt->cl_nodelen > UNX_MAXNODENAME) > > clnt->cl_nodelen = UNX_MAXNODENAME; > > - memcpy(clnt->cl_nodename, system_utsname.nodename, clnt->cl_nodelen); > > + memcpy(clnt->cl_nodename, init_utsname()->nodename, clnt->cl_nodelen); > > return clnt; > > > > out_no_auth: > > Using nodename is practically the definition of something > that should per namespace I think. Plus it would be really inconsistent > to use utsname() and the init_utsname for the nfs rpc calls. > > Unless I am missing something. It seemed like this would be happening in any old context, so that current->uts_ns could be any process'. Tracing it back further, it seems like nfs+lockd should have the context available. So I'll switch this as well. thanks, -serge ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 3/7] uts namespaces: use init_utsname when appropriate 2006-04-08 20:27 ` Serge E. Hallyn @ 2006-04-09 9:44 ` Eric W. Biederman 2006-04-09 10:14 ` Christoph Hellwig 2006-04-10 20:39 ` Serge E. Hallyn 0 siblings, 2 replies; 15+ messages in thread From: Eric W. Biederman @ 2006-04-09 9:44 UTC (permalink / raw) To: Serge E. Hallyn Cc: linux-kernel, Kirill Korotaev, herbert, devel, sam, xemul, James Morris "Serge E. Hallyn" <serue@us.ibm.com> writes: >> This also probably makes sense as utsname(). It doesn't >> really matter as this is before init is executed. But logically >> this is a user space or per namespace action. > > Right, I was kind of favoring using init_utsname() for anything > __init. But utsname() will of course work just as well there. Basically anything that should move to klibc I favor using utsname() for. That tends to make it clear it follows the usual user space rules. With a little luck HPA might actually have this code deleted in -mm before we get to far. >> > diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c >> > index aa8965e..97c8439 100644 >> > --- a/net/sunrpc/clnt.c >> > +++ b/net/sunrpc/clnt.c >> > @@ -176,10 +176,10 @@ rpc_new_client(struct rpc_xprt *xprt, ch >> > } >> > >> > /* save the nodename */ >> > - clnt->cl_nodelen = strlen(system_utsname.nodename); >> > + clnt->cl_nodelen = strlen(init_utsname()->nodename); >> > if (clnt->cl_nodelen > UNX_MAXNODENAME) >> > clnt->cl_nodelen = UNX_MAXNODENAME; >> > - memcpy(clnt->cl_nodename, system_utsname.nodename, clnt->cl_nodelen); >> > + memcpy(clnt->cl_nodename, init_utsname()->nodename, clnt->cl_nodelen); >> > return clnt; >> > >> > out_no_auth: >> >> Using nodename is practically the definition of something >> that should per namespace I think. Plus it would be really inconsistent >> to use utsname() and the init_utsname for the nfs rpc calls. >> >> Unless I am missing something. > > It seemed like this would be happening in any old context, so that > current->uts_ns could be any process'. Tracing it back further, > it seems like nfs+lockd should have the context available. So I'll > switch this as well. I have not traced that path recently. So I don't remember. This is one of those odd cases that makes a real difference. This reminds me of another piece of the conversation. kernel_thread vs. kthread, and the oddities of daemonize. In general user space cannot kill kernel threads, so having a kernel thread inside a namespace is dangerous because it means the namespace can never exit. There are two ways to avoid the associated problems. - modify daemonize to always use the instance of that namespace associated with init_task. - modify all interesting kernel threads to use the kthread api instead of kernel_thread. Using kthread makes the kernel threads children of keventd and always in the initial namespace instance. As such we know we aren't inside of any user space namespace instance. Eric ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 3/7] uts namespaces: use init_utsname when appropriate 2006-04-09 9:44 ` Eric W. Biederman @ 2006-04-09 10:14 ` Christoph Hellwig 2006-04-09 10:25 ` Christoph Hellwig 2006-04-10 20:39 ` Serge E. Hallyn 1 sibling, 1 reply; 15+ messages in thread From: Christoph Hellwig @ 2006-04-09 10:14 UTC (permalink / raw) To: Eric W. Biederman Cc: Serge E. Hallyn, linux-kernel, Kirill Korotaev, herbert, devel, sam, xemul, James Morris On Sun, Apr 09, 2006 at 03:44:19AM -0600, Eric W. Biederman wrote: > There are two ways to avoid the associated problems. > - modify daemonize to always use the instance of that > namespace associated with init_task. > - modify all interesting kernel threads to use the > kthread api instead of kernel_thread. Using kthread > makes the kernel threads children of keventd and always > in the initial namespace instance. As such we know > we aren't inside of any user space namespace instance. I've added a deprecation entry for the kernel_thread export and plan to convert all users to the kthread API. Any help on that is of course greatly appreciated. ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 3/7] uts namespaces: use init_utsname when appropriate 2006-04-09 10:14 ` Christoph Hellwig @ 2006-04-09 10:25 ` Christoph Hellwig 2006-04-09 10:36 ` Eric W. Biederman 0 siblings, 1 reply; 15+ messages in thread From: Christoph Hellwig @ 2006-04-09 10:25 UTC (permalink / raw) To: Christoph Hellwig, Eric W. Biederman, Serge E. Hallyn, linux-kernel, Kirill Korotaev, herbert, sam, xemul, James Morris And folks, please remove devel@openvz.org from this thead, it's subscribers only and gives everyone else nasty bounces. ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 3/7] uts namespaces: use init_utsname when appropriate 2006-04-09 10:25 ` Christoph Hellwig @ 2006-04-09 10:36 ` Eric W. Biederman 0 siblings, 0 replies; 15+ messages in thread From: Eric W. Biederman @ 2006-04-09 10:36 UTC (permalink / raw) To: Christoph Hellwig Cc: Serge E. Hallyn, linux-kernel, Kirill Korotaev, herbert, sam, xemul, James Morris Christoph Hellwig <hch@infradead.org> writes: > And folks, please remove devel@openvz.org from this thead, it's subscribers > only and gives everyone else nasty bounces. Odd. I haven't been getting bounces, and I'm not subscribed. I wonder if some of the principals in the conversation were given an explicit exception. If so that is a subtle pain. Eric ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 3/7] uts namespaces: use init_utsname when appropriate 2006-04-09 9:44 ` Eric W. Biederman 2006-04-09 10:14 ` Christoph Hellwig @ 2006-04-10 20:39 ` Serge E. Hallyn 2006-04-10 20:46 ` Serge E. Hallyn 1 sibling, 1 reply; 15+ messages in thread From: Serge E. Hallyn @ 2006-04-10 20:39 UTC (permalink / raw) To: Eric W. Biederman Cc: Serge E. Hallyn, linux-kernel, Kirill Korotaev, herbert, devel, sam, xemul, James Morris Quoting Eric W. Biederman (ebiederm@xmission.com): > "Serge E. Hallyn" <serue@us.ibm.com> writes: > > >> This also probably makes sense as utsname(). It doesn't > >> really matter as this is before init is executed. But logically > >> this is a user space or per namespace action. > > > > Right, I was kind of favoring using init_utsname() for anything > > __init. But utsname() will of course work just as well there. > > Basically anything that should move to klibc I favor using > utsname() for. That tends to make it clear it follows > the usual user space rules. > > With a little luck HPA might actually have this code deleted > in -mm before we get to far. Here is a new version of the init_utsname patch. I'm sending a new version of the utsname() patch in reply to the original [2/7] patch. From: Serge Hallyn <serue@us.ibm.com> Subject: [PATCH 3/7] uts namespaces: use init_utsname when appropriate In some places, particularly drivers and __init code, the init utsns is the appropriate one to use. This patch replaces those with a the init_utsname helper. Changes: Removed several uses of init_utsname(). Hope I picked all the right ones in net/ipv4/ipconfig.c. These are now changed to utsname() (the per-process namespace utsname) in the previous patch (2/7) Signed-off-by: Serge E. Hallyn <serue@us.ibm.com> --- arch/arm/kernel/setup.c | 2 +- arch/arm26/kernel/setup.c | 2 +- arch/cris/kernel/setup.c | 2 +- arch/i386/kernel/process.c | 6 +++--- arch/i386/kernel/traps.c | 6 +++--- arch/powerpc/kernel/process.c | 2 +- arch/powerpc/kernel/setup_64.c | 2 +- arch/powerpc/platforms/pseries/setup.c | 2 +- arch/sh/kernel/setup.c | 2 +- arch/um/kernel/um_arch.c | 6 +++--- arch/um/sys-x86_64/sysrq.c | 2 +- arch/x86_64/kernel/process.c | 6 +++--- drivers/infiniband/hw/ipath/ipath_verbs.c | 2 +- drivers/parisc/led.c | 2 +- drivers/scsi/lpfc/lpfc_ct.c | 8 ++++---- drivers/usb/core/hcd.c | 4 ++-- drivers/usb/gadget/ether.c | 2 +- drivers/usb/gadget/file_storage.c | 2 +- drivers/usb/gadget/serial.c | 2 +- drivers/usb/gadget/zero.c | 2 +- include/asm-i386/bugs.h | 2 +- include/asm-sh/bugs.h | 2 +- kernel/power/snapshot.c | 10 +++++----- net/ipv4/ipconfig.c | 2 +- sound/core/info_oss.c | 10 +++++----- 25 files changed, 45 insertions(+), 45 deletions(-) 3941501899f74ae1fee21a074cdc2e420a4b3f27 diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 4375284..a4dc8de 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c @@ -319,7 +319,7 @@ static void __init setup_processor(void) cpu_name, processor_id, (int)processor_id & 15, proc_arch[cpu_architecture()]); - sprintf(system_utsname.machine, "%s%c", list->arch_name, ENDIANNESS); + sprintf(init_utsname()->machine, "%s%c", list->arch_name, ENDIANNESS); sprintf(elf_platform, "%s%c", list->elf_name, ENDIANNESS); elf_hwcap = list->elf_hwcap; diff --git a/arch/arm26/kernel/setup.c b/arch/arm26/kernel/setup.c index 4eb329e..8e6a441 100644 --- a/arch/arm26/kernel/setup.c +++ b/arch/arm26/kernel/setup.c @@ -144,7 +144,7 @@ static void __init setup_processor(void) dump_cpu_info(); - sprintf(system_utsname.machine, "%s", list->arch_name); + sprintf(init_utsname()->machine, "%s", list->arch_name); sprintf(elf_platform, "%s", list->elf_name); elf_hwcap = list->elf_hwcap; diff --git a/arch/cris/kernel/setup.c b/arch/cris/kernel/setup.c index 619a6ee..1974c01 100644 --- a/arch/cris/kernel/setup.c +++ b/arch/cris/kernel/setup.c @@ -161,7 +161,7 @@ setup_arch(char **cmdline_p) show_etrax_copyright(); /* Setup utsname */ - strcpy(system_utsname.machine, cris_machine_name); + strcpy(init_utsname()->machine, cris_machine_name); } static void *c_start(struct seq_file *m, loff_t *pos) diff --git a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c index 6259afe..da2e439 100644 --- a/arch/i386/kernel/process.c +++ b/arch/i386/kernel/process.c @@ -297,9 +297,9 @@ void show_regs(struct pt_regs * regs) if (user_mode_vm(regs)) printk(" ESP: %04x:%08lx",0xffff & regs->xss,regs->esp); printk(" EFLAGS: %08lx %s (%s %.*s)\n", - regs->eflags, print_tainted(), system_utsname.release, - (int)strcspn(system_utsname.version, " "), - system_utsname.version); + regs->eflags, print_tainted(), init_utsname()->release, + (int)strcspn(init_utsname()->version, " "), + init_utsname()->version); printk("EAX: %08lx EBX: %08lx ECX: %08lx EDX: %08lx\n", regs->eax,regs->ebx,regs->ecx,regs->edx); printk("ESI: %08lx EDI: %08lx EBP: %08lx", diff --git a/arch/i386/kernel/traps.c b/arch/i386/kernel/traps.c index e385279..dd62423 100644 --- a/arch/i386/kernel/traps.c +++ b/arch/i386/kernel/traps.c @@ -260,9 +260,9 @@ void show_registers(struct pt_regs *regs printk(KERN_EMERG "CPU: %d\nEIP: %04x:[<%08lx>] %s VLI\n" "EFLAGS: %08lx (%s %.*s) \n", smp_processor_id(), 0xffff & regs->xcs, regs->eip, - print_tainted(), regs->eflags, system_utsname.release, - (int)strcspn(system_utsname.version, " "), - system_utsname.version); + print_tainted(), regs->eflags, init_utsname()->release, + (int)strcspn(init_utsname()->version, " "), + init_utsname()->version); print_symbol(KERN_EMERG "EIP is at %s\n", regs->eip); printk(KERN_EMERG "eax: %08lx ebx: %08lx ecx: %08lx edx: %08lx\n", regs->eax, regs->ebx, regs->ecx, regs->edx); diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index 2dd47d2..6ce9e10 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c @@ -425,7 +425,7 @@ void show_regs(struct pt_regs * regs) printk("NIP: "REG" LR: "REG" CTR: "REG"\n", regs->nip, regs->link, regs->ctr); printk("REGS: %p TRAP: %04lx %s (%s)\n", - regs, regs->trap, print_tainted(), system_utsname.release); + regs, regs->trap, print_tainted(), init_utsname()->release); printk("MSR: "REG" ", regs->msr); printbits(regs->msr, msr_bits); printk(" CR: %08lX XER: %08lX\n", regs->ccr, regs->xer); diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c index 13e91c4..1c6619f 100644 --- a/arch/powerpc/kernel/setup_64.c +++ b/arch/powerpc/kernel/setup_64.c @@ -435,7 +435,7 @@ void __init setup_system(void) smp_release_cpus(); #endif - printk("Starting Linux PPC64 %s\n", system_utsname.version); + printk("Starting Linux PPC64 %s\n", init_utsname()->version); printk("-----------------------------------------------------\n"); printk("ppc64_pft_size = 0x%lx\n", ppc64_pft_size); diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c index 5eb55ef..58b7a74 100644 --- a/arch/powerpc/platforms/pseries/setup.c +++ b/arch/powerpc/platforms/pseries/setup.c @@ -255,7 +255,7 @@ static int __init pSeries_init_panel(voi { /* Manually leave the kernel version on the panel. */ ppc_md.progress("Linux ppc64\n", 0); - ppc_md.progress(system_utsname.version, 0); + ppc_md.progress(init_utsname()->version, 0); return 0; } diff --git a/arch/sh/kernel/setup.c b/arch/sh/kernel/setup.c index bb229ef..024401e 100644 --- a/arch/sh/kernel/setup.c +++ b/arch/sh/kernel/setup.c @@ -481,7 +481,7 @@ static int show_cpuinfo(struct seq_file seq_printf(m, "machine\t\t: %s\n", get_system_type()); seq_printf(m, "processor\t: %d\n", cpu); - seq_printf(m, "cpu family\t: %s\n", system_utsname.machine); + seq_printf(m, "cpu family\t: %s\n", init_utsname()->machine); seq_printf(m, "cpu type\t: %s\n", get_cpu_subtype()); show_cpuflags(m); diff --git a/arch/um/kernel/um_arch.c b/arch/um/kernel/um_arch.c index 7d51dd7..b49dd7d 100644 --- a/arch/um/kernel/um_arch.c +++ b/arch/um/kernel/um_arch.c @@ -167,7 +167,7 @@ static char *usage_string = static int __init uml_version_setup(char *line, int *add) { - printf("%s\n", system_utsname.release); + printf("%s\n", init_utsname()->release); exit(0); return 0; @@ -278,7 +278,7 @@ static int __init Usage(char *line, int { const char **p; - printf(usage_string, system_utsname.release); + printf(usage_string, init_utsname()->release); p = &__uml_help_start; while (p < &__uml_help_end) { printf("%s", *p); @@ -400,7 +400,7 @@ int linux_main(int argc, char **argv) /* Reserve up to 4M after the current brk */ uml_reserved = ROUND_4M(brk_start) + (1 << 22); - setup_machinename(system_utsname.machine); + setup_machinename(init_utsname()->machine); #ifdef CONFIG_CMDLINE_ON_HOST argv1_begin = argv[1]; diff --git a/arch/um/sys-x86_64/sysrq.c b/arch/um/sys-x86_64/sysrq.c index d0a25af..ce3e07f 100644 --- a/arch/um/sys-x86_64/sysrq.c +++ b/arch/um/sys-x86_64/sysrq.c @@ -16,7 +16,7 @@ void __show_regs(struct pt_regs * regs) printk("\n"); print_modules(); printk("Pid: %d, comm: %.20s %s %s\n", - current->pid, current->comm, print_tainted(), system_utsname.release); + current->pid, current->comm, print_tainted(), init_utsname()->release); printk("RIP: %04lx:[<%016lx>] ", PT_REGS_CS(regs) & 0xffff, PT_REGS_RIP(regs)); printk("\nRSP: %016lx EFLAGS: %08lx\n", PT_REGS_RSP(regs), diff --git a/arch/x86_64/kernel/process.c b/arch/x86_64/kernel/process.c index 70dd8e5..79f8174 100644 --- a/arch/x86_64/kernel/process.c +++ b/arch/x86_64/kernel/process.c @@ -292,9 +292,9 @@ void __show_regs(struct pt_regs * regs) print_modules(); printk("Pid: %d, comm: %.20s %s %s %.*s\n", current->pid, current->comm, print_tainted(), - system_utsname.release, - (int)strcspn(system_utsname.version, " "), - system_utsname.version); + init_utsname()->release, + (int)strcspn(init_utsname()->version, " "), + init_utsname()->version); printk("RIP: %04lx:[<%016lx>] ", regs->cs & 0xffff, regs->rip); printk_address(regs->rip); printk("\nRSP: %04lx:%016lx EFLAGS: %08lx\n", regs->ss, regs->rsp, diff --git a/drivers/infiniband/hw/ipath/ipath_verbs.c b/drivers/infiniband/hw/ipath/ipath_verbs.c index 9f27fd3..f873380 100644 --- a/drivers/infiniband/hw/ipath/ipath_verbs.c +++ b/drivers/infiniband/hw/ipath/ipath_verbs.c @@ -1048,7 +1048,7 @@ static void *ipath_register_ib_device(in dev->process_mad = ipath_process_mad; snprintf(dev->node_desc, sizeof(dev->node_desc), - IPATH_IDSTR " %s kernel_SMA", system_utsname.nodename); + IPATH_IDSTR " %s kernel_SMA", init_utsname()->nodename); ret = ib_register_device(dev); if (ret) diff --git a/drivers/parisc/led.c b/drivers/parisc/led.c index 298f2dd..1d778d2 100644 --- a/drivers/parisc/led.c +++ b/drivers/parisc/led.c @@ -684,7 +684,7 @@ int __init led_init(void) int ret; snprintf(lcd_text_default, sizeof(lcd_text_default), - "Linux %s", system_utsname.release); + "Linux %s", init_utsname()->release); /* Work around the buggy PDC of KittyHawk-machines */ switch (CPU_HVERSION) { diff --git a/drivers/scsi/lpfc/lpfc_ct.c b/drivers/scsi/lpfc/lpfc_ct.c index b65ee57..83f53fb 100644 --- a/drivers/scsi/lpfc/lpfc_ct.c +++ b/drivers/scsi/lpfc/lpfc_ct.c @@ -961,8 +961,8 @@ lpfc_fdmi_cmd(struct lpfc_hba * phba, st ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) rh + size); ae->ad.bits.AttrType = be16_to_cpu(OS_NAME_VERSION); sprintf(ae->un.OsNameVersion, "%s %s %s", - system_utsname.sysname, system_utsname.release, - system_utsname.version); + init_utsname()->sysname, init_utsname()->release, + init_utsname()->version); len = strlen(ae->un.OsNameVersion); len += (len & 3) ? (4 - (len & 3)) : 4; ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + len); @@ -1080,7 +1080,7 @@ lpfc_fdmi_cmd(struct lpfc_hba * phba, st size); ae->ad.bits.AttrType = be16_to_cpu(HOST_NAME); sprintf(ae->un.HostName, "%s", - system_utsname.nodename); + init_utsname()->nodename); len = strlen(ae->un.HostName); len += (len & 3) ? (4 - (len & 3)) : 4; ae->ad.bits.AttrLen = @@ -1168,7 +1168,7 @@ lpfc_fdmi_tmo_handler(struct lpfc_hba *p ndlp = lpfc_findnode_did(phba, NLP_SEARCH_ALL, FDMI_DID); if (ndlp) { - if (system_utsname.nodename[0] != '\0') { + if (init_utsname()->nodename[0] != '\0') { lpfc_fdmi_cmd(phba, ndlp, SLI_MGMT_DHBA); } else { mod_timer(&phba->fc_fdmitmo, jiffies + HZ * 60); diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index fbd938d..c1255ec 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c @@ -318,8 +318,8 @@ static int rh_string ( // id 3 == vendor description } else if (id == 3) { - snprintf (buf, sizeof buf, "%s %s %s", system_utsname.sysname, - system_utsname.release, hcd->driver->description); + snprintf (buf, sizeof buf, "%s %s %s", init_utsname()->sysname, + init_utsname()->release, hcd->driver->description); // unsupported IDs --> "protocol stall" } else diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c index c3d8e5c..e6fe999 100644 --- a/drivers/usb/gadget/ether.c +++ b/drivers/usb/gadget/ether.c @@ -2242,7 +2242,7 @@ eth_bind (struct usb_gadget *gadget) return -ENODEV; } snprintf (manufacturer, sizeof manufacturer, "%s %s/%s", - system_utsname.sysname, system_utsname.release, + init_utsname()->sysname, init_utsname()->release, gadget->name); /* If there's an RNDIS configuration, that's what Windows wants to diff --git a/drivers/usb/gadget/file_storage.c b/drivers/usb/gadget/file_storage.c index cf3be29..d3149e5 100644 --- a/drivers/usb/gadget/file_storage.c +++ b/drivers/usb/gadget/file_storage.c @@ -3965,7 +3965,7 @@ static int __init fsg_bind(struct usb_ga usb_gadget_set_selfpowered(gadget); snprintf(manufacturer, sizeof manufacturer, "%s %s with %s", - system_utsname.sysname, system_utsname.release, + init_utsname()->sysname, init_utsname()->release, gadget->name); /* On a real device, serial[] would be loaded from permanent diff --git a/drivers/usb/gadget/serial.c b/drivers/usb/gadget/serial.c index b992546..a2f905b 100644 --- a/drivers/usb/gadget/serial.c +++ b/drivers/usb/gadget/serial.c @@ -1496,7 +1496,7 @@ static int __init gs_bind(struct usb_gad return -ENOMEM; snprintf(manufacturer, sizeof(manufacturer), "%s %s with %s", - system_utsname.sysname, system_utsname.release, + init_utsname()->sysname, init_utsname()->release, gadget->name); memset(dev, 0, sizeof(struct gs_dev)); diff --git a/drivers/usb/gadget/zero.c b/drivers/usb/gadget/zero.c index 51424f6..b23e0fd 100644 --- a/drivers/usb/gadget/zero.c +++ b/drivers/usb/gadget/zero.c @@ -1240,7 +1240,7 @@ autoconf_fail: EP_OUT_NAME, EP_IN_NAME); snprintf (manufacturer, sizeof manufacturer, "%s %s with %s", - system_utsname.sysname, system_utsname.release, + init_utsname()->sysname, init_utsname()->release, gadget->name); return 0; diff --git a/include/asm-i386/bugs.h b/include/asm-i386/bugs.h index 50233e0..6cb79fe 100644 --- a/include/asm-i386/bugs.h +++ b/include/asm-i386/bugs.h @@ -190,6 +190,6 @@ static void __init check_bugs(void) check_fpu(); check_hlt(); check_popad(); - system_utsname.machine[1] = '0' + (boot_cpu_data.x86 > 6 ? 6 : boot_cpu_data.x86); + init_utsname()->machine[1] = '0' + (boot_cpu_data.x86 > 6 ? 6 : boot_cpu_data.x86); alternative_instructions(); } diff --git a/include/asm-sh/bugs.h b/include/asm-sh/bugs.h index a6de3d0..d09933c 100644 --- a/include/asm-sh/bugs.h +++ b/include/asm-sh/bugs.h @@ -18,7 +18,7 @@ static void __init check_bugs(void) { extern char *get_cpu_subtype(void); extern unsigned long loops_per_jiffy; - char *p= &system_utsname.machine[2]; /* "sh" */ + char *p= &init_utsname()->machine[2]; /* "sh" */ cpu_data->loops_per_jiffy = loops_per_jiffy; diff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c index c5863d0..f43f7db 100644 --- a/kernel/power/snapshot.c +++ b/kernel/power/snapshot.c @@ -523,7 +523,7 @@ static void init_header(struct swsusp_in memset(info, 0, sizeof(struct swsusp_info)); info->version_code = LINUX_VERSION_CODE; info->num_physpages = num_physpages; - memcpy(&info->uts, &system_utsname, sizeof(system_utsname)); + memcpy(&info->uts, init_utsname(), sizeof(struct new_utsname)); info->cpus = num_online_cpus(); info->image_pages = nr_copy_pages; info->pages = nr_copy_pages + nr_meta_pages + 1; @@ -662,13 +662,13 @@ static int check_header(struct swsusp_in reason = "kernel version"; if (info->num_physpages != num_physpages) reason = "memory size"; - if (strcmp(info->uts.sysname,system_utsname.sysname)) + if (strcmp(info->uts.sysname,init_utsname()->sysname)) reason = "system type"; - if (strcmp(info->uts.release,system_utsname.release)) + if (strcmp(info->uts.release,init_utsname()->release)) reason = "kernel release"; - if (strcmp(info->uts.version,system_utsname.version)) + if (strcmp(info->uts.version,init_utsname()->version)) reason = "version"; - if (strcmp(info->uts.machine,system_utsname.machine)) + if (strcmp(info->uts.machine,init_utsname()->machine)) reason = "machine"; if (reason) { printk(KERN_ERR "swsusp: Resume mismatch: %s\n", reason); diff --git a/net/ipv4/ipconfig.c b/net/ipv4/ipconfig.c index b9bdf0f..4c13acb 100644 --- a/net/ipv4/ipconfig.c +++ b/net/ipv4/ipconfig.c @@ -367,7 +367,7 @@ static int __init ic_defaults(void) */ if (!ic_host_name_set) - sprintf(system_utsname.nodename, "%u.%u.%u.%u", NIPQUAD(ic_myaddr)); + sprintf(init_utsname()->nodename, "%u.%u.%u.%u", NIPQUAD(ic_myaddr)); if (root_server_addr == INADDR_NONE) root_server_addr = ic_servaddr; diff --git a/sound/core/info_oss.c b/sound/core/info_oss.c index f9ce854..35662bb 100644 --- a/sound/core/info_oss.c +++ b/sound/core/info_oss.c @@ -94,11 +94,11 @@ static void snd_sndstat_proc_read(struct { snd_iprintf(buffer, "Sound Driver:3.8.1a-980706 (ALSA v" CONFIG_SND_VERSION " emulation code)\n"); snd_iprintf(buffer, "Kernel: %s %s %s %s %s\n", - system_utsname.sysname, - system_utsname.nodename, - system_utsname.release, - system_utsname.version, - system_utsname.machine); + init_utsname()->sysname, + init_utsname()->nodename, + init_utsname()->release, + init_utsname()->version, + init_utsname()->machine); snd_iprintf(buffer, "Config options: 0\n"); snd_iprintf(buffer, "\nInstalled drivers: \n"); snd_iprintf(buffer, "Type 10: ALSA emulation\n"); -- 1.1.6 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH 3/7] uts namespaces: use init_utsname when appropriate 2006-04-10 20:39 ` Serge E. Hallyn @ 2006-04-10 20:46 ` Serge E. Hallyn 0 siblings, 0 replies; 15+ messages in thread From: Serge E. Hallyn @ 2006-04-10 20:46 UTC (permalink / raw) To: Serge E. Hallyn Cc: Eric W. Biederman, linux-kernel, Kirill Korotaev, herbert, sam, xemul, James Morris Quoting Serge E. Hallyn (serue@us.ibm.com): > Here is a new version of the init_utsname patch. I'm sending a > new version of the utsname() patch in reply to the original [2/7] > patch. Then again, I can't find the rest of the /7 series. I'm assuming at least those cc:d got the full set, so will the resend. Here is the updated the utsname() usage patch. From: Serge Hallyn <serue@us.ibm.com> Subject: [PATCH 2/7] uts namespaces: switch to using uts namespaces Replace references to system_utsname to the per-process uts namespace where appropriate. This includes things like uname. Changes: Per Eric Biederman's comments, use the per-process uts namespace for ELF_PLATFORM, sunrpc, and parts of net/ipv4/ipconfig.c Signed-off-by: Serge E. Hallyn <serue@us.ibm.com> --- arch/alpha/kernel/osf_sys.c | 24 ++++++++++++------------ arch/i386/kernel/sys_i386.c | 12 ++++++------ arch/ia64/sn/kernel/sn2/sn_hwperf.c | 2 +- arch/m32r/kernel/sys_m32r.c | 2 +- arch/mips/kernel/linux32.c | 2 +- arch/mips/kernel/syscall.c | 18 +++++++++--------- arch/mips/kernel/sysirix.c | 12 ++++++------ arch/parisc/hpux/sys_hpux.c | 22 +++++++++++----------- arch/powerpc/kernel/syscalls.c | 14 +++++++------- arch/sh/kernel/sys_sh.c | 2 +- arch/sh64/kernel/sys_sh64.c | 2 +- arch/sparc/kernel/sys_sparc.c | 4 ++-- arch/sparc/kernel/sys_sunos.c | 10 +++++----- arch/sparc64/kernel/sys_sparc.c | 4 ++-- arch/sparc64/kernel/sys_sunos32.c | 10 +++++----- arch/sparc64/solaris/misc.c | 6 +++--- arch/um/drivers/mconsole_kern.c | 6 +++--- arch/um/kernel/syscall_kern.c | 12 ++++++------ arch/um/sys-x86_64/syscalls.c | 2 +- arch/x86_64/ia32/sys_ia32.c | 10 +++++----- arch/x86_64/kernel/sys_x86_64.c | 2 +- arch/xtensa/kernel/syscalls.c | 2 +- drivers/char/random.c | 4 ++-- fs/cifs/connect.c | 28 ++++++++++++++-------------- fs/exec.c | 2 +- fs/lockd/clntproc.c | 4 ++-- fs/lockd/mon.c | 2 +- fs/lockd/svclock.c | 2 +- fs/lockd/xdr.c | 2 +- fs/nfs/nfsroot.c | 2 +- include/asm-i386/elf.h | 2 +- include/linux/lockd/lockd.h | 2 +- kernel/sys.c | 14 +++++++------- net/ipv4/ipconfig.c | 14 +++++++------- net/sunrpc/clnt.c | 4 ++-- 35 files changed, 131 insertions(+), 131 deletions(-) dd728b16d71caef35e6c5b55fff9f39a4ca1c0b1 diff --git a/arch/alpha/kernel/osf_sys.c b/arch/alpha/kernel/osf_sys.c index 31afe3d..b793b96 100644 --- a/arch/alpha/kernel/osf_sys.c +++ b/arch/alpha/kernel/osf_sys.c @@ -402,15 +402,15 @@ osf_utsname(char __user *name) down_read(&uts_sem); error = -EFAULT; - if (copy_to_user(name + 0, system_utsname.sysname, 32)) + if (copy_to_user(name + 0, utsname()->sysname, 32)) goto out; - if (copy_to_user(name + 32, system_utsname.nodename, 32)) + if (copy_to_user(name + 32, utsname()->nodename, 32)) goto out; - if (copy_to_user(name + 64, system_utsname.release, 32)) + if (copy_to_user(name + 64, utsname()->release, 32)) goto out; - if (copy_to_user(name + 96, system_utsname.version, 32)) + if (copy_to_user(name + 96, utsname()->version, 32)) goto out; - if (copy_to_user(name + 128, system_utsname.machine, 32)) + if (copy_to_user(name + 128, utsname()->machine, 32)) goto out; error = 0; @@ -449,8 +449,8 @@ osf_getdomainname(char __user *name, int down_read(&uts_sem); for (i = 0; i < len; ++i) { - __put_user(system_utsname.domainname[i], name + i); - if (system_utsname.domainname[i] == '\0') + __put_user(utsname()->domainname[i], name + i); + if (utsname()->domainname[i] == '\0') break; } up_read(&uts_sem); @@ -608,11 +608,11 @@ asmlinkage long osf_sysinfo(int command, char __user *buf, long count) { static char * sysinfo_table[] = { - system_utsname.sysname, - system_utsname.nodename, - system_utsname.release, - system_utsname.version, - system_utsname.machine, + utsname()->sysname, + utsname()->nodename, + utsname()->release, + utsname()->version, + utsname()->machine, "alpha", /* instruction set architecture */ "dummy", /* hardware serial number */ "dummy", /* hardware manufacturer */ diff --git a/arch/i386/kernel/sys_i386.c b/arch/i386/kernel/sys_i386.c index 8fdb1fb..4af731d 100644 --- a/arch/i386/kernel/sys_i386.c +++ b/arch/i386/kernel/sys_i386.c @@ -210,7 +210,7 @@ asmlinkage int sys_uname(struct old_utsn if (!name) return -EFAULT; down_read(&uts_sem); - err=copy_to_user(name, &system_utsname, sizeof (*name)); + err=copy_to_user(name, utsname(), sizeof (*name)); up_read(&uts_sem); return err?-EFAULT:0; } @@ -226,15 +226,15 @@ asmlinkage int sys_olduname(struct oldol down_read(&uts_sem); - error = __copy_to_user(&name->sysname,&system_utsname.sysname,__OLD_UTS_LEN); + error = __copy_to_user(&name->sysname,&utsname()->sysname,__OLD_UTS_LEN); error |= __put_user(0,name->sysname+__OLD_UTS_LEN); - error |= __copy_to_user(&name->nodename,&system_utsname.nodename,__OLD_UTS_LEN); + error |= __copy_to_user(&name->nodename,&utsname()->nodename,__OLD_UTS_LEN); error |= __put_user(0,name->nodename+__OLD_UTS_LEN); - error |= __copy_to_user(&name->release,&system_utsname.release,__OLD_UTS_LEN); + error |= __copy_to_user(&name->release,&utsname()->release,__OLD_UTS_LEN); error |= __put_user(0,name->release+__OLD_UTS_LEN); - error |= __copy_to_user(&name->version,&system_utsname.version,__OLD_UTS_LEN); + error |= __copy_to_user(&name->version,&utsname()->version,__OLD_UTS_LEN); error |= __put_user(0,name->version+__OLD_UTS_LEN); - error |= __copy_to_user(&name->machine,&system_utsname.machine,__OLD_UTS_LEN); + error |= __copy_to_user(&name->machine,&utsname()->machine,__OLD_UTS_LEN); error |= __put_user(0,name->machine+__OLD_UTS_LEN); up_read(&uts_sem); diff --git a/arch/ia64/sn/kernel/sn2/sn_hwperf.c b/arch/ia64/sn/kernel/sn2/sn_hwperf.c index d917afa..a0632a9 100644 --- a/arch/ia64/sn/kernel/sn2/sn_hwperf.c +++ b/arch/ia64/sn/kernel/sn2/sn_hwperf.c @@ -420,7 +420,7 @@ static int sn_topology_show(struct seq_f "coherency_domain %d, " "region_size %d\n", - partid, system_utsname.nodename, + partid, utsname()->nodename, shubtype ? "shub2" : "shub1", (u64)nasid_mask << nasid_shift, nasid_msb, nasid_shift, system_size, sharing_size, coher, region_size); diff --git a/arch/m32r/kernel/sys_m32r.c b/arch/m32r/kernel/sys_m32r.c index 670cb49..11412c0 100644 --- a/arch/m32r/kernel/sys_m32r.c +++ b/arch/m32r/kernel/sys_m32r.c @@ -206,7 +206,7 @@ asmlinkage int sys_uname(struct old_utsn if (!name) return -EFAULT; down_read(&uts_sem); - err=copy_to_user(name, &system_utsname, sizeof (*name)); + err=copy_to_user(name, utsname(), sizeof (*name)); up_read(&uts_sem); return err?-EFAULT:0; } diff --git a/arch/mips/kernel/linux32.c b/arch/mips/kernel/linux32.c index 3f40c37..b9b702f 100644 --- a/arch/mips/kernel/linux32.c +++ b/arch/mips/kernel/linux32.c @@ -1100,7 +1100,7 @@ asmlinkage long sys32_newuname(struct ne int ret = 0; down_read(&uts_sem); - if (copy_to_user(name,&system_utsname,sizeof *name)) + if (copy_to_user(name,utsname(),sizeof *name)) ret = -EFAULT; up_read(&uts_sem); diff --git a/arch/mips/kernel/syscall.c b/arch/mips/kernel/syscall.c index 2aeaa2f..8b13d57 100644 --- a/arch/mips/kernel/syscall.c +++ b/arch/mips/kernel/syscall.c @@ -232,7 +232,7 @@ out: */ asmlinkage int sys_uname(struct old_utsname __user * name) { - if (name && !copy_to_user(name, &system_utsname, sizeof (*name))) + if (name && !copy_to_user(name, utsname(), sizeof (*name))) return 0; return -EFAULT; } @@ -249,15 +249,15 @@ asmlinkage int sys_olduname(struct oldol if (!access_ok(VERIFY_WRITE,name,sizeof(struct oldold_utsname))) return -EFAULT; - error = __copy_to_user(&name->sysname,&system_utsname.sysname,__OLD_UTS_LEN); + error = __copy_to_user(&name->sysname,&utsname()->sysname,__OLD_UTS_LEN); error -= __put_user(0,name->sysname+__OLD_UTS_LEN); - error -= __copy_to_user(&name->nodename,&system_utsname.nodename,__OLD_UTS_LEN); + error -= __copy_to_user(&name->nodename,&utsname()->nodename,__OLD_UTS_LEN); error -= __put_user(0,name->nodename+__OLD_UTS_LEN); - error -= __copy_to_user(&name->release,&system_utsname.release,__OLD_UTS_LEN); + error -= __copy_to_user(&name->release,&utsname()->release,__OLD_UTS_LEN); error -= __put_user(0,name->release+__OLD_UTS_LEN); - error -= __copy_to_user(&name->version,&system_utsname.version,__OLD_UTS_LEN); + error -= __copy_to_user(&name->version,&utsname()->version,__OLD_UTS_LEN); error -= __put_user(0,name->version+__OLD_UTS_LEN); - error -= __copy_to_user(&name->machine,&system_utsname.machine,__OLD_UTS_LEN); + error -= __copy_to_user(&name->machine,&utsname()->machine,__OLD_UTS_LEN); error = __put_user(0,name->machine+__OLD_UTS_LEN); error = error ? -EFAULT : 0; @@ -293,10 +293,10 @@ asmlinkage int _sys_sysmips(int cmd, lon return -EFAULT; down_write(&uts_sem); - strncpy(system_utsname.nodename, nodename, len); + strncpy(utsname()->nodename, nodename, len); nodename[__NEW_UTS_LEN] = '\0'; - strlcpy(system_utsname.nodename, nodename, - sizeof(system_utsname.nodename)); + strlcpy(utsname()->nodename, nodename, + sizeof(utsname()->nodename)); up_write(&uts_sem); return 0; } diff --git a/arch/mips/kernel/sysirix.c b/arch/mips/kernel/sysirix.c index 5407b78..1b4e7e7 100644 --- a/arch/mips/kernel/sysirix.c +++ b/arch/mips/kernel/sysirix.c @@ -884,7 +884,7 @@ asmlinkage int irix_getdomainname(char _ down_read(&uts_sem); if (len > __NEW_UTS_LEN) len = __NEW_UTS_LEN; - err = copy_to_user(name, system_utsname.domainname, len) ? -EFAULT : 0; + err = copy_to_user(name, utsname()->domainname, len) ? -EFAULT : 0; up_read(&uts_sem); return err; @@ -1127,11 +1127,11 @@ struct iuname { asmlinkage int irix_uname(struct iuname __user *buf) { down_read(&uts_sem); - if (copy_from_user(system_utsname.sysname, buf->sysname, 65) - || copy_from_user(system_utsname.nodename, buf->nodename, 65) - || copy_from_user(system_utsname.release, buf->release, 65) - || copy_from_user(system_utsname.version, buf->version, 65) - || copy_from_user(system_utsname.machine, buf->machine, 65)) { + if (copy_from_user(utsname()->sysname, buf->sysname, 65) + || copy_from_user(utsname()->nodename, buf->nodename, 65) + || copy_from_user(utsname()->release, buf->release, 65) + || copy_from_user(utsname()->version, buf->version, 65) + || copy_from_user(utsname()->machine, buf->machine, 65)) { return -EFAULT; } up_read(&uts_sem); diff --git a/arch/parisc/hpux/sys_hpux.c b/arch/parisc/hpux/sys_hpux.c index 05273cc..9fc2c08 100644 --- a/arch/parisc/hpux/sys_hpux.c +++ b/arch/parisc/hpux/sys_hpux.c @@ -266,15 +266,15 @@ static int hpux_uname(struct hpux_utsnam down_read(&uts_sem); - error = __copy_to_user(&name->sysname,&system_utsname.sysname,HPUX_UTSLEN-1); + error = __copy_to_user(&name->sysname,&utsname()->sysname,HPUX_UTSLEN-1); error |= __put_user(0,name->sysname+HPUX_UTSLEN-1); - error |= __copy_to_user(&name->nodename,&system_utsname.nodename,HPUX_UTSLEN-1); + error |= __copy_to_user(&name->nodename,&utsname()->nodename,HPUX_UTSLEN-1); error |= __put_user(0,name->nodename+HPUX_UTSLEN-1); - error |= __copy_to_user(&name->release,&system_utsname.release,HPUX_UTSLEN-1); + error |= __copy_to_user(&name->release,&utsname()->release,HPUX_UTSLEN-1); error |= __put_user(0,name->release+HPUX_UTSLEN-1); - error |= __copy_to_user(&name->version,&system_utsname.version,HPUX_UTSLEN-1); + error |= __copy_to_user(&name->version,&utsname()->version,HPUX_UTSLEN-1); error |= __put_user(0,name->version+HPUX_UTSLEN-1); - error |= __copy_to_user(&name->machine,&system_utsname.machine,HPUX_UTSLEN-1); + error |= __copy_to_user(&name->machine,&utsname()->machine,HPUX_UTSLEN-1); error |= __put_user(0,name->machine+HPUX_UTSLEN-1); up_read(&uts_sem); @@ -373,8 +373,8 @@ int hpux_utssys(char *ubuf, int n, int t /* TODO: print a warning about using this? */ down_write(&uts_sem); error = -EFAULT; - if (!copy_from_user(system_utsname.sysname, ubuf, len)) { - system_utsname.sysname[len] = 0; + if (!copy_from_user(utsname()->sysname, ubuf, len)) { + utsname()->sysname[len] = 0; error = 0; } up_write(&uts_sem); @@ -400,8 +400,8 @@ int hpux_utssys(char *ubuf, int n, int t /* TODO: print a warning about this? */ down_write(&uts_sem); error = -EFAULT; - if (!copy_from_user(system_utsname.release, ubuf, len)) { - system_utsname.release[len] = 0; + if (!copy_from_user(utsname()->release, ubuf, len)) { + utsname()->release[len] = 0; error = 0; } up_write(&uts_sem); @@ -422,13 +422,13 @@ int hpux_getdomainname(char *name, int l down_read(&uts_sem); - nlen = strlen(system_utsname.domainname) + 1; + nlen = strlen(utsname()->domainname) + 1; if (nlen < len) len = nlen; if(len > __NEW_UTS_LEN) goto done; - if(copy_to_user(name, system_utsname.domainname, len)) + if(copy_to_user(name, utsname()->domainname, len)) goto done; err = 0; done: diff --git a/arch/powerpc/kernel/syscalls.c b/arch/powerpc/kernel/syscalls.c index 9b69d99..d358866 100644 --- a/arch/powerpc/kernel/syscalls.c +++ b/arch/powerpc/kernel/syscalls.c @@ -260,7 +260,7 @@ long ppc_newuname(struct new_utsname __u int err = 0; down_read(&uts_sem); - if (copy_to_user(name, &system_utsname, sizeof(*name))) + if (copy_to_user(name, utsname(), sizeof(*name))) err = -EFAULT; up_read(&uts_sem); if (!err) @@ -273,7 +273,7 @@ int sys_uname(struct old_utsname __user int err = 0; down_read(&uts_sem); - if (copy_to_user(name, &system_utsname, sizeof(*name))) + if (copy_to_user(name, utsname(), sizeof(*name))) err = -EFAULT; up_read(&uts_sem); if (!err) @@ -289,19 +289,19 @@ int sys_olduname(struct oldold_utsname _ return -EFAULT; down_read(&uts_sem); - error = __copy_to_user(&name->sysname, &system_utsname.sysname, + error = __copy_to_user(&name->sysname, &utsname()->sysname, __OLD_UTS_LEN); error |= __put_user(0, name->sysname + __OLD_UTS_LEN); - error |= __copy_to_user(&name->nodename, &system_utsname.nodename, + error |= __copy_to_user(&name->nodename, &utsname()->nodename, __OLD_UTS_LEN); error |= __put_user(0, name->nodename + __OLD_UTS_LEN); - error |= __copy_to_user(&name->release, &system_utsname.release, + error |= __copy_to_user(&name->release, &utsname()->release, __OLD_UTS_LEN); error |= __put_user(0, name->release + __OLD_UTS_LEN); - error |= __copy_to_user(&name->version, &system_utsname.version, + error |= __copy_to_user(&name->version, &utsname()->version, __OLD_UTS_LEN); error |= __put_user(0, name->version + __OLD_UTS_LEN); - error |= __copy_to_user(&name->machine, &system_utsname.machine, + error |= __copy_to_user(&name->machine, &utsname()->machine, __OLD_UTS_LEN); error |= override_machine(name->machine); up_read(&uts_sem); diff --git a/arch/sh/kernel/sys_sh.c b/arch/sh/kernel/sys_sh.c index 917b2f3..e4966b2 100644 --- a/arch/sh/kernel/sys_sh.c +++ b/arch/sh/kernel/sys_sh.c @@ -267,7 +267,7 @@ asmlinkage int sys_uname(struct old_utsn if (!name) return -EFAULT; down_read(&uts_sem); - err=copy_to_user(name, &system_utsname, sizeof (*name)); + err=copy_to_user(name, utsname(), sizeof (*name)); up_read(&uts_sem); return err?-EFAULT:0; } diff --git a/arch/sh64/kernel/sys_sh64.c b/arch/sh64/kernel/sys_sh64.c index 58ff7d5..a8dc88c 100644 --- a/arch/sh64/kernel/sys_sh64.c +++ b/arch/sh64/kernel/sys_sh64.c @@ -279,7 +279,7 @@ asmlinkage int sys_uname(struct old_utsn if (!name) return -EFAULT; down_read(&uts_sem); - err=copy_to_user(name, &system_utsname, sizeof (*name)); + err=copy_to_user(name, utsname(), sizeof (*name)); up_read(&uts_sem); return err?-EFAULT:0; } diff --git a/arch/sparc/kernel/sys_sparc.c b/arch/sparc/kernel/sys_sparc.c index 0cdfc9d..c8ad73c 100644 --- a/arch/sparc/kernel/sys_sparc.c +++ b/arch/sparc/kernel/sys_sparc.c @@ -470,13 +470,13 @@ asmlinkage int sys_getdomainname(char __ down_read(&uts_sem); - nlen = strlen(system_utsname.domainname) + 1; + nlen = strlen(utsname()->domainname) + 1; if (nlen < len) len = nlen; if (len > __NEW_UTS_LEN) goto done; - if (copy_to_user(name, system_utsname.domainname, len)) + if (copy_to_user(name, utsname()->domainname, len)) goto done; err = 0; done: diff --git a/arch/sparc/kernel/sys_sunos.c b/arch/sparc/kernel/sys_sunos.c index 288de27..9f9206f 100644 --- a/arch/sparc/kernel/sys_sunos.c +++ b/arch/sparc/kernel/sys_sunos.c @@ -483,13 +483,13 @@ asmlinkage int sunos_uname(struct sunos_ { int ret; down_read(&uts_sem); - ret = copy_to_user(&name->sname[0], &system_utsname.sysname[0], sizeof(name->sname) - 1); + ret = copy_to_user(&name->sname[0], &utsname()->sysname[0], sizeof(name->sname) - 1); if (!ret) { - ret |= __copy_to_user(&name->nname[0], &system_utsname.nodename[0], sizeof(name->nname) - 1); + ret |= __copy_to_user(&name->nname[0], &utsname()->nodename[0], sizeof(name->nname) - 1); ret |= __put_user('\0', &name->nname[8]); - ret |= __copy_to_user(&name->rel[0], &system_utsname.release[0], sizeof(name->rel) - 1); - ret |= __copy_to_user(&name->ver[0], &system_utsname.version[0], sizeof(name->ver) - 1); - ret |= __copy_to_user(&name->mach[0], &system_utsname.machine[0], sizeof(name->mach) - 1); + ret |= __copy_to_user(&name->rel[0], &utsname()->release[0], sizeof(name->rel) - 1); + ret |= __copy_to_user(&name->ver[0], &utsname()->version[0], sizeof(name->ver) - 1); + ret |= __copy_to_user(&name->mach[0], &utsname()->machine[0], sizeof(name->mach) - 1); } up_read(&uts_sem); return ret ? -EFAULT : 0; diff --git a/arch/sparc64/kernel/sys_sparc.c b/arch/sparc64/kernel/sys_sparc.c index 7a86913..0453bd2 100644 --- a/arch/sparc64/kernel/sys_sparc.c +++ b/arch/sparc64/kernel/sys_sparc.c @@ -707,13 +707,13 @@ asmlinkage long sys_getdomainname(char _ down_read(&uts_sem); - nlen = strlen(system_utsname.domainname) + 1; + nlen = strlen(utsname()->domainname) + 1; if (nlen < len) len = nlen; if (len > __NEW_UTS_LEN) goto done; - if (copy_to_user(name, system_utsname.domainname, len)) + if (copy_to_user(name, utsname()->domainname, len)) goto done; err = 0; done: diff --git a/arch/sparc64/kernel/sys_sunos32.c b/arch/sparc64/kernel/sys_sunos32.c index ae5b32f..ba98c47 100644 --- a/arch/sparc64/kernel/sys_sunos32.c +++ b/arch/sparc64/kernel/sys_sunos32.c @@ -439,16 +439,16 @@ asmlinkage int sunos_uname(struct sunos_ int ret; down_read(&uts_sem); - ret = copy_to_user(&name->sname[0], &system_utsname.sysname[0], + ret = copy_to_user(&name->sname[0], &utsname()->sysname[0], sizeof(name->sname) - 1); - ret |= copy_to_user(&name->nname[0], &system_utsname.nodename[0], + ret |= copy_to_user(&name->nname[0], &utsname()->nodename[0], sizeof(name->nname) - 1); ret |= put_user('\0', &name->nname[8]); - ret |= copy_to_user(&name->rel[0], &system_utsname.release[0], + ret |= copy_to_user(&name->rel[0], &utsname()->release[0], sizeof(name->rel) - 1); - ret |= copy_to_user(&name->ver[0], &system_utsname.version[0], + ret |= copy_to_user(&name->ver[0], &utsname()->version[0], sizeof(name->ver) - 1); - ret |= copy_to_user(&name->mach[0], &system_utsname.machine[0], + ret |= copy_to_user(&name->mach[0], &utsname()->machine[0], sizeof(name->mach) - 1); up_read(&uts_sem); return (ret ? -EFAULT : 0); diff --git a/arch/sparc64/solaris/misc.c b/arch/sparc64/solaris/misc.c index 5284996..5d0162a 100644 --- a/arch/sparc64/solaris/misc.c +++ b/arch/sparc64/solaris/misc.c @@ -239,7 +239,7 @@ asmlinkage int solaris_utssys(u32 buf, u /* Let's cheat */ err = set_utsfield(v->sysname, "SunOS", 1, 0); down_read(&uts_sem); - err |= set_utsfield(v->nodename, system_utsname.nodename, + err |= set_utsfield(v->nodename, utsname()->nodename, 1, 1); up_read(&uts_sem); err |= set_utsfield(v->release, "2.6", 0, 0); @@ -263,7 +263,7 @@ asmlinkage int solaris_utsname(u32 buf) /* Why should we not lie a bit? */ down_read(&uts_sem); err = set_utsfield(v->sysname, "SunOS", 0, 0); - err |= set_utsfield(v->nodename, system_utsname.nodename, 1, 1); + err |= set_utsfield(v->nodename, utsname()->nodename, 1, 1); err |= set_utsfield(v->release, "5.6", 0, 0); err |= set_utsfield(v->version, "Generic", 0, 0); err |= set_utsfield(v->machine, machine(), 0, 0); @@ -295,7 +295,7 @@ asmlinkage int solaris_sysinfo(int cmd, case SI_HOSTNAME: r = buffer + 256; down_read(&uts_sem); - for (p = system_utsname.nodename, q = buffer; + for (p = utsname()->nodename, q = buffer; q < r && *p && *p != '.'; *q++ = *p++); up_read(&uts_sem); *q = 0; diff --git a/arch/um/drivers/mconsole_kern.c b/arch/um/drivers/mconsole_kern.c index 28e3760..5f87323 100644 --- a/arch/um/drivers/mconsole_kern.c +++ b/arch/um/drivers/mconsole_kern.c @@ -106,9 +106,9 @@ void mconsole_version(struct mc_request { char version[256]; - sprintf(version, "%s %s %s %s %s", system_utsname.sysname, - system_utsname.nodename, system_utsname.release, - system_utsname.version, system_utsname.machine); + sprintf(version, "%s %s %s %s %s", utsname()->sysname, + utsname()->nodename, utsname()->release, + utsname()->version, utsname()->machine); mconsole_reply(req, version, 0, 0); } diff --git a/arch/um/kernel/syscall_kern.c b/arch/um/kernel/syscall_kern.c index 37d3978..d90e9ed 100644 --- a/arch/um/kernel/syscall_kern.c +++ b/arch/um/kernel/syscall_kern.c @@ -110,7 +110,7 @@ long sys_uname(struct old_utsname __user if (!name) return -EFAULT; down_read(&uts_sem); - err=copy_to_user(name, &system_utsname, sizeof (*name)); + err=copy_to_user(name, utsname(), sizeof (*name)); up_read(&uts_sem); return err?-EFAULT:0; } @@ -126,19 +126,19 @@ long sys_olduname(struct oldold_utsname down_read(&uts_sem); - error = __copy_to_user(&name->sysname,&system_utsname.sysname, + error = __copy_to_user(&name->sysname,&utsname()->sysname, __OLD_UTS_LEN); error |= __put_user(0,name->sysname+__OLD_UTS_LEN); - error |= __copy_to_user(&name->nodename,&system_utsname.nodename, + error |= __copy_to_user(&name->nodename,&utsname()->nodename, __OLD_UTS_LEN); error |= __put_user(0,name->nodename+__OLD_UTS_LEN); - error |= __copy_to_user(&name->release,&system_utsname.release, + error |= __copy_to_user(&name->release,&utsname()->release, __OLD_UTS_LEN); error |= __put_user(0,name->release+__OLD_UTS_LEN); - error |= __copy_to_user(&name->version,&system_utsname.version, + error |= __copy_to_user(&name->version,&utsname()->version, __OLD_UTS_LEN); error |= __put_user(0,name->version+__OLD_UTS_LEN); - error |= __copy_to_user(&name->machine,&system_utsname.machine, + error |= __copy_to_user(&name->machine,&utsname()->machine, __OLD_UTS_LEN); error |= __put_user(0,name->machine+__OLD_UTS_LEN); diff --git a/arch/um/sys-x86_64/syscalls.c b/arch/um/sys-x86_64/syscalls.c index 6acee5c..3ad014e 100644 --- a/arch/um/sys-x86_64/syscalls.c +++ b/arch/um/sys-x86_64/syscalls.c @@ -21,7 +21,7 @@ asmlinkage long sys_uname64(struct new_u { int err; down_read(&uts_sem); - err = copy_to_user(name, &system_utsname, sizeof (*name)); + err = copy_to_user(name, utsname(), sizeof (*name)); up_read(&uts_sem); if (personality(current->personality) == PER_LINUX32) err |= copy_to_user(&name->machine, "i686", 5); diff --git a/arch/x86_64/ia32/sys_ia32.c b/arch/x86_64/ia32/sys_ia32.c index f182b20..6e0a19d 100644 --- a/arch/x86_64/ia32/sys_ia32.c +++ b/arch/x86_64/ia32/sys_ia32.c @@ -801,13 +801,13 @@ asmlinkage long sys32_olduname(struct ol down_read(&uts_sem); - error = __copy_to_user(&name->sysname,&system_utsname.sysname,__OLD_UTS_LEN); + error = __copy_to_user(&name->sysname,&utsname()->sysname,__OLD_UTS_LEN); __put_user(0,name->sysname+__OLD_UTS_LEN); - __copy_to_user(&name->nodename,&system_utsname.nodename,__OLD_UTS_LEN); + __copy_to_user(&name->nodename,&utsname()->nodename,__OLD_UTS_LEN); __put_user(0,name->nodename+__OLD_UTS_LEN); - __copy_to_user(&name->release,&system_utsname.release,__OLD_UTS_LEN); + __copy_to_user(&name->release,&utsname()->release,__OLD_UTS_LEN); __put_user(0,name->release+__OLD_UTS_LEN); - __copy_to_user(&name->version,&system_utsname.version,__OLD_UTS_LEN); + __copy_to_user(&name->version,&utsname()->version,__OLD_UTS_LEN); __put_user(0,name->version+__OLD_UTS_LEN); { char *arch = "x86_64"; @@ -830,7 +830,7 @@ long sys32_uname(struct old_utsname __us if (!name) return -EFAULT; down_read(&uts_sem); - err=copy_to_user(name, &system_utsname, sizeof (*name)); + err=copy_to_user(name, utsname(), sizeof (*name)); up_read(&uts_sem); if (personality(current->personality) == PER_LINUX32) err |= copy_to_user(&name->machine, "i686", 5); diff --git a/arch/x86_64/kernel/sys_x86_64.c b/arch/x86_64/kernel/sys_x86_64.c index 6449ea8..76bf7c2 100644 --- a/arch/x86_64/kernel/sys_x86_64.c +++ b/arch/x86_64/kernel/sys_x86_64.c @@ -148,7 +148,7 @@ asmlinkage long sys_uname(struct new_uts { int err; down_read(&uts_sem); - err = copy_to_user(name, &system_utsname, sizeof (*name)); + err = copy_to_user(name, utsname(), sizeof (*name)); up_read(&uts_sem); if (personality(current->personality) == PER_LINUX32) err |= copy_to_user(&name->machine, "i686", 5); diff --git a/arch/xtensa/kernel/syscalls.c b/arch/xtensa/kernel/syscalls.c index f20c649..30060c1 100644 --- a/arch/xtensa/kernel/syscalls.c +++ b/arch/xtensa/kernel/syscalls.c @@ -129,7 +129,7 @@ out: int sys_uname(struct old_utsname * name) { - if (name && !copy_to_user(name, &system_utsname, sizeof (*name))) + if (name && !copy_to_user(name, utsname(), sizeof (*name))) return 0; return -EFAULT; } diff --git a/drivers/char/random.c b/drivers/char/random.c index 86be04b..ec4c11d 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c @@ -888,8 +888,8 @@ static void init_std_data(struct entropy do_gettimeofday(&tv); add_entropy_words(r, (__u32 *)&tv, sizeof(tv)/4); - add_entropy_words(r, (__u32 *)&system_utsname, - sizeof(system_utsname)/4); + add_entropy_words(r, (__u32 *)utsname(), + sizeof(*(utsname()))/4); } static int __init rand_initialize(void) diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 0b86d5c..852ff41 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c @@ -765,12 +765,12 @@ cifs_parse_mount_options(char *options, separator[1] = 0; memset(vol->source_rfc1001_name,0x20,15); - for(i=0;i < strnlen(system_utsname.nodename,15);i++) { + for(i=0;i < strnlen(utsname()->nodename,15);i++) { /* does not have to be a perfect mapping since the field is informational, only used for servers that do not support port 445 and it can be overridden at mount time */ vol->source_rfc1001_name[i] = - toupper(system_utsname.nodename[i]); + toupper(utsname()->nodename[i]); } vol->source_rfc1001_name[15] = 0; /* null target name indicates to use *SMBSERVR default called name @@ -2077,7 +2077,7 @@ CIFSSessSetup(unsigned int xid, struct c 32, nls_codepage); bcc_ptr += 2 * bytes_returned; bytes_returned = - cifs_strtoUCS((__le16 *) bcc_ptr, system_utsname.release, + cifs_strtoUCS((__le16 *) bcc_ptr, utsname()->release, 32, nls_codepage); bcc_ptr += 2 * bytes_returned; bcc_ptr += 2; @@ -2104,8 +2104,8 @@ CIFSSessSetup(unsigned int xid, struct c } strcpy(bcc_ptr, "Linux version "); bcc_ptr += strlen("Linux version "); - strcpy(bcc_ptr, system_utsname.release); - bcc_ptr += strlen(system_utsname.release) + 1; + strcpy(bcc_ptr, utsname()->release); + bcc_ptr += strlen(utsname()->release) + 1; strcpy(bcc_ptr, CIFS_NETWORK_OPSYS); bcc_ptr += strlen(CIFS_NETWORK_OPSYS) + 1; } @@ -2346,7 +2346,7 @@ CIFSSpnegoSessSetup(unsigned int xid, st 32, nls_codepage); bcc_ptr += 2 * bytes_returned; bytes_returned = - cifs_strtoUCS((__le16 *) bcc_ptr, system_utsname.release, 32, + cifs_strtoUCS((__le16 *) bcc_ptr, utsname()->release, 32, nls_codepage); bcc_ptr += 2 * bytes_returned; bcc_ptr += 2; @@ -2371,8 +2371,8 @@ CIFSSpnegoSessSetup(unsigned int xid, st } strcpy(bcc_ptr, "Linux version "); bcc_ptr += strlen("Linux version "); - strcpy(bcc_ptr, system_utsname.release); - bcc_ptr += strlen(system_utsname.release) + 1; + strcpy(bcc_ptr, utsname()->release); + bcc_ptr += strlen(utsname()->release) + 1; strcpy(bcc_ptr, CIFS_NETWORK_OPSYS); bcc_ptr += strlen(CIFS_NETWORK_OPSYS) + 1; } @@ -2622,7 +2622,7 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned i 32, nls_codepage); bcc_ptr += 2 * bytes_returned; bytes_returned = - cifs_strtoUCS((__le16 *) bcc_ptr, system_utsname.release, 32, + cifs_strtoUCS((__le16 *) bcc_ptr, utsname()->release, 32, nls_codepage); bcc_ptr += 2 * bytes_returned; bcc_ptr += 2; /* null terminate Linux version */ @@ -2639,8 +2639,8 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned i } else { /* ASCII */ strcpy(bcc_ptr, "Linux version "); bcc_ptr += strlen("Linux version "); - strcpy(bcc_ptr, system_utsname.release); - bcc_ptr += strlen(system_utsname.release) + 1; + strcpy(bcc_ptr, utsname()->release); + bcc_ptr += strlen(utsname()->release) + 1; strcpy(bcc_ptr, CIFS_NETWORK_OPSYS); bcc_ptr += strlen(CIFS_NETWORK_OPSYS) + 1; bcc_ptr++; /* empty domain field */ @@ -3001,7 +3001,7 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xi 32, nls_codepage); bcc_ptr += 2 * bytes_returned; bytes_returned = - cifs_strtoUCS((__le16 *) bcc_ptr, system_utsname.release, 32, + cifs_strtoUCS((__le16 *) bcc_ptr, utsname()->release, 32, nls_codepage); bcc_ptr += 2 * bytes_returned; bcc_ptr += 2; /* null term version string */ @@ -3053,8 +3053,8 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xi strcpy(bcc_ptr, "Linux version "); bcc_ptr += strlen("Linux version "); - strcpy(bcc_ptr, system_utsname.release); - bcc_ptr += strlen(system_utsname.release) + 1; + strcpy(bcc_ptr, utsname()->release); + bcc_ptr += strlen(utsname()->release) + 1; strcpy(bcc_ptr, CIFS_NETWORK_OPSYS); bcc_ptr += strlen(CIFS_NETWORK_OPSYS) + 1; bcc_ptr++; /* null domain */ diff --git a/fs/exec.c b/fs/exec.c index 0291a68..d881479 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -1347,7 +1347,7 @@ static void format_corename(char *corena case 'h': down_read(&uts_sem); rc = snprintf(out_ptr, out_end - out_ptr, - "%s", system_utsname.nodename); + "%s", utsname()->nodename); up_read(&uts_sem); if (rc > out_end - out_ptr) goto out; diff --git a/fs/lockd/clntproc.c b/fs/lockd/clntproc.c index f96e381..915e596 100644 --- a/fs/lockd/clntproc.c +++ b/fs/lockd/clntproc.c @@ -130,11 +130,11 @@ static void nlmclnt_setlockargs(struct n nlmclnt_next_cookie(&argp->cookie); argp->state = nsm_local_state; memcpy(&lock->fh, NFS_FH(fl->fl_file->f_dentry->d_inode), sizeof(struct nfs_fh)); - lock->caller = system_utsname.nodename; + lock->caller = utsname()->nodename; lock->oh.data = req->a_owner; lock->oh.len = snprintf(req->a_owner, sizeof(req->a_owner), "%u@%s", (unsigned int)fl->fl_u.nfs_fl.owner->pid, - system_utsname.nodename); + utsname()->nodename); lock->svid = fl->fl_u.nfs_fl.owner->pid; lock->fl.fl_start = fl->fl_start; lock->fl.fl_end = fl->fl_end; diff --git a/fs/lockd/mon.c b/fs/lockd/mon.c index 3fc683f..547aaa3 100644 --- a/fs/lockd/mon.c +++ b/fs/lockd/mon.c @@ -152,7 +152,7 @@ xdr_encode_common(struct rpc_rqst *rqstp */ sprintf(buffer, "%u.%u.%u.%u", NIPQUAD(argp->addr)); if (!(p = xdr_encode_string(p, buffer)) - || !(p = xdr_encode_string(p, system_utsname.nodename))) + || !(p = xdr_encode_string(p, utsname()->nodename))) return ERR_PTR(-EIO); *p++ = htonl(argp->prog); *p++ = htonl(argp->vers); diff --git a/fs/lockd/svclock.c b/fs/lockd/svclock.c index d2b66ba..61b4791 100644 --- a/fs/lockd/svclock.c +++ b/fs/lockd/svclock.c @@ -326,7 +326,7 @@ static int nlmsvc_setgrantargs(struct nl { locks_copy_lock(&call->a_args.lock.fl, &lock->fl); memcpy(&call->a_args.lock.fh, &lock->fh, sizeof(call->a_args.lock.fh)); - call->a_args.lock.caller = system_utsname.nodename; + call->a_args.lock.caller = utsname()->nodename; call->a_args.lock.oh.len = lock->oh.len; /* set default data area */ diff --git a/fs/lockd/xdr.c b/fs/lockd/xdr.c index f22a376..4eec051 100644 --- a/fs/lockd/xdr.c +++ b/fs/lockd/xdr.c @@ -516,7 +516,7 @@ nlmclt_decode_res(struct rpc_rqst *req, */ #define NLM_void_sz 0 #define NLM_cookie_sz 1+XDR_QUADLEN(NLM_MAXCOOKIELEN) -#define NLM_caller_sz 1+XDR_QUADLEN(sizeof(system_utsname.nodename)) +#define NLM_caller_sz 1+XDR_QUADLEN(sizeof(utsname()->nodename)) #define NLM_netobj_sz 1+XDR_QUADLEN(XDR_MAX_NETOBJ) /* #define NLM_owner_sz 1+XDR_QUADLEN(NLM_MAXOWNER) */ #define NLM_fhandle_sz 1+XDR_QUADLEN(NFS2_FHSIZE) diff --git a/fs/nfs/nfsroot.c b/fs/nfs/nfsroot.c index c0a754e..1d656a6 100644 --- a/fs/nfs/nfsroot.c +++ b/fs/nfs/nfsroot.c @@ -312,7 +312,7 @@ static int __init root_nfs_name(char *na /* Override them by options set on kernel command-line */ root_nfs_parse(name, buf); - cp = system_utsname.nodename; + cp = utsname()->nodename; if (strlen(buf) + strlen(cp) > NFS_MAXPATHLEN) { printk(KERN_ERR "Root-NFS: Pathname for remote directory too long.\n"); return -1; diff --git a/include/asm-i386/elf.h b/include/asm-i386/elf.h index 4153d80..1b06c44 100644 --- a/include/asm-i386/elf.h +++ b/include/asm-i386/elf.h @@ -108,7 +108,7 @@ typedef struct user_fxsr_struct elf_fpxr For the moment, we have only optimizations for the Intel generations, but that could change... */ -#define ELF_PLATFORM (system_utsname.machine) +#define ELF_PLATFORM (utsname()->machine) #ifdef __KERNEL__ #define SET_PERSONALITY(ex, ibcs2) do { } while (0) diff --git a/include/linux/lockd/lockd.h b/include/linux/lockd/lockd.h index 995f89d..ac15b87 100644 --- a/include/linux/lockd/lockd.h +++ b/include/linux/lockd/lockd.h @@ -80,7 +80,7 @@ struct nlm_wait; /* * Memory chunk for NLM client RPC request. */ -#define NLMCLNT_OHSIZE (sizeof(system_utsname.nodename)+10) +#define NLMCLNT_OHSIZE (sizeof(utsname()->nodename)+10) struct nlm_rqst { unsigned int a_flags; /* initial RPC task flags */ struct nlm_host * a_host; /* host handle */ diff --git a/kernel/sys.c b/kernel/sys.c index 0b6ec0e..bcaa48e 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -1671,7 +1671,7 @@ asmlinkage long sys_newuname(struct new_ int errno = 0; down_read(&uts_sem); - if (copy_to_user(name,&system_utsname,sizeof *name)) + if (copy_to_user(name,utsname(),sizeof *name)) errno = -EFAULT; up_read(&uts_sem); return errno; @@ -1689,8 +1689,8 @@ asmlinkage long sys_sethostname(char __u down_write(&uts_sem); errno = -EFAULT; if (!copy_from_user(tmp, name, len)) { - memcpy(system_utsname.nodename, tmp, len); - system_utsname.nodename[len] = 0; + memcpy(utsname()->nodename, tmp, len); + utsname()->nodename[len] = 0; errno = 0; } up_write(&uts_sem); @@ -1706,11 +1706,11 @@ asmlinkage long sys_gethostname(char __u if (len < 0) return -EINVAL; down_read(&uts_sem); - i = 1 + strlen(system_utsname.nodename); + i = 1 + strlen(utsname()->nodename); if (i > len) i = len; errno = 0; - if (copy_to_user(name, system_utsname.nodename, i)) + if (copy_to_user(name, utsname()->nodename, i)) errno = -EFAULT; up_read(&uts_sem); return errno; @@ -1735,8 +1735,8 @@ asmlinkage long sys_setdomainname(char _ down_write(&uts_sem); errno = -EFAULT; if (!copy_from_user(tmp, name, len)) { - memcpy(system_utsname.domainname, tmp, len); - system_utsname.domainname[len] = 0; + memcpy(utsname()->domainname, tmp, len); + utsname()->domainname[len] = 0; errno = 0; } up_write(&uts_sem); diff --git a/net/ipv4/ipconfig.c b/net/ipv4/ipconfig.c index cb8a92f..b9bdf0f 100644 --- a/net/ipv4/ipconfig.c +++ b/net/ipv4/ipconfig.c @@ -806,7 +806,7 @@ static void __init ic_do_bootp_ext(u8 *e } break; case 12: /* Host name */ - ic_bootp_string(system_utsname.nodename, ext+1, *ext, __NEW_UTS_LEN); + ic_bootp_string(utsname()->nodename, ext+1, *ext, __NEW_UTS_LEN); ic_host_name_set = 1; break; case 15: /* Domain name (DNS) */ @@ -817,7 +817,7 @@ static void __init ic_do_bootp_ext(u8 *e ic_bootp_string(root_server_path, ext+1, *ext, sizeof(root_server_path)); break; case 40: /* NIS Domain name (_not_ DNS) */ - ic_bootp_string(system_utsname.domainname, ext+1, *ext, __NEW_UTS_LEN); + ic_bootp_string(utsname()->domainname, ext+1, *ext, __NEW_UTS_LEN); break; } } @@ -1369,7 +1369,7 @@ static int __init ip_auto_config(void) printk(", mask=%u.%u.%u.%u", NIPQUAD(ic_netmask)); printk(", gw=%u.%u.%u.%u", NIPQUAD(ic_gateway)); printk(",\n host=%s, domain=%s, nis-domain=%s", - system_utsname.nodename, ic_domain, system_utsname.domainname); + utsname()->nodename, ic_domain, utsname()->domainname); printk(",\n bootserver=%u.%u.%u.%u", NIPQUAD(ic_servaddr)); printk(", rootserver=%u.%u.%u.%u", NIPQUAD(root_server_addr)); printk(", rootpath=%s", root_server_path); @@ -1479,11 +1479,11 @@ static int __init ip_auto_config_setup(c case 4: if ((dp = strchr(ip, '.'))) { *dp++ = '\0'; - strlcpy(system_utsname.domainname, dp, - sizeof(system_utsname.domainname)); + strlcpy(utsname()->domainname, dp, + sizeof(utsname()->domainname)); } - strlcpy(system_utsname.nodename, ip, - sizeof(system_utsname.nodename)); + strlcpy(utsname()->nodename, ip, + sizeof(utsname()->nodename)); ic_host_name_set = 1; break; case 5: diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index aa8965e..1d00e41 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c @@ -176,10 +176,10 @@ rpc_new_client(struct rpc_xprt *xprt, ch } /* save the nodename */ - clnt->cl_nodelen = strlen(system_utsname.nodename); + clnt->cl_nodelen = strlen(utsname()->nodename); if (clnt->cl_nodelen > UNX_MAXNODENAME) clnt->cl_nodelen = UNX_MAXNODENAME; - memcpy(clnt->cl_nodename, system_utsname.nodename, clnt->cl_nodelen); + memcpy(clnt->cl_nodename, utsname()->nodename, clnt->cl_nodelen); return clnt; out_no_auth: -- 1.1.6 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH 3/7] uts namespaces: use init_utsname when appropriate 2006-04-08 7:09 ` [PATCH 3/7] uts namespaces: use init_utsname when appropriate Eric W. Biederman 2006-04-08 20:27 ` Serge E. Hallyn @ 2006-04-08 23:44 ` Sam Vilain 2006-04-09 0:12 ` [Devel] " Kir Kolyshkin 1 sibling, 1 reply; 15+ messages in thread From: Sam Vilain @ 2006-04-08 23:44 UTC (permalink / raw) To: Eric W. Biederman Cc: Serge E. Hallyn, linux-kernel, Kirill Korotaev, herbert, devel, xemul, James Morris On Sat, 2006-04-08 at 01:09 -0600, Eric W. Biederman wrote: > > -#define ELF_PLATFORM (system_utsname.machine) > > +#define ELF_PLATFORM (init_utsname()->machine) > > > > #ifdef __KERNEL__ > > #define SET_PERSONALITY(ex, ibcs2) do { } while (0) > I think this one needs to be utsname()->machine. > Currently it doesn't matter. But Herbert has expressed > the desire to make a machine appear like an older one. This is extremely useful for faking it as "i386" on x86_64 systems, for instance. Sam. ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [Devel] Re: [PATCH 3/7] uts namespaces: use init_utsname when appropriate 2006-04-08 23:44 ` Sam Vilain @ 2006-04-09 0:12 ` Kir Kolyshkin 2006-04-09 9:25 ` Eric W. Biederman 0 siblings, 1 reply; 15+ messages in thread From: Kir Kolyshkin @ 2006-04-09 0:12 UTC (permalink / raw) To: devel, Sam Vilain Cc: Eric W. Biederman, linux-kernel, herbert, Serge E. Hallyn, James Morris Sam Vilain wrote: >On Sat, 2006-04-08 at 01:09 -0600, Eric W. Biederman wrote: > > >>>-#define ELF_PLATFORM (system_utsname.machine) >>>+#define ELF_PLATFORM (init_utsname()->machine) >>> >>> #ifdef __KERNEL__ >>> #define SET_PERSONALITY(ex, ibcs2) do { } while (0) >>> >>> >>I think this one needs to be utsname()->machine. >>Currently it doesn't matter. But Herbert has expressed >>the desire to make a machine appear like an older one. >> >> > >This is extremely useful for faking it as "i386" on x86_64 systems, for >instance. > > Could 'setarch' be of any help here? Works fine for us. Or am I missing something? ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [Devel] Re: [PATCH 3/7] uts namespaces: use init_utsname when appropriate 2006-04-09 0:12 ` [Devel] " Kir Kolyshkin @ 2006-04-09 9:25 ` Eric W. Biederman 0 siblings, 0 replies; 15+ messages in thread From: Eric W. Biederman @ 2006-04-09 9:25 UTC (permalink / raw) To: Kir Kolyshkin Cc: devel, Sam Vilain, linux-kernel, herbert, Serge E. Hallyn, James Morris Kir Kolyshkin <kir@openvz.org> writes: > Sam Vilain wrote: > >>On Sat, 2006-04-08 at 01:09 -0600, Eric W. Biederman wrote: >> >> >>>>-#define ELF_PLATFORM (system_utsname.machine) >>>>+#define ELF_PLATFORM (init_utsname()->machine) >>>> #ifdef __KERNEL__ >>>> #define SET_PERSONALITY(ex, ibcs2) do { } while (0) >>>> >>>> >>>I think this one needs to be utsname()->machine. >>>Currently it doesn't matter. But Herbert has expressed >>>the desire to make a machine appear like an older one. >>> >>> >> >>This is extremely useful for faking it as "i386" on x86_64 systems, for >>instance. >> >> > Could 'setarch' be of any help here? Works fine for us. Or am I missing > something? For the specific case that is clearly the better solution, as it already exists, and it handles the weird 32/64bit logic. The ELF_PLATFORM bit I was commenting on was 32bit only. I'm not ready to implement any new functionality at the moment, but what I heard suggested and was it may be reasonable to allow machine to be modified on a per uts namespace basis. If that kind of thing is ever to happen ELF_PLATFORM needs to be per uts on x86. Actually allowing modification of machine is an entirely different conversation. Eric ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 0/7] uts namespaces: Introduction [not found] <20060407234815.849357768@sergelap> [not found] ` <20060408045206.EAA8E19B8FF@sergelap.hallyn.com> @ 2006-04-10 1:15 ` Sam Vilain [not found] ` <20060408045206.EFDD819B901@sergelap.hallyn.com> 2 siblings, 0 replies; 15+ messages in thread From: Sam Vilain @ 2006-04-10 1:15 UTC (permalink / raw) To: Serge E. Hallyn Cc: linux-kernel, Kirill Korotaev, herbert, devel, Eric W. Biederman, xemul, James Morris Serge, I have just imported your series into the GIT repository where I have been collating the various recent related submissions at: git://vserver.utsl.gen.nz/vserver A summary of the submissions imported to date are at: http://www.utsl.gen.nz/gitweb/?p=vserver;a=heads I will endeavour to continue to collect and catalogue all vserver related submissions I receive, see on LKML, or get pull requests for, as a part of my efforts to merge this functionality. Sam. Serge E. Hallyn wrote: >Introduce utsname namespaces. Instead of a single system_utsname >containing hostname domainname etc, a process can request it's >copy of the uts info to be cloned. The data will be copied from >it's original, but any further changes will not be seen by processes >which are not it's children, and vice versa. > >This is useful, for instance, for vserver/openvz, which can now clone >a new uts namespace for each new virtual server. > >Aside from the debugging patch which comes last, this patchset does >not actually implement a way for processes to unshare the uts namespace. >The proper unsharing semantics are to be worked out later. > >Changes since last submission: > Restructured patchset so it compiles after each patch > Removed EXPORT_SYMBOL for unshare_uts_ns and free_uts_ns. > The former is now in the debugging pach and the latter gone > entirely, as unsharing is likely not something to be done > from modules! > >-serge > > > > ^ permalink raw reply [flat|nested] 15+ messages in thread
[parent not found: <20060408045206.EFDD819B901@sergelap.hallyn.com>]
* Re: [Devel] [PATCH 4/7] uts namespaces: implement utsname namespaces [not found] ` <20060408045206.EFDD819B901@sergelap.hallyn.com> @ 2006-04-10 16:06 ` Cedric Le Goater 2006-04-10 20:48 ` Serge E. Hallyn 0 siblings, 1 reply; 15+ messages in thread From: Cedric Le Goater @ 2006-04-10 16:06 UTC (permalink / raw) To: devel Cc: linux-kernel, Kirill Korotaev, herbert, sam, Eric W. Biederman, xemul, James Morris Serge E. Hallyn wrote: > ... > -struct new_utsname system_utsname = { > - .sysname = UTS_SYSNAME, > - .nodename = UTS_NODENAME, > - .release = UTS_RELEASE, > - .version = UTS_VERSION, > - .machine = UTS_MACHINE, > - .domainname = UTS_DOMAINNAME, > +struct uts_namespace init_uts_ns = { > + .kref = { > + .refcount = ATOMIC_INIT(2), > + }, > + .name = { > + .sysname = UTS_SYSNAME, > + .nodename = UTS_NODENAME, > + .release = UTS_RELEASE, > + .version = UTS_VERSION, > + .machine = UTS_MACHINE, > + .domainname = UTS_DOMAINNAME, > + }, > }; > > -EXPORT_SYMBOL(system_utsname); this should problably be replaced with EXPORT_SYMBOL(init_uts_ns); or export init_utsname(). C. ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [Devel] [PATCH 4/7] uts namespaces: implement utsname namespaces 2006-04-10 16:06 ` [Devel] [PATCH 4/7] uts namespaces: implement utsname namespaces Cedric Le Goater @ 2006-04-10 20:48 ` Serge E. Hallyn 0 siblings, 0 replies; 15+ messages in thread From: Serge E. Hallyn @ 2006-04-10 20:48 UTC (permalink / raw) To: Cedric Le Goater Cc: linux-kernel, Kirill Korotaev, herbert, sam, Eric W. Biederman, xemul, James Morris Quoting Cedric Le Goater (clg@fr.ibm.com): > Serge E. Hallyn wrote: > > ... > > -struct new_utsname system_utsname = { > > - .sysname = UTS_SYSNAME, > > - .nodename = UTS_NODENAME, > > - .release = UTS_RELEASE, > > - .version = UTS_VERSION, > > - .machine = UTS_MACHINE, > > - .domainname = UTS_DOMAINNAME, > > +struct uts_namespace init_uts_ns = { > > + .kref = { > > + .refcount = ATOMIC_INIT(2), > > + }, > > + .name = { > > + .sysname = UTS_SYSNAME, > > + .nodename = UTS_NODENAME, > > + .release = UTS_RELEASE, > > + .version = UTS_VERSION, > > + .machine = UTS_MACHINE, > > + .domainname = UTS_DOMAINNAME, > > + }, > > }; > > > > -EXPORT_SYMBOL(system_utsname); > > this should problably be replaced with > > EXPORT_SYMBOL(init_uts_ns); > > or export init_utsname(). True, here's an updated version of the uts_ns introduction patch. From: Serge Hallyn <serue@us.ibm.com> Subject: [PATCH 4/7] This patch defines the uts namespace and some manipulators. Adds the uts namespace to task_struct, and initializes a system-wide init namespace. It leaves a #define for system_utsname so sysctl will compile. This define will be removed in a separate patch. Changes: Export init_uts_ns. Signed-off-by: Serge E. Hallyn <serue@us.ibm.com> --- include/linux/init_task.h | 2 + include/linux/sched.h | 2 + include/linux/utsname.h | 43 +++++++++++++++++++++++++--- init/Kconfig | 8 +++++ init/version.c | 69 ++++++++++++++++++++++++++++++++++++++++----- kernel/exit.c | 2 + kernel/fork.c | 9 +++++- 7 files changed, 121 insertions(+), 14 deletions(-) 087afa02b1165104da8352cbf35512cf0c681f2f diff --git a/include/linux/init_task.h b/include/linux/init_task.h index 41ecbb8..21b1751 100644 --- a/include/linux/init_task.h +++ b/include/linux/init_task.h @@ -3,6 +3,7 @@ #include <linux/file.h> #include <linux/rcupdate.h> +#include <linux/utsname.h> #define INIT_FDTABLE \ { \ @@ -123,6 +124,7 @@ extern struct group_info init_groups; .journal_info = NULL, \ .cpu_timers = INIT_CPU_TIMERS(tsk.cpu_timers), \ .fs_excl = ATOMIC_INIT(0), \ + .uts_ns = &init_uts_ns, \ } diff --git a/include/linux/sched.h b/include/linux/sched.h index 541f482..97c7990 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -684,6 +684,7 @@ static inline void prefetch_stack(struct struct audit_context; /* See audit.c */ struct mempolicy; +struct uts_namespace; enum sleep_type { SLEEP_NORMAL, @@ -807,6 +808,7 @@ struct task_struct { struct files_struct *files; /* namespace */ struct namespace *namespace; + struct uts_namespace *uts_ns; /* signal handlers */ struct signal_struct *signal; struct sighand_struct *sighand; diff --git a/include/linux/utsname.h b/include/linux/utsname.h index 8f0decf..e6ce607 100644 --- a/include/linux/utsname.h +++ b/include/linux/utsname.h @@ -1,5 +1,8 @@ #ifndef _LINUX_UTSNAME_H #define _LINUX_UTSNAME_H +#include <linux/sched.h> +#include <linux/kref.h> +#include <asm/atomic.h> #define __OLD_UTS_LEN 8 @@ -30,15 +33,47 @@ struct new_utsname { char domainname[65]; }; -extern struct new_utsname system_utsname; +struct uts_namespace { + struct kref kref; + struct new_utsname name; +}; +extern struct uts_namespace init_uts_ns; + +#ifdef CONFIG_UTS_NS + +extern struct uts_namespace *clone_uts_ns(struct uts_namespace *old_ns); +extern struct uts_namespace *unshare_uts_ns(void); +extern void free_uts_ns(struct kref *kref); + +static inline void get_uts_ns(struct uts_namespace *ns) +{ + kref_get(&ns->kref); +} + +static inline void put_uts_ns(struct uts_namespace *ns) +{ + kref_put(&ns->kref, free_uts_ns); +} + +#else +static inline void get_uts_ns(struct uts_namespace *ns) +{ +} +static inline void put_uts_ns(struct uts_namespace *ns) +{ +} +#endif -static inline struct new_utsname *utsname(void) { - return &system_utsname; +static inline struct new_utsname *utsname(void) +{ + return ¤t->uts_ns->name; } static inline struct new_utsname *init_utsname(void) { - return &system_utsname; + return &init_uts_ns.name; } +#define system_utsname init_uts_ns.name + extern struct rw_semaphore uts_sem; #endif diff --git a/init/Kconfig b/init/Kconfig index 3b36a1d..8460e5a 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -166,6 +166,14 @@ config SYSCTL building a kernel for install/rescue disks or your system is very limited in memory. +config UTS_NS + bool "UTS Namespaces" + default n + help + Support uts namespaces. This allows containers, i.e. + vservers, to use uts namespaces to provide different + uts info for different servers. If unsure, say N. + config AUDIT bool "Auditing support" depends on NET diff --git a/init/version.c b/init/version.c index 3ddc3ce..983338a 100644 --- a/init/version.c +++ b/init/version.c @@ -11,22 +11,75 @@ #include <linux/uts.h> #include <linux/utsname.h> #include <linux/version.h> +#include <linux/sched.h> #define version(a) Version_ ## a #define version_string(a) version(a) int version_string(LINUX_VERSION_CODE); -struct new_utsname system_utsname = { - .sysname = UTS_SYSNAME, - .nodename = UTS_NODENAME, - .release = UTS_RELEASE, - .version = UTS_VERSION, - .machine = UTS_MACHINE, - .domainname = UTS_DOMAINNAME, +struct uts_namespace init_uts_ns = { + .kref = { + .refcount = ATOMIC_INIT(2), + }, + .name = { + .sysname = UTS_SYSNAME, + .nodename = UTS_NODENAME, + .release = UTS_RELEASE, + .version = UTS_VERSION, + .machine = UTS_MACHINE, + .domainname = UTS_DOMAINNAME, + }, }; +EXPORT_SYMBOL(init_uts_ns); -EXPORT_SYMBOL(system_utsname); +#ifdef CONFIG_UTS_NS +/* + * Clone a new ns copying an original utsname, setting refcount to 1 + * @old_ns: namespace to clone + * Return NULL on error (failure to kmalloc), new ns otherwise + */ +struct uts_namespace *clone_uts_ns(struct uts_namespace *old_ns) +{ + struct uts_namespace *ns; + + ns = kmalloc(sizeof(struct uts_namespace), GFP_KERNEL); + if (ns) { + memcpy(&ns->name, &old_ns->name, sizeof(ns->name)); + kref_init(&ns->kref); + } + return ns; +} + +/* + * unshare the current process' utsname namespace. Changes + * to the utsname of this process won't be seen by parent, and + * vice versa + * + * Return NULL on error (failure to kmalloc), new ns otherwise + * + * TODO: decide where this should be locked (depends on how/where + * we decide to use this) + */ +struct uts_namespace *unshare_uts_ns(void) +{ + struct uts_namespace *old_ns = current->uts_ns; + struct uts_namespace *new_ns = clone_uts_ns(old_ns); + if (new_ns) { + current->uts_ns = new_ns; + put_uts_ns(old_ns); + } + return new_ns; +} + +void free_uts_ns(struct kref *kref) +{ + struct uts_namespace *ns; + + ns = container_of(kref, struct uts_namespace, kref); + kfree(ns); +} +#endif const char linux_banner[] = "Linux version " UTS_RELEASE " (" LINUX_COMPILE_BY "@" diff --git a/kernel/exit.c b/kernel/exit.c index 6c2eeb8..97c5405 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -34,6 +34,7 @@ #include <linux/mutex.h> #include <linux/futex.h> #include <linux/compat.h> +#include <linux/utsname.h> #include <asm/uaccess.h> #include <asm/unistd.h> @@ -173,6 +174,7 @@ repeat: spin_unlock(&p->proc_lock); proc_pid_flush(proc_dentry); release_thread(p); + put_uts_ns(p->uts_ns); call_rcu(&p->rcu, delayed_put_task_struct); p = leader; diff --git a/kernel/fork.c b/kernel/fork.c index 3384eb8..62e4479 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -44,6 +44,7 @@ #include <linux/rmap.h> #include <linux/acct.h> #include <linux/cn_proc.h> +#include <linux/utsname.h> #include <asm/pgtable.h> #include <asm/pgalloc.h> @@ -1119,6 +1120,8 @@ static task_t *copy_process(unsigned lon /* Perform scheduler related setup. Assign this task to a CPU. */ sched_fork(p, clone_flags); + get_uts_ns(p->uts_ns); + /* Need tasklist lock for parent etc handling! */ write_lock_irq(&tasklist_lock); @@ -1158,7 +1161,7 @@ static task_t *copy_process(unsigned lon spin_unlock(¤t->sighand->siglock); write_unlock_irq(&tasklist_lock); retval = -ERESTARTNOINTR; - goto bad_fork_cleanup_namespace; + goto bad_fork_cleanup_utsns; } if (clone_flags & CLONE_THREAD) { @@ -1171,7 +1174,7 @@ static task_t *copy_process(unsigned lon spin_unlock(¤t->sighand->siglock); write_unlock_irq(&tasklist_lock); retval = -EAGAIN; - goto bad_fork_cleanup_namespace; + goto bad_fork_cleanup_utsns; } p->group_leader = current->group_leader; @@ -1223,6 +1226,8 @@ static task_t *copy_process(unsigned lon proc_fork_connector(p); return p; +bad_fork_cleanup_utsns: + put_uts_ns(p->uts_ns); bad_fork_cleanup_namespace: exit_namespace(p); bad_fork_cleanup_keys: -- 1.1.6 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 0/7] uts namespaces: Introduction @ 2006-05-01 19:53 Serge E. Hallyn 0 siblings, 0 replies; 15+ messages in thread From: Serge E. Hallyn @ 2006-05-01 19:53 UTC (permalink / raw) To: ebiederm, herbert, dev, linux-kernel, sam, xemul, haveblue, clg, frankeh Introduce utsname namespaces. Instead of a single system_utsname containing hostname domainname etc, a process can request it's copy of the uts info to be cloned. The data will be copied from it's original, but any further changes will not be seen by processes which are not it's children, and vice versa. This is useful, for instance, for vserver/openvz, which can now clone a new uts namespace for each new virtual server. Changes since last submission: As per Eric's suggestion, switched several uses of init_utsname to (per-process namespace) utsname(). Implemented UTS namespace cloning through clone and unshare. -serge ^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2006-05-01 19:55 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20060407234815.849357768@sergelap>
[not found] ` <20060408045206.EAA8E19B8FF@sergelap.hallyn.com>
2006-04-08 7:09 ` [PATCH 3/7] uts namespaces: use init_utsname when appropriate Eric W. Biederman
2006-04-08 20:27 ` Serge E. Hallyn
2006-04-09 9:44 ` Eric W. Biederman
2006-04-09 10:14 ` Christoph Hellwig
2006-04-09 10:25 ` Christoph Hellwig
2006-04-09 10:36 ` Eric W. Biederman
2006-04-10 20:39 ` Serge E. Hallyn
2006-04-10 20:46 ` Serge E. Hallyn
2006-04-08 23:44 ` Sam Vilain
2006-04-09 0:12 ` [Devel] " Kir Kolyshkin
2006-04-09 9:25 ` Eric W. Biederman
2006-04-10 1:15 ` [PATCH 0/7] uts namespaces: Introduction Sam Vilain
[not found] ` <20060408045206.EFDD819B901@sergelap.hallyn.com>
2006-04-10 16:06 ` [Devel] [PATCH 4/7] uts namespaces: implement utsname namespaces Cedric Le Goater
2006-04-10 20:48 ` Serge E. Hallyn
2006-05-01 19:53 [PATCH 0/7] uts namespaces: Introduction Serge E. Hallyn
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox