Whamcloud - gitweb
- list_for_each_entry() added
[fs/lustre-release.git] / lustre / kernel_patches / patches / ext3-map_inode_page-2.6.0.patch
1  fs/ext3/inode.c |   52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
2  fs/ext3/super.c |    3 +++
3  2 files changed, 55 insertions(+)
4
5 --- linux-2.6.0-test6/fs/ext3/inode.c~ext3-map_inode_page-2.6.0 2003-10-14 17:03:48.000000000 +0400
6 +++ linux-2.6.0-test6-alexey/fs/ext3/inode.c    2003-10-14 17:03:49.000000000 +0400
7 @@ -3143,3 +3143,55 @@ int ext3_prep_san_write(struct inode *in
8                 ret = ret2;
9         return ret;
10  }
11 +
12 +int ext3_map_inode_page(struct inode *inode, struct page *page,
13 +                        unsigned long *blocks, int *created, int create)
14 +{
15 +        unsigned int blocksize, blocks_per_page;
16 +        unsigned long iblock;
17 +        struct buffer_head dummy;
18 +        void *handle;
19 +        int i, rc = 0, failed = 0, needed_blocks;
20 +
21 +        blocksize = inode->i_sb->s_blocksize;
22 +        blocks_per_page = PAGE_SIZE >> inode->i_sb->s_blocksize_bits;
23 +        iblock = page->index * blocks_per_page;
24 +
25 +        for (i = 0; i < blocks_per_page; i++, iblock++) {
26 +                blocks[i] = ext3_bmap(inode->i_mapping, iblock);
27 +                if (blocks[i] == 0) {
28 +                        failed++;
29 +                        created[i] = -1;
30 +                } else {
31 +                        created[i] = 0;
32 +                }
33 +        }
34 +
35 +        if (failed == 0 || create == 0)
36 +                return 0;
37 +
38 +        needed_blocks = ext3_writepage_trans_blocks(inode);
39 +        handle = ext3_journal_start(inode, needed_blocks);
40 +        if (IS_ERR(handle))
41 +                return PTR_ERR(handle);
42 +
43 +        iblock = page->index * blocks_per_page;
44 +        for (i = 0; i < blocks_per_page; i++, iblock++) {
45 +                if (blocks[i] != 0)
46 +                        continue;
47 +
48 +                rc = ext3_get_block_handle(handle, inode, iblock, &dummy, 1, 1);
49 +                if (rc) {
50 +                        printk(KERN_INFO "ext3_map_inode_page: error reading "
51 +                               "block %ld\n", iblock);
52 +                        goto out;
53 +                }
54 +                blocks[i] = dummy.b_blocknr;
55 +                created[i] = 1;
56 +        }
57 +
58 + out:
59 +       ext3_journal_stop(handle);
60 +        return rc;
61 +}
62 +
63 --- linux-2.6.0-test6/fs/ext3/super.c~ext3-map_inode_page-2.6.0 2003-10-14 17:03:48.000000000 +0400
64 +++ linux-2.6.0-test6-alexey/fs/ext3/super.c    2003-10-14 17:09:05.000000000 +0400
65 @@ -2043,6 +2043,9 @@ static void __exit exit_ext3_fs(void)
66  int ext3_prep_san_write(struct inode *inode, long *blocks,
67                          int nblocks, loff_t newsize);
68  EXPORT_SYMBOL(ext3_prep_san_write);
69 +int ext3_map_inode_page(struct inode *inode, struct page *page,
70 +                        unsigned long *blocks, int *created, int create);
71 +EXPORT_SYMBOL(ext3_map_inode_page);
72  
73  MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others");
74  MODULE_DESCRIPTION("Second Extended Filesystem with journaling extensions");
75
76 _