From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from aserp1040.oracle.com ([141.146.126.69]:23192 "EHLO aserp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754702Ab3A1I6Q (ORCPT ); Mon, 28 Jan 2013 03:58:16 -0500 Date: Mon, 28 Jan 2013 16:55:29 +0800 From: Liu Bo To: Jan Schmidt Cc: chris.mason@fusionio.com, linux-btrfs@vger.kernel.org, lev@zadarastorage.com, sensille@gmx.net Subject: Re: [PATCH] Btrfs: fix EDQUOT handling in btrfs_delalloc_reserve_metadata Message-ID: <20130128085528.GB19533@liubo> Reply-To: bo.li.liu@oracle.com References: <1359354360-604-1-git-send-email-list.btrfs@jan-o-sch.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii In-Reply-To: <1359354360-604-1-git-send-email-list.btrfs@jan-o-sch.net> Sender: linux-btrfs-owner@vger.kernel.org List-ID: On Mon, Jan 28, 2013 at 07:26:00AM +0100, Jan Schmidt wrote: > When btrfs_qgroup_reserve returned a failure, we were missing a counter > operation for BTRFS_I(inode)->outstanding_extents++, leading to warning > messages about outstanding extents and space_info->bytes_may_use != 0. > Additionally, the error handling code didn't take into account that we > dropped the inode lock which might require more cleanup. > > Luckily, all the cleanup code we need is already there and can be shared > with reserve_metadata_bytes, which is exactly what this patch does. Reviewed-by: Liu Bo > > Reported-by: Lev Vainblat > Signed-off-by: Jan Schmidt > --- > fs/btrfs/extent-tree.c | 22 ++++++++++------------ > 1 files changed, 10 insertions(+), 12 deletions(-) > > diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c > index 85b8454..61da9d0 100644 > --- a/fs/btrfs/extent-tree.c > +++ b/fs/btrfs/extent-tree.c > @@ -4534,7 +4534,7 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes) > unsigned nr_extents = 0; > int extra_reserve = 0; > enum btrfs_reserve_flush_enum flush = BTRFS_RESERVE_FLUSH_ALL; > - int ret; > + int ret = 0; > bool delalloc_lock = true; > > /* If we are a free space inode we need to not flush since we will be in > @@ -4579,20 +4579,18 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes) > csum_bytes = BTRFS_I(inode)->csum_bytes; > spin_unlock(&BTRFS_I(inode)->lock); > > - if (root->fs_info->quota_enabled) { > + if (root->fs_info->quota_enabled) > ret = btrfs_qgroup_reserve(root, num_bytes + > nr_extents * root->leafsize); > - if (ret) { > - spin_lock(&BTRFS_I(inode)->lock); > - calc_csum_metadata_size(inode, num_bytes, 0); > - spin_unlock(&BTRFS_I(inode)->lock); > - if (delalloc_lock) > - mutex_unlock(&BTRFS_I(inode)->delalloc_mutex); > - return ret; > - } > - } > > - ret = reserve_metadata_bytes(root, block_rsv, to_reserve, flush); > + /* > + * ret != 0 here means the qgroup reservation failed, we go straight to > + * the shared error handling then. > + */ > + if (ret == 0) > + ret = reserve_metadata_bytes(root, block_rsv, > + to_reserve, flush); > + > if (ret) { > u64 to_free = 0; > unsigned dropped; > -- > 1.7.1 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html