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

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
Loading
Loading
Loading
Loading
+26 −33
Original line number Diff line number Diff line
@@ -15,9 +15,8 @@
 * file or directory.  The caller must hold the inode lock.
 */
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;

	if (!(inode->i_flags & S_KERNEL_FILE)) {
@@ -26,21 +25,18 @@ static bool __cachefiles_mark_inode_in_use(struct cachefiles_object *object,
		can_use = true;
	} else {
		trace_cachefiles_mark_failed(object, inode);
		pr_notice("cachefiles: Inode already in use: %pd (B=%lx)\n",
			  dentry, inode->i_ino);
	}

	return can_use;
}

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;

	inode_lock(inode);
	can_use = __cachefiles_mark_inode_in_use(object, dentry);
	can_use = __cachefiles_mark_inode_in_use(object, inode);
	inode_unlock(inode);
	return can_use;
}
@@ -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.
 */
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;
	trace_cachefiles_mark_inactive(object, inode);
}

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);
	__cachefiles_unmark_inode_in_use(object, dentry);
	__cachefiles_unmark_inode_in_use(object, inode);
	inode_unlock(inode);
}

@@ -77,8 +69,7 @@ void cachefiles_unmark_inode_in_use(struct cachefiles_object *object,
	struct cachefiles_cache *cache = object->volume->cache;
	struct inode *inode = file_inode(file);

	if (inode) {
		cachefiles_do_unmark_inode_in_use(object, file->f_path.dentry);
	cachefiles_do_unmark_inode_in_use(object, inode);

	if (!test_bit(CACHEFILES_OBJECT_USING_TMPFILE, &object->flags)) {
		atomic_long_add(inode->i_blocks, &cache->b_released);
@@ -86,7 +77,6 @@ void cachefiles_unmark_inode_in_use(struct cachefiles_object *object,
			cachefiles_state_changed(cache);
	}
}
}

/*
 * get a subdirectory
@@ -164,8 +154,11 @@ struct dentry *cachefiles_get_directory(struct cachefiles_cache *cache,
	inode_lock(d_inode(subdir));
	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;
	}

	inode_unlock(d_inode(subdir));

@@ -224,9 +217,7 @@ struct dentry *cachefiles_get_directory(struct cachefiles_cache *cache,
void cachefiles_put_directory(struct dentry *dir)
{
	if (dir) {
		inode_lock(dir->d_inode);
		__cachefiles_unmark_inode_in_use(NULL, dir);
		inode_unlock(dir->d_inode);
		cachefiles_do_unmark_inode_in_use(NULL, d_inode(dir));
		dput(dir);
	}
}
@@ -410,7 +401,7 @@ int cachefiles_bury_object(struct cachefiles_cache *cache,
					    "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);
	dput(grave);
	_leave(" = 0");
@@ -474,9 +465,9 @@ struct file *cachefiles_create_tmpfile(struct cachefiles_object *object)

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

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

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

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

	_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;
	}

	/* 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
@@ -621,7 +614,7 @@ static bool cachefiles_open_file(struct cachefiles_object *object,
error_fput:
	fput(file);
error:
	cachefiles_do_unmark_inode_in_use(object, dentry);
	cachefiles_do_unmark_inode_in_use(object, d_inode(dentry));
	dput(dentry);
	return false;
}