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

Commit a39caadf authored by David Howells's avatar David Howells
Browse files

FS-Cache: Put an aborted initialised op so that it is accounted correctly



Call fscache_put_operation() or a wrapper on any op that has gone through
fscache_operation_init() so that the accounting shown in /proc is done
correctly, specifically fscache_n_op_release.

fscache_put_operation() therefore now allows an op in the INITIALISED state as
well as in the CANCELLED and COMPLETE states.

Note that this means that an operation can get put that doesn't have its
->object pointer filled in, so anything that depends on the object needs to be
conditional in fscache_put_operation().

Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
Reviewed-by: default avatarSteve Dickson <steved@redhat.com>
Acked-by: default avatarJeff Layton <jeff.layton@primarydata.com>
parent 73c04a47
Loading
Loading
Loading
Loading
+28 −26
Original line number Diff line number Diff line
@@ -472,7 +472,8 @@ void fscache_put_operation(struct fscache_operation *op)
		return;

	_debug("PUT OP");
	ASSERTIFCMP(op->state != FSCACHE_OP_ST_COMPLETE,
	ASSERTIFCMP(op->state != FSCACHE_OP_ST_INITIALISED &&
		    op->state != FSCACHE_OP_ST_COMPLETE,
		    op->state, ==, FSCACHE_OP_ST_CANCELLED);
	op->state = FSCACHE_OP_ST_DEAD;

@@ -484,7 +485,7 @@ void fscache_put_operation(struct fscache_operation *op)
	}

	object = op->object;

	if (likely(object)) {
		if (test_bit(FSCACHE_OP_DEC_READ_CNT, &op->flags))
			atomic_dec(&object->n_reads);
		if (test_bit(FSCACHE_OP_UNUSE_COOKIE, &op->flags))
@@ -512,6 +513,7 @@ void fscache_put_operation(struct fscache_operation *op)
			fscache_raise_event(object, FSCACHE_OBJECT_EV_CLEARED);

		spin_unlock(&object->lock);
	}

	kfree(op);
	_leave(" [done]");
+7 −7
Original line number Diff line number Diff line
@@ -239,7 +239,7 @@ int __fscache_attr_changed(struct fscache_cookie *cookie)
	wake_cookie = __fscache_unuse_cookie(cookie);
nobufs:
	spin_unlock(&cookie->lock);
	kfree(op);
	fscache_put_operation(op);
	if (wake_cookie)
		__fscache_wake_unused_cookie(cookie);
	fscache_stat(&fscache_n_attr_changed_nobufs);
@@ -505,7 +505,7 @@ int __fscache_read_or_alloc_page(struct fscache_cookie *cookie,
	spin_unlock(&cookie->lock);
	if (wake_cookie)
		__fscache_wake_unused_cookie(cookie);
	kfree(op);
	fscache_put_retrieval(op);
nobufs:
	fscache_stat(&fscache_n_retrievals_nobufs);
	_leave(" = -ENOBUFS");
@@ -634,7 +634,7 @@ int __fscache_read_or_alloc_pages(struct fscache_cookie *cookie,
	wake_cookie = __fscache_unuse_cookie(cookie);
nobufs_unlock:
	spin_unlock(&cookie->lock);
	kfree(op);
	fscache_put_retrieval(op);
	if (wake_cookie)
		__fscache_wake_unused_cookie(cookie);
nobufs:
@@ -728,7 +728,7 @@ int __fscache_alloc_page(struct fscache_cookie *cookie,
	wake_cookie = __fscache_unuse_cookie(cookie);
nobufs_unlock:
	spin_unlock(&cookie->lock);
	kfree(op);
	fscache_put_retrieval(op);
	if (wake_cookie)
		__fscache_wake_unused_cookie(cookie);
nobufs:
@@ -1018,7 +1018,7 @@ int __fscache_write_page(struct fscache_cookie *cookie,
	spin_unlock(&object->lock);
	spin_unlock(&cookie->lock);
	radix_tree_preload_end();
	kfree(op);
	fscache_put_operation(&op->op);
	fscache_stat(&fscache_n_stores_ok);
	_leave(" = 0");
	return 0;
@@ -1038,7 +1038,7 @@ int __fscache_write_page(struct fscache_cookie *cookie,
nobufs:
	spin_unlock(&cookie->lock);
	radix_tree_preload_end();
	kfree(op);
	fscache_put_operation(&op->op);
	if (wake_cookie)
		__fscache_wake_unused_cookie(cookie);
	fscache_stat(&fscache_n_stores_nobufs);
@@ -1046,7 +1046,7 @@ int __fscache_write_page(struct fscache_cookie *cookie,
	return -ENOBUFS;

nomem_free:
	kfree(op);
	fscache_put_operation(&op->op);
nomem:
	fscache_stat(&fscache_n_stores_oom);
	_leave(" = -ENOMEM");