2 #include <linux/slab.h>
3 #include <linux/fs_pin.h>
6 static void pin_free_rcu(struct rcu_head *head)
8 kfree(container_of(head, struct fs_pin, rcu));
11 static DEFINE_SPINLOCK(pin_lock);
13 void pin_put(struct fs_pin *p)
15 if (atomic_long_dec_and_test(&p->count))
16 call_rcu(&p->rcu, pin_free_rcu);
19 void pin_remove(struct fs_pin *pin)
22 hlist_del(&pin->m_list);
23 hlist_del(&pin->s_list);
24 spin_unlock(&pin_lock);
27 void pin_insert(struct fs_pin *pin, struct vfsmount *m)
30 hlist_add_head(&pin->s_list, &m->mnt_sb->s_pins);
31 hlist_add_head(&pin->m_list, &real_mount(m)->mnt_pins);
32 spin_unlock(&pin_lock);
35 void acct_auto_close_mnt(struct hlist_head *list)
41 p = ACCESS_ONCE(list->first);
46 pin = hlist_entry(p, struct fs_pin, m_list);
47 if (!atomic_long_inc_not_zero(&pin->count)) {
57 void acct_auto_close(struct hlist_head *list)
63 p = ACCESS_ONCE(list->first);
68 pin = hlist_entry(p, struct fs_pin, s_list);
69 if (!atomic_long_inc_not_zero(&pin->count)) {