Messages in this thread Patch in this message | | | From | "Sean Hunter" <> | Date | Sun, 7 Mar 1999 16:11:41 +0000 | Subject | PATCH: Zip drive sync bug fixed (WAS Re: I can kill 2.2.2 with my zip drive) |
| |
The patch below is from Andrea Arcangeli. It fixes the bug that I reported that causes a kernel panic while attempting to sync to my parallel port zip drive. It also seems to give a performance improvement when writing to the drive, but I haven't had time to benchmark it yet.
Thanks to Andrea and David Campbell for sorting this one out. I also think Alan was involved somewhere, so thanks to him too. It would be great if this patch (or something like it) could go in for 2.2.3.
Sean
----- Forwarded message from Andrea Arcangeli <andrea@e-mind.com> -----
Index: buffer.c =================================================================== RCS file: /var/cvs/linux/fs/buffer.c,v retrieving revision 1.1.2.22 diff -u -r1.1.2.22 buffer.c --- buffer.c 1999/02/20 15:57:29 1.1.2.22 +++ linux/fs/buffer.c 1999/03/04 00:24:33 @@ -78,7 +78,6 @@ static int nr_buffers = 0; static int nr_buffers_type[NR_LIST] = {0,}; -static int size_buffers_type[NR_LIST] = {0,}; static int nr_buffer_heads = 0; static int nr_unused_buffer_heads = 0; @@ -104,8 +103,7 @@ each time we call refill */ int nref_dirt; /* Dirty buffer threshold for activating bdflush when trying to refill buffers. */ - int pct_dirt; /* Max %age of mem for dirty buffers before - activating bdflush */ + int dummy1; /* unused */ int age_buffer; /* Time for normal buffer to age before we flush it */ int age_super; /* Time for superblock to age before we @@ -486,7 +484,6 @@ return; } nr_buffers_type[bh->b_list]--; - size_buffers_type[bh->b_list] -= bh->b_size; remove_from_hash_queue(bh); remove_from_lru_list(bh); } @@ -560,7 +557,6 @@ (*bhp)->b_prev_free = bh; nr_buffers_type[bh->b_list]++; - size_buffers_type[bh->b_list] += bh->b_size; /* Put the buffer in new hash-queue if it has a device. */ bh->b_next = NULL; @@ -814,19 +810,13 @@ file_buffer(buf, dispose); if(dispose == BUF_DIRTY) { int too_many = (nr_buffers * bdf_prm.b_un.nfract/100); - int too_large = (num_physpages * bdf_prm.b_un.pct_dirt/100); /* This buffer is dirty, maybe we need to start flushing. * If too high a percentage of the buffers are dirty... */ - if (nr_buffers_type[BUF_DIRTY] > too_many || - size_buffers_type[BUF_DIRTY]/PAGE_SIZE > too_large) { - if (nr_buffers_type[BUF_LOCKED] > 3 * bdf_prm.b_un.ndirty) - wakeup_bdflush(1); - else - wakeup_bdflush(0); - } - + if (nr_buffers_type[BUF_DIRTY] > too_many) + wakeup_bdflush(1); + /* If this is a loop device, and * more than half of the buffers are dirty... * (Prevents no-free-buffers deadlock with loop device.)
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu Please read the FAQ at http://www.tux.org/lkml/
| |