Skip to content

Commit 8c5a853

Browse files
author
Al Viro
committed
mnt_slave_list/mnt_slave: turn into hlist_head/hlist_node
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
1 parent 94a8d00 commit 8c5a853

3 files changed

Lines changed: 27 additions & 32 deletions

File tree

fs/mount.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ struct mount {
6969
struct list_head mnt_list;
7070
struct list_head mnt_expire; /* link in fs-specific expiry list */
7171
struct list_head mnt_share; /* circular list of shared mounts */
72-
struct list_head mnt_slave_list;/* list of slave mounts */
73-
struct list_head mnt_slave; /* slave list entry */
72+
struct hlist_head mnt_slave_list;/* list of slave mounts */
73+
struct hlist_node mnt_slave; /* slave list entry */
7474
struct mount *mnt_master; /* slave is on master->mnt_slave_list */
7575
struct mnt_namespace *mnt_ns; /* containing namespace */
7676
struct mountpoint *mnt_mp; /* where is it mounted */

fs/namespace.c

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -380,8 +380,8 @@ static struct mount *alloc_vfsmnt(const char *name)
380380
INIT_LIST_HEAD(&mnt->mnt_list);
381381
INIT_LIST_HEAD(&mnt->mnt_expire);
382382
INIT_LIST_HEAD(&mnt->mnt_share);
383-
INIT_LIST_HEAD(&mnt->mnt_slave_list);
384-
INIT_LIST_HEAD(&mnt->mnt_slave);
383+
INIT_HLIST_HEAD(&mnt->mnt_slave_list);
384+
INIT_HLIST_NODE(&mnt->mnt_slave);
385385
INIT_HLIST_NODE(&mnt->mnt_mp_list);
386386
INIT_HLIST_HEAD(&mnt->mnt_stuck_children);
387387
RB_CLEAR_NODE(&mnt->mnt_node);
@@ -1348,10 +1348,10 @@ static struct mount *clone_mnt(struct mount *old, struct dentry *root,
13481348

13491349
if ((flag & CL_SLAVE) ||
13501350
((flag & CL_SHARED_TO_SLAVE) && IS_MNT_SHARED(old))) {
1351-
list_add(&mnt->mnt_slave, &old->mnt_slave_list);
1351+
hlist_add_head(&mnt->mnt_slave, &old->mnt_slave_list);
13521352
mnt->mnt_master = old;
13531353
} else if (IS_MNT_SLAVE(old)) {
1354-
list_add(&mnt->mnt_slave, &old->mnt_slave);
1354+
hlist_add_behind(&mnt->mnt_slave, &old->mnt_slave);
13551355
mnt->mnt_master = old->mnt_master;
13561356
}
13571357
return mnt;
@@ -3398,10 +3398,8 @@ static int do_set_group(struct path *from_path, struct path *to_path)
33983398
goto out;
33993399

34003400
if (IS_MNT_SLAVE(from)) {
3401-
struct mount *m = from->mnt_master;
3402-
3403-
list_add(&to->mnt_slave, &from->mnt_slave);
3404-
to->mnt_master = m;
3401+
hlist_add_behind(&to->mnt_slave, &from->mnt_slave);
3402+
to->mnt_master = from->mnt_master;
34053403
}
34063404

34073405
if (IS_MNT_SHARED(from)) {

fs/pnode.c

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,12 @@ static inline struct mount *next_peer(struct mount *p)
2121

2222
static inline struct mount *first_slave(struct mount *p)
2323
{
24-
return list_entry(p->mnt_slave_list.next, struct mount, mnt_slave);
24+
return hlist_entry(p->mnt_slave_list.first, struct mount, mnt_slave);
2525
}
2626

2727
static inline struct mount *next_slave(struct mount *p)
2828
{
29-
return list_entry(p->mnt_slave.next, struct mount, mnt_slave);
29+
return hlist_entry(p->mnt_slave.next, struct mount, mnt_slave);
3030
}
3131

3232
static struct mount *get_peer_under_root(struct mount *mnt,
@@ -85,21 +85,18 @@ static struct mount *propagation_source(struct mount *mnt)
8585

8686
static void transfer_propagation(struct mount *mnt, struct mount *to)
8787
{
88-
struct mount *slave_mnt;
89-
if (!to) {
90-
struct list_head *p = &mnt->mnt_slave_list;
91-
while (!list_empty(p)) {
92-
slave_mnt = list_first_entry(p,
93-
struct mount, mnt_slave);
94-
list_del_init(&slave_mnt->mnt_slave);
95-
slave_mnt->mnt_master = NULL;
96-
}
97-
return;
88+
struct hlist_node *p = NULL, *n;
89+
struct mount *m;
90+
91+
hlist_for_each_entry_safe(m, n, &mnt->mnt_slave_list, mnt_slave) {
92+
m->mnt_master = to;
93+
if (!to)
94+
hlist_del_init(&m->mnt_slave);
95+
else
96+
p = &m->mnt_slave;
9897
}
99-
list_for_each_entry(slave_mnt, &mnt->mnt_slave_list, mnt_slave)
100-
slave_mnt->mnt_master = to;
101-
list_splice(&mnt->mnt_slave_list, to->mnt_slave_list.prev);
102-
INIT_LIST_HEAD(&mnt->mnt_slave_list);
98+
if (p)
99+
hlist_splice_init(&mnt->mnt_slave_list, p, &to->mnt_slave_list);
103100
}
104101

105102
/*
@@ -124,10 +121,10 @@ void change_mnt_propagation(struct mount *mnt, int type)
124121
transfer_propagation(mnt, m);
125122
mnt->mnt_master = m;
126123
}
127-
list_del_init(&mnt->mnt_slave);
124+
hlist_del_init(&mnt->mnt_slave);
128125
if (type == MS_SLAVE) {
129126
if (mnt->mnt_master)
130-
list_add(&mnt->mnt_slave,
127+
hlist_add_head(&mnt->mnt_slave,
131128
&mnt->mnt_master->mnt_slave_list);
132129
} else {
133130
mnt->mnt_master = NULL;
@@ -147,7 +144,7 @@ static struct mount *__propagation_next(struct mount *m,
147144
if (master == origin->mnt_master) {
148145
struct mount *next = next_peer(m);
149146
return (next == origin) ? NULL : next;
150-
} else if (m->mnt_slave.next != &master->mnt_slave_list)
147+
} else if (m->mnt_slave.next)
151148
return next_slave(m);
152149

153150
/* back at master */
@@ -169,7 +166,7 @@ static struct mount *propagation_next(struct mount *m,
169166
struct mount *origin)
170167
{
171168
/* are there any slaves of this mount? */
172-
if (!IS_MNT_NEW(m) && !list_empty(&m->mnt_slave_list))
169+
if (!IS_MNT_NEW(m) && !hlist_empty(&m->mnt_slave_list))
173170
return first_slave(m);
174171

175172
return __propagation_next(m, origin);
@@ -194,7 +191,7 @@ static struct mount *next_group(struct mount *m, struct mount *origin)
194191
while (1) {
195192
while (1) {
196193
struct mount *next;
197-
if (!IS_MNT_NEW(m) && !list_empty(&m->mnt_slave_list))
194+
if (!IS_MNT_NEW(m) && !hlist_empty(&m->mnt_slave_list))
198195
return first_slave(m);
199196
next = next_peer(m);
200197
if (m->mnt_group_id == origin->mnt_group_id) {
@@ -207,7 +204,7 @@ static struct mount *next_group(struct mount *m, struct mount *origin)
207204
/* m is the last peer */
208205
while (1) {
209206
struct mount *master = m->mnt_master;
210-
if (m->mnt_slave.next != &master->mnt_slave_list)
207+
if (m->mnt_slave.next)
211208
return next_slave(m);
212209
m = next_peer(master);
213210
if (master->mnt_group_id == origin->mnt_group_id)

0 commit comments

Comments
 (0)