aboutsummaryrefslogtreecommitdiffstats
path: root/fs/reiserfs/file.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2013-03-19 19:46:45 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2013-04-09 14:12:54 -0400
commitd5daaaff24026d59130e97a406f2999118bafdc3 (patch)
tree65d58bbc2583f936808ef34cb8420b77adbc98ac /fs/reiserfs/file.c
parent97216be09efd41414725068212e3af0f05cde11a (diff)
reiserfs: don't wank with EFBIG before calling do_sync_write()
look for file_capable() in there... Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/reiserfs/file.c')
-rw-r--r--fs/reiserfs/file.c61
1 files changed, 1 insertions, 60 deletions
diff --git a/fs/reiserfs/file.c b/fs/reiserfs/file.c
index 6165bd4784f6..dcaafcfc23b0 100644
--- a/fs/reiserfs/file.c
+++ b/fs/reiserfs/file.c
@@ -234,68 +234,9 @@ int reiserfs_commit_page(struct inode *inode, struct page *page,
234 return ret; 234 return ret;
235} 235}
236 236
237/* Write @count bytes at position @ppos in a file indicated by @file
238 from the buffer @buf.
239
240 generic_file_write() is only appropriate for filesystems that are not seeking to optimize performance and want
241 something simple that works. It is not for serious use by general purpose filesystems, excepting the one that it was
242 written for (ext2/3). This is for several reasons:
243
244 * It has no understanding of any filesystem specific optimizations.
245
246 * It enters the filesystem repeatedly for each page that is written.
247
248 * It depends on reiserfs_get_block() function which if implemented by reiserfs performs costly search_by_key
249 * operation for each page it is supplied with. By contrast reiserfs_file_write() feeds as much as possible at a time
250 * to reiserfs which allows for fewer tree traversals.
251
252 * Each indirect pointer insertion takes a lot of cpu, because it involves memory moves inside of blocks.
253
254 * Asking the block allocation code for blocks one at a time is slightly less efficient.
255
256 All of these reasons for not using only generic file write were understood back when reiserfs was first miscoded to
257 use it, but we were in a hurry to make code freeze, and so it couldn't be revised then. This new code should make
258 things right finally.
259
260 Future Features: providing search_by_key with hints.
261
262*/
263static ssize_t reiserfs_file_write(struct file *file, /* the file we are going to write into */
264 const char __user * buf, /* pointer to user supplied data
265 (in userspace) */
266 size_t count, /* amount of bytes to write */
267 loff_t * ppos /* pointer to position in file that we start writing at. Should be updated to
268 * new current position before returning. */
269 )
270{
271 struct inode *inode = file_inode(file); // Inode of the file that we are writing to.
272 /* To simplify coding at this time, we store
273 locked pages in array for now */
274 struct reiserfs_transaction_handle th;
275 th.t_trans_id = 0;
276
277 /* If a filesystem is converted from 3.5 to 3.6, we'll have v3.5 items
278 * lying around (most of the disk, in fact). Despite the filesystem
279 * now being a v3.6 format, the old items still can't support large
280 * file sizes. Catch this case here, as the rest of the VFS layer is
281 * oblivious to the different limitations between old and new items.
282 * reiserfs_setattr catches this for truncates. This chunk is lifted
283 * from generic_write_checks. */
284 if (get_inode_item_key_version (inode) == KEY_FORMAT_3_5 &&
285 *ppos + count > MAX_NON_LFS) {
286 if (*ppos >= MAX_NON_LFS) {
287 return -EFBIG;
288 }
289 if (count > MAX_NON_LFS - (unsigned long)*ppos)
290 count = MAX_NON_LFS - (unsigned long)*ppos;
291 }
292
293 return do_sync_write(file, buf, count, ppos);
294}
295
296const struct file_operations reiserfs_file_operations = { 237const struct file_operations reiserfs_file_operations = {
297 .read = do_sync_read, 238 .read = do_sync_read,
298 .write = reiserfs_file_write, 239 .write = do_sync_write,
299 .unlocked_ioctl = reiserfs_ioctl, 240 .unlocked_ioctl = reiserfs_ioctl,
300#ifdef CONFIG_COMPAT 241#ifdef CONFIG_COMPAT
301 .compat_ioctl = reiserfs_compat_ioctl, 242 .compat_ioctl = reiserfs_compat_ioctl,