All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Stephen C. Tweedie" <sct@redhat.com>
To: Andrew Morton <andrewm@uow.edu.au>
Cc: Alexander Viro <viro@math.psu.edu>,
	Jonathan Hudson <jonathan@daria.co.uk>,
	linux-kernel@vger.kernel.org, Stephen Tweedie <sct@redhat.com>
Subject: Re: corruption
Date: Fri, 1 Dec 2000 14:16:59 +0000	[thread overview]
Message-ID: <20001201141659.A4562@redhat.com> (raw)
In-Reply-To: <b09.3a269edc.6bd12@trespassersw.daria.co.uk> <Pine.GSO.4.21.0011301400290.20801-100000@weyl.math.psu.edu> <3A26C82D.26267202@uow.edu.au>
In-Reply-To: <3A26C82D.26267202@uow.edu.au>; from andrewm@uow.edu.au on Fri, Dec 01, 2000 at 08:35:41AM +1100

Hi,

On Fri, Dec 01, 2000 at 08:35:41AM +1100, Andrew Morton wrote:
> 
> I bet this'll catch it:
> 
>  static __inline__ void list_del(struct list_head *entry)
>  {
>  	__list_del(entry->prev, entry->next);
> +	entry->next = entry->prev = 0;
>  }

No, because the buffer hash list is never referenced unless
buffer->b_inode is non-null, so we can't ever do a double-list_del on
the buffer.

The patch below should fix it.  It has been sent to Linus.  The
important part is the first hunk of the inode.c diff.

Cheers,
 Stephen

fsync-fix2.diff:
--- fs/buffer.c.~1~	Wed Nov 29 15:16:43 2000
+++ fs/buffer.c	Fri Dec  1 00:41:28 2000
@@ -871,10 +871,11 @@
 		else {
 			bh->b_inode = &tmp;
 			list_add(&bh->b_inode_buffers, &tmp.i_dirty_buffers);
-			atomic_inc(&bh->b_count);
 			if (buffer_dirty(bh)) {
+				atomic_inc(&bh->b_count);
 				spin_unlock(&lru_list_lock);
 				ll_rw_block(WRITE, 1, &bh);
+				brelse(bh);
 				spin_lock(&lru_list_lock);
 			}
 		}
@@ -883,6 +884,7 @@
 	while (!list_empty(&tmp.i_dirty_buffers)) {
 		bh = BH_ENTRY(tmp.i_dirty_buffers.prev);
 		remove_inode_queue(bh);
+		atomic_inc(&bh->b_count);
 		spin_unlock(&lru_list_lock);
 		wait_on_buffer(bh);
 		if (!buffer_uptodate(bh))
@@ -929,9 +931,9 @@
 			atomic_inc(&bh->b_count);
 			spin_unlock(&lru_list_lock);
 			wait_on_buffer(bh);
-			brelse(bh);
 			if (!buffer_uptodate(bh))
 				err = -EIO;
+			brelse(bh);
 			spin_lock(&lru_list_lock);
 			goto repeat;
 		}
--- fs/inode.c.~1~	Wed Nov 29 15:16:43 2000
+++ fs/inode.c	Fri Dec  1 00:40:26 2000
@@ -77,7 +77,13 @@
 
 #define alloc_inode() \
 	 ((struct inode *) kmem_cache_alloc(inode_cachep, SLAB_KERNEL))
