Re: 2.6.1-rc1-tiny1 tree for small systems

From: Eric W. Biederman
Date: Sun Jan 04 2004 - 19:10:37 EST


Matt Mackall <mpm@xxxxxxxxxxx> writes:

> On Sun, Jan 04, 2004 at 12:42:43AM -0700, Eric W. Biederman wrote:
> > Matt Mackall <mpm@xxxxxxxxxxx> writes:
> > 220K compressed and 371K uncompressed. This is a serious reduction from
> > previous versions. There is still a huge amount of code I can't compile
> > out but this is certainly progress. Thank you.
>
> Suggestions? I'm rapidly exhausting a lot of the obvious candidates.
> My target build at the moment is ide + ext2 + proc + ipv4 + console, and
> that's currently at around 800K uncompressed, booting in a little less
> than 2.5MB. Hoping to get that under 2.

On the side of useless ugly. But interesting in what I had to touch
the following patch is a first crude stab at removing block device
support from the kernel.

With nothing selected this gets me down to a 191K bzImage and a 323K
text segment. So for those who are not using it this is a significant
drop.

I have a fairly static target of kernel and user space in 384K so I
can fit it in a standard BIOS ROM chip. 192K would be even better,
but I have other solutions I can use in that case if I need to.

Eric

$ ls -l arch/i386/boot/bzImage
-rw-r--r-- 2 eric eric 191316 Jan 4 15:38 arch/i386/boot/bzImage

$ size vmlinux
text data bss dec hex filename
323359 28652 24252 376263 5bdc7 vmlinux

diff -uNr -X linux-ignore-files linux-2.6.1-rc1-tiny1.eb1/arch/i386/mm/init.c linux-2.6.1-rc1-tiny1.eb2/arch/i386/mm/init.c
--- linux-2.6.1-rc1-tiny1.eb1/arch/i386/mm/init.c Sun Jan 4 00:22:36 2004
+++ linux-2.6.1-rc1-tiny1.eb2/arch/i386/mm/init.c Sun Jan 4 13:35:36 2004
@@ -444,7 +444,7 @@
static struct kcore_list kcore_mem, kcore_vmalloc;
#endif

-#ifdef CNFIG_CPU_SUP_INTEL
+#ifdef CONFIG_CPU_SUP_INTEL
extern int ppro_with_ram_bug(void);
#else
static inline int ppro_with_ram_bug(void) { return 0; }
diff -uNr -X linux-ignore-files linux-2.6.1-rc1-tiny1.eb1/drivers/block/Kconfig linux-2.6.1-rc1-tiny1.eb2/drivers/block/Kconfig
--- linux-2.6.1-rc1-tiny1.eb1/drivers/block/Kconfig Wed Dec 17 19:58:28 2003
+++ linux-2.6.1-rc1-tiny1.eb2/drivers/block/Kconfig Sun Jan 4 03:09:30 2004
@@ -6,7 +6,7 @@

config BLK_DEV_FD
tristate "Normal floppy disk support"
- depends on !X86_PC9800 && !ARCH_S390
+ depends on BLOCK_DEVICES && !X86_PC9800 && !ARCH_S390
---help---
If you want to use the floppy disk drive(s) of your PC under Linux,
say Y. Information about this driver, especially important for IBM
@@ -20,29 +20,29 @@

config AMIGA_FLOPPY
tristate "Amiga floppy support"
- depends on AMIGA
+ depends on BLOCK_DEVICES && AMIGA

config ATARI_FLOPPY
tristate "Atari floppy support"
- depends on ATARI
+ depends on BLOCK_DEVICES && ATARI

config BLK_DEV_FD98
tristate "NEC PC-9800 floppy disk support"
- depends on X86_PC9800
+ depends on BLOCK_DEVICES && X86_PC9800
---help---
If you want to use the floppy disk drive(s) of NEC PC-9801/PC-9821,
say Y.

config BLK_DEV_SWIM_IOP
bool "Macintosh IIfx/Quadra 900/Quadra 950 floppy support (EXPERIMENTAL)"
- depends on MAC && EXPERIMENTAL && BROKEN
+ depends on BLOCK_DEVICES && MAC && EXPERIMENTAL && BROKEN
help
Say Y here to support the SWIM (Super Woz Integrated Machine) IOP
floppy controller on the Macintosh IIfx and Quadra 900/950.

config BLK_DEV_PS2
tristate "PS/2 ESDI hard disk support"
- depends on MCA && MCA_LEGACY
+ depends on BLOCK_DEVICES && MCA && MCA_LEGACY
help
Say Y here if you have a PS/2 machine with a MCA bus and an ESDI
hard disk.
@@ -52,7 +52,7 @@

config AMIGA_Z2RAM
tristate "Amiga Zorro II ramdisk support"
- depends on ZORRO
+ depends on BLOCK_DEVICES && ZORRO
help
This enables support for using Chip RAM and Zorro II RAM as a
ramdisk or as a swap partition. Say Y if you want to include this
@@ -63,7 +63,7 @@

config ATARI_ACSI
tristate "Atari ACSI support"
- depends on ATARI && BROKEN
+ depends on BLOCK_DEVICES && ATARI && BROKEN
---help---
This enables support for the Atari ACSI interface. The driver
supports hard disks and CD-ROMs, which have 512-byte sectors, or can
@@ -79,11 +79,11 @@
module will be called acsi.

comment "Some devices (e.g. CD jukebox) support multiple LUNs"
- depends on ATARI && ATARI_ACSI
+ depends on BLOCK_DEVICES && ATARI && ATARI_ACSI

