> So basically - when we move block devices to the page cache, get rid of
> buffer cache usage in the filesystems as well? Ext2 is nearly there at
> least.
IBM's Linux port of JFS2 does already not use the buffercache at all.
It has an special struct address_space (and inode due to the braindamaged
assumption that ->host must be an inode, introduced in 2.4.0-test) that
covers the whole filesystems.
> One alternative is as Daniel Phillips did in the indexed-ext2-
> directory patch, where he kept the "bread" interface, but backed it
> with the page cache, so it required relatively little change to the
> filesystem.
I'd rather prefer to use a different structure for this kind of accesses,
so that we can get rid of struct buffer_head altogether (especially
with Jens' bio rewrite that nukes it out of the lowlevel drivers.)
An example for such an interface is the fbuf use for directorioes in
SVR4/SVR5. Header file that should explain it attached.
Christoph
-- Of course it doesn't work. We've performed a software upgrade.
/* * Copyright (c) 2001 Caldera International, Inc.. All Rights Reserved. * * THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF * CALDERA INTERNATIONAL, INC. * * The copyright notice above does not evidence any actual or intended * publication of such source code. */
#ifndef _FS_FBUF_H /* wrapper symbol for kernel use */ #define _FS_FBUF_H /* subject to change without notice */
#ident "@(#)unixsrc:usr/src/common/uts/fs/fbuf.h /main/uw7_nj/1" #ident "$Header: $"
#if defined(__cplusplus) extern "C" { #endif
#ifdef _KERNEL_HEADERS
#include <mem/seg.h> /* REQUIRED */ #include <util/types.h> /* REQUIRED */
#elif defined(_KERNEL) || defined(_KMEMUSER)
#include <vm/seg.h> /* REQUIRED */ #include <sys/types.h> /* REQUIRED */
#endif /* _KERNEL_HEADERS */
#if defined(_KERNEL) || defined(_KMEMUSER)
/* * A struct fbuf is used to get a mapping to part of a file using the * segkmap facilities. After you get a mapping, you can fbrelse() it * (giving a seg code to pass back to segmap_release), you can fbwrite() * it (causes a synchronous write back using the file mapping information), * or you can fbiwrite it (causing indirect synchronous write back to * the block number given without using the file mapping information). */
typedef struct fbuf { char *fb_addr; size_t fb_count; } fbuf_t;
#endif /* _KERNEL || _KMEMUSER */
#ifdef _KERNEL
struct vnode;
#ifdef _FSKI extern int fbread(struct vnode *vp, off_t off, size_t len, enum seg_rw rw, fbuf_t **fbpp); #else extern int fbread(struct vnode *vp, off64_t off, size_t len, enum seg_rw rw, fbuf_t **fbpp); #endif
extern int fbrelse(fbuf_t *fbp, uint_t sm_flags);
#endif /* _KERNEL */
#if defined(__cplusplus) } #endif
#endif /* _FS_FBUF_H */ - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/