Blame view

kernel/utsname.c 1.51 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
18
  
  /*
071df104f   Serge E. Hallyn   [PATCH] namespace...
19
20
21
22
23
24
25
26
27
   * 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;
  
  	ns = kmalloc(sizeof(struct uts_namespace), GFP_KERNEL);
467e9f4b5   Cedric Le Goater   fix create_new_na...
28
29
  	if (!ns)
  		return ERR_PTR(-ENOMEM);
efc63c4fb   Alexey Dobriyan   Fix UTS corruptio...
30
  	down_read(&uts_sem);
467e9f4b5   Cedric Le Goater   fix create_new_na...
31
  	memcpy(&ns->name, &old_ns->name, sizeof(ns->name));
efc63c4fb   Alexey Dobriyan   Fix UTS corruptio...
32
  	up_read(&uts_sem);
467e9f4b5   Cedric Le Goater   fix create_new_na...
33
  	kref_init(&ns->kref);
071df104f   Serge E. Hallyn   [PATCH] namespace...
34
35
36
37
  	return ns;
  }
  
  /*
4865ecf13   Serge E. Hallyn   [PATCH] namespace...
38
39
40
41
42
   * 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...
43
  struct uts_namespace *copy_utsname(unsigned long flags, struct uts_namespace *old_ns)
4865ecf13   Serge E. Hallyn   [PATCH] namespace...
44
  {
071df104f   Serge E. Hallyn   [PATCH] namespace...
45
  	struct uts_namespace *new_ns;
4865ecf13   Serge E. Hallyn   [PATCH] namespace...
46

e3222c4ec   Badari Pulavarty   Merge sys_clone()...
47
  	BUG_ON(!old_ns);
4865ecf13   Serge E. Hallyn   [PATCH] namespace...
48
  	get_uts_ns(old_ns);
071df104f   Serge E. Hallyn   [PATCH] namespace...
49
  	if (!(flags & CLONE_NEWUTS))
e3222c4ec   Badari Pulavarty   Merge sys_clone()...
50
  		return old_ns;
071df104f   Serge E. Hallyn   [PATCH] namespace...
51
52
  
  	new_ns = clone_uts_ns(old_ns);
071df104f   Serge E. Hallyn   [PATCH] namespace...
53

071df104f   Serge E. Hallyn   [PATCH] namespace...
54
  	put_uts_ns(old_ns);
e3222c4ec   Badari Pulavarty   Merge sys_clone()...
55
  	return new_ns;
4865ecf13   Serge E. Hallyn   [PATCH] namespace...
56
57
58
59
60
61
62
63
64
  }
  
  void free_uts_ns(struct kref *kref)
  {
  	struct uts_namespace *ns;
  
  	ns = container_of(kref, struct uts_namespace, kref);
  	kfree(ns);
  }