config ACSI_MULTI_LUN
bool "Probe all LUNs on each ACSI device"
- depends on ATARI_ACSI
+ depends on BLOCK_DEVICES && ATARI_ACSI
help
If you have a ACSI device that supports more than one LUN (Logical
Unit Number), e.g. a CD jukebox, you should say Y here so that all
@@ -94,7 +94,7 @@

config ATARI_SLM
tristate "Atari SLM laser printer support"
- depends on ATARI && ATARI_ACSI!=n
+ depends on BLOCK_DEVICES && ATARI && ATARI_ACSI!=n
help
If you have an Atari SLM laser printer, say Y to include support for
it in the kernel. Otherwise, say N. This driver is also available as
@@ -105,7 +105,7 @@

config BLK_DEV_XD
tristate "XT hard disk support"
- depends on ISA
+ depends on BLOCK_DEVICES && ISA
help
Very old 8 bit hard disk controllers used in the IBM XT computer
will be supported if you say Y here.
@@ -117,7 +117,7 @@

config PARIDE
tristate "Parallel port IDE device support"
- depends on PARPORT
+ depends on BLOCK_DEVIVES && PARPORT
---help---
There are many external CD-ROM and disk devices that connect through
your computer's parallel port. Most of them are actually IDE devices
@@ -146,7 +146,7 @@

config BLK_CPQ_DA
tristate "Compaq SMART2 support"
- depends on PCI
+ depends on BLOCK_DEVICES && PCI
help
This is the driver for Compaq Smart Array controllers. Everyone
using these boards should say Y here. See the file
@@ -156,7 +156,7 @@

config BLK_CPQ_CISS_DA
tristate "Compaq Smart Array 5xxx support"
- depends on PCI
+ depends on BLOCK_DEVICES && PCI
help
This is the driver for Compaq Smart Array 5xxx controllers.
Everyone using these boards should say Y here.
@@ -166,7 +166,7 @@

config CISS_SCSI_TAPE
bool "SCSI tape drive support for Smart Array 5xxx"
- depends on BLK_CPQ_CISS_DA && SCSI
+ depends on BLOCK_DEVICES && BLK_CPQ_CISS_DA && SCSI
help
When enabled (Y), this option allows SCSI tape drives and SCSI medium
changers (tape robots) to be accessed via a Compaq 5xxx array
@@ -180,7 +180,7 @@

config BLK_DEV_DAC960
tristate "Mylex DAC960/DAC1100 PCI RAID Controller support"
- depends on PCI
+ depends on BLOCK_DEVICES && PCI
help
This driver adds support for the Mylex DAC960, AcceleRAID, and
eXtremeRAID PCI RAID controllers. See the file
@@ -192,7 +192,7 @@

config BLK_DEV_UMEM
tristate "Micro Memory MM5415 Battery Backed RAM support (EXPERIMENTAL)"
- depends on PCI && EXPERIMENTAL
+ depends on BLOCK_DEVICES && PCI && EXPERIMENTAL
---help---
Saying Y here will include support for the MM5415 family of
battery backed (Non-volatile) RAM cards.
@@ -251,7 +251,7 @@
config BLK_DEV_CRYPTOLOOP
tristate "Cryptoloop Support"
select CRYPTO
- depends on BLK_DEV_LOOP
+ depends on BLOCK_DEVICES && BLK_DEV_LOOP
---help---
Say Y here if you want to be able to use the ciphers that are
provided by the CryptoAPI as loop transformation. This might be
@@ -259,7 +259,7 @@

config BLK_DEV_NBD
tristate "Network block device support"
- depends on NET
+ depends on BLOCK_DEVICES && NET
---help---
Saying Y here will allow your computer to be a client for network
block devices, i.e. it will be able to use block devices exported by
@@ -305,7 +305,7 @@

config BLK_DEV_RAM_SIZE
int "Default RAM disk size"
- depends on BLK_DEV_RAM
+ depends on BLOCK_DEVICES && BLK_DEV_RAM
default "4096"
help
The default value is 4096. Only change this if you know what are
@@ -322,7 +322,7 @@

config LBD
bool "Support for Large Block Devices"
- depends on X86 || MIPS32 || PPC32 || ARCH_S390_31 || SUPERH
+ depends on BLOCK_DEVICES && ( X86 || MIPS32 || PPC32 || ARCH_S390_31 || SUPERH )
help
Say Y here if you want to attach large (bigger than 2TB) discs to
your machine, or if you want to have a raid or loopback device
diff -uNr -X linux-ignore-files linux-2.6.1-rc1-tiny1.eb1/drivers/block/Kconfig.embedded linux-2.6.1-rc1-tiny1.eb2/drivers/block/Kconfig.embedded
--- linux-2.6.1-rc1-tiny1.eb1/drivers/block/Kconfig.embedded Wed Dec 31 17:00:00 1969
+++ linux-2.6.1-rc1-tiny1.eb2/drivers/block/Kconfig.embedded Sun Jan 4 03:09:51 2004
@@ -0,0 +1,5 @@
+config BLOCK_DEVICES
+ bool "Block device support" if EMBEDDED
+ default y
+ help
+ Allow the complete removal of block device code
diff -uNr -X linux-ignore-files linux-2.6.1-rc1-tiny1.eb1/drivers/block/Kconfig.iosched linux-2.6.1-rc1-tiny1.eb2/drivers/block/Kconfig.iosched
--- linux-2.6.1-rc1-tiny1.eb1/drivers/block/Kconfig.iosched Wed Dec 17 19:58:07 2003
+++ linux-2.6.1-rc1-tiny1.eb2/drivers/block/Kconfig.iosched Sun Jan 4 15:34:04 2004
@@ -1,5 +1,6 @@
config IOSCHED_NOOP
bool "No-op I/O scheduler" if EMBEDDED
+ depends on BLOCK_DEVICES
default y
---help---
The no-op I/O scheduler is a minimal scheduler that does basic merging
@@ -10,6 +11,7 @@

