Commit 08d7a6fb authored by Miklos Szeredi's avatar Miklos Szeredi

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: default avatarMiklos Szeredi <mszeredi@redhat.com>
parent 38017d44
...@@ -15,9 +15,8 @@ ...@@ -15,9 +15,8 @@
* file or directory. The caller must hold the inode lock. * file or directory. The caller must hold the inode lock.
*/ */
static bool __cachefiles_mark_inode_in_use(struct cachefiles_object *object, static bool __cachefiles_mark_inode_in_use(struct cachefiles_object *object,
struct dentry *dentry) struct inode *inode)
{ {
struct inode *inode = d_backing_inode(dentry);
bool can_use = false; bool can_use = false;
if (!(inode->i_flags & S_KERNEL_FILE)) { if (!(inode->i_flags & S_KERNEL_FILE)) {
...@@ -26,21 +25,18 @@ static bool __cachefiles_mark_inode_in_use(struct cachefiles_object *object, ...@@ -26,21 +25,18 @@ static bool __cachefiles_mark_inode_in_use(struct cachefiles_object *object,
can_use = true; can_use = true;
} else { } else {
trace_cachefiles_mark_failed(object, inode); trace_cachefiles_mark_failed(object, inode);
pr_notice("cachefiles: Inode already in use: %pd (B=%lx)\n",
dentry, inode->i_ino);
} }
return can_use; return can_use;
} }
static bool cachefiles_mark_inode_in_use(struct cachefiles_object *object, static bool cachefiles_mark_inode_in_use(struct cachefiles_object *object,
struct dentry *dentry) struct inode *inode)
{ {
struct inode *inode = d_backing_inode(dentry);
bool can_use; bool can_use;
inode_lock(inode); inode_lock(inode);
can_use = __cachefiles_mark_inode_in_use(object, dentry); can_use = __cachefiles_mark_inode_in_use(object, inode);
inode_unlock(inode); inode_unlock(inode);
return can_use; return can_use;
} }
...@@ -49,21 +45,17 @@ static bool cachefiles_mark_inode_in_use(struct cachefiles_object *object, ...@@ -49,21 +45,17 @@ static bool cachefiles_mark_inode_in_use(struct cachefiles_object *object,
* Unmark a backing inode. The caller must hold the inode lock. * Unmark a backing inode. The caller must hold the inode lock.
*/ */
static void __cachefiles_unmark_inode_in_use(struct cachefiles_object *object, static void __cachefiles_unmark_inode_in_use(struct cachefiles_object *object,
struct dentry *dentry) struct inode *inode)
{ {
struct inode *inode = d_backing_inode(dentry);
inode->i_flags &= ~S_KERNEL_FILE; inode->i_flags &= ~S_KERNEL_FILE;
trace_cachefiles_mark_inactive(object, inode); trace_cachefiles_mark_inactive(object, inode);
} }
static void cachefiles_do_unmark_inode_in_use(struct cachefiles_object *object, static void cachefiles_do_unmark_inode_in_use(struct cachefiles_object *object,
struct dentry *dentry) struct inode *inode)
{ {
struct inode *inode = d_backing_inode(dentry);
inode_lock(inode); inode_lock(inode);
__cachefiles_unmark_inode_in_use(object, dentry); __cachefiles_unmark_inode_in_use(object, inode);
inode_unlock(inode); inode_unlock(inode);
} }
...@@ -77,14 +69,12 @@ void cachefiles_unmark_inode_in_use(struct cachefiles_object *object, ...@@ -77,14 +69,12 @@ void cachefiles_unmark_inode_in_use(struct cachefiles_object *object,
struct cachefiles_cache *cache = object->volume->cache; struct cachefiles_cache *cache = object->volume->cache;
struct inode *inode = file_inode(file); struct inode *inode = file_inode(file);
if (inode) { cachefiles_do_unmark_inode_in_use(object, inode);
cachefiles_do_unmark_inode_in_use(object, file->f_path.dentry);
if (!test_bit(CACHEFILES_OBJECT_USING_TMPFILE, &object->flags)) { if (!test_bit(CACHEFILES_OBJECT_USING_TMPFILE, &object->flags)) {
atomic_long_add(inode->i_blocks, &cache->b_released); atomic_long_add(inode->i_blocks, &cache->b_released);
if (atomic_inc_return(&cache->f_released)) if (atomic_inc_return(&cache->f_released))
cachefiles_state_changed(cache); cachefiles_state_changed(cache);
}
} }
} }
...@@ -164,8 +154,11 @@ struct dentry *cachefiles_get_directory(struct cachefiles_cache *cache, ...@@ -164,8 +154,11 @@ struct dentry *cachefiles_get_directory(struct cachefiles_cache *cache,
inode_lock(d_inode(subdir)); inode_lock(d_inode(subdir));
inode_unlock(d_inode(dir)); inode_unlock(d_inode(dir));
if (!__cachefiles_mark_inode_in_use(NULL, subdir)) if (!__cachefiles_mark_inode_in_use(NULL, d_inode(subdir))) {
pr_notice("cachefiles: Inode already in use: %pd (B=%lx)\n",
subdir, d_inode(subdir)->i_ino);
goto mark_error; goto mark_error;
}
inode_unlock(d_inode(subdir)); inode_unlock(d_inode(subdir));
...@@ -224,9 +217,7 @@ struct dentry *cachefiles_get_directory(struct cachefiles_cache *cache, ...@@ -224,9 +217,7 @@ struct dentry *cachefiles_get_directory(struct cachefiles_cache *cache,
void cachefiles_put_directory(struct dentry *dir) void cachefiles_put_directory(struct dentry *dir)
{ {
if (dir) { if (dir) {
inode_lock(dir->d_inode); cachefiles_do_unmark_inode_in_use(NULL, d_inode(dir));
__cachefiles_unmark_inode_in_use(NULL, dir);
inode_unlock(dir->d_inode);
dput(dir); dput(dir);
} }
} }
...@@ -410,7 +401,7 @@ int cachefiles_bury_object(struct cachefiles_cache *cache, ...@@ -410,7 +401,7 @@ int cachefiles_bury_object(struct cachefiles_cache *cache,
"Rename failed with error %d", ret); "Rename failed with error %d", ret);
} }
__cachefiles_unmark_inode_in_use(object, rep); __cachefiles_unmark_inode_in_use(object, d_inode(rep));
unlock_rename(cache->graveyard, dir); unlock_rename(cache->graveyard, dir);
dput(grave); dput(grave);
_leave(" = 0"); _leave(" = 0");
...@@ -474,9 +465,9 @@ struct file *cachefiles_create_tmpfile(struct cachefiles_object *object) ...@@ -474,9 +465,9 @@ struct file *cachefiles_create_tmpfile(struct cachefiles_object *object)
trace_cachefiles_tmpfile(object, d_backing_inode(path.dentry)); trace_cachefiles_tmpfile(object, d_backing_inode(path.dentry));
ret = -EBUSY; /* This is a newly created file with no other possible user */
if (!cachefiles_mark_inode_in_use(object, path.dentry)) if (!cachefiles_mark_inode_in_use(object, d_inode(path.dentry)))
goto err_dput; WARN_ON(1);
ret = cachefiles_ondemand_init_object(object); ret = cachefiles_ondemand_init_object(object);
if (ret < 0) if (ret < 0)
...@@ -520,8 +511,7 @@ struct file *cachefiles_create_tmpfile(struct cachefiles_object *object) ...@@ -520,8 +511,7 @@ struct file *cachefiles_create_tmpfile(struct cachefiles_object *object)
return file; return file;
err_unuse: err_unuse:
cachefiles_do_unmark_inode_in_use(object, path.dentry); cachefiles_do_unmark_inode_in_use(object, d_inode(path.dentry));
err_dput:
dput(path.dentry); dput(path.dentry);
err: err:
file = ERR_PTR(ret); file = ERR_PTR(ret);
...@@ -566,8 +556,11 @@ static bool cachefiles_open_file(struct cachefiles_object *object, ...@@ -566,8 +556,11 @@ static bool cachefiles_open_file(struct cachefiles_object *object,
_enter("%pd", dentry); _enter("%pd", dentry);
if (!cachefiles_mark_inode_in_use(object, dentry)) if (!cachefiles_mark_inode_in_use(object, d_inode(dentry))) {
pr_notice("cachefiles: Inode already in use: %pd (B=%lx)\n",
dentry, d_inode(dentry)->i_ino);
return false; return false;
}
/* We need to open a file interface onto a data file now as we can't do /* We need to open a file interface onto a data file now as we can't do
* it on demand because writeback called from do_exit() sees * it on demand because writeback called from do_exit() sees
...@@ -621,7 +614,7 @@ static bool cachefiles_open_file(struct cachefiles_object *object, ...@@ -621,7 +614,7 @@ static bool cachefiles_open_file(struct cachefiles_object *object,
error_fput: error_fput:
fput(file); fput(file);
error: error:
cachefiles_do_unmark_inode_in_use(object, dentry); cachefiles_do_unmark_inode_in_use(object, d_inode(dentry));
dput(dentry); dput(dentry);
return false; return false;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment