mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
fixes-v5.11
-----BEGIN PGP SIGNATURE-----
iHUEABYKAB0WIQRAhzRXHqcMeLMyaSiRxhvAZXjcogUCX9daOgAKCRCRxhvAZXjc
ohPkAQChXUB2BAjtIzXlCkZoDBbzHHblm5DZ37oy/4xYFmAcEwEA5sw6dQqyGHnF
GEP9def51HvXLpBV2BzNUGggo1SoGgQ=
=w/cO
-----END PGP SIGNATURE-----
Merge tag 'fixes-v5.11' of git://git.kernel.org/pub/scm/linux/kernel/git/brauner/linux
Pull misc fixes from Christian Brauner:
"This contains several fixes which felt worth being combined into a
single branch:
- Use put_nsproxy() instead of open-coding it switch_task_namespaces()
- Kirill's work to unify lifecycle management for all namespaces. The
lifetime counters are used identically for all namespaces types.
Namespaces may of course have additional unrelated counters and
these are not altered. This work allows us to unify the type of the
counters and reduces maintenance cost by moving the counter in one
place and indicating that basic lifetime management is identical
for all namespaces.
- Peilin's fix adding three byte padding to Dmitry's
PTRACE_GET_SYSCALL_INFO uapi struct to prevent an info leak.
- Two smal patches to convert from the /* fall through */ comment
annotation to the fallthrough keyword annotation which I had taken
into my branch and into -next before df561f6688
("treewide: Use
fallthrough pseudo-keyword") made it upstream which fixed this
tree-wide.
Since I didn't want to invalidate all testing for other commits I
didn't rebase and kept them"
* tag 'fixes-v5.11' of git://git.kernel.org/pub/scm/linux/kernel/git/brauner/linux:
nsproxy: use put_nsproxy() in switch_task_namespaces()
sys: Convert to the new fallthrough notation
signal: Convert to the new fallthrough notation
time: Use generic ns_common::count
cgroup: Use generic ns_common::count
mnt: Use generic ns_common::count
user: Use generic ns_common::count
pid: Use generic ns_common::count
ipc: Use generic ns_common::count
uts: Use generic ns_common::count
net: Use generic ns_common::count
ns: Add a common refcount into ns_common
ptrace: Prevent kernel-infoleak in ptrace_get_syscall_info()
This commit is contained in:
commit
f9b4240b07
@ -6,7 +6,6 @@
|
||||
#include <linux/fs_pin.h>
|
||||
|
||||
struct mnt_namespace {
|
||||
atomic_t count;
|
||||
struct ns_common ns;
|
||||
struct mount * root;
|
||||
/*
|
||||
@ -120,7 +119,7 @@ static inline void detach_mounts(struct dentry *dentry)
|
||||
|
||||
static inline void get_mnt_ns(struct mnt_namespace *ns)
|
||||
{
|
||||
atomic_inc(&ns->count);
|
||||
refcount_inc(&ns->ns.count);
|
||||
}
|
||||
|
||||
extern seqlock_t mount_lock;
|
||||
|
@ -3274,7 +3274,7 @@ static struct mnt_namespace *alloc_mnt_ns(struct user_namespace *user_ns, bool a
|
||||
new_ns->ns.ops = &mntns_operations;
|
||||
if (!anon)
|
||||
new_ns->seq = atomic64_add_return(1, &mnt_ns_seq);
|
||||
atomic_set(&new_ns->count, 1);
|
||||
refcount_set(&new_ns->ns.count, 1);
|
||||
INIT_LIST_HEAD(&new_ns->list);
|
||||
init_waitqueue_head(&new_ns->poll);
|
||||
spin_lock_init(&new_ns->ns_lock);
|
||||
@ -3848,7 +3848,7 @@ void __init mnt_init(void)
|
||||
|
||||
void put_mnt_ns(struct mnt_namespace *ns)
|
||||
{
|
||||
if (!atomic_dec_and_test(&ns->count))
|
||||
if (!refcount_dec_and_test(&ns->ns.count))
|
||||
return;
|
||||
drop_collected_mounts(&ns->root->mnt);
|
||||
free_mnt_ns(ns);
|
||||
|
@ -854,7 +854,6 @@ static inline void cgroup_sk_free(struct sock_cgroup_data *skcd) {}
|
||||
#endif /* CONFIG_CGROUP_DATA */
|
||||
|
||||
struct cgroup_namespace {
|
||||
refcount_t count;
|
||||
struct ns_common ns;
|
||||
struct user_namespace *user_ns;
|
||||
struct ucounts *ucounts;
|
||||
@ -889,12 +888,12 @@ copy_cgroup_ns(unsigned long flags, struct user_namespace *user_ns,
|
||||
static inline void get_cgroup_ns(struct cgroup_namespace *ns)
|
||||
{
|
||||
if (ns)
|
||||
refcount_inc(&ns->count);
|
||||
refcount_inc(&ns->ns.count);
|
||||
}
|
||||
|
||||
static inline void put_cgroup_ns(struct cgroup_namespace *ns)
|
||||
{
|
||||
if (ns && refcount_dec_and_test(&ns->count))
|
||||
if (ns && refcount_dec_and_test(&ns->ns.count))
|
||||
free_cgroup_ns(ns);
|
||||
}
|
||||
|
||||
|
@ -27,7 +27,6 @@ struct ipc_ids {
|
||||
};
|
||||
|
||||
struct ipc_namespace {
|
||||
refcount_t count;
|
||||
struct ipc_ids ids[3];
|
||||
|
||||
int sem_ctls[4];
|
||||
@ -128,7 +127,7 @@ extern struct ipc_namespace *copy_ipcs(unsigned long flags,
|
||||
static inline struct ipc_namespace *get_ipc_ns(struct ipc_namespace *ns)
|
||||
{
|
||||
if (ns)
|
||||
refcount_inc(&ns->count);
|
||||
refcount_inc(&ns->ns.count);
|
||||
return ns;
|
||||
}
|
||||
|
||||
|
@ -2,12 +2,15 @@
|
||||
#ifndef _LINUX_NS_COMMON_H
|
||||
#define _LINUX_NS_COMMON_H
|
||||
|
||||
#include <linux/refcount.h>
|
||||
|
||||
struct proc_ns_operations;
|
||||
|
||||
struct ns_common {
|
||||
atomic_long_t stashed;
|
||||
const struct proc_ns_operations *ops;
|
||||
unsigned int inum;
|
||||
refcount_t count;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -8,7 +8,6 @@
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/threads.h>
|
||||
#include <linux/nsproxy.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/ns_common.h>
|
||||
#include <linux/idr.h>
|
||||
|
||||
@ -18,7 +17,6 @@
|
||||
struct fs_pin;
|
||||
|
||||
struct pid_namespace {
|
||||
struct kref kref;
|
||||
struct idr idr;
|
||||
struct rcu_head rcu;
|
||||
unsigned int pid_allocated;
|
||||
@ -43,7 +41,7 @@ extern struct pid_namespace init_pid_ns;
|
||||
static inline struct pid_namespace *get_pid_ns(struct pid_namespace *ns)
|
||||
{
|
||||
if (ns != &init_pid_ns)
|
||||
kref_get(&ns->kref);
|
||||
refcount_inc(&ns->ns.count);
|
||||
return ns;
|
||||
}
|
||||
|
||||
|
@ -4,7 +4,6 @@
|
||||
|
||||
|
||||
#include <linux/sched.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/nsproxy.h>
|
||||
#include <linux/ns_common.h>
|
||||
#include <linux/err.h>
|
||||
@ -18,7 +17,6 @@ struct timens_offsets {
|
||||
};
|
||||
|
||||
struct time_namespace {
|
||||
struct kref kref;
|
||||
struct user_namespace *user_ns;
|
||||
struct ucounts *ucounts;
|
||||
struct ns_common ns;
|
||||
@ -37,20 +35,21 @@ extern void timens_commit(struct task_struct *tsk, struct time_namespace *ns);
|
||||
|
||||
static inline struct time_namespace *get_time_ns(struct time_namespace *ns)
|
||||
{
|
||||
kref_get(&ns->kref);
|
||||
refcount_inc(&ns->ns.count);
|
||||
return ns;
|
||||
}
|
||||
|
||||
struct time_namespace *copy_time_ns(unsigned long flags,
|
||||
struct user_namespace *user_ns,
|
||||
struct time_namespace *old_ns);
|
||||
void free_time_ns(struct kref *kref);
|
||||
void free_time_ns(struct time_namespace *ns);
|
||||
void timens_on_fork(struct nsproxy *nsproxy, struct task_struct *tsk);
|
||||
struct vdso_data *arch_get_vdso_data(void *vvar_page);
|
||||
|
||||
static inline void put_time_ns(struct time_namespace *ns)
|
||||
{
|
||||
kref_put(&ns->kref, free_time_ns);
|
||||
if (refcount_dec_and_test(&ns->ns.count))
|
||||
free_time_ns(ns);
|
||||
}
|
||||
|
||||
void proc_timens_show_offsets(struct task_struct *p, struct seq_file *m);
|
||||
|
@ -57,7 +57,6 @@ struct user_namespace {
|
||||
struct uid_gid_map uid_map;
|
||||
struct uid_gid_map gid_map;
|
||||
struct uid_gid_map projid_map;
|
||||
atomic_t count;
|
||||
struct user_namespace *parent;
|
||||
int level;
|
||||
kuid_t owner;
|
||||
@ -109,7 +108,7 @@ void dec_ucount(struct ucounts *ucounts, enum ucount_type type);
|
||||
static inline struct user_namespace *get_user_ns(struct user_namespace *ns)
|
||||
{
|
||||
if (ns)
|
||||
atomic_inc(&ns->count);
|
||||
refcount_inc(&ns->ns.count);
|
||||
return ns;
|
||||
}
|
||||
|
||||
@ -119,7 +118,7 @@ extern void __put_user_ns(struct user_namespace *ns);
|
||||
|
||||
static inline void put_user_ns(struct user_namespace *ns)
|
||||
{
|
||||
if (ns && atomic_dec_and_test(&ns->count))
|
||||
if (ns && refcount_dec_and_test(&ns->ns.count))
|
||||
__put_user_ns(ns);
|
||||
}
|
||||
|
||||
|
@ -4,7 +4,6 @@
|
||||
|
||||
|
||||
#include <linux/sched.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/nsproxy.h>
|
||||
#include <linux/ns_common.h>
|
||||
#include <linux/err.h>
|
||||
@ -22,7 +21,6 @@ struct user_namespace;
|
||||
extern struct user_namespace init_user_ns;
|
||||
|
||||
struct uts_namespace {
|
||||
struct kref kref;
|
||||
struct new_utsname name;
|
||||
struct user_namespace *user_ns;
|
||||
struct ucounts *ucounts;
|
||||
@ -33,16 +31,17 @@ extern struct uts_namespace init_uts_ns;
|
||||
#ifdef CONFIG_UTS_NS
|
||||
static inline void get_uts_ns(struct uts_namespace *ns)
|
||||
{
|
||||
kref_get(&ns->kref);
|
||||
refcount_inc(&ns->ns.count);
|
||||
}
|
||||
|
||||
extern struct uts_namespace *copy_utsname(unsigned long flags,
|
||||
struct user_namespace *user_ns, struct uts_namespace *old_ns);
|
||||
extern void free_uts_ns(struct kref *kref);
|
||||
extern void free_uts_ns(struct uts_namespace *ns);
|
||||
|
||||
static inline void put_uts_ns(struct uts_namespace *ns)
|
||||
{
|
||||
kref_put(&ns->kref, free_uts_ns);
|
||||
if (refcount_dec_and_test(&ns->ns.count))
|
||||
free_uts_ns(ns);
|
||||
}
|
||||
|
||||
void uts_ns_init(void);
|
||||
|
@ -60,9 +60,6 @@ struct net {
|
||||
refcount_t passive; /* To decide when the network
|
||||
* namespace should be freed.
|
||||
*/
|
||||
refcount_t count; /* To decided when the network
|
||||
* namespace should be shut down.
|
||||
*/
|
||||
spinlock_t rules_mod_lock;
|
||||
|
||||
unsigned int dev_unreg_count;
|
||||
@ -245,7 +242,7 @@ void __put_net(struct net *net);
|
||||
|
||||
static inline struct net *get_net(struct net *net)
|
||||
{
|
||||
refcount_inc(&net->count);
|
||||
refcount_inc(&net->ns.count);
|
||||
return net;
|
||||
}
|
||||
|
||||
@ -256,14 +253,14 @@ static inline struct net *maybe_get_net(struct net *net)
|
||||
* exists. If the reference count is zero this
|
||||
* function fails and returns NULL.
|
||||
*/
|
||||
if (!refcount_inc_not_zero(&net->count))
|
||||
if (!refcount_inc_not_zero(&net->ns.count))
|
||||
net = NULL;
|
||||
return net;
|
||||
}
|
||||
|
||||
static inline void put_net(struct net *net)
|
||||
{
|
||||
if (refcount_dec_and_test(&net->count))
|
||||
if (refcount_dec_and_test(&net->ns.count))
|
||||
__put_net(net);
|
||||
}
|
||||
|
||||
@ -275,7 +272,7 @@ int net_eq(const struct net *net1, const struct net *net2)
|
||||
|
||||
static inline int check_net(const struct net *net)
|
||||
{
|
||||
return refcount_read(&net->count) != 0;
|
||||
return refcount_read(&net->ns.count) != 0;
|
||||
}
|
||||
|
||||
void net_drop_ns(void *);
|
||||
|
@ -81,7 +81,8 @@ struct seccomp_metadata {
|
||||
|
||||
struct ptrace_syscall_info {
|
||||
__u8 op; /* PTRACE_SYSCALL_INFO_* */
|
||||
__u32 arch __attribute__((__aligned__(sizeof(__u32))));
|
||||
__u8 pad[3];
|
||||
__u32 arch;
|
||||
__u64 instruction_pointer;
|
||||
__u64 stack_pointer;
|
||||
union {
|
||||
|
@ -25,7 +25,7 @@ int version_string(LINUX_VERSION_CODE);
|
||||
#endif
|
||||
|
||||
struct uts_namespace init_uts_ns = {
|
||||
.kref = KREF_INIT(2),
|
||||
.ns.count = REFCOUNT_INIT(2),
|
||||
.name = {
|
||||
.sysname = UTS_SYSNAME,
|
||||
.nodename = UTS_NODENAME,
|
||||
|
@ -26,7 +26,7 @@ DEFINE_SPINLOCK(mq_lock);
|
||||
* and not CONFIG_IPC_NS.
|
||||
*/
|
||||
struct ipc_namespace init_ipc_ns = {
|
||||
.count = REFCOUNT_INIT(1),
|
||||
.ns.count = REFCOUNT_INIT(1),
|
||||
.user_ns = &init_user_ns,
|
||||
.ns.inum = PROC_IPC_INIT_INO,
|
||||
#ifdef CONFIG_IPC_NS
|
||||
|
@ -51,7 +51,7 @@ static struct ipc_namespace *create_ipc_ns(struct user_namespace *user_ns,
|
||||
goto fail_free;
|
||||
ns->ns.ops = &ipcns_operations;
|
||||
|
||||
refcount_set(&ns->count, 1);
|
||||
refcount_set(&ns->ns.count, 1);
|
||||
ns->user_ns = get_user_ns(user_ns);
|
||||
ns->ucounts = ucounts;
|
||||
|
||||
@ -164,7 +164,7 @@ static DECLARE_WORK(free_ipc_work, free_ipc);
|
||||
*/
|
||||
void put_ipc_ns(struct ipc_namespace *ns)
|
||||
{
|
||||
if (refcount_dec_and_lock(&ns->count, &mq_lock)) {
|
||||
if (refcount_dec_and_lock(&ns->ns.count, &mq_lock)) {
|
||||
mq_clear_sbinfo(ns);
|
||||
spin_unlock(&mq_lock);
|
||||
|
||||
|
@ -199,7 +199,7 @@ static u16 have_canfork_callback __read_mostly;
|
||||
|
||||
/* cgroup namespace for init task */
|
||||
struct cgroup_namespace init_cgroup_ns = {
|
||||
.count = REFCOUNT_INIT(2),
|
||||
.ns.count = REFCOUNT_INIT(2),
|
||||
.user_ns = &init_user_ns,
|
||||
.ns.ops = &cgroupns_operations,
|
||||
.ns.inum = PROC_CGROUP_INIT_INO,
|
||||
|
@ -32,7 +32,7 @@ static struct cgroup_namespace *alloc_cgroup_ns(void)
|
||||
kfree(new_ns);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
refcount_set(&new_ns->count, 1);
|
||||
refcount_set(&new_ns->ns.count, 1);
|
||||
new_ns->ns.ops = &cgroupns_operations;
|
||||
return new_ns;
|
||||
}
|
||||
|
@ -245,8 +245,8 @@ void switch_task_namespaces(struct task_struct *p, struct nsproxy *new)
|
||||
p->nsproxy = new;
|
||||
task_unlock(p);
|
||||
|
||||
if (ns && atomic_dec_and_test(&ns->count))
|
||||
free_nsproxy(ns);
|
||||
if (ns)
|
||||
put_nsproxy(ns);
|
||||
}
|
||||
|
||||
void exit_task_namespaces(struct task_struct *p)
|
||||
|
@ -73,7 +73,7 @@ int pid_max_max = PID_MAX_LIMIT;
|
||||
* the scheme scales to up to 4 million PIDs, runtime.
|
||||
*/
|
||||
struct pid_namespace init_pid_ns = {
|
||||
.kref = KREF_INIT(2),
|
||||
.ns.count = REFCOUNT_INIT(2),
|
||||
.idr = IDR_INIT(init_pid_ns.idr),
|
||||
.pid_allocated = PIDNS_ADDING,
|
||||
.level = 0,
|
||||
|
@ -102,7 +102,7 @@ static struct pid_namespace *create_pid_namespace(struct user_namespace *user_ns
|
||||
goto out_free_idr;
|
||||
ns->ns.ops = &pidns_operations;
|
||||
|
||||
kref_init(&ns->kref);
|
||||
refcount_set(&ns->ns.count, 1);
|
||||
ns->level = level;
|
||||
ns->parent = get_pid_ns(parent_pid_ns);
|
||||
ns->user_ns = get_user_ns(user_ns);
|
||||
@ -148,22 +148,15 @@ struct pid_namespace *copy_pid_ns(unsigned long flags,
|
||||
return create_pid_namespace(user_ns, old_ns);
|
||||
}
|
||||
|
||||
static void free_pid_ns(struct kref *kref)
|
||||
{
|
||||
struct pid_namespace *ns;
|
||||
|
||||
ns = container_of(kref, struct pid_namespace, kref);
|
||||
destroy_pid_namespace(ns);
|
||||
}
|
||||
|
||||
void put_pid_ns(struct pid_namespace *ns)
|
||||
{
|
||||
struct pid_namespace *parent;
|
||||
|
||||
while (ns != &init_pid_ns) {
|
||||
parent = ns->parent;
|
||||
if (!kref_put(&ns->kref, free_pid_ns))
|
||||
if (!refcount_dec_and_test(&ns->ns.count))
|
||||
break;
|
||||
destroy_pid_namespace(ns);
|
||||
ns = parent;
|
||||
}
|
||||
}
|
||||
|
@ -92,7 +92,7 @@ static struct time_namespace *clone_time_ns(struct user_namespace *user_ns,
|
||||
if (!ns)
|
||||
goto fail_dec;
|
||||
|
||||
kref_init(&ns->kref);
|
||||
refcount_set(&ns->ns.count, 1);
|
||||
|
||||
ns->vvar_page = alloc_page(GFP_KERNEL | __GFP_ZERO);
|
||||
if (!ns->vvar_page)
|
||||
@ -226,11 +226,8 @@ out:
|
||||
mutex_unlock(&offset_lock);
|
||||
}
|
||||
|
||||
void free_time_ns(struct kref *kref)
|
||||
void free_time_ns(struct time_namespace *ns)
|
||||
{
|
||||
struct time_namespace *ns;
|
||||
|
||||
ns = container_of(kref, struct time_namespace, kref);
|
||||
dec_time_namespaces(ns->ucounts);
|
||||
put_user_ns(ns->user_ns);
|
||||
ns_free_inum(&ns->ns);
|
||||
@ -462,7 +459,7 @@ const struct proc_ns_operations timens_for_children_operations = {
|
||||
};
|
||||
|
||||
struct time_namespace init_time_ns = {
|
||||
.kref = KREF_INIT(3),
|
||||
.ns.count = REFCOUNT_INIT(3),
|
||||
.user_ns = &init_user_ns,
|
||||
.ns.inum = PROC_TIME_INIT_INO,
|
||||
.ns.ops = &timens_operations,
|
||||
|
@ -55,7 +55,7 @@ struct user_namespace init_user_ns = {
|
||||
},
|
||||
},
|
||||
},
|
||||
.count = ATOMIC_INIT(3),
|
||||
.ns.count = REFCOUNT_INIT(3),
|
||||
.owner = GLOBAL_ROOT_UID,
|
||||
.group = GLOBAL_ROOT_GID,
|
||||
.ns.inum = PROC_USER_INIT_INO,
|
||||
|
@ -111,7 +111,7 @@ int create_user_ns(struct cred *new)
|
||||
goto fail_free;
|
||||
ns->ns.ops = &userns_operations;
|
||||
|
||||
atomic_set(&ns->count, 1);
|
||||
refcount_set(&ns->ns.count, 1);
|
||||
/* Leave the new->user_ns reference with the new user namespace. */
|
||||
ns->parent = parent_ns;
|
||||
ns->level = parent_ns->level + 1;
|
||||
@ -197,7 +197,7 @@ static void free_user_ns(struct work_struct *work)
|
||||
kmem_cache_free(user_ns_cachep, ns);
|
||||
dec_user_namespaces(ucounts);
|
||||
ns = parent;
|
||||
} while (atomic_dec_and_test(&parent->count));
|
||||
} while (refcount_dec_and_test(&parent->ns.count));
|
||||
}
|
||||
|
||||
void __put_user_ns(struct user_namespace *ns)
|
||||
|
@ -33,7 +33,7 @@ static struct uts_namespace *create_uts_ns(void)
|
||||
|
||||
uts_ns = kmem_cache_alloc(uts_ns_cache, GFP_KERNEL);
|
||||
if (uts_ns)
|
||||
kref_init(&uts_ns->kref);
|
||||
refcount_set(&uts_ns->ns.count, 1);
|
||||
return uts_ns;
|
||||
}
|
||||
|
||||
@ -103,11 +103,8 @@ struct uts_namespace *copy_utsname(unsigned long flags,
|
||||
return new_ns;
|
||||
}
|
||||
|
||||
void free_uts_ns(struct kref *kref)
|
||||
void free_uts_ns(struct uts_namespace *ns)
|
||||
{
|
||||
struct uts_namespace *ns;
|
||||
|
||||
ns = container_of(kref, struct uts_namespace, kref);
|
||||
dec_uts_namespaces(ns->ucounts);
|
||||
put_user_ns(ns->user_ns);
|
||||
ns_free_inum(&ns->ns);
|
||||
|
@ -1027,7 +1027,7 @@ net_rx_queue_update_kobjects(struct net_device *dev, int old_num, int new_num)
|
||||
while (--i >= new_num) {
|
||||
struct kobject *kobj = &dev->_rx[i].kobj;
|
||||
|
||||
if (!refcount_read(&dev_net(dev)->count))
|
||||
if (!refcount_read(&dev_net(dev)->ns.count))
|
||||
kobj->uevent_suppress = 1;
|
||||
if (dev->sysfs_rx_queue_group)
|
||||
sysfs_remove_group(kobj, dev->sysfs_rx_queue_group);
|
||||
@ -1605,7 +1605,7 @@ netdev_queue_update_kobjects(struct net_device *dev, int old_num, int new_num)
|
||||
while (--i >= new_num) {
|
||||
struct netdev_queue *queue = dev->_tx + i;
|
||||
|
||||
if (!refcount_read(&dev_net(dev)->count))
|
||||
if (!refcount_read(&dev_net(dev)->ns.count))
|
||||
queue->kobj.uevent_suppress = 1;
|
||||
#ifdef CONFIG_BQL
|
||||
sysfs_remove_group(&queue->kobj, &dql_group);
|
||||
@ -1852,7 +1852,7 @@ void netdev_unregister_kobject(struct net_device *ndev)
|
||||
{
|
||||
struct device *dev = &ndev->dev;
|
||||
|
||||
if (!refcount_read(&dev_net(ndev)->count))
|
||||
if (!refcount_read(&dev_net(ndev)->ns.count))
|
||||
dev_set_uevent_suppress(dev, 1);
|
||||
|
||||
kobject_get(&dev->kobj);
|
||||
|
@ -45,7 +45,7 @@ static struct key_tag init_net_key_domain = { .usage = REFCOUNT_INIT(1) };
|
||||
#endif
|
||||
|
||||
struct net init_net = {
|
||||
.count = REFCOUNT_INIT(1),
|
||||
.ns.count = REFCOUNT_INIT(1),
|
||||
.dev_base_head = LIST_HEAD_INIT(init_net.dev_base_head),
|
||||
#ifdef CONFIG_KEYS
|
||||
.key_domain = &init_net_key_domain,
|
||||
@ -249,7 +249,7 @@ int peernet2id_alloc(struct net *net, struct net *peer, gfp_t gfp)
|
||||
{
|
||||
int id;
|
||||
|
||||
if (refcount_read(&net->count) == 0)
|
||||
if (refcount_read(&net->ns.count) == 0)
|
||||
return NETNSA_NSID_NOT_ASSIGNED;
|
||||
|
||||
spin_lock_bh(&net->nsid_lock);
|
||||
@ -329,7 +329,7 @@ static __net_init int setup_net(struct net *net, struct user_namespace *user_ns)
|
||||
int error = 0;
|
||||
LIST_HEAD(net_exit_list);
|
||||
|
||||
refcount_set(&net->count, 1);
|
||||
refcount_set(&net->ns.count, 1);
|
||||
refcount_set(&net->passive, 1);
|
||||
get_random_bytes(&net->hash_mix, sizeof(u32));
|
||||
net->dev_base_seq = 1;
|
||||
|
@ -272,14 +272,14 @@ restart:
|
||||
continue;
|
||||
tw = inet_twsk(sk);
|
||||
if ((tw->tw_family != family) ||
|
||||
refcount_read(&twsk_net(tw)->count))
|
||||
refcount_read(&twsk_net(tw)->ns.count))
|
||||
continue;
|
||||
|
||||
if (unlikely(!refcount_inc_not_zero(&tw->tw_refcnt)))
|
||||
continue;
|
||||
|
||||
if (unlikely((tw->tw_family != family) ||
|
||||
refcount_read(&twsk_net(tw)->count))) {
|
||||
refcount_read(&twsk_net(tw)->ns.count))) {
|
||||
inet_twsk_put(tw);
|
||||
goto restart;
|
||||
}
|
||||
|
@ -887,7 +887,7 @@ static void tcp_metrics_flush_all(struct net *net)
|
||||
pp = &hb->chain;
|
||||
for (tm = deref_locked(*pp); tm; tm = deref_locked(*pp)) {
|
||||
match = net ? net_eq(tm_net(tm), net) :
|
||||
!refcount_read(&tm_net(tm)->count);
|
||||
!refcount_read(&tm_net(tm)->ns.count);
|
||||
if (match) {
|
||||
*pp = tm->tcpm_next;
|
||||
kfree_rcu(tm, rcu_head);
|
||||
|
Loading…
Reference in New Issue
Block a user