All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
To: Jan Kara <jack@suse.cz>
Cc: linux-ext4@vger.kernel.org, Andrew Morton <akpm@linux-foundation.org>
Subject: Re: [PATCH] ext3: Avoid false EIO errors
Date: Mon, 30 Mar 2009 16:28:21 +0530	[thread overview]
Message-ID: <20090330105821.GE4796@skywalker> (raw)
In-Reply-To: <20090330103248.GB18833@duck.suse.cz>

On Mon, Mar 30, 2009 at 12:32:48PM +0200, Jan Kara wrote:
> > > > > -				struct address_space *mapping,
> > > > > -				loff_t pos, unsigned len, unsigned copied,
> > > > > -				struct page *page, void *fsdata)
> > > > > +static void update_file_sizes(struct inode *inode, loff_t pos, unsigned len,
> > > > > +			      unsigned copied)
> > > > >  {
> > > > > -	struct inode *inode = file->f_mapping->host;
> > > > > -
> > > > > -	copied = block_write_end(file, mapping, pos, len, copied, page, fsdata);
> > > > > +	int mark_dirty = 0;
> > > > > 
> > > > > -	if (pos+copied > inode->i_size) {
> > > > > -		i_size_write(inode, pos+copied);
> > > > > -		mark_inode_dirty(inode);
> > > > > +	if (pos + len > EXT3_I(inode)->i_disksize) {
> > > > > +		mark_dirty = 1;
> > > > > +		EXT3_I(inode)->i_disksize = pos + len;
> > > > >  	}
> > > > 
> > > > Won't this result in file having wrong contents if we failed to copy
> > > > the contents from user space? Now if we successfully allocated
> > > > blocks and we failed to copy the contents from user space, the above
> > > > would result in update of i_disksize and a mark_inode_dirty. Doesn't
> > > > that imply we have wrong contents in those block for which we failed to
> > > > copy the contents from user space ?
> > >   block_write_end() zeros all new buffers. So yes, if we crash after
> > > this transaction commits but before we manage to redo the write, then user
> > > could see zeros at the end of file (previously inode could have blocks
> > > allocated beyond EOF).
> > >   I was also thinking about truncating the newly created buffers but it's a
> > > bit tricky. We need to do it in the same transaction (otherwise the race
> > > would be still there) but standard truncate path would like to add inode
> > > to the orphan list, lock pages etc and we have no credits for that and also
> > > lock ordering might be troublesome. So I've chosen the simple path.
> > > 
> > We do a vmtruncate if we failed to allocate blocks in
> > ext3_write_begin. That is done after the closing the current
> > transaction. If we crash in between (ie, after committing the
> > transaction allocating blocks and before committing the transaction that
> > is doing truncate) we would only have  some data blocks leaking. But
> > that would be better than user seeing zero's in the file ?. Also if we
> > happen to add the inode to the orphan list and crash, the recovery would
> > truncate it properly. So by doing a vmtruncate I guess the window would be
> > small and we are already doing that in ext3_write_begin.
>   Hmm, are you sure some assertion would not fire if we find allocated
> blocks beyond i_size (which could happen with the old code)? Frankly, I
> prefer user seeing zeros at the end of file (so that he can come and yell
> at me ;) rather than silently leaking blocks, getting inode into an
> unexpected state and then debug some mysterious problem. But hopefully this
> problem has a solution which can make both of us happy ;): We can reserve
> enough credits (actually just one block more) and when we see we need to
> do truncate because of failed write, we first add inode to the orphan list
> before stopping the current handle (so that if we crash it gets properly
> truncated) and then truncate the blocks in a separate transaction. Does it
> sound good to you?

Yes. We also should unlock the page before the truncate

-aneesh

  reply	other threads:[~2009-03-30 10:58 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-03-26 18:21 [PATCH] ext3: Avoid false EIO errors Jan Kara
2009-03-27 18:08 ` Aneesh Kumar K.V
2009-03-27 20:24   ` Jan Kara
2009-03-30  8:25     ` Aneesh Kumar K.V
2009-03-30 10:32       ` Jan Kara
2009-03-30 10:58         ` Aneesh Kumar K.V [this message]
2009-03-30 16:05           ` Jan Kara
2009-03-31  4:45             ` Aneesh Kumar K.V
2009-03-31  9:29               ` [PATCH 1/2] [PATCH] ext4: Add inode to the orphan list during block allocation failure Aneesh Kumar K.V
2009-03-31  9:29                 ` [PATCH 2/2] [PATCH] ext4: truncate the file properly if we fail to copy data from userspace Aneesh Kumar K.V
2009-03-31  9:38                   ` Jan Kara
2009-04-05  3:22                   ` Theodore Tso
2009-04-06 10:07                     ` Jan Kara
2009-03-31  9:34                 ` [PATCH 1/2] [PATCH] ext4: Add inode to the orphan list during block allocation failure Jan Kara
2009-04-05  3:11                 ` Theodore Tso
2009-04-06 10:05                   ` Jan Kara
2009-06-05  4:31                     ` Theodore Tso
2009-06-05  6:22                       ` Theodore Tso
2009-06-05  7:24                         ` Theodore Tso
2009-06-05 23:42                           ` Jan Kara
2009-06-05 23:44                       ` Jan Kara
2009-06-08  4:35                         ` [PATCH -V2 1/2] " Aneesh Kumar K.V
2009-06-08  4:35                           ` [PATCH -V2 2/2] ext4: truncate the file properly if we fail to copy data from userspace Aneesh Kumar K.V
2009-06-08 16:29                             ` Theodore Tso
2009-06-08 16:43                               ` Aneesh Kumar K.V
2009-06-08 19:14                                 ` Theodore Tso
2009-06-08 19:23                                   ` Jan Kara
2009-06-08 20:20                                   ` Aneesh Kumar K.V
2009-06-09 10:12                                     ` Jan Kara
2009-06-08 16:29                           ` [PATCH -V2 1/2] ext4: Add inode to the orphan list during block allocation failure Theodore Tso
2009-03-31  9:46               ` [PATCH] ext3: Avoid false EIO errors (version 4) Jan Kara
2009-04-01  0:06                 ` Andrew Morton
2009-04-01  9:49                   ` Jan Kara
2009-03-30 13:53       ` [PATCH] ext3: Avoid false EIO errors Eric Sandeen
2009-03-30 14:45         ` Aneesh Kumar K.V
2009-03-30 15:12           ` Eric Sandeen

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=20090330105821.GE4796@skywalker \
    --to=aneesh.kumar@linux.vnet.ibm.com \
    --cc=akpm@linux-foundation.org \
    --cc=jack@suse.cz \
    --cc=linux-ext4@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.