2323 * for each kernfs_node with one or more open files.
2424 *
2525 * kernfs_node->attr.open points to kernfs_open_node. attr.open is
26- * protected by kernfs_open_node_lock .
26+ * RCU protected .
2727 *
2828 * filp->private_data points to seq_file whose ->private points to
2929 * kernfs_open_file. kernfs_open_files are chained at
3030 * kernfs_open_node->files, which is protected by kernfs_open_file_mutex.
3131 */
32- static DEFINE_SPINLOCK (kernfs_open_node_lock );
3332static DEFINE_MUTEX (kernfs_open_file_mutex );
3433
3534struct kernfs_open_node {
35+ struct rcu_head rcu_head ;
3636 atomic_t event ;
3737 wait_queue_head_t poll ;
3838 struct list_head files ; /* goes through kernfs_open_file.list */
@@ -51,6 +51,52 @@ struct kernfs_open_node {
5151static DEFINE_SPINLOCK (kernfs_notify_lock );
5252static struct kernfs_node * kernfs_notify_list = KERNFS_NOTIFY_EOL ;
5353
54+ /**
55+ * kernfs_deref_open_node - Get kernfs_open_node corresponding to @kn.
56+ *
57+ * @of: associated kernfs_open_file instance.
58+ * @kn: target kernfs_node.
59+ *
60+ * Fetch and return ->attr.open of @kn if @of->list is non empty.
61+ * If @of->list is not empty we can safely assume that @of is on
62+ * @kn->attr.open->files list and this guarantees that @kn->attr.open
63+ * will not vanish i.e. dereferencing outside RCU read-side critical
64+ * section is safe here.
65+ *
66+ * The caller needs to make sure that @of->list is not empty.
67+ */
68+ static struct kernfs_open_node *
69+ kernfs_deref_open_node (struct kernfs_open_file * of , struct kernfs_node * kn )
70+ {
71+ struct kernfs_open_node * on ;
72+
73+ on = rcu_dereference_check (kn -> attr .open , !list_empty (& of -> list ));
74+
75+ return on ;
76+ }
77+
78+ /**
79+ * kernfs_deref_open_node_protected - Get kernfs_open_node corresponding to @kn
80+ *
81+ * @kn: target kernfs_node.
82+ *
83+ * Fetch and return ->attr.open of @kn when caller holds the
84+ * kernfs_open_file_mutex.
85+ *
86+ * Update of ->attr.open happens under kernfs_open_file_mutex. So when
87+ * the caller guarantees that this mutex is being held, other updaters can't
88+ * change ->attr.open and this means that we can safely deref ->attr.open
89+ * outside RCU read-side critical section.
90+ *
91+ * The caller needs to make sure that kernfs_open_file_mutex is held.
92+ */
93+ static struct kernfs_open_node *
94+ kernfs_deref_open_node_protected (struct kernfs_node * kn )
95+ {
96+ return rcu_dereference_protected (kn -> attr .open ,
97+ lockdep_is_held (& kernfs_open_file_mutex ));
98+ }
99+
54100static struct kernfs_open_file * kernfs_of (struct file * file )
55101{
56102 return ((struct seq_file * )file -> private_data )-> private ;
@@ -156,8 +202,12 @@ static void kernfs_seq_stop(struct seq_file *sf, void *v)
156202static int kernfs_seq_show (struct seq_file * sf , void * v )
157203{
158204 struct kernfs_open_file * of = sf -> private ;
205+ struct kernfs_open_node * on = kernfs_deref_open_node (of , of -> kn );
159206
160- of -> event = atomic_read (& of -> kn -> attr .open -> event );
207+ if (!on )
208+ return - EINVAL ;
209+
210+ of -> event = atomic_read (& on -> event );
161211
162212 return of -> kn -> attr .ops -> seq_show (sf , v );
163213}
@@ -180,6 +230,7 @@ static ssize_t kernfs_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)
180230 struct kernfs_open_file * of = kernfs_of (iocb -> ki_filp );
181231 ssize_t len = min_t (size_t , iov_iter_count (iter ), PAGE_SIZE );
182232 const struct kernfs_ops * ops ;
233+ struct kernfs_open_node * on ;
183234 char * buf ;
184235
185236 buf = of -> prealloc_buf ;
@@ -201,7 +252,15 @@ static ssize_t kernfs_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)
201252 goto out_free ;
202253 }
203254
204- of -> event = atomic_read (& of -> kn -> attr .open -> event );
255+ on = kernfs_deref_open_node (of , of -> kn );
256+ if (!on ) {
257+ len = - EINVAL ;
258+ mutex_unlock (& of -> mutex );
259+ goto out_free ;
260+ }
261+
262+ of -> event = atomic_read (& on -> event );
263+
205264 ops = kernfs_ops (of -> kn );
206265 if (ops -> read )
207266 len = ops -> read (of , buf , len , iocb -> ki_pos );
@@ -518,36 +577,29 @@ static int kernfs_get_open_node(struct kernfs_node *kn,
518577{
519578 struct kernfs_open_node * on , * new_on = NULL ;
520579
521- retry :
522580 mutex_lock (& kernfs_open_file_mutex );
523- spin_lock_irq (& kernfs_open_node_lock );
524-
525- if (!kn -> attr .open && new_on ) {
526- kn -> attr .open = new_on ;
527- new_on = NULL ;
528- }
529-
530- on = kn -> attr .open ;
531- if (on )
532- list_add_tail (& of -> list , & on -> files );
533-
534- spin_unlock_irq (& kernfs_open_node_lock );
535- mutex_unlock (& kernfs_open_file_mutex );
581+ on = kernfs_deref_open_node_protected (kn );
536582
537583 if (on ) {
538- kfree (new_on );
584+ list_add_tail (& of -> list , & on -> files );
585+ mutex_unlock (& kernfs_open_file_mutex );
539586 return 0 ;
587+ } else {
588+ /* not there, initialize a new one */
589+ new_on = kmalloc (sizeof (* new_on ), GFP_KERNEL );
590+ if (!new_on ) {
591+ mutex_unlock (& kernfs_open_file_mutex );
592+ return - ENOMEM ;
593+ }
594+ atomic_set (& new_on -> event , 1 );
595+ init_waitqueue_head (& new_on -> poll );
596+ INIT_LIST_HEAD (& new_on -> files );
597+ list_add_tail (& of -> list , & new_on -> files );
598+ rcu_assign_pointer (kn -> attr .open , new_on );
540599 }
600+ mutex_unlock (& kernfs_open_file_mutex );
541601
542- /* not there, initialize a new one and retry */
543- new_on = kmalloc (sizeof (* new_on ), GFP_KERNEL );
544- if (!new_on )
545- return - ENOMEM ;
546-
547- atomic_set (& new_on -> event , 1 );
548- init_waitqueue_head (& new_on -> poll );
549- INIT_LIST_HEAD (& new_on -> files );
550- goto retry ;
602+ return 0 ;
551603}
552604
553605/**
@@ -566,24 +618,25 @@ static int kernfs_get_open_node(struct kernfs_node *kn,
566618static void kernfs_unlink_open_file (struct kernfs_node * kn ,
567619 struct kernfs_open_file * of )
568620{
569- struct kernfs_open_node * on = kn -> attr .open ;
570- unsigned long flags ;
621+ struct kernfs_open_node * on ;
571622
572623 mutex_lock (& kernfs_open_file_mutex );
573- spin_lock_irqsave (& kernfs_open_node_lock , flags );
624+
625+ on = kernfs_deref_open_node_protected (kn );
626+ if (!on ) {
627+ mutex_unlock (& kernfs_open_file_mutex );
628+ return ;
629+ }
574630
575631 if (of )
576632 list_del (& of -> list );
577633
578- if (list_empty (& on -> files ))
579- kn -> attr .open = NULL ;
580- else
581- on = NULL ;
634+ if (list_empty (& on -> files )) {
635+ rcu_assign_pointer ( kn -> attr .open , NULL ) ;
636+ kfree_rcu ( on , rcu_head );
637+ }
582638
583- spin_unlock_irqrestore (& kernfs_open_node_lock , flags );
584639 mutex_unlock (& kernfs_open_file_mutex );
585-
586- kfree (on );
587640}
588641
589642static int kernfs_fop_open (struct inode * inode , struct file * file )
@@ -773,17 +826,16 @@ void kernfs_drain_open_files(struct kernfs_node *kn)
773826 * check under kernfs_open_file_mutex will ensure bailing out if
774827 * ->attr.open became NULL while waiting for the mutex.
775828 */
776- if (!kn -> attr .open )
829+ if (!rcu_access_pointer ( kn -> attr .open ) )
777830 return ;
778831
779832 mutex_lock (& kernfs_open_file_mutex );
780- if (!kn -> attr .open ) {
833+ on = kernfs_deref_open_node_protected (kn );
834+ if (!on ) {
781835 mutex_unlock (& kernfs_open_file_mutex );
782836 return ;
783837 }
784838
785- on = kn -> attr .open ;
786-
787839 list_for_each_entry (of , & on -> files , list ) {
788840 struct inode * inode = file_inode (of -> file );
789841
@@ -814,7 +866,10 @@ void kernfs_drain_open_files(struct kernfs_node *kn)
814866__poll_t kernfs_generic_poll (struct kernfs_open_file * of , poll_table * wait )
815867{
816868 struct kernfs_node * kn = kernfs_dentry_node (of -> file -> f_path .dentry );
817- struct kernfs_open_node * on = kn -> attr .open ;
869+ struct kernfs_open_node * on = kernfs_deref_open_node (of , kn );
870+
871+ if (!on )
872+ return EPOLLERR ;
818873
819874 poll_wait (of -> file , & on -> poll , wait );
820875
@@ -921,13 +976,13 @@ void kernfs_notify(struct kernfs_node *kn)
921976 return ;
922977
923978 /* kick poll immediately */
924- spin_lock_irqsave ( & kernfs_open_node_lock , flags );
925- on = kn -> attr .open ;
979+ rcu_read_lock ( );
980+ on = rcu_dereference ( kn -> attr .open ) ;
926981 if (on ) {
927982 atomic_inc (& on -> event );
928983 wake_up_interruptible (& on -> poll );
929984 }
930- spin_unlock_irqrestore ( & kernfs_open_node_lock , flags );
985+ rcu_read_unlock ( );
931986
932987 /* schedule work to kick fsnotify */
933988 spin_lock_irqsave (& kernfs_notify_lock , flags );
0 commit comments