Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b130ed59 authored by Kinglong Mee's avatar Kinglong Mee Committed by Al Viro
Browse files

FS-Cache: Don't override netfs's primary_index if registering failed



Only override netfs->primary_index when registering success.

Cc: stable@vger.kernel.org # v2.6.30+
Signed-off-by: default avatarKinglong Mee <kinglongmee@gmail.com>
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 86108c2e
Loading
Loading
Loading
Loading
+17 −18
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ static LIST_HEAD(fscache_netfs_list);
int __fscache_register_netfs(struct fscache_netfs *netfs)
{
	struct fscache_netfs *ptr;
	struct fscache_cookie *cookie;
	int ret;

	_enter("{%s}", netfs->name);
@@ -29,26 +30,25 @@ int __fscache_register_netfs(struct fscache_netfs *netfs)
	INIT_LIST_HEAD(&netfs->link);

	/* allocate a cookie for the primary index */
	netfs->primary_index =
		kmem_cache_zalloc(fscache_cookie_jar, GFP_KERNEL);
	cookie = kmem_cache_zalloc(fscache_cookie_jar, GFP_KERNEL);

	if (!netfs->primary_index) {
	if (!cookie) {
		_leave(" = -ENOMEM");
		return -ENOMEM;
	}

	/* initialise the primary index cookie */
	atomic_set(&netfs->primary_index->usage, 1);
	atomic_set(&netfs->primary_index->n_children, 0);
	atomic_set(&netfs->primary_index->n_active, 1);
	atomic_set(&cookie->usage, 1);
	atomic_set(&cookie->n_children, 0);
	atomic_set(&cookie->n_active, 1);

	netfs->primary_index->def		= &fscache_fsdef_netfs_def;
	netfs->primary_index->parent		= &fscache_fsdef_index;
	netfs->primary_index->netfs_data	= netfs;
	netfs->primary_index->flags		= 1 << FSCACHE_COOKIE_ENABLED;
	cookie->def		= &fscache_fsdef_netfs_def;
	cookie->parent		= &fscache_fsdef_index;
	cookie->netfs_data	= netfs;
	cookie->flags		= 1 << FSCACHE_COOKIE_ENABLED;

	spin_lock_init(&netfs->primary_index->lock);
	INIT_HLIST_HEAD(&netfs->primary_index->backing_objects);
	spin_lock_init(&cookie->lock);
	INIT_HLIST_HEAD(&cookie->backing_objects);

	/* check the netfs type is not already present */
	down_write(&fscache_addremove_sem);
@@ -59,9 +59,10 @@ int __fscache_register_netfs(struct fscache_netfs *netfs)
			goto already_registered;
	}

	atomic_inc(&netfs->primary_index->parent->usage);
	atomic_inc(&netfs->primary_index->parent->n_children);
	atomic_inc(&cookie->parent->usage);
	atomic_inc(&cookie->parent->n_children);

	netfs->primary_index = cookie;
	list_add(&netfs->link, &fscache_netfs_list);
	ret = 0;

@@ -70,10 +71,8 @@ int __fscache_register_netfs(struct fscache_netfs *netfs)
already_registered:
	up_write(&fscache_addremove_sem);

	if (ret < 0) {
		kmem_cache_free(fscache_cookie_jar, netfs->primary_index);
		netfs->primary_index = NULL;
	}
	if (ret < 0)
		kmem_cache_free(fscache_cookie_jar, cookie);

	_leave(" = %d", ret);
	return ret;