aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/linux-2.6/xfs_lrw.c
diff options
context:
space:
mode:
authorNick Piggin <npiggin@suse.de>2007-10-16 04:25:06 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-10-16 12:42:55 -0400
commitd79689c7038ea07182e8d7340786f7fcf8c77780 (patch)
tree8275c8ab209a8ecd03838f41e42228b053de00af /fs/xfs/linux-2.6/xfs_lrw.c
parentbfc1af650a8f36feba6b90a6c398325f885c00bc (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.c35
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
171unlock:
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);