From: David Howells <dhowells@redhat.com>
To: Linux filesystem caching discussion list <linux-cachefs@redhat.com>
Cc: dhowells@redhat.com, linux-kernel@vger.kernel.org
Subject: Re: [Linux-cachefs] 3.0.3 64-bit Crash running fscache/cachefilesd
Date: Fri, 07 Oct 2011 11:42:56 +0100 [thread overview]
Message-ID: <8905.1317984176@redhat.com> (raw)
In-Reply-To: <CAOH1cHkVjTSBvqvaoWnxTB1V-dOtj1cCT_kMZpJdsyNNeUoBag@mail.gmail.com>
Mark Moseley <moseleymark@gmail.com> wrote:
> [ 7719.996883] FS-Cache: Assertion failed
> [ 7719.996886] 3 == 5 is false
> [ 7719.996906] ------------[ cut here ]------------
> [ 7720.006139] kernel BUG at fs/fscache/operation.c:408!
Can you add the attached patch? It will display which operation was being run
just before displaying the above assertion.
David
---
From: David Howells <dhowells@redhat.com>
Subject: [PATCH] FS-Cache: Give operations names for debugging
Give operations names for debugging and print it if we're going to assert.
Signed-off-by: David Howells <dhowells@redhat.com>
---
fs/fscache/object.c | 1 +
fs/fscache/operation.c | 18 ++++++++++++++++++
fs/fscache/page.c | 5 +++++
include/linux/fscache-cache.h | 14 +++++++++++++-
4 files changed, 37 insertions(+), 1 deletions(-)
diff --git a/fs/fscache/object.c b/fs/fscache/object.c
index 80b5491..91d998b 100644
--- a/fs/fscache/object.c
+++ b/fs/fscache/object.c
@@ -940,6 +940,7 @@ static void fscache_invalidate_object(struct fscache_object *object)
}
fscache_operation_init(op, object->cache->ops->invalidate_object, NULL);
+ op->name = FSCACHE_OP_INVALIDATE;
op->flags = FSCACHE_OP_ASYNC | (1 << FSCACHE_OP_EXCLUSIVE);
spin_lock(&cookie->lock);
diff --git a/fs/fscache/operation.c b/fs/fscache/operation.c
index 2037f03..6bfefee 100644
--- a/fs/fscache/operation.c
+++ b/fs/fscache/operation.c
@@ -20,6 +20,16 @@
atomic_t fscache_op_debug_id;
EXPORT_SYMBOL(fscache_op_debug_id);
+static const char *const fscache_op_names[FSCACHE_OP__NR] = {
+ [FSCACHE_OP_UNNAMED] = "Unnamed",
+ [FSCACHE_OP_INVALIDATE] = "Invalidate",
+ [FSCACHE_OP_ATTR_CHANGED] = "AttrChanged",
+ [FSCACHE_OP_ALLOC_PAGE] = "AllocPage",
+ [FSCACHE_OP_READ_OR_ALLOC_PAGE] = "ReadOrAllocPage",
+ [FSCACHE_OP_READ_OR_ALLOC_PAGES] = "ReadOrAllocPages",
+ [FSCACHE_OP_WRITE] = "Write",
+};
+
/**
* fscache_enqueue_operation - Enqueue an operation for processing
* @op: The operation to enqueue
@@ -86,6 +96,7 @@ int fscache_submit_exclusive_op(struct fscache_object *object,
{
_enter("{OBJ%x OP%x},", object->debug_id, op->debug_id);
+ ASSERTCMP(op->name, >, FSCACHE_OP_UNNAMED);
ASSERTCMP(op->state, ==, FSCACHE_OP_ST_INITIALISED);
ASSERTCMP(atomic_read(&op->usage), >, 0);
@@ -189,6 +200,7 @@ int fscache_submit_op(struct fscache_object *object,
_enter("{OBJ%x OP%x},{%u}",
object->debug_id, op->debug_id, atomic_read(&op->usage));
+ ASSERTCMP(op->name, >, FSCACHE_OP_UNNAMED);
ASSERTCMP(op->state, ==, FSCACHE_OP_ST_INITIALISED);
ASSERTCMP(atomic_read(&op->usage), >, 0);
@@ -404,6 +416,12 @@ void fscache_put_operation(struct fscache_operation *op)
return;
_debug("PUT OP");
+
+ if (op->state != FSCACHE_OP_ST_COMPLETE &&
+ op->state != FSCACHE_OP_ST_CANCELLED)
+ printk("FS-Cache: Asserting on %s operation\n",
+ fscache_op_names[op->name]);
+
ASSERTIFCMP(op->state != FSCACHE_OP_ST_COMPLETE,
op->state, ==, FSCACHE_OP_ST_CANCELLED);
op->state = FSCACHE_OP_ST_DEAD;
diff --git a/fs/fscache/page.c b/fs/fscache/page.c
index 00a5ed9..cf6dd34 100644
--- a/fs/fscache/page.c
+++ b/fs/fscache/page.c
@@ -188,6 +188,7 @@ int __fscache_attr_changed(struct fscache_cookie *cookie)
}
fscache_operation_init(op, fscache_attr_changed_op, NULL);
+ op->name = FSCACHE_OP_ATTR_CHANGED;
op->flags = FSCACHE_OP_ASYNC | (1 << FSCACHE_OP_EXCLUSIVE);
spin_lock(&cookie->lock);
@@ -379,6 +380,7 @@ int __fscache_read_or_alloc_page(struct fscache_cookie *cookie,
_leave(" = -ENOMEM");
return -ENOMEM;
}
+ op->op.name = FSCACHE_OP_READ_OR_ALLOC_PAGE;
op->n_pages = 1;
spin_lock(&cookie->lock);
@@ -505,6 +507,7 @@ int __fscache_read_or_alloc_pages(struct fscache_cookie *cookie,
op = fscache_alloc_retrieval(mapping, end_io_func, context);
if (!op)
return -ENOMEM;
+ op->op.name = FSCACHE_OP_READ_OR_ALLOC_PAGES;
op->n_pages = *nr_pages;
spin_lock(&cookie->lock);
@@ -635,6 +638,7 @@ int __fscache_alloc_page(struct fscache_cookie *cookie,
op = fscache_alloc_retrieval(page->mapping, NULL, NULL);
if (!op)
return -ENOMEM;
+ op->op.name = FSCACHE_OP_ALLOC_PAGE;
op->n_pages = 1;
spin_lock(&cookie->lock);
@@ -856,6 +860,7 @@ int __fscache_write_page(struct fscache_cookie *cookie,
fscache_operation_init(&op->op, fscache_write_op,
fscache_release_write_op);
+ op->op.name = FSCACHE_OP_WRITE;
op->op.flags = FSCACHE_OP_ASYNC | (1 << FSCACHE_OP_WAITING);
ret = radix_tree_preload(gfp & ~__GFP_HIGHMEM);
diff --git a/include/linux/fscache-cache.h b/include/linux/fscache-cache.h
index 29f552d..fa61436 100644
--- a/include/linux/fscache-cache.h
+++ b/include/linux/fscache-cache.h
@@ -85,6 +85,17 @@ enum fscache_operation_state {
FSCACHE_OP_ST_DEAD /* Op is now dead */
};
+enum fscache_operation_name {
+ FSCACHE_OP_UNNAMED,
+ FSCACHE_OP_INVALIDATE,
+ FSCACHE_OP_ATTR_CHANGED,
+ FSCACHE_OP_ALLOC_PAGE,
+ FSCACHE_OP_READ_OR_ALLOC_PAGE,
+ FSCACHE_OP_READ_OR_ALLOC_PAGES,
+ FSCACHE_OP_WRITE,
+ FSCACHE_OP__NR
+};
+
struct fscache_operation {
struct work_struct work; /* record for async ops */
struct list_head pend_link; /* link in object->pending_ops */
@@ -99,7 +110,8 @@ struct fscache_operation {
#define FSCACHE_OP_DEC_READ_CNT 6 /* decrement object->n_reads on destruction */
#define FSCACHE_OP_KEEP_FLAGS 0x0070 /* flags to keep when repurposing an op */
- enum fscache_operation_state state;
+ enum fscache_operation_state state : 8;
+ enum fscache_operation_name name : 8;
atomic_t usage;
unsigned debug_id; /* debugging ID */
next prev parent reply other threads:[~2011-10-07 10:43 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-08-25 16:44 3.0.3 64-bit Crash running fscache/cachefilesd Mark Moseley
2011-08-26 12:52 ` [Linux-cachefs] " Дмитрий Ильин
2011-09-01 13:04 ` David Howells
2011-09-22 17:03 ` Mark Moseley
2011-09-22 21:41 ` Mark Moseley
2011-09-26 11:32 ` David Howells
2011-09-26 21:02 ` Mark Moseley
2011-09-27 0:59 ` Mark Moseley
2011-09-27 23:46 ` Mark Moseley
2011-09-29 14:57 ` David Howells
2011-09-29 15:51 ` Mark Moseley
2011-09-29 16:30 ` David Howells
2011-09-29 19:02 ` Mark Moseley
2011-09-29 22:11 ` Mark Moseley
2011-09-29 22:44 ` David Howells
2011-09-29 22:51 ` Mark Moseley
2011-09-30 12:28 ` David Howells
2011-09-30 18:57 ` Mark Moseley
2011-09-30 20:10 ` David Howells
2011-10-05 13:37 ` David Howells
2011-10-05 13:49 ` David Howells
2011-10-07 10:42 ` David Howells [this message]
2011-10-08 16:32 ` Mark Moseley
2011-10-11 13:07 ` David Howells
2011-10-11 16:27 ` Mark Moseley
2011-10-12 9:26 ` David Howells
2011-10-12 10:05 ` David Howells
2011-10-12 18:10 ` Mark Moseley
2011-10-12 23:38 ` Mark Moseley
2011-10-13 15:21 ` David Howells
2011-10-13 20:48 ` Mark Moseley
2011-10-14 9:22 ` David Howells
2011-10-14 23:25 ` Mark Moseley
2011-10-17 10:39 ` David Howells
2011-10-19 12:25 ` David Howells
2011-10-19 23:15 ` Mark Moseley
2011-10-20 8:46 ` David Howells
2011-10-20 19:37 ` Mark Moseley
2011-10-20 9:03 ` David Howells
2011-10-20 19:29 ` Mark Moseley
2011-10-20 23:05 ` David Howells
2011-10-21 0:21 ` Mark Moseley
2011-10-21 8:16 ` David Howells
2011-10-21 18:09 ` Mark Moseley
2011-12-13 1:56 ` Mark Moseley
2011-09-29 22:44 ` Mark Moseley
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=8905.1317984176@redhat.com \
--to=dhowells@redhat.com \
--cc=linux-cachefs@redhat.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.