lift sb_start_write() out of ->write()

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Al Viro 2013-03-20 13:04:20 -04:00
parent 72ec35163f
commit 03d95eb2f2
8 changed files with 26 additions and 13 deletions

View file

@ -230,9 +230,11 @@ static int __do_lo_send_write(struct file *file,
ssize_t bw; ssize_t bw;
mm_segment_t old_fs = get_fs(); mm_segment_t old_fs = get_fs();
file_start_write(file);
set_fs(get_ds()); set_fs(get_ds());
bw = file->f_op->write(file, buf, len, &pos); bw = file->f_op->write(file, buf, len, &pos);
set_fs(old_fs); set_fs(old_fs);
file_end_write(file);
if (likely(bw == len)) if (likely(bw == len))
return 0; return 0;
printk(KERN_ERR "loop: Write error at byte offset %llu, length %i.\n", printk(KERN_ERR "loop: Write error at byte offset %llu, length %i.\n",

View file

@ -962,12 +962,14 @@ int cachefiles_write_page(struct fscache_storage *op, struct page *page)
} }
data = kmap(page); data = kmap(page);
file_start_write(file);
old_fs = get_fs(); old_fs = get_fs();
set_fs(KERNEL_DS); set_fs(KERNEL_DS);
ret = file->f_op->write( ret = file->f_op->write(
file, (const void __user *) data, len, &pos); file, (const void __user *) data, len, &pos);
set_fs(old_fs); set_fs(old_fs);
kunmap(page); kunmap(page);
file_end_write(file);
if (ret != len) if (ret != len)
ret = -EIO; ret = -EIO;
} }

View file

@ -79,6 +79,7 @@ coda_file_write(struct file *coda_file, const char __user *buf, size_t count, lo
return -EINVAL; return -EINVAL;
host_inode = file_inode(host_file); host_inode = file_inode(host_file);
file_start_write(host_file);
mutex_lock(&coda_inode->i_mutex); mutex_lock(&coda_inode->i_mutex);
ret = host_file->f_op->write(host_file, buf, count, ppos); 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
coda_inode->i_blocks = (coda_inode->i_size + 511) >> 9; coda_inode->i_blocks = (coda_inode->i_size + 511) >> 9;
coda_inode->i_mtime = coda_inode->i_ctime = CURRENT_TIME_SEC; coda_inode->i_mtime = coda_inode->i_ctime = CURRENT_TIME_SEC;
mutex_unlock(&coda_inode->i_mutex); mutex_unlock(&coda_inode->i_mutex);
file_end_write(host_file);
return ret; return ret;
} }

View file

@ -629,9 +629,11 @@ void do_coredump(siginfo_t *siginfo)
goto close_fail; goto close_fail;
if (displaced) if (displaced)
put_files_struct(displaced); put_files_struct(displaced);
file_start_write(cprm.file);
retval = binfmt->core_dump(&cprm); retval = binfmt->core_dump(&cprm);
if (retval) if (retval)
current->signal->group_exit_code |= 0x80; current->signal->group_exit_code |= 0x80;
file_end_write(cprm.file);
if (ispipe && core_pipe_limit) if (ispipe && core_pipe_limit)
wait_for_dump_helpers(cprm.file); wait_for_dump_helpers(cprm.file);

View file

