Skip to content

Commit 08d7a6f

Browse files
author
Miklos Szeredi
committed
cachefiles: only pass inode to *mark_inode_inuse() helpers
The only reason to pass dentry was because of a pr_notice() text. Move that to the two callers where it makes sense and add a WARN_ON() to the third. file_inode(file) is never NULL on an opened file. Remove check in cachefiles_unmark_inode_in_use(). Do not open code cachefiles_do_unmark_inode_in_use() in cachefiles_put_directory(). Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
1 parent 38017d4 commit 08d7a6f

1 file changed

Lines changed: 26 additions & 33 deletions

File tree

fs/cachefiles/namei.c

Lines changed: 26 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,8 @@
1515
* file or directory. The caller must hold the inode lock.
1616
*/
1717
static 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

3633
static 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
*/
5147
static 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

6054
static 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,
224217
void 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");
@@ -474,9 +465,9 @@ struct file *cachefiles_create_tmpfile(struct cachefiles_object *object)
474465

475466
trace_cachefiles_tmpfile(object, d_backing_inode(path.dentry));
476467

477-
ret = -EBUSY;
478-
if (!cachefiles_mark_inode_in_use(object, path.dentry))
479-
goto err_dput;
468+
/* This is a newly created file with no other possible user */
469+
if (!cachefiles_mark_inode_in_use(object, d_inode(path.dentry)))
470+
WARN_ON(1);
480471

481472
ret = cachefiles_ondemand_init_object(object);
482473
if (ret < 0)
@@ -520,8 +511,7 @@ struct file *cachefiles_create_tmpfile(struct cachefiles_object *object)
520511
return file;
521512

522513
err_unuse:
523-
cachefiles_do_unmark_inode_in_use(object, path.dentry);
524-
err_dput:
514+
cachefiles_do_unmark_inode_in_use(object, d_inode(path.dentry));
525515
dput(path.dentry);
526516
err:
527517
file = ERR_PTR(ret);
@@ -566,8 +556,11 @@ static bool cachefiles_open_file(struct cachefiles_object *object,
566556

567557
_enter("%pd", dentry);
568558

569-
if (!cachefiles_mark_inode_in_use(object, dentry))
559+
if (!cachefiles_mark_inode_in_use(object, d_inode(dentry))) {
560+
pr_notice("cachefiles: Inode already in use: %pd (B=%lx)\n",
561+
dentry, d_inode(dentry)->i_ino);
570562
return false;
563+
}
571564

572565
/* We need to open a file interface onto a data file now as we can't do
573566
* it on demand because writeback called from do_exit() sees
@@ -621,7 +614,7 @@ static bool cachefiles_open_file(struct cachefiles_object *object,
621614
error_fput:
622615
fput(file);
623616
error:
624-
cachefiles_do_unmark_inode_in_use(object, dentry);
617+
cachefiles_do_unmark_inode_in_use(object, d_inode(dentry));
625618
dput(dentry);
626619
return false;
627620
}

0 commit comments

Comments
 (0)