config IOSCHED_AS
bool "Anticipatory I/O scheduler" if EMBEDDED
+ depends on BLOCK_DEVICES
default y
---help---
The anticipatory I/O scheduler is the default disk scheduler. It is
@@ -19,6 +21,7 @@

config IOSCHED_DEADLINE
bool "Deadline I/O scheduler" if EMBEDDED
+ depends on BLOCK_DEVICES
default y
---help---
The deadline I/O scheduler is simple and compact, and is often as
diff -uNr -X linux-ignore-files linux-2.6.1-rc1-tiny1.eb1/drivers/block/Makefile linux-2.6.1-rc1-tiny1.eb2/drivers/block/Makefile
--- linux-2.6.1-rc1-tiny1.eb1/drivers/block/Makefile Wed Dec 17 19:59:19 2003
+++ linux-2.6.1-rc1-tiny1.eb2/drivers/block/Makefile Sun Jan 4 03:10:27 2004
@@ -13,7 +13,7 @@
# kblockd threads
#

-obj-y := elevator.o ll_rw_blk.o ioctl.o genhd.o scsi_ioctl.o
+obj-$(CONFIG_BLOCK_DEVICES) := elevator.o ll_rw_blk.o ioctl.o genhd.o scsi_ioctl.o

obj-$(CONFIG_IOSCHED_NOOP) += noop-iosched.o
obj-$(CONFIG_IOSCHED_AS) += as-iosched.o
diff -uNr -X linux-ignore-files linux-2.6.1-rc1-tiny1.eb1/drivers/md/Kconfig linux-2.6.1-rc1-tiny1.eb2/drivers/md/Kconfig
--- linux-2.6.1-rc1-tiny1.eb1/drivers/md/Kconfig Sat Jan 3 22:09:07 2004
+++ linux-2.6.1-rc1-tiny1.eb2/drivers/md/Kconfig Sun Jan 4 03:13:26 2004
@@ -6,6 +6,7 @@

config MD
bool "Multiple devices driver support (RAID and LVM)"
+ depends on BLOCK_DEVICES
help
Support multiple physical spindles through a single logical device.
Required for RAID and logical volume management.
diff -uNr -X linux-ignore-files linux-2.6.1-rc1-tiny1.eb1/fs/Kconfig.embedded linux-2.6.1-rc1-tiny1.eb2/fs/Kconfig.embedded
--- linux-2.6.1-rc1-tiny1.eb1/fs/Kconfig.embedded Wed Dec 31 17:00:00 1969
+++ linux-2.6.1-rc1-tiny1.eb2/fs/Kconfig.embedded Sun Jan 4 03:44:16 2004
@@ -0,0 +1,11 @@
+config BINFMT_SCRIPT
+ bool "Kernel support for shell scripts" if EMBEDDED
+ default y
+ help
+ Allow the removal of the code for executing shell scripts
diff -uNr -X linux-ignore-files linux-2.6.1-rc1-tiny1.eb1/fs/Makefile linux-2.6.1-rc1-tiny1.eb2/fs/Makefile
--- linux-2.6.1-rc1-tiny1.eb1/fs/Makefile Sat Jan 3 22:10:11 2004
+++ linux-2.6.1-rc1-tiny1.eb2/fs/Makefile Sun Jan 4 03:44:53 2004
@@ -5,12 +5,14 @@
# Rewritten to use lists instead of if-statements.
#

-obj-y := open.o read_write.o file_table.o buffer.o \
- bio.o super.o block_dev.o char_dev.o stat.o exec.o pipe.o \
+obj-y := open.o read_write.o file_table.o \
+ super.o char_dev.o stat.o exec.o pipe.o \
namei.o fcntl.o ioctl.o readdir.o select.o fifo.o locks.o \
dcache.o inode.o attr.o bad_inode.o file.o \
filesystems.o namespace.o seq_file.o xattr.o libfs.o \
- fs-writeback.o mpage.o direct-io.o aio.o
+ fs-writeback.o aio.o
+
+obj-$(CONFIG_BLOCK_DEVICES) += buffer.o bio.o block_dev.o mpage.o direct-io.o

obj-$(CONFIG_DNOTIFY) += dnotify.o
obj-$(CONFIG_EPOLL) += eventpoll.o
@@ -24,7 +26,7 @@
obj-$(CONFIG_BINFMT_MISC) += binfmt_misc.o

# binfmt_script is always there
-obj-y += binfmt_script.o
+obj-$(CONFIG_BINFMT_SCRIPT) += binfmt_script.o

obj-$(CONFIG_BINFMT_ELF) += binfmt_elf.o
obj-$(CONFIG_BINFMT_SOM) += binfmt_som.o
diff -uNr -X linux-ignore-files linux-2.6.1-rc1-tiny1.eb1/fs/buffer.c linux-2.6.1-rc1-tiny1.eb2/fs/buffer.c
--- linux-2.6.1-rc1-tiny1.eb1/fs/buffer.c Sat Jan 3 22:10:11 2004
+++ linux-2.6.1-rc1-tiny1.eb2/fs/buffer.c Sun Jan 4 14:37:38 2004
@@ -225,27 +225,6 @@