-#define destroy_inode(inode) kmem_cache_free(inode_cachep, (inode))
+static void destroy_inode(struct inode *inode) 
+{
+	if (!list_empty(&inode->i_dirty_buffers))
+		BUG();
+	kmem_cache_free(inode_cachep, (inode));
+}
+
 
 /*
  * These are initializations that only need to be done
@@ -348,6 +354,12 @@
  
 void clear_inode(struct inode *inode)
 {
+	if (!list_empty(&inode->i_dirty_buffers)) {
+		if (inode->i_nlink)
+			BUG();
+		invalidate_inode_buffers(inode);
+	}
+       
 	if (inode->i_data.nrpages)
 		BUG();
 	if (!(inode->i_state & I_FREEING))
@@ -407,6 +419,7 @@
 		inode = list_entry(tmp, struct inode, i_list);
 		if (inode->i_sb != sb)
 			continue;
+		invalidate_inode_buffers(inode);
 		if (!atomic_read(&inode->i_count)) {
 			list_del(&inode->i_hash);
 			INIT_LIST_HEAD(&inode->i_hash);
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/

  parent reply	other threads:[~2000-12-01 14:49 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2000-11-29 21:54 corruption Andries.Brouwer
2000-11-29 22:18 ` corruption Alexander Viro
2000-11-30 14:21   ` corruption Andrew Morton
2000-11-30 18:39     ` corruption Jonathan Hudson
2000-11-30 19:07       ` corruption Alexander Viro
2000-11-30 21:35         ` corruption Andrew Morton
2000-12-01  0:57           ` corruption Andrew Morton
2000-12-01 12:18             ` corruption Jens Axboe
2000-12-01 12:34               ` corruption Andrew Morton
2000-12-01 12:37                 ` corruption Jens Axboe
2000-12-01 12:23             ` corruption Andrew Morton
2000-12-01 15:04               ` corruption Lawrence Walton
2000-12-01 14:16           ` Stephen C. Tweedie [this message]
2000-12-01 23:28             ` corruption Andrew Morton
2000-12-02  0:30               ` corruption kumon
2000-12-02  3:59             ` corruption Andrew Morton
2000-12-02 14:00               ` corruption Andrew Morton
2000-12-02 15:33                 ` corruption Alexander Viro
2000-12-02 16:39                   ` corruption Petr Vandrovec
2000-12-02 17:50                     ` corruption Alexander Viro
2000-12-02 17:59                     ` corruption Alexander Viro
2000-12-03 20:24                       ` corruption Jonathan Hudson
2000-12-03 21:44                   ` corruption Andrew Morton
2000-12-03 22:45                     ` [resync?] corruption Alexander Viro
2000-12-04  0:56                       ` Jeff V. Merkey
2000-12-04 15:00                   ` corruption Stephen C. Tweedie
2000-12-04 15:19                     ` corruption Alexander Viro
2000-12-01 17:29           ` corruption Jeff Garzik
     [not found] <20001202161158.A475@ppc.vc.cvut.cz>
2000-12-02 15:35 ` corruption Petr Vandrovec
  -- strict thread matches above, loose matches on Subject: below --
2000-11-29 13:44 corruption Andries.Brouwer
2000-11-29 14:10 ` corruption Tigran Aivazian
2000-11-29 14:16   ` corruption Alexander Viro
2000-11-29 14:26   ` corruption Jens Axboe
2000-11-29 11:16 corruption Andries.Brouwer
2000-11-29 17:47 ` corruption Linus Torvalds
2000-11-29 17:57   ` corruption Tigran Aivazian
2000-11-29 18:08     ` corruption Tigran Aivazian
2000-11-29 18:14       ` corruption Tigran Aivazian
2000-11-29 18:17       ` corruption Alexander Viro
2000-11-29 18:38       ` corruption Linus Torvalds
2000-11-29 18:47         ` corruption Tigran Aivazian
2000-11-29 18:07   ` corruption Zdenek Kabelac
2000-11-29  4:08 corruption Andries.Brouwer
2000-11-29  5:09 ` corruption Linus Torvalds
2000-11-29  9:08   ` corruption Alexander Viro
2000-11-29  9:20     ` corruption Tigran Aivazian
2000-11-29  9:26       ` corruption Alexander Viro
2000-11-29 10:52         ` corruption Tigran Aivazian
2000-11-29 18:56     ` corruption Andrea Arcangeli
2000-11-29 19:05       ` corruption Rik van Riel
2000-11-29 19:27         ` corruption Andrea Arcangeli
2000-11-29 20:02           ` corruption Rik van Riel
2000-11-29 19:25     ` corruption Linus Torvalds
2000-11-29 19:57       ` corruption Alexander Viro
2000-11-29 20:36         ` corruption Andrea Arcangeli

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=20001201141659.A4562@redhat.com \
    --to=sct@redhat.com \
    --cc=andrewm@uow.edu.au \
    --cc=jonathan@daria.co.uk \
    --cc=linux-kernel@vger.kernel.org \
    --cc=viro@math.psu.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.