aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2014-04-05 04:34:23 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2014-06-12 00:21:10 -0400
commit6dc8bc0fb300f6a878a4ed41ed833743a0dcf70e (patch)
treedbc8b023608509876af99631f66529875c781002 /fs
parent8d0207652cbe27d1f962050737848e5ad4671958 (diff)
ocfs2: switch to iter_file_splice_write()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs')
-rw-r--r--fs/ocfs2/file.c82
1 files changed, 2 insertions, 80 deletions
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c
index 64909ac2be43..465c95016a39 100644
--- a/fs/ocfs2/file.c
+++ b/fs/ocfs2/file.c
@@ -2430,84 +2430,6 @@ out_sems:
2430 return ret; 2430 return ret;
2431} 2431}
2432 2432
2433static int ocfs2_splice_to_file(struct pipe_inode_info *pipe,
2434 struct file *out,
2435 struct splice_desc *sd)
2436{
2437 int ret;
2438
2439 ret = ocfs2_prepare_inode_for_write(out, &sd->pos,
2440 sd->total_len, 0, NULL, NULL);
2441 if (ret < 0) {
2442 mlog_errno(ret);
2443 return ret;
2444 }
2445
2446 return splice_from_pipe_feed(pipe, sd, pipe_to_file);
2447}
2448
2449static ssize_t ocfs2_file_splice_write(struct pipe_inode_info *pipe,
2450 struct file *out,
2451 loff_t *ppos,
2452 size_t len,
2453 unsigned int flags)
2454{
2455 int ret;
2456 struct address_space *mapping = out->f_mapping;
2457 struct inode *inode = mapping->host;
2458 struct splice_desc sd = {
2459 .total_len = len,
2460 .flags = flags,
2461 .pos = *ppos,
2462 .u.file = out,
2463 };
2464
2465
2466 trace_ocfs2_file_splice_write(inode, out, out->f_path.dentry,
2467 (unsigned long long)OCFS2_I(inode)->ip_blkno,
2468 out->f_path.dentry->d_name.len,
2469 out->f_path.dentry->d_name.name, len);
2470
2471 pipe_lock(pipe);
2472
2473 splice_from_pipe_begin(&sd);
2474 do {
2475 ret = splice_from_pipe_next(pipe, &sd);
2476 if (ret <= 0)
2477 break;
2478
2479 mutex_lock_nested(&inode->i_mutex, I_MUTEX_CHILD);
2480 ret = ocfs2_rw_lock(inode, 1);
2481 if (ret < 0)
2482 mlog_errno(ret);
2483 else {
2484 ret = ocfs2_splice_to_file(pipe, out, &sd);
2485 ocfs2_rw_unlock(inode, 1);
2486 }
2487 mutex_unlock(&inode->i_mutex);
2488 } while (ret > 0);
2489 splice_from_pipe_end(pipe, &sd);
2490
2491 pipe_unlock(pipe);
2492
2493 if (sd.num_spliced)
2494 ret = sd.num_spliced;
2495
2496 if (ret > 0) {
2497 int err;
2498
2499 err = generic_write_sync(out, *ppos, ret);
2500 if (err)
2501 ret = err;
2502 else
2503 *ppos += ret;
2504
2505 balance_dirty_pages_ratelimited(mapping);
2506 }
2507
2508 return ret;
2509}
2510
2511static ssize_t ocfs2_file_splice_read(struct file *in, 2433static ssize_t ocfs2_file_splice_read(struct file *in,
2512 loff_t *ppos, 2434 loff_t *ppos,
2513 struct pipe_inode_info *pipe, 2435 struct pipe_inode_info *pipe,
@@ -2708,7 +2630,7 @@ const struct file_operations ocfs2_fops = {
2708 .lock = ocfs2_lock, 2630 .lock = ocfs2_lock,
2709 .flock = ocfs2_flock, 2631 .flock = ocfs2_flock,
2710 .splice_read = ocfs2_file_splice_read, 2632 .splice_read = ocfs2_file_splice_read,
2711 .splice_write = ocfs2_file_splice_write, 2633 .splice_write = iter_file_splice_write,
2712 .fallocate = ocfs2_fallocate, 2634 .fallocate = ocfs2_fallocate,
2713}; 2635};
2714 2636
@@ -2755,7 +2677,7 @@ const struct file_operations ocfs2_fops_no_plocks = {
2755#endif 2677#endif
2756 .flock = ocfs2_flock, 2678 .flock = ocfs2_flock,
2757 .splice_read = ocfs2_file_splice_read, 2679 .splice_read = ocfs2_file_splice_read,
2758 .splice_write = ocfs2_file_splice_write, 2680 .splice_write = iter_file_splice_write,
2759 .fallocate = ocfs2_fallocate, 2681 .fallocate = ocfs2_fallocate,
2760}; 2682};
2761 2683