Re: Block device swamping disk cache

From: Andrew Morton
Date: Wed May 12 2004 - 19:22:09 EST


marcus hall <marcus@xxxxxxxxxx> wrote:
>
> On Tue, May 11, 2004 at 05:26:43PM -0700, Andrew Morton wrote:
> > no, sorry, it'll still happen. I haven't fixed the ramdisk driver yet.
> >
> > The problem is that ->memory_backed means both "doesn't contribute
> > to dirty memory" and also "doesn't need writeback".
> >
> > These concepts need to be split apart for the ramdisk driver. I'll do it
> > for 2.6.7, promise.
>
> Well, I believe that the inodes that are marked as memory_backed are
> for the ramdisk, and that isn't really a problem. The block device
> that I am writing to is a compact flash, so it's going through the ide-disk
> device. I do not see this inode show up on any superblock's dirty queue
> (since it doesn't appear that mark_inode_dirty() is being called for
> it). So the question I am asking is, what strategy is *supposed* to be
> in place to flush the blocks out? (Or is this a hole that isn't plugged?)

Not sure why you're stuck running Krufty Old Kernels, but this patch from
June 2003 should fix it.

# This is a BitKeeper generated diff -Nru style patch.
#
# ChangeSet
# 2003/06/13 17:43:10-07:00 akpm@xxxxxxxxx
# [PATCH] fix writeback for dirty ramdisk blockdev inodes
#
# Once the blockdev inode for /dev/ram0 is dirtied we have a memory-backed
# inode on the blockdev superblock's s_dirty list.
#
# sync_sb_inodes() sees the memory-backed inode on the superblock and assumes
# that all the other inodes on the superblock are also memory-backed. This is
# not true for the blockdev superblock! We forget to write out dirty pages
# against the following blockdevs.
#
# Fix this by just leaving the inode dirty and moving on to inspect the other
# blockdev inodes on sb->s_io.
#
# (This is a little inefficient: an alternative is to leave dirtied
# memory-backed inodes on inode_in_use, so nobody ever even considers them for
# writeout. But that introduces an inconsistency and is a bit kludgey).
#
# fs/fs-writeback.c
# 2003/06/13 08:39:48-07:00 akpm@xxxxxxxxx +14 -1
# fix writeback for dirty ramdisk blockdev inodes
#
diff -Nru a/fs/fs-writeback.c b/fs/fs-writeback.c
--- a/fs/fs-writeback.c Wed May 12 17:18:54 2004
+++ b/fs/fs-writeback.c Wed May 12 17:18:54 2004
@@ -260,8 +260,21 @@
struct address_space *mapping = inode->i_mapping;
struct backing_dev_info *bdi = mapping->backing_dev_info;

- if (bdi->memory_backed)
+ if (bdi->memory_backed) {
+ if (sb == blockdev_superblock) {
+ /*
+ * Dirty memory-backed blockdev: the ramdisk
+ * driver does this.
+ */
+ list_move(&inode->i_list, &sb->s_dirty);
+ continue;
+ }
+ /*
+ * Assume that all inodes on this superblock are memory
+ * backed. Skip the superblock.
+ */
break;
+ }

if (wbc->nonblocking && bdi_write_congested(bdi)) {
wbc->encountered_congestion = 1;

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/