diff options
author | Nick Piggin <npiggin@suse.de> | 2007-10-16 04:25:06 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-16 12:42:55 -0400 |
commit | d79689c7038ea07182e8d7340786f7fcf8c77780 (patch) | |
tree | 8275c8ab209a8ecd03838f41e42228b053de00af /fs/xfs/linux-2.6/xfs_lrw.c | |
parent | bfc1af650a8f36feba6b90a6c398325f885c00bc (diff) |
xfs: convert to new aops
Signed-off-by: Nick Piggin <npiggin@suse.de>
Cc: David Chinner <dgc@sgi.com>
Cc: Timothy Shimmin <tes@sgi.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/xfs/linux-2.6/xfs_lrw.c')
-rw-r--r-- | fs/xfs/linux-2.6/xfs_lrw.c | 35 |
1 files changed, 12 insertions, 23 deletions
diff --git a/fs/xfs/linux-2.6/xfs_lrw.c b/fs/xfs/linux-2.6/xfs_lrw.c index 765ec16a6e39..7e7aeb4c8a08 100644 --- a/fs/xfs/linux-2.6/xfs_lrw.c +++ b/fs/xfs/linux-2.6/xfs_lrw.c | |||
@@ -134,45 +134,34 @@ xfs_iozero( | |||
134 | loff_t pos, /* offset in file */ | 134 | loff_t pos, /* offset in file */ |
135 | size_t count) /* size of data to zero */ | 135 | size_t count) /* size of data to zero */ |
136 | { | 136 | { |
137 | unsigned bytes; | ||
138 | struct page *page; | 137 | struct page *page; |
139 | struct address_space *mapping; | 138 | struct address_space *mapping; |
140 | int status; | 139 | int status; |
141 | 140 | ||
142 | mapping = ip->i_mapping; | 141 | mapping = ip->i_mapping; |
143 | do { | 142 | do { |
144 | unsigned long index, offset; | 143 | unsigned offset, bytes; |
144 | void *fsdata; | ||
145 | 145 | ||
146 | offset = (pos & (PAGE_CACHE_SIZE -1)); /* Within page */ | 146 | offset = (pos & (PAGE_CACHE_SIZE -1)); /* Within page */ |
147 | index = pos >> PAGE_CACHE_SHIFT; | ||
148 | bytes = PAGE_CACHE_SIZE - offset; | 147 | bytes = PAGE_CACHE_SIZE - offset; |
149 | if (bytes > count) | 148 | if (bytes > count) |
150 | bytes = count; | 149 | bytes = count; |
151 | 150 | ||
152 | status = -ENOMEM; | 151 | status = pagecache_write_begin(NULL, mapping, pos, bytes, |
153 | page = grab_cache_page(mapping, index); | 152 | AOP_FLAG_UNINTERRUPTIBLE, |
154 | if (!page) | 153 | &page, &fsdata); |
155 | break; | ||
156 | |||
157 | status = mapping->a_ops->prepare_write(NULL, page, offset, | ||
158 | offset + bytes); | ||
159 | if (status) | 154 | if (status) |
160 | goto unlock; | 155 | break; |
161 | 156 | ||
162 | zero_user_page(page, offset, bytes, KM_USER0); | 157 | zero_user_page(page, offset, bytes, KM_USER0); |
163 | 158 | ||
164 | status = mapping->a_ops->commit_write(NULL, page, offset, | 159 | status = pagecache_write_end(NULL, mapping, pos, bytes, bytes, |
165 | offset + bytes); | 160 | page, fsdata); |
166 | if (!status) { | 161 | WARN_ON(status <= 0); /* can't return less than zero! */ |
167 | pos += bytes; | 162 | pos += bytes; |
168 | count -= bytes; | 163 | count -= bytes; |
169 | } | 164 | status = 0; |
170 | |||
171 | unlock: | ||
172 | unlock_page(page); | ||
173 | page_cache_release(page); | ||
174 | if (status) | ||
175 | break; | ||
176 | } while (count); | 165 | } while (count); |
177 | 166 | ||
178 | return (-status); | 167 | return (-status); |