Annotation of /trunk/kernel26-alx/patches-2.6.23-r1/0106-2.6.23.7-all-fixes.patch
Parent Directory | Revision Log
Revision 658 -
(hide annotations)
(download)
Mon Jun 23 21:39:39 2008 UTC (16 years, 3 months ago) by niro
File size: 4539 byte(s)
Mon Jun 23 21:39:39 2008 UTC (16 years, 3 months ago) by niro
File size: 4539 byte(s)
2.6.23-alx-r1: new default as we fix the via epia clocksource=tsc quircks -linux-2.6.23.17 -fbcondecor-0.9.4 -squashfs-3.3 -unionfs-2.3.3 -ipw3945-1.2.2 -mptbase-vmware fix
1 | niro | 658 | diff --git a/fs/minix/itree_v1.c b/fs/minix/itree_v1.c |
2 | index 1a5f3bf..82d6554 100644 | ||
3 | --- a/fs/minix/itree_v1.c | ||
4 | +++ b/fs/minix/itree_v1.c | ||
5 | @@ -23,11 +23,16 @@ static inline block_t *i_data(struct inode *inode) | ||
6 | static int block_to_path(struct inode * inode, long block, int offsets[DEPTH]) | ||
7 | { | ||
8 | int n = 0; | ||
9 | + char b[BDEVNAME_SIZE]; | ||
10 | |||
11 | if (block < 0) { | ||
12 | - printk("minix_bmap: block<0\n"); | ||
13 | + printk("MINIX-fs: block_to_path: block %ld < 0 on dev %s\n", | ||
14 | + block, bdevname(inode->i_sb->s_bdev, b)); | ||
15 | } else if (block >= (minix_sb(inode->i_sb)->s_max_size/BLOCK_SIZE)) { | ||
16 | - printk("minix_bmap: block>big\n"); | ||
17 | + if (printk_ratelimit()) | ||
18 | + printk("MINIX-fs: block_to_path: " | ||
19 | + "block %ld too big on dev %s\n", | ||
20 | + block, bdevname(inode->i_sb->s_bdev, b)); | ||
21 | } else if (block < 7) { | ||
22 | offsets[n++] = block; | ||
23 | } else if ((block -= 7) < 512) { | ||
24 | diff --git a/fs/minix/itree_v2.c b/fs/minix/itree_v2.c | ||
25 | index ad8f0de..f230109 100644 | ||
26 | --- a/fs/minix/itree_v2.c | ||
27 | +++ b/fs/minix/itree_v2.c | ||
28 | @@ -23,12 +23,17 @@ static inline block_t *i_data(struct inode *inode) | ||
29 | static int block_to_path(struct inode * inode, long block, int offsets[DEPTH]) | ||
30 | { | ||
31 | int n = 0; | ||
32 | + char b[BDEVNAME_SIZE]; | ||
33 | struct super_block *sb = inode->i_sb; | ||
34 | |||
35 | if (block < 0) { | ||
36 | - printk("minix_bmap: block<0\n"); | ||
37 | + printk("MINIX-fs: block_to_path: block %ld < 0 on dev %s\n", | ||
38 | + block, bdevname(sb->s_bdev, b)); | ||
39 | } else if (block >= (minix_sb(inode->i_sb)->s_max_size/sb->s_blocksize)) { | ||
40 | - printk("minix_bmap: block>big\n"); | ||
41 | + if (printk_ratelimit()) | ||
42 | + printk("MINIX-fs: block_to_path: " | ||
43 | + "block %ld too big on dev %s\n", | ||
44 | + block, bdevname(sb->s_bdev, b)); | ||
45 | } else if (block < 7) { | ||
46 | offsets[n++] = block; | ||
47 | } else if ((block -= 7) < 256) { | ||
48 | diff --git a/fs/nfs/write.c b/fs/nfs/write.c | ||
49 | index 0d7a77c..a2a4865 100644 | ||
50 | --- a/fs/nfs/write.c | ||
51 | +++ b/fs/nfs/write.c | ||
52 | @@ -167,8 +167,6 @@ static void nfs_mark_uptodate(struct page *page, unsigned int base, unsigned int | ||
53 | return; | ||
54 | if (count != nfs_page_length(page)) | ||
55 | return; | ||
56 | - if (count != PAGE_CACHE_SIZE) | ||
57 | - zero_user_page(page, count, PAGE_CACHE_SIZE - count, KM_USER0); | ||
58 | SetPageUptodate(page); | ||
59 | } | ||
60 | |||
61 | @@ -643,7 +641,8 @@ static struct nfs_page * nfs_update_request(struct nfs_open_context* ctx, | ||
62 | return ERR_PTR(error); | ||
63 | } | ||
64 | spin_unlock(&inode->i_lock); | ||
65 | - return new; | ||
66 | + req = new; | ||
67 | + goto zero_page; | ||
68 | } | ||
69 | spin_unlock(&inode->i_lock); | ||
70 | |||
71 | @@ -671,13 +670,23 @@ static struct nfs_page * nfs_update_request(struct nfs_open_context* ctx, | ||
72 | if (offset < req->wb_offset) { | ||
73 | req->wb_offset = offset; | ||
74 | req->wb_pgbase = offset; | ||
75 | - req->wb_bytes = rqend - req->wb_offset; | ||
76 | + req->wb_bytes = max(end, rqend) - req->wb_offset; | ||
77 | + goto zero_page; | ||
78 | } | ||
79 | |||
80 | if (end > rqend) | ||
81 | req->wb_bytes = end - req->wb_offset; | ||
82 | |||
83 | return req; | ||
84 | +zero_page: | ||
85 | + /* If this page might potentially be marked as up to date, | ||
86 | + * then we need to zero any uninitalised data. */ | ||
87 | + if (req->wb_pgbase == 0 && req->wb_bytes != PAGE_CACHE_SIZE | ||
88 | + && !PageUptodate(req->wb_page)) | ||
89 | + zero_user_page(req->wb_page, req->wb_bytes, | ||
90 | + PAGE_CACHE_SIZE - req->wb_bytes, | ||
91 | + KM_USER0); | ||
92 | + return req; | ||
93 | } | ||
94 | |||
95 | int nfs_flush_incompatible(struct file *file, struct page *page) | ||
96 | diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c | ||
97 | index f37f25c..0b5e35f 100644 | ||
98 | --- a/fs/ocfs2/aops.c | ||
99 | +++ b/fs/ocfs2/aops.c | ||
100 | @@ -661,6 +661,27 @@ static void ocfs2_clear_page_regions(struct page *page, | ||
101 | } | ||
102 | |||
103 | /* | ||
104 | + * Nonsparse file systems fully allocate before we get to the write | ||
105 | + * code. This prevents ocfs2_write() from tagging the write as an | ||
106 | + * allocating one, which means ocfs2_map_page_blocks() might try to | ||
107 | + * read-in the blocks at the tail of our file. Avoid reading them by | ||
108 | + * testing i_size against each block offset. | ||
109 | + */ | ||
110 | +static int ocfs2_should_read_blk(struct inode *inode, struct page *page, | ||
111 | + unsigned int block_start) | ||
112 | +{ | ||
113 | + u64 offset = page_offset(page) + block_start; | ||
114 | + | ||
115 | + if (ocfs2_sparse_alloc(OCFS2_SB(inode->i_sb))) | ||
116 | + return 1; | ||
117 | + | ||
118 | + if (i_size_read(inode) > offset) | ||
119 | + return 1; | ||
120 | + | ||
121 | + return 0; | ||
122 | +} | ||
123 | + | ||
124 | +/* | ||
125 | * Some of this taken from block_prepare_write(). We already have our | ||
126 | * mapping by now though, and the entire write will be allocating or | ||
127 | * it won't, so not much need to use BH_New. | ||
128 | @@ -713,6 +734,7 @@ int ocfs2_map_page_blocks(struct page *page, u64 *p_blkno, | ||
129 | set_buffer_uptodate(bh); | ||
130 | } else if (!buffer_uptodate(bh) && !buffer_delay(bh) && | ||
131 | !buffer_new(bh) && | ||
132 | + ocfs2_should_read_blk(inode, page, block_start) && | ||
133 | (block_start < from || block_end > to)) { | ||
134 | ll_rw_block(READ, 1, &bh); | ||
135 | *wait_bh++=bh; |