diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2013-03-19 19:46:45 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2013-04-09 14:12:54 -0400 |
commit | d5daaaff24026d59130e97a406f2999118bafdc3 (patch) | |
tree | 65d58bbc2583f936808ef34cb8420b77adbc98ac /fs/reiserfs/file.c | |
parent | 97216be09efd41414725068212e3af0f05cde11a (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.c | 61 |
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 | */ | ||
263 | static 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 | |||
296 | const struct file_operations reiserfs_file_operations = { | 237 | const 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, |