@@ -70,6 +70,24 @@ static struct kernfs_open_node *of_on(struct kernfs_open_file *of)
7070 !list_empty (& of -> list ));
7171}
7272
73+ /* Get active reference to kernfs node for an open file */
74+ static struct kernfs_open_file * kernfs_get_active_of (struct kernfs_open_file * of )
75+ {
76+ /* Skip if file was already released */
77+ if (unlikely (of -> released ))
78+ return NULL ;
79+
80+ if (!kernfs_get_active (of -> kn ))
81+ return NULL ;
82+
83+ return of ;
84+ }
85+
86+ static void kernfs_put_active_of (struct kernfs_open_file * of )
87+ {
88+ return kernfs_put_active (of -> kn );
89+ }
90+
7391/**
7492 * kernfs_deref_open_node_locked - Get kernfs_open_node corresponding to @kn
7593 *
@@ -139,7 +157,7 @@ static void kernfs_seq_stop_active(struct seq_file *sf, void *v)
139157
140158 if (ops -> seq_stop )
141159 ops -> seq_stop (sf , v );
142- kernfs_put_active (of -> kn );
160+ kernfs_put_active_of (of );
143161}
144162
145163static void * kernfs_seq_start (struct seq_file * sf , loff_t * ppos )
@@ -152,7 +170,7 @@ static void *kernfs_seq_start(struct seq_file *sf, loff_t *ppos)
152170 * the ops aren't called concurrently for the same open file.
153171 */
154172 mutex_lock (& of -> mutex );
155- if (!kernfs_get_active (of -> kn ))
173+ if (!kernfs_get_active_of (of ))
156174 return ERR_PTR (- ENODEV );
157175
158176 ops = kernfs_ops (of -> kn );
@@ -238,7 +256,7 @@ static ssize_t kernfs_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)
238256 * the ops aren't called concurrently for the same open file.
239257 */
240258 mutex_lock (& of -> mutex );
241- if (!kernfs_get_active (of -> kn )) {
259+ if (!kernfs_get_active_of (of )) {
242260 len = - ENODEV ;
243261 mutex_unlock (& of -> mutex );
244262 goto out_free ;
@@ -252,7 +270,7 @@ static ssize_t kernfs_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)
252270 else
253271 len = - EINVAL ;
254272
255- kernfs_put_active (of -> kn );
273+ kernfs_put_active_of (of );
256274 mutex_unlock (& of -> mutex );
257275
258276 if (len < 0 )
@@ -323,7 +341,7 @@ static ssize_t kernfs_fop_write_iter(struct kiocb *iocb, struct iov_iter *iter)
323341 * the ops aren't called concurrently for the same open file.
324342 */
325343 mutex_lock (& of -> mutex );
326- if (!kernfs_get_active (of -> kn )) {
344+ if (!kernfs_get_active_of (of )) {
327345 mutex_unlock (& of -> mutex );
328346 len = - ENODEV ;
329347 goto out_free ;
@@ -335,7 +353,7 @@ static ssize_t kernfs_fop_write_iter(struct kiocb *iocb, struct iov_iter *iter)
335353 else
336354 len = - EINVAL ;
337355
338- kernfs_put_active (of -> kn );
356+ kernfs_put_active_of (of );
339357 mutex_unlock (& of -> mutex );
340358
341359 if (len > 0 )
@@ -357,13 +375,13 @@ static void kernfs_vma_open(struct vm_area_struct *vma)
357375 if (!of -> vm_ops )
358376 return ;
359377
360- if (!kernfs_get_active (of -> kn ))
378+ if (!kernfs_get_active_of (of ))
361379 return ;
362380
363381 if (of -> vm_ops -> open )
364382 of -> vm_ops -> open (vma );
365383
366- kernfs_put_active (of -> kn );
384+ kernfs_put_active_of (of );
367385}
368386
369387static vm_fault_t kernfs_vma_fault (struct vm_fault * vmf )
@@ -375,14 +393,14 @@ static vm_fault_t kernfs_vma_fault(struct vm_fault *vmf)
375393 if (!of -> vm_ops )
376394 return VM_FAULT_SIGBUS ;
377395
378- if (!kernfs_get_active (of -> kn ))
396+ if (!kernfs_get_active_of (of ))
379397 return VM_FAULT_SIGBUS ;
380398
381399 ret = VM_FAULT_SIGBUS ;
382400 if (of -> vm_ops -> fault )
383401 ret = of -> vm_ops -> fault (vmf );
384402
385- kernfs_put_active (of -> kn );
403+ kernfs_put_active_of (of );
386404 return ret ;
387405}
388406
@@ -395,7 +413,7 @@ static vm_fault_t kernfs_vma_page_mkwrite(struct vm_fault *vmf)
395413 if (!of -> vm_ops )
396414 return VM_FAULT_SIGBUS ;
397415
398- if (!kernfs_get_active (of -> kn ))
416+ if (!kernfs_get_active_of (of ))
399417 return VM_FAULT_SIGBUS ;
400418
401419 ret = 0 ;
@@ -404,7 +422,7 @@ static vm_fault_t kernfs_vma_page_mkwrite(struct vm_fault *vmf)
404422 else
405423 file_update_time (file );
406424
407- kernfs_put_active (of -> kn );
425+ kernfs_put_active_of (of );
408426 return ret ;
409427}
410428
@@ -418,14 +436,14 @@ static int kernfs_vma_access(struct vm_area_struct *vma, unsigned long addr,
418436 if (!of -> vm_ops )
419437 return - EINVAL ;
420438
421- if (!kernfs_get_active (of -> kn ))
439+ if (!kernfs_get_active_of (of ))
422440 return - EINVAL ;
423441
424442 ret = - EINVAL ;
425443 if (of -> vm_ops -> access )
426444 ret = of -> vm_ops -> access (vma , addr , buf , len , write );
427445
428- kernfs_put_active (of -> kn );
446+ kernfs_put_active_of (of );
429447 return ret ;
430448}
431449
@@ -455,7 +473,7 @@ static int kernfs_fop_mmap(struct file *file, struct vm_area_struct *vma)
455473 mutex_lock (& of -> mutex );
456474
457475 rc = - ENODEV ;
458- if (!kernfs_get_active (of -> kn ))
476+ if (!kernfs_get_active_of (of ))
459477 goto out_unlock ;
460478
461479 ops = kernfs_ops (of -> kn );
@@ -490,7 +508,7 @@ static int kernfs_fop_mmap(struct file *file, struct vm_area_struct *vma)
490508 }
491509 vma -> vm_ops = & kernfs_vm_ops ;
492510out_put :
493- kernfs_put_active (of -> kn );
511+ kernfs_put_active_of (of );
494512out_unlock :
495513 mutex_unlock (& of -> mutex );
496514
@@ -851,15 +869,15 @@ static __poll_t kernfs_fop_poll(struct file *filp, poll_table *wait)
851869 struct kernfs_node * kn = kernfs_dentry_node (filp -> f_path .dentry );
852870 __poll_t ret ;
853871
854- if (!kernfs_get_active ( kn ))
872+ if (!kernfs_get_active_of ( of ))
855873 return DEFAULT_POLLMASK |EPOLLERR |EPOLLPRI ;
856874
857875 if (kn -> attr .ops -> poll )
858876 ret = kn -> attr .ops -> poll (of , wait );
859877 else
860878 ret = kernfs_generic_poll (of , wait );
861879
862- kernfs_put_active ( kn );
880+ kernfs_put_active_of ( of );
863881 return ret ;
864882}
865883
@@ -874,7 +892,7 @@ static loff_t kernfs_fop_llseek(struct file *file, loff_t offset, int whence)
874892 * the ops aren't called concurrently for the same open file.
875893 */
876894 mutex_lock (& of -> mutex );
877- if (!kernfs_get_active (of -> kn )) {
895+ if (!kernfs_get_active_of (of )) {
878896 mutex_unlock (& of -> mutex );
879897 return - ENODEV ;
880898 }
@@ -885,7 +903,7 @@ static loff_t kernfs_fop_llseek(struct file *file, loff_t offset, int whence)
885903 else
886904 ret = generic_file_llseek (file , offset , whence );
887905
888- kernfs_put_active (of -> kn );
906+ kernfs_put_active_of (of );
889907 mutex_unlock (& of -> mutex );
890908 return ret ;
891909}
0 commit comments