/*
* Write out and wait upon all dirty data associated with this
- * superblock. Filesystem data as well as the underlying block
- * device. Takes the superblock lock.
- */
-int fsync_super(struct super_block *sb)
-{
- sync_inodes_sb(sb, 0);
- DQUOT_SYNC(sb);
- lock_super(sb);
- if (sb->s_dirt && sb->s_op->write_super)
- sb->s_op->write_super(sb);
- unlock_super(sb);
- if (sb->s_op->sync_fs)
- sb->s_op->sync_fs(sb, 1);
- sync_blockdev(sb->s_bdev);
- sync_inodes_sb(sb, 1);
-
- return sync_blockdev(sb->s_bdev);
-}
-
-/*
- * Write out and wait upon all dirty data associated with this
* device. Filesystem data as well as the underlying block
* device. Takes the superblock lock.
*/
@@ -1559,35 +1538,6 @@
clear_buffer_new(bh);
clear_buffer_delay(bh);
unlock_buffer(bh);
-}
-
-/**
- * try_to_release_page() - release old fs-specific metadata on a page
- *
- * @page: the page which the kernel is trying to free
- * @gfp_mask: memory allocation flags (and I/O mode)
- *
- * The address_space is to try to release any data against the page
- * (presumably at page->private). If the release was successful, return `1'.
- * Otherwise return zero.
- *
- * The @gfp_mask argument specifies whether I/O may be performed to release
- * this page (__GFP_IO), and whether the call may block (__GFP_WAIT).
- *
- * NOTE: @gfp_mask may go away, and this function may become non-blocking.
- */
-int try_to_release_page(struct page *page, int gfp_mask)
-{
- struct address_space * const mapping = page->mapping;
-
- if (!PageLocked(page))
- BUG();
- if (PageWriteback(page))
- return 0;
-
- if (mapping && mapping->a_ops->releasepage)
- return mapping->a_ops->releasepage(page, gfp_mask);
- return try_to_free_buffers(page);
}

/**
diff -uNr -X linux-ignore-files linux-2.6.1-rc1-tiny1.eb1/fs/dcache.c linux-2.6.1-rc1-tiny1.eb2/fs/dcache.c
--- linux-2.6.1-rc1-tiny1.eb1/fs/dcache.c Sat Jan 3 22:09:11 2004
+++ linux-2.6.1-rc1-tiny1.eb2/fs/dcache.c Sun Jan 4 03:24:20 2004
@@ -1619,7 +1619,9 @@
inode_init(mempages);
files_init(mempages);
mnt_init(mempages);
+#ifdef CONFIG_BLOCK_DEVICES
bdev_cache_init();
+#endif
chrdev_init();
}

diff -uNr -X linux-ignore-files linux-2.6.1-rc1-tiny1.eb1/fs/fs-writeback.c linux-2.6.1-rc1-tiny1.eb2/fs/fs-writeback.c
--- linux-2.6.1-rc1-tiny1.eb1/fs/fs-writeback.c Wed Dec 17 20:00:00 2003
+++ linux-2.6.1-rc1-tiny1.eb2/fs/fs-writeback.c Sun Jan 4 15:25:49 2004
@@ -22,8 +22,11 @@
#include <linux/blkdev.h>
#include <linux/backing-dev.h>
#include <linux/buffer_head.h>
+#include <linux/quotaops.h>

+#ifdef CONFIG_BLOCK_DEVICES
extern struct super_block *blockdev_superblock;
+#endif

/**
* __mark_inode_dirty - internal function
@@ -263,6 +266,7 @@
struct backing_dev_info *bdi = mapping->backing_dev_info;

if (bdi->memory_backed) {
+#ifdef CONFIG_BLOCK_DEVICES
if (sb == blockdev_superblock) {
/*
* Dirty memory-backed blockdev: the ramdisk
@@ -271,6 +275,7 @@
list_move(&inode->i_list, &sb->s_dirty);
continue;
}
+#endif
/*
* Assume that all inodes on this superblock are memory
* backed. Skip the superblock.
@@ -280,15 +285,19 @@

if (wbc->nonblocking && bdi_write_congested(bdi)) {
wbc->encountered_congestion = 1;
+#ifdef CONFIG_BLOCK_DEVICES
if (sb != blockdev_superblock)
break; /* Skip a congested fs */
+#endif
list_move(&inode->i_list, &sb->s_dirty);
continue; /* Skip a congested blockdev */
}

if (wbc->bdi && bdi != wbc->bdi) {
+#ifdef CONFIG_BLOCK_DEVICES
if (sb != blockdev_superblock)
break; /* fs has the wrong queue */
+#endif
list_move(&inode->i_list, &sb->s_dirty);
continue; /* blockdev has wrong queue */
}
@@ -523,11 +532,13 @@
current->flags |= PF_SYNCWRITE;
if (what & OSYNC_DATA)
err = filemap_fdatawrite(inode->i_mapping);
+#ifdef CONFIG_BLOCK_DEVICES
if (what & (OSYNC_METADATA|OSYNC_DATA)) {
err2 = sync_mapping_buffers(inode->i_mapping);
if (!err)
err = err2;
}
+#endif
if (what & OSYNC_DATA) {
err2 = filemap_fdatawait(inode->i_mapping);
if (!err)
@@ -586,4 +597,32 @@
{
BUG_ON(!writeback_in_progress(bdi));
clear_bit(BDI_pdflush, &bdi->state);
+}
+
+
+/*
+ * Write out and wait upon all dirty data associated with this
+ * superblock. Filesystem data as well as the underlying block
+ * device. Takes the superblock lock.
+ */
+int fsync_super(struct super_block *sb)
+{
+ sync_inodes_sb(sb, 0);
+ DQUOT_SYNC(sb);
+ lock_super(sb);
+ if (sb->s_dirt && sb->s_op->write_super)
+ sb->s_op->write_super(sb);
+ unlock_super(sb);
+ if (sb->s_op->sync_fs)
+ sb->s_op->sync_fs(sb, 1);
+#ifdef CONFIG_BLOCK_DEVICES
+ sync_blockdev(sb->s_bdev);
+#endif
+ sync_inodes_sb(sb, 1);
+
+#ifdef CONFIG_BLOCK_DEVICES
+ return sync_blockdev(sb->s_bdev);
+#else
+ return 0;
+#endif
}
diff -uNr -X linux-ignore-files linux-2.6.1-rc1-tiny1.eb1/fs/inode.c linux-2.6.1-rc1-tiny1.eb2/fs/inode.c
--- linux-2.6.1-rc1-tiny1.eb1/fs/inode.c Wed Dec 17 19:59:55 2003
+++ linux-2.6.1-rc1-tiny1.eb2/fs/inode.c Sun Jan 4 15:35:18 2004
@@ -233,7 +233,9 @@
*/
void clear_inode(struct inode *inode)
{
+#ifdef CONFIG_BLOCK_DEVICES
invalidate_inode_buffers(inode);
+#endif

if (inode->i_data.nrpages)
BUG();
@@ -245,8 +247,10 @@
DQUOT_DROP(inode);
if (inode->i_sb && inode->i_sb->s_op->clear_inode)
inode->i_sb->s_op->clear_inode(inode);
+#if CONFIG_BLOCK_DEVICES
if (inode->i_bdev)
bd_forget(inode);
+#endif
if (inode->i_cdev)
cd_forget(inode);
inode->i_state = I_CLEAR;
@@ -301,7 +305,9 @@
inode = list_entry(tmp, struct inode, i_list);
if (inode->i_sb != sb)
continue;
+#ifdef CONFIG_BLOCK_DEVICES
invalidate_inode_buffers(inode);
+#endif
if (!atomic_read(&inode->i_count)) {
hlist_del_init(&inode->i_hash);
list_del(&inode->i_list);
@@ -353,7 +359,8 @@
}

EXPORT_SYMBOL(invalidate_inodes);
-
+
+#ifdef CONFIG_BLOCK_DEVICES
int __invalidate_device(struct block_device *bdev, int do_sync)
{
struct super_block *sb;
@@ -380,6 +387,7 @@
}

EXPORT_SYMBOL(__invalidate_device);
+#endif

static int can_unuse(struct inode *inode)
{
@@ -431,8 +439,10 @@
if (inode_has_buffers(inode) || inode->i_data.nrpages) {
__iget(inode);
spin_unlock(&inode_lock);
+#ifdef CONFIG_BLOCK_DEVICES
if (remove_inode_buffers(inode))
reap += invalidate_inode_pages(&inode->i_data);
+#endif
iput(inode);
spin_lock(&inode_lock);

@@ -1391,9 +1401,11 @@
if (S_ISCHR(mode)) {
inode->i_fop = &def_chr_fops;
inode->i_rdev = rdev;
+#ifdef CONFIG_BLOCK_DEVICES
} else if (S_ISBLK(mode)) {
inode->i_fop = &def_blk_fops;
inode->i_rdev = rdev;
+#endif
} else if (S_ISFIFO(mode))
inode->i_fop = &def_fifo_fops;
else if (S_ISSOCK(mode))
diff -uNr -X linux-ignore-files linux-2.6.1-rc1-tiny1.eb1/fs/partitions/Makefile linux-2.6.1-rc1-tiny1.eb2/fs/partitions/Makefile
--- linux-2.6.1-rc1-tiny1.eb1/fs/partitions/Makefile Wed Dec 17 19:58:47 2003
+++ linux-2.6.1-rc1-tiny1.eb2/fs/partitions/Makefile Sun Jan 4 03:29:11 2004
@@ -2,7 +2,7 @@
# Makefile for the linux kernel.
#

-obj-y := check.o
+obj-$(CONFIG_BLOCK_DEVICES) := check.o

obj-$(CONFIG_DEVFS_FS) += devfs.o
obj-$(CONFIG_ACORN_PARTITION) += acorn.o
diff -uNr -X linux-ignore-files linux-2.6.1-rc1-tiny1.eb1/fs/super.c linux-2.6.1-rc1-tiny1.eb2/fs/super.c
--- linux-2.6.1-rc1-tiny1.eb1/fs/super.c Wed Dec 17 19:58:48 2003
+++ linux-2.6.1-rc1-tiny1.eb2/fs/super.c Sun Jan 4 15:18:28 2004
@@ -473,8 +473,10 @@
{
int retval;

+#ifdef CONFIG_BLOCK_DEVICES
if (!(flags & MS_RDONLY) && bdev_read_only(sb->s_bdev))
return -EACCES;
+#endif
if (flags & MS_RDONLY)
acct_auto_close(sb);
shrink_dcache_sb(sb);
@@ -588,6 +590,7 @@
return (void *)s->s_bdev == data;
}

+#ifdef CONFIG_BLOCK_DEVICES
struct super_block *get_sb_bdev(struct file_system_type *fs_type,
int flags, const char *dev_name, void *data,
int (*fill_super)(struct super_block *, void *, int))
@@ -645,6 +648,7 @@
}

EXPORT_SYMBOL(kill_block_super);
+#endif

struct super_block *get_sb_nodev(struct file_system_type *fs_type,
int flags, void *data,
diff -uNr -X linux-ignore-files linux-2.6.1-rc1-tiny1.eb1/include/linux/blkdev.h linux-2.6.1-rc1-tiny1.eb2/include/linux/blkdev.h
--- linux-2.6.1-rc1-tiny1.eb1/include/linux/blkdev.h Wed Dec 17 19:58:28 2003
+++ linux-2.6.1-rc1-tiny1.eb2/include/linux/blkdev.h Sun Jan 4 03:32:28 2004
@@ -577,7 +577,11 @@
extern int blk_rq_map_sg(request_queue_t *, struct request *, struct scatterlist *);
extern void blk_dump_rq_flags(struct request *, char *);
extern void generic_unplug_device(void *);
+#ifdef CONFIG_BLOCK_DEVICES
extern long nr_blockdev_pages(void);
+#else
+static inline long nr_blockdev_pages(void) { return 0; }
+#endif

int blk_get_queue(request_queue_t *);
request_queue_t *blk_alloc_queue(int);
@@ -596,7 +600,12 @@
extern void blk_queue_free_tags(request_queue_t *);
extern int blk_queue_resize_tags(request_queue_t *, int);
extern void blk_queue_invalidate_tags(request_queue_t *);
+
+#if defined(CONFIG_BLOCK_DEVICES)
extern void blk_congestion_wait(int rw, long timeout);
+#else
+static inline void blk_congestion_wait(int rw, long timeout) {}
+#endif

extern void blk_rq_bio_prep(request_queue_t *, struct request *, struct bio *);
extern void blk_rq_prep_restart(struct request *);
diff -uNr -X linux-ignore-files linux-2.6.1-rc1-tiny1.eb1/include/linux/buffer_head.h linux-2.6.1-rc1-tiny1.eb2/include/linux/buffer_head.h
--- linux-2.6.1-rc1-tiny1.eb1/include/linux/buffer_head.h Wed Dec 17 19:58:04 2003
+++ linux-2.6.1-rc1-tiny1.eb2/include/linux/buffer_head.h Sun Jan 4 15:23:47 2004
@@ -150,7 +150,11 @@
void buffer_insert_list(spinlock_t *lock,
struct buffer_head *, struct list_head *);
void mark_buffer_dirty_inode(struct buffer_head *bh, struct inode *inode);
+#ifdef CONFIG_BLOCK_DEVICES
int inode_has_buffers(struct inode *);
+#else
+static inline int inode_has_buffers(struct inode *inode) { return 0; }
+#endif
void invalidate_inode_buffers(struct inode *);
int remove_inode_buffers(struct inode *inode);
int fsync_buffers_list(spinlock_t *lock, struct list_head *);
@@ -160,7 +164,11 @@
void mark_buffer_async_read(struct buffer_head *bh);
void mark_buffer_async_write(struct buffer_head *bh);
void invalidate_bdev(struct block_device *, int);
+#if CONFIG_BLOCK_DEVICES
int sync_blockdev(struct block_device *bdev);
+#else
+static inline int sync_blockdev(struct block_device *bdev) { return 0; }
+#endif
void __wait_on_buffer(struct buffer_head *);
wait_queue_head_t *bh_waitq_head(struct buffer_head *bh);
void wake_up_buffer(struct buffer_head *bh);
diff -uNr -X linux-ignore-files linux-2.6.1-rc1-tiny1.eb1/include/linux/fs.h linux-2.6.1-rc1-tiny1.eb2/include/linux/fs.h
--- linux-2.6.1-rc1-tiny1.eb1/include/linux/fs.h Sat Jan 3 22:10:11 2004
+++ linux-2.6.1-rc1-tiny1.eb2/include/linux/fs.h Sun Jan 4 03:52:15 2004
@@ -1145,7 +1145,11 @@
extern int blkdev_put(struct block_device *, int);
extern int bd_claim(struct block_device *, void *);
extern void bd_release(struct block_device *);
+#ifdef CONFIG_BLOCK_DEVICE
extern void blk_run_queues(void);
+#else
+static inline void blk_run_queues(void) {};
+#endif

/* fs/char_dev.c */
extern int alloc_chrdev_region(dev_t *, unsigned, unsigned, char *);
diff -uNr -X linux-ignore-files linux-2.6.1-rc1-tiny1.eb1/include/linux/mm.h linux-2.6.1-rc1-tiny1.eb2/include/linux/mm.h
--- linux-2.6.1-rc1-tiny1.eb1/include/linux/mm.h Sat Jan 3 22:09:12 2004
+++ linux-2.6.1-rc1-tiny1.eb2/include/linux/mm.h Sun Jan 4 03:57:55 2004
@@ -486,7 +486,11 @@
if (spd)
return (*spd)(page);
}
+#if CONFIG_BLOCK_DEVICES
return __set_page_dirty_buffers(page);
+#else
+ return 0;
+#endif
}

/*
diff -uNr -X linux-ignore-files linux-2.6.1-rc1-tiny1.eb1/include/linux/mpage.h linux-2.6.1-rc1-tiny1.eb2/include/linux/mpage.h
--- linux-2.6.1-rc1-tiny1.eb1/include/linux/mpage.h Wed Dec 17 19:58:47 2003
+++ linux-2.6.1-rc1-tiny1.eb2/include/linux/mpage.h Sun Jan 4 03:33:28 2004
@@ -10,6 +10,7 @@
* nested includes. Get it right in the .c file).
*/

+#ifdef CONFIG_BLOCK_DEVICES
struct writeback_control;

int mpage_readpages(struct address_space *mapping, struct list_head *pages,
@@ -23,3 +24,12 @@
{
return mpage_writepages(mapping, wbc, NULL);
}
+#else
+
+static inline int
+generic_writepages(struct address_space *mapping, struct writeback_control *wbc)
+{
+ return 0;
+}
+
+#endif
diff -uNr -X linux-ignore-files linux-2.6.1-rc1-tiny1.eb1/init/Kconfig linux-2.6.1-rc1-tiny1.eb2/init/Kconfig
--- linux-2.6.1-rc1-tiny1.eb1/init/Kconfig Sat Jan 3 22:10:11 2004
+++ linux-2.6.1-rc1-tiny1.eb2/init/Kconfig Sun Jan 4 03:35:04 2004
@@ -277,6 +277,8 @@
support for epoll family of system calls.

source "drivers/block/Kconfig.iosched"
+source "fs/Kconfig.embedded"
+source "drivers/block/Kconfig.embedded"

config CC_OPTIMIZE_FOR_SIZE
bool "Optimize for size" if EMBEDDED
diff -uNr -X linux-ignore-files linux-2.6.1-rc1-tiny1.eb1/init/do_mounts.c linux-2.6.1-rc1-tiny1.eb2/init/do_mounts.c
--- linux-2.6.1-rc1-tiny1.eb1/init/do_mounts.c Sat Jan 3 22:10:11 2004
+++ linux-2.6.1-rc1-tiny1.eb2/init/do_mounts.c Sun Jan 4 03:36:41 2004
@@ -267,6 +267,7 @@
return 0;
}

+#if CONFIG_BLOCK_DEVICES
void __init mount_block_root(char *name, int flags)
{
char *fs_names = __getname();
@@ -301,6 +302,7 @@
out:
putname(fs_names);
}
+#endif

#ifdef CONFIG_ROOT_NFS
static int __init mount_nfs_root(void)
@@ -368,8 +370,10 @@
change_floppy("root floppy");
}
#endif
+#if CONFIG_BLOCK_DEVICES
create_dev("/dev/root", ROOT_DEV, root_device_name);
mount_block_root("/dev/root", root_mountflags);
+#endif
}

/*
diff -uNr -X linux-ignore-files linux-2.6.1-rc1-tiny1.eb1/init/main.c linux-2.6.1-rc1-tiny1.eb2/init/main.c
--- linux-2.6.1-rc1-tiny1.eb1/init/main.c Sat Jan 3 22:10:11 2004
+++ linux-2.6.1-rc1-tiny1.eb2/init/main.c Sun Jan 4 03:37:07 2004
@@ -447,7 +447,9 @@
#endif
fork_init(num_physpages);
proc_caches_init();
+#if CONFIG_BLOCK_DEVICES
buffer_init();
+#endif
security_scaffolding_startup();
vfs_caches_init(max(1000, (int)num_physpages-16000));
radix_tree_init();
diff -uNr -X linux-ignore-files linux-2.6.1-rc1-tiny1.eb1/kernel/exit.c linux-2.6.1-rc1-tiny1.eb2/kernel/exit.c
--- linux-2.6.1-rc1-tiny1.eb1/kernel/exit.c Sat Jan 3 22:09:12 2004
+++ linux-2.6.1-rc1-tiny1.eb2/kernel/exit.c Sun Jan 4 15:38:02 2004
@@ -750,8 +750,10 @@
panic("Attempted to kill the idle task!");
if (unlikely(tsk->pid == 1))
panic("Attempted to kill init!");
+#ifdef CONFIG_BLOCK_DEVICES
if (tsk->io_context)
exit_io_context();
+#endif
tsk->flags |= PF_EXITING;
del_timer_sync(&tsk->real_timer);

diff -uNr -X linux-ignore-files linux-2.6.1-rc1-tiny1.eb1/kernel/sys.c linux-2.6.1-rc1-tiny1.eb2/kernel/sys.c
--- linux-2.6.1-rc1-tiny1.eb1/kernel/sys.c Sat Jan 3 22:10:11 2004
+++ linux-2.6.1-rc1-tiny1.eb2/kernel/sys.c Sun Jan 4 03:38:29 2004
@@ -251,6 +251,15 @@
cond_syscall(sys_epoll_wait)
cond_syscall(sys_pciconfig_read)
cond_syscall(sys_pciconfig_write)
+cond_syscall(sys_io_setup)
+cond_syscall(sys_io_destroy)
+cond_syscall(sys_io_getevents)
+cond_syscall(sys_io_submit)
+cond_syscall(sys_io_cancel)
+cond_syscall(sys_bdflush)
+cond_syscall(sys_sync)
+cond_syscall(sys_fsync)
+cond_syscall(sys_fdatasync)

static int set_one_prio(struct task_struct *p, int niceval, int error)
{
diff -uNr -X linux-ignore-files linux-2.6.1-rc1-tiny1.eb1/mm/filemap.c linux-2.6.1-rc1-tiny1.eb2/mm/filemap.c
--- linux-2.6.1-rc1-tiny1.eb1/mm/filemap.c Sat Jan 3 22:09:12 2004
+++ linux-2.6.1-rc1-tiny1.eb2/mm/filemap.c Sun Jan 4 03:41:15 2004
@@ -1640,6 +1640,11 @@
return err;
}

+#if !defined(CONFIG_BLOCK_DEVICES)
+ if (unlikely(isblk)) {
+ return -EINVAL;
+ }
+#endif
if (!isblk) {
/* FIXME: this is for backwards compatibility with 2.4 */
if (file->f_flags & O_APPEND)
@@ -1688,7 +1693,9 @@

if (unlikely(*pos + *count > inode->i_sb->s_maxbytes))
*count = inode->i_sb->s_maxbytes - *pos;
- } else {
+ }
+#if defined(CONFIG_BLOCK_DEVICES)
+ else {
loff_t isize;
if (bdev_read_only(inode->i_bdev))
return -EPERM;
@@ -1701,6 +1708,7 @@
if (*pos + *count > isize)
*count = isize - *pos;
}
+#endif
return 0;
}

diff -uNr -X linux-ignore-files linux-2.6.1-rc1-tiny1.eb1/mm/highmem.c linux-2.6.1-rc1-tiny1.eb2/mm/highmem.c
--- linux-2.6.1-rc1-tiny1.eb1/mm/highmem.c Sat Jan 3 22:09:12 2004
+++ linux-2.6.1-rc1-tiny1.eb2/mm/highmem.c Sun Jan 4 03:42:22 2004
@@ -300,6 +300,7 @@
}
}

+#ifdef CONFIG_BLOCK_DEVICES
static void bounce_end_io(struct bio *bio, mempool_t *pool)
{
struct bio *bio_orig = bio->bi_private;
@@ -479,6 +480,7 @@
}

EXPORT_SYMBOL(blk_queue_bounce);
+#endif /* CONFIG_BLOCK_DEVICES */

#if defined(HASHED_PAGE_VIRTUAL)

diff -uNr -X linux-ignore-files linux-2.6.1-rc1-tiny1.eb1/mm/page-writeback.c linux-2.6.1-rc1-tiny1.eb2/mm/page-writeback.c
--- linux-2.6.1-rc1-tiny1.eb1/mm/page-writeback.c Wed Dec 17 19:59:05 2003
+++ linux-2.6.1-rc1-tiny1.eb2/mm/page-writeback.c Sun Jan 4 14:15:00 2004
@@ -567,3 +567,38 @@
return 0;
}
EXPORT_SYMBOL(test_clear_page_dirty);
+
+
+/**
+ * try_to_release_page() - release old fs-specific metadata on a page
+ *
+ * @page: the page which the kernel is trying to free
+ * @gfp_mask: memory allocation flags (and I/O mode)
+ *
+ * The address_space is to try to release any data against the page
+ * (presumably at page->private). If the release was successful, return `1'.
+ * Otherwise return zero.
+ *
+ * The @gfp_mask argument specifies whether I/O may be performed to release
+ * this page (__GFP_IO), and whether the call may block (__GFP_WAIT).
+ *
+ * NOTE: @gfp_mask may go away, and this function may become non-blocking.
+ */
+int try_to_release_page(struct page *page, int gfp_mask)
+{
+ struct address_space * const mapping = page->mapping;
+
+ if (!PageLocked(page))
+ BUG();
+ if (PageWriteback(page))
+ return 0;
+
+ if (mapping && mapping->a_ops->releasepage)
+ return mapping->a_ops->releasepage(page, gfp_mask);
+#if CONFIG_BLOCK_DEVICES
+ return try_to_free_buffers(page);
+#else
+ BUG();
+ return 0;
+#endif
+}
diff -uNr -X linux-ignore-files linux-2.6.1-rc1-tiny1.eb1/mm/swap.c linux-2.6.1-rc1-tiny1.eb2/mm/swap.c
--- linux-2.6.1-rc1-tiny1.eb1/mm/swap.c Sat Jan 3 22:09:12 2004
+++ linux-2.6.1-rc1-tiny1.eb2/mm/swap.c Sun Jan 4 14:25:25 2004
@@ -317,6 +317,7 @@
pagevec_reinit(pvec);
}

+#if CONFIG_BLOCK_DEVICES
/*
* Try to drop buffers from the pages in a pagevec
*/
@@ -333,6 +334,7 @@
}
}
}
+#endif

/**
* pagevec_lookup - gang pagecache lookup
diff -uNr -X linux-ignore-files linux-2.6.1-rc1-tiny1.eb1/mm/truncate.c linux-2.6.1-rc1-tiny1.eb2/mm/truncate.c
--- linux-2.6.1-rc1-tiny1.eb1/mm/truncate.c Wed Dec 17 19:59:42 2003
+++ linux-2.6.1-rc1-tiny1.eb2/mm/truncate.c Sun Jan 4 14:27:10 2004
@@ -18,11 +18,18 @@

static int do_invalidatepage(struct page *page, unsigned long offset)
{
+ int ret;
int (*invalidatepage)(struct page *, unsigned long);
invalidatepage = page->mapping->a_ops->invalidatepage;
+#if CONFIG_BLOCK_DEVICE
if (invalidatepage == NULL)
invalidatepage = block_invalidatepage;
- return (*invalidatepage)(page, offset);
+#endif
+ ret = 1;
+ if (invalidatepage) {
+ ret = (*invalidatepage)(page, offset);
+ }
+ return ret;
}

static inline void truncate_partial_page(struct page *page, unsigned partial)
diff -uNr -X linux-ignore-files linux-2.6.1-rc1-tiny1.eb1/mm/vmscan.c linux-2.6.1-rc1-tiny1.eb2/mm/vmscan.c
--- linux-2.6.1-rc1-tiny1.eb1/mm/vmscan.c Sat Jan 3 22:09:12 2004
+++ linux-2.6.1-rc1-tiny1.eb2/mm/vmscan.c Sun Jan 4 03:43:24 2004
@@ -704,19 +704,23 @@
spin_unlock_irq(&zone->lru_lock);
pgdeactivate += pgmoved;
pgmoved = 0;
+#ifdef CONFIG_BLOCK_DEVICES
if (buffer_heads_over_limit)
pagevec_strip(&pvec);
+#endif
__pagevec_release(&pvec);
spin_lock_irq(&zone->lru_lock);
}
}
zone->nr_inactive += pgmoved;
pgdeactivate += pgmoved;
+#ifdef CONFIG_BLOCK_DEVICES
if (buffer_heads_over_limit) {
spin_unlock_irq(&zone->lru_lock);
pagevec_strip(&pvec);
spin_lock_irq(&zone->lru_lock);
}
+#endif

pgmoved = 0;
while (!list_empty(&l_active)) {

-
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/