All of lore.kernel.org
 help / color / mirror / Atom feed
From: Theodore Tso <tytso@mit.edu>
To: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
Cc: cmm@us.ibm.com, sandeen@redhat.com, linux-ext4@vger.kernel.org,
	Jan Kara <jack@suse.cz>
Subject: Re: [PATCH -V2 1/2] ext4: Add inode to the orphan list during block allocation failure
Date: Mon, 8 Jun 2009 12:29:24 -0400	[thread overview]
Message-ID: <20090608162924.GI23883@mit.edu> (raw)
In-Reply-To: <1244435715-6807-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com>

Aneesh, thanks for working on a replacement patch, but I had already
added the call to ext4_orphan_del in the patch in the patch queue.
The difference is I added the call right after the call to
vmtruncate(), which avoids calling ext4_orphan_del() in a few cases
where it's not necessary.

This is what I have in the patch queue.

						- Ted

ext4: Avoid leaking blocks after a block allocation failure

From: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>

We should add inode to the orphan list in the same transaction
as block allocation.  This ensures that if we crash after a failed
block allocation and before we do a vmtruncate we don't leak block
(ie block marked as used in bitmap but not claimed by the inode).

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
CC:  Jan Kara <jack@suse.cz>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index 95a3f45..036552a 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -1462,7 +1462,7 @@ static int ext4_write_begin(struct file *file, struct address_space *mapping,
 				struct page **pagep, void **fsdata)
 {
 	struct inode *inode = mapping->host;
-	int ret, needed_blocks = ext4_writepage_trans_blocks(inode);
+	int ret, needed_blocks;
 	handle_t *handle;
 	int retries = 0;
 	struct page *page;
@@ -1473,6 +1473,11 @@ static int ext4_write_begin(struct file *file, struct address_space *mapping,
 		   "dev %s ino %lu pos %llu len %u flags %u",
 		   inode->i_sb->s_id, inode->i_ino,
 		   (unsigned long long) pos, len, flags);
+	/*
+	 * Reserve one block more for addition to orphan list in case
+	 * we allocate blocks but write fails for some reason
+	 */
+	needed_blocks = ext4_writepage_trans_blocks(inode) + 1;
  	index = pos >> PAGE_CACHE_SHIFT;
 	from = pos & (PAGE_CACHE_SIZE - 1);
 	to = from + len;
@@ -1506,15 +1511,30 @@ retry:
 
 	if (ret) {
 		unlock_page(page);
-		ext4_journal_stop(handle);
 		page_cache_release(page);
 		/*
 		 * block_write_begin may have instantiated a few blocks
 		 * outside i_size.  Trim these off again. Don't need
 		 * i_size_read because we hold i_mutex.
+		 *
+		 * Add inode to orphan list in case we crash before
+		 * truncate finishes
 		 */
 		if (pos + len > inode->i_size)
+			ext4_orphan_add(handle, inode);
+
+		ext4_journal_stop(handle);
+		if (pos + len > inode->i_size) {
 			vmtruncate(inode, inode->i_size);
+			/* 
+			 * If vmtruncate failed early the inode might
+			 * still be on the orphan list; we need to
+			 * make sure the inode is removed from the
+			 * orphan list in that case.
+			 */
+			if (inode->i_nlink)
+				ext4_orphan_del(NULL, inode);
+		}
 	}
 
 	if (ret == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries))

  parent reply	other threads:[~2009-06-08 16:29 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
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                           ` Theodore Tso [this message]
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=20090608162924.GI23883@mit.edu \
    --to=tytso@mit.edu \
    --cc=aneesh.kumar@linux.vnet.ibm.com \
    --cc=cmm@us.ibm.com \
    --cc=jack@suse.cz \
    --cc=linux-ext4@vger.kernel.org \
    --cc=sandeen@redhat.com \
    /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.