1515 * file or directory. The caller must hold the inode lock.
1616 */
1717static bool __cachefiles_mark_inode_in_use (struct cachefiles_object * object ,
18- struct dentry * dentry )
18+ struct inode * inode )
1919{
20- struct inode * inode = d_backing_inode (dentry );
2120 bool can_use = false;
2221
2322 if (!(inode -> i_flags & S_KERNEL_FILE )) {
@@ -26,21 +25,18 @@ static bool __cachefiles_mark_inode_in_use(struct cachefiles_object *object,
2625 can_use = true;
2726 } else {
2827 trace_cachefiles_mark_failed (object , inode );
29- pr_notice ("cachefiles: Inode already in use: %pd (B=%lx)\n" ,
30- dentry , inode -> i_ino );
3128 }
3229
3330 return can_use ;
3431}
3532
3633static bool cachefiles_mark_inode_in_use (struct cachefiles_object * object ,
37- struct dentry * dentry )
34+ struct inode * inode )
3835{
39- struct inode * inode = d_backing_inode (dentry );
4036 bool can_use ;
4137
4238 inode_lock (inode );
43- can_use = __cachefiles_mark_inode_in_use (object , dentry );
39+ can_use = __cachefiles_mark_inode_in_use (object , inode );
4440 inode_unlock (inode );
4541 return can_use ;
4642}
@@ -49,21 +45,17 @@ static bool cachefiles_mark_inode_in_use(struct cachefiles_object *object,
4945 * Unmark a backing inode. The caller must hold the inode lock.
5046 */
5147static void __cachefiles_unmark_inode_in_use (struct cachefiles_object * object ,
52- struct dentry * dentry )
48+ struct inode * inode )
5349{
54- struct inode * inode = d_backing_inode (dentry );
55-
5650 inode -> i_flags &= ~S_KERNEL_FILE ;
5751 trace_cachefiles_mark_inactive (object , inode );
5852}
5953
6054static void cachefiles_do_unmark_inode_in_use (struct cachefiles_object * object ,
61- struct dentry * dentry )
55+ struct inode * inode )
6256{
63- struct inode * inode = d_backing_inode (dentry );
64-
6557 inode_lock (inode );
66- __cachefiles_unmark_inode_in_use (object , dentry );
58+ __cachefiles_unmark_inode_in_use (object , inode );
6759 inode_unlock (inode );
6860}
6961
@@ -77,14 +69,12 @@ void cachefiles_unmark_inode_in_use(struct cachefiles_object *object,
7769 struct cachefiles_cache * cache = object -> volume -> cache ;
7870 struct inode * inode = file_inode (file );
7971
80- if (inode ) {
81- cachefiles_do_unmark_inode_in_use (object , file -> f_path .dentry );
72+ cachefiles_do_unmark_inode_in_use (object , inode );
8273
83- if (!test_bit (CACHEFILES_OBJECT_USING_TMPFILE , & object -> flags )) {
84- atomic_long_add (inode -> i_blocks , & cache -> b_released );
85- if (atomic_inc_return (& cache -> f_released ))
86- cachefiles_state_changed (cache );
87- }
74+ if (!test_bit (CACHEFILES_OBJECT_USING_TMPFILE , & object -> flags )) {
75+ atomic_long_add (inode -> i_blocks , & cache -> b_released );
76+ if (atomic_inc_return (& cache -> f_released ))
77+ cachefiles_state_changed (cache );
8878 }
8979}
9080
@@ -164,8 +154,11 @@ struct dentry *cachefiles_get_directory(struct cachefiles_cache *cache,
164154 inode_lock (d_inode (subdir ));
165155 inode_unlock (d_inode (dir ));
166156
167- if (!__cachefiles_mark_inode_in_use (NULL , subdir ))
157+ if (!__cachefiles_mark_inode_in_use (NULL , d_inode (subdir ))) {
158+ pr_notice ("cachefiles: Inode already in use: %pd (B=%lx)\n" ,
159+ subdir , d_inode (subdir )-> i_ino );
168160 goto mark_error ;
161+ }
169162
170163 inode_unlock (d_inode (subdir ));
171164
@@ -224,9 +217,7 @@ struct dentry *cachefiles_get_directory(struct cachefiles_cache *cache,
224217void cachefiles_put_directory (struct dentry * dir )
225218{
226219 if (dir ) {
227- inode_lock (dir -> d_inode );
228- __cachefiles_unmark_inode_in_use (NULL , dir );
229- inode_unlock (dir -> d_inode );
220+ cachefiles_do_unmark_inode_in_use (NULL , d_inode (dir ));
230221 dput (dir );
231222 }
232223}
@@ -410,7 +401,7 @@ int cachefiles_bury_object(struct cachefiles_cache *cache,
410401 "Rename failed with error %d" , ret );
411402 }
412403
413- __cachefiles_unmark_inode_in_use (object , rep );
404+ __cachefiles_unmark_inode_in_use (object , d_inode ( rep ) );
414405 unlock_rename (cache -> graveyard , dir );
415406 dput (grave );
416407 _leave (" = 0" );
@@ -451,84 +442,72 @@ struct file *cachefiles_create_tmpfile(struct cachefiles_object *object)
451442 const struct cred * saved_cred ;
452443 struct dentry * fan = volume -> fanout [(u8 )object -> cookie -> key_hash ];
453444 struct file * file ;
454- struct path path ;
445+ const struct path parentpath = { . mnt = cache -> mnt , . dentry = fan } ;
455446 uint64_t ni_size ;
456447 long ret ;
457448
458449
459450 cachefiles_begin_secure (cache , & saved_cred );
460451
461- path .mnt = cache -> mnt ;
462452 ret = cachefiles_inject_write_error ();
463- if (ret == 0 )
464- path .dentry = vfs_tmpfile (& init_user_ns , fan , S_IFREG , O_RDWR );
465- else
466- path .dentry = ERR_PTR (ret );
467- if (IS_ERR (path .dentry )) {
468- trace_cachefiles_vfs_error (object , d_inode (fan ), PTR_ERR (path .dentry ),
453+ if (ret == 0 ) {
454+ file = vfs_tmpfile_open (& init_user_ns , & parentpath , S_IFREG ,
455+ O_RDWR | O_LARGEFILE | O_DIRECT ,
456+ cache -> cache_cred );
457+ ret = PTR_ERR_OR_ZERO (file );
458+ }
459+ if (ret ) {
460+ trace_cachefiles_vfs_error (object , d_inode (fan ), ret ,
469461 cachefiles_trace_tmpfile_error );
470- if (PTR_ERR ( path . dentry ) == - EIO )
462+ if (ret == - EIO )
471463 cachefiles_io_error_obj (object , "Failed to create tmpfile" );
472- file = ERR_CAST (path .dentry );
473- goto out ;
464+ goto err ;
474465 }
475466
476- trace_cachefiles_tmpfile (object , d_backing_inode ( path . dentry ));
467+ trace_cachefiles_tmpfile (object , file_inode ( file ));
477468
478- if (!cachefiles_mark_inode_in_use (object , path .dentry )) {
479- file = ERR_PTR (- EBUSY );
480- goto out_dput ;
481- }
469+ /* This is a newly created file with no other possible user */
470+ if (!cachefiles_mark_inode_in_use (object , file_inode (file )))
471+ WARN_ON (1 );
482472
483473 ret = cachefiles_ondemand_init_object (object );
484- if (ret < 0 ) {
485- file = ERR_PTR (ret );
486- goto out_unuse ;
487- }
474+ if (ret < 0 )
475+ goto err_unuse ;
488476
489477 ni_size = object -> cookie -> object_size ;
490478 ni_size = round_up (ni_size , CACHEFILES_DIO_BLOCK_SIZE );
491479
492480 if (ni_size > 0 ) {
493- trace_cachefiles_trunc (object , d_backing_inode ( path . dentry ), 0 , ni_size ,
481+ trace_cachefiles_trunc (object , file_inode ( file ), 0 , ni_size ,
494482 cachefiles_trunc_expand_tmpfile );
495483 ret = cachefiles_inject_write_error ();
496484 if (ret == 0 )
497- ret = vfs_truncate (& path , ni_size );
485+ ret = vfs_truncate (& file -> f_path , ni_size );
498486 if (ret < 0 ) {
499487 trace_cachefiles_vfs_error (
500- object , d_backing_inode ( path . dentry ), ret ,
488+ object , file_inode ( file ), ret ,
501489 cachefiles_trace_trunc_error );
502- file = ERR_PTR (ret );
503- goto out_unuse ;
490+ goto err_unuse ;
504491 }
505492 }
506493
507- file = open_with_fake_path (& path , O_RDWR | O_LARGEFILE | O_DIRECT ,
508- d_backing_inode (path .dentry ), cache -> cache_cred );
509- if (IS_ERR (file )) {
510- trace_cachefiles_vfs_error (object , d_backing_inode (path .dentry ),
511- PTR_ERR (file ),
512- cachefiles_trace_open_error );
513- goto out_unuse ;
514- }
494+ ret = - EINVAL ;
515495 if (unlikely (!file -> f_op -> read_iter ) ||
516496 unlikely (!file -> f_op -> write_iter )) {
517497 fput (file );
518498 pr_notice ("Cache does not support read_iter and write_iter\n" );
519- file = ERR_PTR (- EINVAL );
520- goto out_unuse ;
499+ goto err_unuse ;
521500 }
522-
523- goto out_dput ;
524-
525- out_unuse :
526- cachefiles_do_unmark_inode_in_use (object , path .dentry );
527- out_dput :
528- dput (path .dentry );
529501out :
530502 cachefiles_end_secure (cache , saved_cred );
531503 return file ;
504+
505+ err_unuse :
506+ cachefiles_do_unmark_inode_in_use (object , file_inode (file ));
507+ fput (file );
508+ err :
509+ file = ERR_PTR (ret );
510+ goto out ;
532511}
533512
534513/*
@@ -569,8 +548,11 @@ static bool cachefiles_open_file(struct cachefiles_object *object,
569548
570549 _enter ("%pd" , dentry );
571550
572- if (!cachefiles_mark_inode_in_use (object , dentry ))
551+ if (!cachefiles_mark_inode_in_use (object , d_inode (dentry ))) {
552+ pr_notice ("cachefiles: Inode already in use: %pd (B=%lx)\n" ,
553+ dentry , d_inode (dentry )-> i_ino );
573554 return false;
555+ }
574556
575557 /* We need to open a file interface onto a data file now as we can't do
576558 * it on demand because writeback called from do_exit() sees
@@ -624,7 +606,7 @@ static bool cachefiles_open_file(struct cachefiles_object *object,
624606error_fput :
625607 fput (file );
626608error :
627- cachefiles_do_unmark_inode_in_use (object , dentry );
609+ cachefiles_do_unmark_inode_in_use (object , d_inode ( dentry ) );
628610 dput (dentry );
629611 return false;
630612}
0 commit comments