* 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; 14+ 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] 14+ 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; 14+ 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] 14+ 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; 14+ 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] 14+ 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; 14+ 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] 14+ 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; 14+ 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] 14+ 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; 14+ 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] 14+ 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; 14+ 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] 14+ 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; 14+ 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] 14+ 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; 14+ 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] 14+ 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; 14+ 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] 14+ 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; 14+ 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] 14+ 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; 14+ 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] 14+ 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; 14+ 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] 14+ 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; 14+ 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] 14+ messages in thread
end of thread, other threads:[~2006-04-10 20:48 UTC | newest]
Thread overview: 14+ 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
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox