--- /dev/null
+
+
+
+ 0 files changed
+
+--- linux-2.4.18-17.8.0/drivers/block/blkpg.c~dev_read_only 2002-12-06 14:52:29.000000000 -0800
++++ linux-2.4.18-17.8.0-zab/drivers/block/blkpg.c 2002-12-06 14:52:29.000000000 -0800
+@@ -297,3 +297,38 @@ int blk_ioctl(kdev_t dev, unsigned int c
+ }
+
+ EXPORT_SYMBOL(blk_ioctl);
++
++#define NUM_DEV_NO_WRITE 16
++static int dev_no_write[NUM_DEV_NO_WRITE];
++
++/*
++ * Debug code for turning block devices "read-only" (will discard writes
++ * silently). This is for filesystem crash/recovery testing.
++ */
++void dev_set_rdonly(kdev_t dev, int no_write)
++{
++ if (dev) {
++ printk(KERN_WARNING "Turning device %s read-only\n",
++ bdevname(dev));
++ dev_no_write[no_write] = 0xdead0000 + dev;
++ }
++}
++
++int dev_check_rdonly(kdev_t dev) {
++ int i;
++
++ for (i = 0; i < NUM_DEV_NO_WRITE; i++) {
++ if ((dev_no_write[i] & 0xffff0000) == 0xdead0000 &&
++ dev == (dev_no_write[i] & 0xffff))
++ return 1;
++ }
++ return 0;
++}
++
++void dev_clear_rdonly(int no_write) {
++ dev_no_write[no_write] = 0;
++}
++
++EXPORT_SYMBOL(dev_set_rdonly);
++EXPORT_SYMBOL(dev_check_rdonly);
++EXPORT_SYMBOL(dev_clear_rdonly);
+--- linux-2.4.18-17.8.0/drivers/block/loop.c~dev_read_only 2002-12-06 14:52:29.000000000 -0800
++++ linux-2.4.18-17.8.0-zab/drivers/block/loop.c 2002-12-06 14:52:29.000000000 -0800
+@@ -491,6 +491,9 @@ static int loop_make_request(request_que
+ spin_unlock_irq(&lo->lo_lock);
+
+ if (rw == WRITE) {
++ if (dev_check_rdonly(rbh->b_rdev))
++ goto err;
++
+ if (lo->lo_flags & LO_FLAGS_READ_ONLY)
+ goto err;
+ } else if (rw == READA) {
+--- linux-2.4.18-17.8.0/drivers/ide/ide-disk.c~dev_read_only 2002-12-06 14:52:29.000000000 -0800
++++ linux-2.4.18-17.8.0-zab/drivers/ide/ide-disk.c 2002-12-06 14:52:29.000000000 -0800
+@@ -557,6 +557,10 @@ static ide_startstop_t lba_48_rw_disk (i
+ */
+ static ide_startstop_t do_rw_disk (ide_drive_t *drive, struct request *rq, unsigned long block)
+ {
++ if (rq->cmd == WRITE && dev_check_rdonly(rq->rq_dev)) {
++ ide_end_request(1, HWGROUP(drive));
++ return ide_stopped;
++ }
+ if (IDE_CONTROL_REG)
+ OUT_BYTE(drive->ctl,IDE_CONTROL_REG);
+
+
+_
--- /dev/null
+
+
+
+ fs/ext3/ext3-exports.c | 3 ++
+ fs/ext3/inode.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 58 insertions(+)
+
+--- linux-2.4.18-p4smp/fs/ext3/inode.c~ext3-map_inode_page_2.4.18 2003-07-21 22:51:45.000000000 -0600
++++ linux-2.4.18-p4smp-braam/fs/ext3/inode.c 2003-07-21 22:51:47.000000000 -0600
+@@ -3003,3 +3003,58 @@ int ext3_prep_san_write(struct inode *in
+ ret = ret2;
+ return ret;
+ }
++
++int ext3_map_inode_page(struct inode *inode, struct page *page,
++ unsigned long *blocks, int *created, int create)
++{
++ unsigned int blocksize, blocks_per_page;
++ unsigned long iblock;
++ struct buffer_head dummy;
++ void *handle;
++ int i, rc = 0, failed = 0, needed_blocks;
++
++ blocksize = inode->i_sb->s_blocksize;
++ blocks_per_page = PAGE_SIZE >> inode->i_sb->s_blocksize_bits;
++ iblock = page->index >> (PAGE_SHIFT - inode->i_sb->s_blocksize_bits);
++
++ for (i = 0; i < blocks_per_page; i++, iblock++) {
++ blocks[i] = ext3_bmap(inode->i_mapping, iblock);
++ if (blocks[i] == 0) {
++ failed++;
++ created[i] = -1;
++ } else {
++ created[i] = 0;
++ }
++ }
++
++ if (failed == 0 || create == 0)
++ return 0;
++
++ needed_blocks = ext3_writepage_trans_blocks(inode) * failed;
++ lock_kernel();
++ handle = ext3_journal_start(inode, needed_blocks);
++ unlock_kernel();
++ if (IS_ERR(handle))
++ return PTR_ERR(handle);
++
++ iblock = page->index >> (PAGE_SHIFT - inode->i_sb->s_blocksize_bits);
++ for (i = 0; i < blocks_per_page; i++, iblock++) {
++ if (blocks[i] != 0)
++ continue;
++
++ rc = ext3_get_block_handle(handle, inode, iblock, &dummy, 1);
++ if (rc) {
++ printk(KERN_INFO "ext3_map_inode_page: error reading "
++ "block %ld\n", iblock);
++ goto out;
++ }
++ blocks[i] = dummy.b_blocknr;
++ created[i] = 1;
++ }
++
++ out:
++ lock_kernel();
++ ext3_journal_stop(handle, inode);
++ unlock_kernel();
++ return rc;
++}
+--- linux-2.4.18-p4smp/fs/ext3/ext3-exports.c~ext3-map_inode_page_2.4.18 2003-07-21 22:51:45.000000000 -0600
++++ linux-2.4.18-p4smp-braam/fs/ext3/ext3-exports.c 2003-07-21 22:51:47.000000000 -0600
+@@ -9,6 +9,8 @@
+
+ int ext3_prep_san_write(struct inode *inode, long *blocks,
+ int nblocks, loff_t newsize);
++int ext3_map_inode_page(struct inode *inode, struct page *page,
++ unsigned long *block, int *created, int create);
+
+ EXPORT_SYMBOL(ext3_force_commit);
+ EXPORT_SYMBOL(ext3_bread);
+@@ -18,3 +20,4 @@ EXPORT_SYMBOL(ext3_xattr_get);
+ EXPORT_SYMBOL(ext3_xattr_list);
+ EXPORT_SYMBOL(ext3_xattr_set);
+ EXPORT_SYMBOL(ext3_prep_san_write);
++EXPORT_SYMBOL(ext3_map_inode_page);
+
+_