1 // SPDX-License-Identifier: GPL-2.0
3 #include <linux/sched.h>
4 #include <linux/slab.h>
8 static DEFINE_SPINLOCK(pin_lock
);
10 void pin_remove(struct fs_pin
*pin
)
13 hlist_del_init(&pin
->m_list
);
14 hlist_del_init(&pin
->s_list
);
15 spin_unlock(&pin_lock
);
16 spin_lock_irq(&pin
->wait
.lock
);
18 wake_up_locked(&pin
->wait
);
19 spin_unlock_irq(&pin
->wait
.lock
);
22 void pin_insert_group(struct fs_pin
*pin
, struct vfsmount
*m
, struct hlist_head
*p
)
26 hlist_add_head(&pin
->s_list
, p
);
27 hlist_add_head(&pin
->m_list
, &real_mount(m
)->mnt_pins
);
28 spin_unlock(&pin_lock
);
31 void pin_insert(struct fs_pin
*pin
, struct vfsmount
*m
)
33 pin_insert_group(pin
, m
, &m
->mnt_sb
->s_pins
);
36 void pin_kill(struct fs_pin
*p
)
38 wait_queue_entry_t wait
;
45 spin_lock_irq(&p
->wait
.lock
);
46 if (likely(!p
->done
)) {
48 spin_unlock_irq(&p
->wait
.lock
);
54 spin_unlock_irq(&p
->wait
.lock
);
58 __add_wait_queue(&p
->wait
, &wait
);
60 set_current_state(TASK_UNINTERRUPTIBLE
);
61 spin_unlock_irq(&p
->wait
.lock
);
65 if (likely(list_empty(&wait
.entry
)))
67 /* OK, we know p couldn't have been freed yet */
68 spin_lock_irq(&p
->wait
.lock
);
70 spin_unlock_irq(&p
->wait
.lock
);
77 void mnt_pin_kill(struct mount
*m
)
82 p
= ACCESS_ONCE(m
->mnt_pins
.first
);
87 pin_kill(hlist_entry(p
, struct fs_pin
, m_list
));
91 void group_pin_kill(struct hlist_head
*p
)
96 q
= ACCESS_ONCE(p
->first
);
101 pin_kill(hlist_entry(q
, struct fs_pin
, s_list
));