Blame view

kernel/utsname.c 1.65 KB
4865ecf13   Serge E. Hallyn   [PATCH] namespace...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  /*
   *  Copyright (C) 2004 IBM Corporation
   *
   *  Author: Serge Hallyn <serue@us.ibm.com>
   *
   *  This program is free software; you can redistribute it and/or
   *  modify it under the terms of the GNU General Public License as
   *  published by the Free Software Foundation, version 2 of the
   *  License.
   */
  
  #include <linux/module.h>
  #include <linux/uts.h>
  #include <linux/utsname.h>
467e9f4b5   Cedric Le Goater   fix create_new_na...
15
  #include <linux/err.h>
1aeb272cf   Robert P. J. Day   kernel: explicitl...
16
  #include <linux/slab.h>
4865ecf13   Serge E. Hallyn   [PATCH] namespace...
17

4c2a7e72d   Alexey Dobriyan   utsns: extract cr...
18
19
20
21
22
23
24
25
26
  static struct uts_namespace *create_uts_ns(void)
  {
  	struct uts_namespace *uts_ns;
  
  	uts_ns = kmalloc(sizeof(struct uts_namespace), GFP_KERNEL);
  	if (uts_ns)
  		kref_init(&uts_ns->kref);
  	return uts_ns;
  }
4865ecf13   Serge E. Hallyn   [PATCH] namespace...
27
  /*
071df104f   Serge E. Hallyn   [PATCH] namespace...
28
29
30
31
32
33
34
   * 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
   */
  static struct uts_namespace *clone_uts_ns(struct uts_namespace *old_ns)
  {
  	struct uts_namespace *ns;
4c2a7e72d   Alexey Dobriyan   utsns: extract cr...
35
  	ns = create_uts_ns();
467e9f4b5   Cedric Le Goater   fix create_new_na...
36
37
  	if (!ns)
  		return ERR_PTR(-ENOMEM);
efc63c4fb   Alexey Dobriyan   Fix UTS corruptio...
38
  	down_read(&uts_sem);
467e9f4b5   Cedric Le Goater   fix create_new_na...
39
  	memcpy(&ns->name, &old_ns->name, sizeof(ns->name));
efc63c4fb   Alexey Dobriyan   Fix UTS corruptio...
40
  	up_read(&uts_sem);
071df104f   Serge E. Hallyn   [PATCH] namespace...
41
42
43
44
  	return ns;
  }
  
  /*
4865ecf13   Serge E. Hallyn   [PATCH] namespace...
45
46
47
48
49
   * Copy task tsk's utsname namespace, or clone it if flags
   * specifies CLONE_NEWUTS.  In latter case, changes to the
   * utsname of this process won't be seen by parent, and vice
   * versa.
   */
213dd266d   Eric W. Biederman   namespace: ensure...
50
  struct uts_namespace *copy_utsname(unsigned long flags, struct uts_namespace *old_ns)
4865ecf13   Serge E. Hallyn   [PATCH] namespace...
51
  {
071df104f   Serge E. Hallyn   [PATCH] namespace...
52
  	struct uts_namespace *new_ns;
4865ecf13   Serge E. Hallyn   [PATCH] namespace...
53

e3222c4ec   Badari Pulavarty   Merge sys_clone()...
54
  	BUG_ON(!old_ns);
4865ecf13   Serge E. Hallyn   [PATCH] namespace...
55
  	get_uts_ns(old_ns);
071df104f   Serge E. Hallyn   [PATCH] namespace...
56
  	if (!(flags & CLONE_NEWUTS))
e3222c4ec   Badari Pulavarty   Merge sys_clone()...
57
  		return old_ns;
071df104f   Serge E. Hallyn   [PATCH] namespace...
58
59
  
  	new_ns = clone_uts_ns(old_ns);
071df104f   Serge E. Hallyn   [PATCH] namespace...
60

071df104f   Serge E. Hallyn   [PATCH] namespace...
61
  	put_uts_ns(old_ns);
e3222c4ec   Badari Pulavarty   Merge sys_clone()...
62
  	return new_ns;
4865ecf13   Serge E. Hallyn   [PATCH] namespace...
63
64
65
66
67
68
69
70
71
  }
  
  void free_uts_ns(struct kref *kref)
  {
  	struct uts_namespace *ns;
  
  	ns = container_of(kref, struct uts_namespace, kref);
  	kfree(ns);
  }