All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jan Kara <jack@suse.cz>
To: Eric Sandeen <sandeen@redhat.com>
Cc: Jan Kara <jack@suse.cz>,
	stable@kernel.org, linux-ext4@vger.kernel.org, tytso@mit.edu,
	Dmitry Monakhov <dmonakhov@openvz.org>
Subject: Re: [PATCH 2/5] quota: decouple fs reserved space from quota reservation
Date: Mon, 11 Jan 2010 19:00:00 +0100	[thread overview]
Message-ID: <20100111175959.GG3184@quack.suse.cz> (raw)
In-Reply-To: <4B4B658F.3020801@redhat.com>

[-- Attachment #1: Type: text/plain, Size: 2654 bytes --]

On Mon 11-01-10 11:53:19, Eric Sandeen wrote:
> Jan Kara wrote:
> > From: Dmitry Monakhov <dmonakhov@openvz.org>
> > 
> > Currently inode_reservation is managed by fs itself and this
> > reservation is transfered on dquot_transfer(). This means what
> > inode_reservation must always be in sync with
> > dquot->dq_dqb.dqb_rsvspace. Otherwise dquot_transfer() will result
> > in incorrect quota(WARN_ON in dquot_claim_reserved_space() will be
> > triggered)
> > This is not easy because of complex locking order issues
> > for example http://bugzilla.kernel.org/show_bug.cgi?id=14739
> > 
> > The patch introduce quota reservation field for each fs-inode
> > (fs specific inode is used in order to prevent bloating generic
> > vfs inode). This reservation is managed by quota code internally
> > similar to i_blocks/i_bytes and may not be always in sync with
> > internal fs reservation.
> > 
> > Also perform some code rearrangement:
> > - Unify dquot_reserve_space() and dquot_reserve_space()
> > - Unify dquot_release_reserved_space() and dquot_free_space()
> > - Also this patch add missing warning update to release_rsv()
> >   dquot_release_reserved_space() must call flush_warnings() as
> >   dquot_free_space() does.
> > 
> > Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
> > Signed-off-by: Jan Kara <jack@suse.cz>
> > ---
> 
> ...
> 
> > @@ -1734,7 +1761,7 @@ int dquot_transfer(struct inode *inode, struct
> iattr *iattr)
> >  	}
> >  	spin_lock(&dq_data_lock);
> >  	cur_space = inode_get_bytes(inode);
> > -	rsv_space = dquot_get_reserved_space(inode);
> > +	rsv_space = inode_get_rsv_space(inode);
> >  	space = cur_space + rsv_space;
> >  	/* Build the transfer_from list and check the limits */
> >  	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
> 
> ...
> 
> >  /*
> > + * inode_reserved_space is managed internally by quota, and protected by
> > + * i_lock similar to i_blocks+i_bytes.
> > + */
> > +static qsize_t *inode_reserved_space(struct inode * inode)
> > +{
> > +	/* Filesystem must explicitly define it's own method in order to use
> > +	 * quota reservation interface */
> > +	BUG_ON(!inode->i_sb->dq_op->get_reserved_space);
> 
> Unless I'm missing something, this just broke quota for everyone
> except ext4 ...
> 
> sys_chown
> 	...
> 		dquot_transfer
> 			inode_get_rsv_space
> 				inode_reserved_space
> 
> will BUG_ON ext3, we get there with (rightly) no ->get_reserved_space.
> 
> Or am I missing something?
  No, you are exactly right (sadly). Linus already has a pull request with
the fix in his mailbox.
  The fix is attached if you need it for something.


									Honza
-- 
Jan Kara <jack@suse.cz>
SUSE Labs, CR

[-- Attachment #2: 0001-quota-Fix-dquot_transfer-for-filesystems-different-f.patch --]
[-- Type: text/x-patch, Size: 1242 bytes --]

>From 05b5d898235401c489c68e1f3bc5706a29ad5713 Mon Sep 17 00:00:00 2001
From: Jan Kara <jack@suse.cz>
Date: Wed, 6 Jan 2010 18:03:36 +0100
Subject: [PATCH] quota: Fix dquot_transfer for filesystems different from ext4

Commit fd8fbfc1 modified the way we find amount of reserved space
belonging to an inode. The amount of reserved space is checked
from dquot_transfer and thus inode_reserved_space gets called
even for filesystems that don't provide get_reserved_space callback
which results in a BUG.

Fix the problem by checking get_reserved_space callback and return 0 if
the filesystem does not provide it.

CC: Dmitry Monakhov <dmonakhov@openvz.org>
Signed-off-by: Jan Kara <jack@suse.cz>
---
 fs/quota/dquot.c |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c
index dea86ab..3fc62b0 100644
--- a/fs/quota/dquot.c
+++ b/fs/quota/dquot.c
@@ -1377,6 +1377,9 @@ static void inode_sub_rsv_space(struct inode *inode, qsize_t number)
 static qsize_t inode_get_rsv_space(struct inode *inode)
 {
 	qsize_t ret;
+
+	if (!inode->i_sb->dq_op->get_reserved_space)
+		return 0;
 	spin_lock(&inode->i_lock);
 	ret = *inode_reserved_space(inode);
 	spin_unlock(&inode->i_lock);
-- 
1.6.4.2


  reply	other threads:[~2010-01-11 17:59 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-12-23 17:27 [PATCH 0/5] Ext4 quota fixes for 2.6.31 kernel Jan Kara
2009-12-23 17:27 ` [PATCH 1/5] Add unlocked version of inode_add_bytes() function Jan Kara
2009-12-23 17:27 ` [PATCH 2/5] quota: decouple fs reserved space from quota reservation Jan Kara
2010-01-11 17:53   ` Eric Sandeen
2010-01-11 18:00     ` Jan Kara [this message]
2009-12-23 17:27 ` [PATCH 3/5] ext4: Convert to generic reserved quota's space management Jan Kara
2009-12-23 17:27 ` [PATCH 4/5] ext4: Fix potential quota deadlock Jan Kara
2009-12-23 17:27 ` [PATCH 5/5] ext4: fix sleep inside spinlock issue with quota and dealloc (#14739) Jan Kara
  -- strict thread matches above, loose matches on Subject: below --
2009-12-23 17:25 [PATCH 0/5] Ext4 quota fixes for 2.6.32 -stable kernel Jan Kara
2009-12-23 17:25 ` [PATCH 2/5] quota: decouple fs reserved space from quota reservation Jan Kara

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=20100111175959.GG3184@quack.suse.cz \
    --to=jack@suse.cz \
    --cc=dmonakhov@openvz.org \
    --cc=linux-ext4@vger.kernel.org \
    --cc=sandeen@redhat.com \
    --cc=stable@kernel.org \
    --cc=tytso@mit.edu \
    /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.