From: Dmitry Monakhov <dmonakhov@openvz.org>
To: Theodore Ts'o <tytso@mit.edu>
Cc: linux-ext4@vger.kernel.org, lczerner@redhat.com
Subject: Re: [PATCH 5/5] update i_disksize coherently with block allocation
Date: Tue, 26 Aug 2014 11:47:10 +0400 [thread overview]
Message-ID: <87egw3ae0x.fsf@openvz.org> (raw)
In-Reply-To: <20140826011310.GB11317@thunk.org>
On Mon, 25 Aug 2014 21:13:10 -0400, Theodore Ts'o <tytso@mit.edu> wrote:
> On Fri, Aug 22, 2014 at 03:32:27PM +0400, Dmitry Monakhov wrote:
> > Writeback call trace looks like follows:
> > ext4_writepages
> > while(nr_pages)
> > ->journal_start
> > ->mpage_map_and_submit_extent -> may alloc some blocks
> > ->mpage_map_one_extent
> > ->journal_stop
> > In case of delalloc block i_disksize may be less than i_size. So we have to
> > update i_disksize each time we allocated and submitted some blocks beyond
> > i_disksize. And we MUST update it in the same transaction, otherwise this
> > result in fs-inconsistency in case of upcoming power-failure.
>
> This description doesn't seem to be consistent with the change in the
> patch; the patch included makes sure that on an error, we update the
> on-disk block size if some blocks had been previously allocated.
> Which looks OK, but the commit description seems to imply tha the
> patch does more than this.
> Did part of the patch get dropped, or
> should we rewrite the commit description to be more clear what it is
> changing?
No. patch was written like this from very beginning.
By logic is follows. We must update i_disksize in the same transaction
Before the patch i_disksize was updated only if requested range was fully completed.
But we also have to update it in case of error. And patch fix what.
> > Another possible way to fix that issue is to insert inode to orhphan list
> > on ext4_writepages entrance.
> >
> > testcase: xfstest generic/019
> >
> > Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
> > ---
> > fs/ext4/inode.c | 10 ++++++++--
> > 1 files changed, 8 insertions(+), 2 deletions(-)
> >
> > diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
> > index 3919e25..b1d92fb 100644
> > --- a/fs/ext4/inode.c
> > +++ b/fs/ext4/inode.c
> > @@ -2077,6 +2077,7 @@ static int mpage_map_and_submit_extent(handle_t *handle,
> > struct ext4_map_blocks *map = &mpd->map;
> > int err;
> > loff_t disksize;
> > + int progress = 0;
> >
> > mpd->io_submit.io_end->offset =
> > ((loff_t)map->m_lblk) << inode->i_blkbits;
> > @@ -2093,8 +2094,11 @@ static int mpage_map_and_submit_extent(handle_t *handle,
> > * is non-zero, a commit should free up blocks.
> > */
> > if ((err == -ENOMEM) ||
> > - (err == -ENOSPC && ext4_count_free_clusters(sb)))
> > + (err == -ENOSPC && ext4_count_free_clusters(sb))) {
> > + if (progress)
> > + goto update_disksize;
> > return err;
> > + }
> > ext4_msg(sb, KERN_CRIT,
> > "Delayed block allocation failed for "
> > "inode %lu at logical offset %llu with"
> > @@ -2111,15 +2115,17 @@ static int mpage_map_and_submit_extent(handle_t *handle,
> > *give_up_on_write = true;
> > return err;
> > }
> > + progress = 1;
> > /*
> > * Update buffer state, submit mapped pages, and get us new
> > * extent to map
> > */
> > err = mpage_map_and_submit_buffers(mpd);
> > if (err < 0)
> > - return err;
> > + goto update_disksize;
> > } while (map->m_len);
> >
> > +update_disksize:
> > /*
> > * Update on-disk size after IO is submitted. Races with
> > * truncate are avoided by checking i_size under i_data_sem.
> > --
> > 1.7.1
> >
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
> > the body of a message to majordomo@vger.kernel.org
> > More majordomo info at http://vger.kernel.org/majordomo-info.html
> --
> To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2014-08-26 7:47 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-08-22 11:32 [PATCH 0/5] i_size/i_disksize update fixes and cleanup series Dmitry Monakhov
2014-08-22 11:32 ` [PATCH 1/5] use ext4_update_i_disksize instead of opencoded ones Dmitry Monakhov
2014-08-31 3:17 ` Theodore Ts'o
2014-08-22 11:32 ` [PATCH 2/5] move i_size,i_diskzie update routines to helper function Dmitry Monakhov
2014-08-26 1:30 ` Theodore Ts'o
2014-08-22 11:32 ` [PATCH 3/5] ext4_zero_range: fix incorect journal credits reservation Dmitry Monakhov
2014-08-23 19:08 ` Theodore Ts'o
2014-08-25 7:19 ` Dmitry Monakhov
2014-08-26 1:30 ` Theodore Ts'o
2014-08-27 21:31 ` Theodore Ts'o
2014-08-22 11:32 ` [PATCH 4/5] fix transaction issues for ext4_fallocate and ext_zero_range Dmitry Monakhov
2014-08-26 1:30 ` Theodore Ts'o
2014-08-22 11:32 ` [PATCH 5/5] update i_disksize coherently with block allocation Dmitry Monakhov
2014-08-23 22:00 ` Theodore Ts'o
2014-08-25 7:59 ` Dmitry Monakhov
2014-09-14 12:38 ` Dmitry Monakhov
2014-08-26 1:13 ` Theodore Ts'o
2014-08-26 7:47 ` Dmitry Monakhov [this message]
2014-08-26 12:26 ` Theodore Ts'o
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=87egw3ae0x.fsf@openvz.org \
--to=dmonakhov@openvz.org \
--cc=lczerner@redhat.com \
--cc=linux-ext4@vger.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.