@ -398,7 +398,6 @@ ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len, lof
struct kiocb kiocb; struct kiocb kiocb;
ssize_t ret; ssize_t ret;
file_start_write(filp);
init_sync_kiocb(&kiocb, filp); init_sync_kiocb(&kiocb, filp);
kiocb.ki_pos = *ppos; kiocb.ki_pos = *ppos;
kiocb.ki_left = len; kiocb.ki_left = len;
@ -414,7 +413,6 @@ ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len, lof
if (-EIOCBQUEUED == ret) if (-EIOCBQUEUED == ret)
ret = wait_on_sync_kiocb(&kiocb); ret = wait_on_sync_kiocb(&kiocb);
*ppos = kiocb.ki_pos; *ppos = kiocb.ki_pos;
file_end_write(filp);
return ret; return ret;
} }
@ -458,6 +456,7 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_
ret = rw_verify_area(WRITE, file, pos, count); ret = rw_verify_area(WRITE, file, pos, count);
if (ret >= 0) { if (ret >= 0) {
count = ret; count = ret;
file_start_write(file);
if (file->f_op->write) if (file->f_op->write)
ret = file->f_op->write(file, buf, count, pos); ret = file->f_op->write(file, buf, count, pos);
else else
@ -467,6 +466,7 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_
add_wchar(current, ret); add_wchar(current, ret);
} }
inc_syscw(current); inc_syscw(current);
file_end_write(file);
} }
return ret; return ret;
@ -758,16 +758,18 @@ static ssize_t do_readv_writev(int type, struct file *file,
} else { } else {
fn = (io_fn_t)file->f_op->write; fn = (io_fn_t)file->f_op->write;
fnv = file->f_op->aio_write; fnv = file->f_op->aio_write;
file_start_write(file);
} }
if (fnv) { if (fnv)
file_start_write(file);
ret = do_sync_readv_writev(file, iov, nr_segs, tot_len, ret = do_sync_readv_writev(file, iov, nr_segs, tot_len,
pos, fnv); pos, fnv);
file_end_write(file); else
} else
ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn); ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn);
if (type != READ)
file_end_write(file);
out: out:
if (iov != iovstack) if (iov != iovstack)
kfree(iov); kfree(iov);
@ -936,16 +938,18 @@ static ssize_t compat_do_readv_writev(int type, struct file *file,
} else { } else {
fn = (io_fn_t)file->f_op->write; fn = (io_fn_t)file->f_op->write;
fnv = file->f_op->aio_write; fnv = file->f_op->aio_write;
file_start_write(file);
} }
if (fnv) { if (fnv)
file_start_write(file);
ret = do_sync_readv_writev(file, iov, nr_segs, tot_len, ret = do_sync_readv_writev(file, iov, nr_segs, tot_len,
pos, fnv); pos, fnv);
file_end_write(file); else
} else
ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn); ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn);
if (type != READ)
file_end_write(file);
out: out:
if (iov != iovstack) if (iov != iovstack)
kfree(iov); kfree(iov);

View file

@ -1052,7 +1052,9 @@ static int write_pipe_buf(struct pipe_inode_info *pipe, struct pipe_buffer *buf,
loff_t tmp = sd->pos; loff_t tmp = sd->pos;
data = buf->ops->map(pipe, buf, 0); data = buf->ops->map(pipe, buf, 0);
file_start_write(sd->u.file);
ret = __kernel_write(sd->u.file, data + buf->offset, sd->len, &tmp); ret = __kernel_write(sd->u.file, data + buf->offset, sd->len, &tmp);
file_end_write(sd->u.file);
buf->ops->unmap(pipe, buf, data); buf->ops->unmap(pipe, buf, data);
return ret; return ret;

View file

@ -543,6 +543,7 @@ static void do_acct_process(struct bsd_acct_struct *acct,
* Kernel segment override to datasegment and write it * Kernel segment override to datasegment and write it
* to the accounting file. * to the accounting file.
*/ */
file_start_write(file);
fs = get_fs(); fs = get_fs();
set_fs(KERNEL_DS); set_fs(KERNEL_DS);
/* /*
@ -554,6 +555,7 @@ static void do_acct_process(struct bsd_acct_struct *acct,
sizeof(acct_t), &file->f_pos); sizeof(acct_t), &file->f_pos);
current->signal->rlim[RLIMIT_FSIZE].rlim_cur = flim; current->signal->rlim[RLIMIT_FSIZE].rlim_cur = flim;
set_fs(fs); set_fs(fs);
file_end_write(file);
out: out:
revert_creds(orig_cred); revert_creds(orig_cred);
} }

View file

@ -404,8 +404,6 @@ xip_file_write(struct file *filp, const char __user *buf, size_t len,
loff_t pos; loff_t pos;
ssize_t ret; ssize_t ret;
sb_start_write(inode->i_sb);
mutex_lock(&inode->i_mutex); mutex_lock(&inode->i_mutex);
if (!access_ok(VERIFY_READ, buf, len)) { if (!access_ok(VERIFY_READ, buf, len)) {
@ -439,7 +437,6 @@ xip_file_write(struct file *filp, const char __user *buf, size_t len,
current->backing_dev_info = NULL; current->backing_dev_info = NULL;
out_up: out_up:
mutex_unlock(&inode->i_mutex); mutex_unlock(&inode->i_mutex);
sb_end_write(inode->i_sb);
return ret; return ret;
} }
EXPORT_SYMBOL_GPL(xip_file_write); EXPORT_SYMBOL_GPL(xip_file_write);