From: Josef Bacik <josef@redhat.com>
To: cpwu@tnsoft.com.cn
Cc: ceph-devel <ceph-devel@vger.kernel.org>,
"linux-btrfs@vger.kernel.org" <linux-btrfs@vger.kernel.org>
Subject: Re: 2.6.39-rc1: btrfs "WARNING: at fs/btrfs/inode.c:2177"
Date: Fri, 08 Apr 2011 10:38:28 -0400 [thread overview]
Message-ID: <4D9F1DE4.7040306@redhat.com> (raw)
In-Reply-To: <1302242000.2014.14.camel@cephhost>
[-- Attachment #1: Type: text/plain, Size: 724 bytes --]
On 04/08/2011 01:53 AM, Jeff Wu wrote:
>
> Hi ,
> I applied the patch to 2.6.39-rc1,took the following steps to compile
> it:make&& make modules_install&& make install&& mkinitramfs
> but , it seam that it don't run to "WARN_ON(block_rsv ==
> root->orphan_block_rsv);"
>
> i attached the codes and logs at the below:
>
Bummer ok so here's a much bigger debug patch, remove the previous one I
sent you and apply this one instead and run with it. As soon as you get
a warning stop iozone because this debug patch will create _a lot_ of
debug output, and I don't want to have to sift through all of it. Just
send me your logs after running this patch so I can try and piece
together what's going on. Thanks,
Josef
[-- Attachment #2: orphan-debug.patch --]
[-- Type: text/plain, Size: 5350 bytes --]
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
index 0d00a07..c0d8c1d 100644
--- a/fs/btrfs/ctree.h
+++ b/fs/btrfs/ctree.h
@@ -766,6 +766,7 @@ struct btrfs_block_rsv {
unsigned int durable:1;
unsigned int refill_used:1;
unsigned int full:1;
+ unsigned int orphan:1;
};
/*
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index f619c3c..5ebcda8 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -3429,6 +3429,9 @@ static int reserve_metadata_bytes(struct btrfs_trans_handle *trans,
bool reserved = false;
bool committed = false;
+ if (block_rsv->orphan)
+ printk(KERN_ERR "resrving metadata bytes for orphan rsv %llu\n",
+ orig_bytes);
again:
ret = -ENOSPC;
if (reserved)
@@ -3556,6 +3559,9 @@ static struct btrfs_block_rsv *get_block_rsv(struct btrfs_trans_handle *trans,
if (!block_rsv)
block_rsv = &root->fs_info->empty_block_rsv;
+ if (block_rsv->orphan)
+ printk(KERN_ERR "got orphan block rsv\n");
+
return block_rsv;
}
@@ -3563,6 +3569,9 @@ static int block_rsv_use_bytes(struct btrfs_block_rsv *block_rsv,
u64 num_bytes)
{
int ret = -ENOSPC;
+ if (block_rsv->orphan)
+ printk(KERN_ERR "using %llu bytes from orphan\n",
+ num_bytes);
spin_lock(&block_rsv->lock);
if (block_rsv->reserved >= num_bytes) {
block_rsv->reserved -= num_bytes;
@@ -3577,6 +3586,9 @@ static int block_rsv_use_bytes(struct btrfs_block_rsv *block_rsv,
static void block_rsv_add_bytes(struct btrfs_block_rsv *block_rsv,
u64 num_bytes, int update_size)
{
+ if (block_rsv->orphan)
+ printk(KERN_ERR "adding %llu bytes, update_size=%d\n",
+ num_bytes, update_size);
spin_lock(&block_rsv->lock);
block_rsv->reserved += num_bytes;
if (update_size)
@@ -3592,6 +3604,10 @@ void block_rsv_release_bytes(struct btrfs_block_rsv *block_rsv,
struct btrfs_space_info *space_info = block_rsv->space_info;
spin_lock(&block_rsv->lock);
+ if (block_rsv->orphan)
+ printk(KERN_ERR "releasing %llu bytes from orhan, size=%llu, "
+ "reserved=%llu\n", num_bytes, block_rsv->size,
+ block_rsv->reserved);
if (num_bytes == (u64)-1)
num_bytes = block_rsv->size;
block_rsv->size -= num_bytes;
@@ -3668,6 +3684,9 @@ struct btrfs_block_rsv *btrfs_alloc_block_rsv(struct btrfs_root *root)
void btrfs_free_block_rsv(struct btrfs_root *root,
struct btrfs_block_rsv *rsv)
{
+ if (rsv->orphan)
+ printk(KERN_ERR "freeing orphan rsv\n");
+
if (rsv && atomic_dec_and_test(&rsv->usage)) {
btrfs_block_rsv_release(root, rsv, (u64)-1);
if (!rsv->durable)
@@ -3696,6 +3715,10 @@ int btrfs_block_rsv_add(struct btrfs_trans_handle *trans,
{
int ret;
+ if (block_rsv->orphan)
+ printk(KERN_ERR "adding %llu bytes to orphan\n",
+ num_bytes);
+
if (num_bytes == 0)
return 0;
@@ -3720,6 +3743,10 @@ int btrfs_block_rsv_check(struct btrfs_trans_handle *trans,
if (!block_rsv)
return 0;
+ if (block_rsv->orphan)
+ printk(KERN_ERR "checking orphan reserve for %llu bytes, "
+ "%d min factor\n", min_reserved, min_factor);
+
spin_lock(&block_rsv->lock);
if (min_factor > 0)
num_bytes = div_factor(block_rsv->size, min_factor);
@@ -3964,6 +3991,7 @@ int btrfs_orphan_reserve_metadata(struct btrfs_trans_handle *trans,
* transaction and use space it freed.
*/
u64 num_bytes = calc_trans_metadata_size(root, 4);
+ printk(KERN_ERR "reserving %llu bytes for orphan\n", num_bytes);
return block_rsv_migrate_bytes(src_rsv, dst_rsv, num_bytes);
}
@@ -3971,6 +3999,7 @@ void btrfs_orphan_release_metadata(struct inode *inode)
{
struct btrfs_root *root = BTRFS_I(inode)->root;
u64 num_bytes = calc_trans_metadata_size(root, 4);
+ printk(KERN_ERR "first release of %llu bytes from orphan\n", num_bytes);
btrfs_block_rsv_release(root, root->orphan_block_rsv, num_bytes);
}
@@ -5697,6 +5726,8 @@ use_block_rsv(struct btrfs_trans_handle *trans,
block_rsv = get_block_rsv(trans, root);
+ if (block_rsv->orphan)
+ printk(KERN_ERR "Using orphan block rsv for tree allocation\n");
if (block_rsv->size == 0) {
ret = reserve_metadata_bytes(trans, root, block_rsv,
blocksize, 0);
@@ -5739,6 +5770,8 @@ use_block_rsv(struct btrfs_trans_handle *trans,
static void unuse_block_rsv(struct btrfs_block_rsv *block_rsv, u32 blocksize)
{
+ if (block_rsv->orphan)
+ printk(KERN_ERR "unusing orphan block rsv\n");
block_rsv_add_bytes(block_rsv, blocksize, 0);
block_rsv_release_bytes(block_rsv, NULL, 0);
}
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 032e8fb..58b1361 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -2176,7 +2176,11 @@ void btrfs_orphan_commit_root(struct btrfs_trans_handle *trans,
}
if (root->orphan_block_rsv) {
- WARN_ON(root->orphan_block_rsv->size > 0);
+ if (root->orphan_block_rsv->size > 0) {
+ printk(KERN_ERR "orphan rsv still has %llu bytes\n",
+ root->orphan_block_rsv->size);
+ WARN_ON(1);
+ }
btrfs_free_block_rsv(root, root->orphan_block_rsv);
root->orphan_block_rsv = NULL;
}
@@ -2205,6 +2209,7 @@ int btrfs_orphan_add(struct btrfs_trans_handle *trans, struct inode *inode)
spin_lock(&root->orphan_lock);
if (!root->orphan_block_rsv) {
root->orphan_block_rsv = block_rsv;
+ block_rsv->orphan = 1;
} else if (block_rsv) {
btrfs_free_block_rsv(root, block_rsv);
block_rsv = NULL;
prev parent reply other threads:[~2011-04-08 14:42 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-04-07 9:41 2.6.39-rc1: btrfs "WARNING: at fs/btrfs/inode.c:2177" Jeff Wu
2011-04-07 9:41 ` Jeff Wu
2011-04-07 9:43 ` Wido den Hollander
2011-04-07 16:20 ` Josef Bacik
2011-04-08 5:53 ` Jeff Wu
2011-04-08 5:53 ` Jeff Wu
2011-04-08 14:38 ` Josef Bacik [this message]
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=4D9F1DE4.7040306@redhat.com \
--to=josef@redhat.com \
--cc=ceph-devel@vger.kernel.org \
--cc=cpwu@tnsoft.com.cn \
--cc=linux-btrfs@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.