Commit 7a0ad546 authored by Kees Cook's avatar Kees Cook
Browse files

pstore: Refactor pstorefs record list removal

The "unlink" handling should perform list removal (which can also make
sure records don't get double-erased), and the "evict" handling should
be responsible only for memory freeing.

Link: https://lore.kernel.org/lkml/20200506152114.50375-8-keescook@chromium.org/


Signed-off-by: default avatarKees Cook <keescook@chromium.org>
parent 6248a066
Loading
Loading
Loading
Loading
+13 −6
Original line number Diff line number Diff line
@@ -177,10 +177,21 @@ static int pstore_unlink(struct inode *dir, struct dentry *dentry)
{
	struct pstore_private *p = d_inode(dentry)->i_private;
	struct pstore_record *record = p->record;
	int rc = 0;

	if (!record->psi->erase)
		return -EPERM;

	/* Make sure we can't race while removing this file. */
	mutex_lock(&records_list_lock);
	if (!list_empty(&p->list))
		list_del_init(&p->list);
	else
		rc = -ENOENT;
	mutex_unlock(&records_list_lock);
	if (rc)
		return rc;

	mutex_lock(&record->psi->read_mutex);
	record->psi->erase(record);
	mutex_unlock(&record->psi->read_mutex);
@@ -193,13 +204,8 @@ static void pstore_evict_inode(struct inode *inode)
	struct pstore_private	*p = inode->i_private;

	clear_inode(inode);
	if (p) {
		mutex_lock(&records_list_lock);
		list_del(&p->list);
		mutex_unlock(&records_list_lock);
	free_pstore_private(p);
}
}

static const struct inode_operations pstore_dir_inode_operations = {
	.lookup		= simple_lookup,
@@ -417,6 +423,7 @@ static void pstore_kill_sb(struct super_block *sb)
{
	kill_litter_super(sb);
	pstore_sb = NULL;
	INIT_LIST_HEAD(&records_list);
}

static struct file_system_type pstore_fs_type = {