aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2013-03-20 13:04:20 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2013-04-09 14:12:56 -0400
commit03d95eb2f2578083a3f6286262e1cb5d88a00c02 (patch)
treea82585b55080628e0ba0028dfb100886bf5b4099
parent72ec35163f9f728ba1579fd80682e51e933dfa8a (diff)
lift sb_start_write() out of ->write()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--drivers/block/loop.c2
-rw-r--r--fs/cachefiles/rdwr.c2
-rw-r--r--fs/coda/file.c2
-rw-r--r--fs/coredump.c2
-rw-r--r--fs/read_write.c24
-rw-r--r--fs/splice.c2
-rw-r--r--kernel/acct.c2
-rw-r--r--mm/filemap_xip.c3
8 files changed, 26 insertions, 13 deletions
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index 747bb2af69dc..cd1e17460f03 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -230,9 +230,11 @@ static int __do_lo_send_write(struct file *file,
230 ssize_t bw; 230 ssize_t bw;
231 mm_segment_t old_fs = get_fs(); 231 mm_segment_t old_fs = get_fs();
232 232
233 file_start_write(file);
233 set_fs(get_ds()); 234 set_fs(get_ds());
234 bw = file->f_op->write(file, buf, len, &pos); 235 bw = file->f_op->write(file, buf, len, &pos);
235 set_fs(old_fs); 236 set_fs(old_fs);
237 file_end_write(file);
236 if (likely(bw == len)) 238 if (likely(bw == len))
237 return 0; 239 return 0;
238 printk(KERN_ERR "loop: Write error at byte offset %llu, length %i.\n", 240 printk(KERN_ERR "loop: Write error at byte offset %llu, length %i.\n",
diff --git a/fs/cachefiles/rdwr.c b/fs/cachefiles/rdwr.c
index 480992259707..317f9ee9c991 100644
--- a/fs/cachefiles/rdwr.c
+++ b/fs/cachefiles/rdwr.c
@@ -962,12 +962,14 @@ int cachefiles_write_page(struct fscache_storage *op, struct page *page)
962 } 962 }
963 963
964 data = kmap(page); 964 data = kmap(page);
965 file_start_write(file);
965 old_fs = get_fs(); 966 old_fs = get_fs();
966 set_fs(KERNEL_DS); 967 set_fs(KERNEL_DS);
967 ret = file->f_op->write( 968 ret = file->f_op->write(
968 file, (const void __user *) data, len, &pos); 969 file, (const void __user *) data, len, &pos);
969 set_fs(old_fs); 970 set_fs(old_fs);
970 kunmap(page); 971 kunmap(page);
972 file_end_write(file);
971 if (ret != len) 973 if (ret != len)
972 ret = -EIO; 974 ret = -EIO;
973 } 975 }
diff --git a/fs/coda/file.c b/fs/coda/file.c
index fa4c100bdc7d..380b798f8443 100644
--- a/fs/coda/file.c
+++ b/fs/coda/file.c
@@ -79,6 +79,7 @@ coda_file_write(struct file *coda_file, const char __user *buf, size_t count, lo
79 return -EINVAL; 79 return -EINVAL;
80 80
81 host_inode = file_inode(host_file); 81 host_inode = file_inode(host_file);
82 file_start_write(host_file);
82 mutex_lock(&coda_inode->i_mutex); 83 mutex_lock(&coda_inode->i_mutex);
83 84
84 ret = host_file->f_op->write(host_file, buf, count, ppos); 85 ret = host_file->f_op->write(host_file, buf, count, ppos);
@@ -87,6 +88,7 @@ coda_file_write(struct file *coda_file, const char __user *buf, size_t count, lo
87 coda_inode->i_blocks = (coda_inode->i_size + 511) >> 9; 88 coda_inode->i_blocks = (coda_inode->i_size + 511) >> 9;
88 coda_inode->i_mtime = coda_inode->i_ctime = CURRENT_TIME_SEC; 89 coda_inode->i_mtime = coda_inode->i_ctime = CURRENT_TIME_SEC;
89 mutex_unlock(&coda_inode->i_mutex); 90 mutex_unlock(&coda_inode->i_mutex);
91 file_end_write(host_file);
90 92
91 return ret; 93 return ret;
92} 94}
diff --git a/fs/coredump.c b/fs/coredump.c
index c6479658d487..288e5c9f9bbe 100644
--- a/fs/coredump.c
+++ b/fs/coredump.c
@@ -629,9 +629,11 @@ void do_coredump(siginfo_t *siginfo)
629 goto close_fail; 629 goto close_fail;
630 if (displaced) 630 if (displaced)
631 put_files_struct(displaced); 631 put_files_struct(displaced);
632 file_start_write(cprm.file);
632 retval = binfmt->core_dump(&cprm); 633 retval = binfmt->core_dump(&cprm);
633 if (retval) 634 if (retval)
634 current->signal->group_exit_code |= 0x80; 635 current->signal->group_exit_code |= 0x80;
636 file_end_write(cprm.file);
635 637
636 if (ispipe && core_pipe_limit) 638 if (ispipe && core_pipe_limit)
637 wait_for_dump_helpers(cprm.file); 639 wait_for_dump_helpers(cprm.file);
diff --git a/fs/read_write.c b/fs/read_write.c
index e6dd1c2d0592..a1f4d44cbc03 100644
--- a/fs/read_write.c
+++ b/fs/read_write.c
@@ -398,7 +398,6 @@ ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len, lof
398 struct kiocb kiocb; 398 struct kiocb kiocb;
399 ssize_t ret; 399 ssize_t ret;
400 400
401 file_start_write(filp);
402 init_sync_kiocb(&kiocb, filp); 401 init_sync_kiocb(&kiocb, filp);
403 kiocb.ki_pos = *ppos; 402 kiocb.ki_pos = *ppos;
404 kiocb.ki_left = len; 403 kiocb.ki_left = len;
@@ -414,7 +413,6 @@ ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len, lof
414 if (-EIOCBQUEUED == ret) 413 if (-EIOCBQUEUED == ret)
415 ret = wait_on_sync_kiocb(&kiocb); 414 ret = wait_on_sync_kiocb(&kiocb);
416 *ppos = kiocb.ki_pos; 415 *ppos = kiocb.ki_pos;
417 file_end_write(filp);
418 return ret; 416 return ret;
419} 417}
420 418
@@ -458,6 +456,7 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_
458 ret = rw_verify_area(WRITE, file, pos, count); 456 ret = rw_verify_area(WRITE, file, pos, count);
459 if (ret >= 0) { 457 if (ret >= 0) {
460 count = ret; 458 count = ret;
459 file_start_write(file);
461 if (file->f_op->write) 460 if (file->f_op->write)
462 ret = file->f_op->write(file, buf, count, pos); 461 ret = file->f_op->write(file, buf, count, pos);
463 else 462 else
@@ -467,6 +466,7 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_
467 add_wchar(current, ret); 466 add_wchar(current, ret);
468 } 467 }
469 inc_syscw(current); 468 inc_syscw(current);
469 file_end_write(file);
470 } 470 }
471 471
472 return ret; 472 return ret;
@@ -758,16 +758,18 @@ static ssize_t do_readv_writev(int type, struct file *file,
758 } else { 758 } else {
759 fn = (io_fn_t)file->f_op->write; 759 fn = (io_fn_t)file->f_op->write;
760 fnv = file->f_op->aio_write; 760 fnv = file->f_op->aio_write;
761 file_start_write(file);
761 } 762 }
762 763
763 if (fnv) { 764 if (fnv)
764 file_start_write(file);
765 ret = do_sync_readv_writev(file, iov, nr_segs, tot_len, 765 ret = do_sync_readv_writev(file, iov, nr_segs, tot_len,
766 pos, fnv); 766 pos, fnv);
767 file_end_write(file); 767 else
768 } else
769 ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn); 768 ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn);
770 769
770 if (type != READ)
771 file_end_write(file);
772
771out: 773out:
772 if (iov != iovstack) 774 if (iov != iovstack)
773 kfree(iov); 775 kfree(iov);
@@ -936,16 +938,18 @@ static ssize_t compat_do_readv_writev(int type, struct file *file,
936 } else { 938 } else {
937 fn = (io_fn_t)file->f_op->write; 939 fn = (io_fn_t)file->f_op->write;
938 fnv = file->f_op->aio_write; 940 fnv = file->f_op->aio_write;
941 file_start_write(file);
939 } 942 }
940 943
941 if (fnv) { 944 if (fnv)
942 file_start_write(file);
943 ret = do_sync_readv_writev(file, iov, nr_segs, tot_len, 945 ret = do_sync_readv_writev(file, iov, nr_segs, tot_len,
944 pos, fnv); 946 pos, fnv);
945 file_end_write(file); 947 else
946 } else
947 ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn); 948 ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn);
948 949
950 if (type != READ)
951 file_end_write(file);
952
949out: 953out:
950 if (iov != iovstack) 954 if (iov != iovstack)
951 kfree(iov); 955 kfree(iov);
diff --git a/fs/splice.c b/fs/splice.c
index 29e394e49ddd..e78a749064db 100644
--- a/fs/splice.c
+++ b/fs/splice.c
@@ -1052,7 +1052,9 @@ static int write_pipe_buf(struct pipe_inode_info *pipe, struct pipe_buffer *buf,
1052 loff_t tmp = sd->pos; 1052 loff_t tmp = sd->pos;
1053 1053
1054 data = buf->ops->map(pipe, buf, 0); 1054 data = buf->ops->map(pipe, buf, 0);
1055 file_start_write(sd->u.file);
1055 ret = __kernel_write(sd->u.file, data + buf->offset, sd->len, &tmp); 1056 ret = __kernel_write(sd->u.file, data + buf->offset, sd->len, &tmp);
1057 file_end_write(sd->u.file);
1056 buf->ops->unmap(pipe, buf, data); 1058 buf->ops->unmap(pipe, buf, data);
1057 1059
1058 return ret; 1060 return ret;
diff --git a/kernel/acct.c b/kernel/acct.c
index b9bd7f098ee5..85389fe2abd0 100644
--- a/kernel/acct.c
+++ b/kernel/acct.c
@@ -543,6 +543,7 @@ static void do_acct_process(struct bsd_acct_struct *acct,
543 * Kernel segment override to datasegment and write it 543 * Kernel segment override to datasegment and write it
544 * to the accounting file. 544 * to the accounting file.
545 */ 545 */
546 file_start_write(file);
546 fs = get_fs(); 547 fs = get_fs();
547 set_fs(KERNEL_DS); 548 set_fs(KERNEL_DS);
548 /* 549 /*
@@ -554,6 +555,7 @@ static void do_acct_process(struct bsd_acct_struct *acct,
554 sizeof(acct_t), &file->f_pos); 555 sizeof(acct_t), &file->f_pos);
555 current->signal->rlim[RLIMIT_FSIZE].rlim_cur = flim; 556 current->signal->rlim[RLIMIT_FSIZE].rlim_cur = flim;
556 set_fs(fs); 557 set_fs(fs);
558 file_end_write(file);
557out: 559out:
558 revert_creds(orig_cred); 560 revert_creds(orig_cred);
559} 561}
diff --git a/mm/filemap_xip.c b/mm/filemap_xip.c
index a912da6ddfd4..28fe26b64f8a 100644
--- a/mm/filemap_xip.c
+++ b/mm/filemap_xip.c
@@ -404,8 +404,6 @@ xip_file_write(struct file *filp, const char __user *buf, size_t len,
404 loff_t pos; 404 loff_t pos;
405 ssize_t ret; 405 ssize_t ret;
406 406
407 sb_start_write(inode->i_sb);
408
409 mutex_lock(&inode->i_mutex); 407 mutex_lock(&inode->i_mutex);
410 408
411 if (!access_ok(VERIFY_READ, buf, len)) { 409 if (!access_ok(VERIFY_READ, buf, len)) {
@@ -439,7 +437,6 @@ xip_file_write(struct file *filp, const char __user *buf, size_t len,
439 current->backing_dev_info = NULL; 437 current->backing_dev_info = NULL;
440 out_up: 438 out_up:
441 mutex_unlock(&inode->i_mutex); 439 mutex_unlock(&inode->i_mutex);
442 sb_end_write(inode->i_sb);
443 return ret; 440 return ret;
444} 441}
445EXPORT_SYMBOL_GPL(xip_file_write); 442EXPORT_SYMBOL_GPL(xip_file_write);