diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2013-03-20 18:04:20 +0100 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2013-04-09 20:12:56 +0200 |
commit | 03d95eb2f2578083a3f6286262e1cb5d88a00c02 (patch) | |
tree | a82585b55080628e0ba0028dfb100886bf5b4099 /fs | |
parent | switch compat readv/writev variants to COMPAT_SYSCALL_DEFINE (diff) | |
download | linux-03d95eb2f2578083a3f6286262e1cb5d88a00c02.tar.xz linux-03d95eb2f2578083a3f6286262e1cb5d88a00c02.zip |
lift sb_start_write() out of ->write()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/cachefiles/rdwr.c | 2 | ||||
-rw-r--r-- | fs/coda/file.c | 2 | ||||
-rw-r--r-- | fs/coredump.c | 2 | ||||
-rw-r--r-- | fs/read_write.c | 24 | ||||
-rw-r--r-- | fs/splice.c | 2 |
5 files changed, 22 insertions, 10 deletions
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) } data = kmap(page); + file_start_write(file); old_fs = get_fs(); set_fs(KERNEL_DS); ret = file->f_op->write( file, (const void __user *) data, len, &pos); set_fs(old_fs); kunmap(page); + file_end_write(file); if (ret != len) ret = -EIO; } 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 return -EINVAL; host_inode = file_inode(host_file); + file_start_write(host_file); mutex_lock(&coda_inode->i_mutex); 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_mtime = coda_inode->i_ctime = CURRENT_TIME_SEC; mutex_unlock(&coda_inode->i_mutex); + file_end_write(host_file); return ret; } 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) goto close_fail; if (displaced) put_files_struct(displaced); + file_start_write(cprm.file); retval = binfmt->core_dump(&cprm); if (retval) current->signal->group_exit_code |= 0x80; + file_end_write(cprm.file); if (ispipe && core_pipe_limit) 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 struct kiocb kiocb; ssize_t ret; - file_start_write(filp); init_sync_kiocb(&kiocb, filp); kiocb.ki_pos = *ppos; 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) ret = wait_on_sync_kiocb(&kiocb); *ppos = kiocb.ki_pos; - file_end_write(filp); 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); if (ret >= 0) { count = ret; + file_start_write(file); if (file->f_op->write) ret = file->f_op->write(file, buf, count, pos); else @@ -467,6 +466,7 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_ add_wchar(current, ret); } inc_syscw(current); + file_end_write(file); } return ret; @@ -758,16 +758,18 @@ static ssize_t do_readv_writev(int type, struct file *file, } else { fn = (io_fn_t)file->f_op->write; fnv = file->f_op->aio_write; + file_start_write(file); } - if (fnv) { - file_start_write(file); + if (fnv) ret = do_sync_readv_writev(file, iov, nr_segs, tot_len, pos, fnv); - file_end_write(file); - } else + else ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn); + if (type != READ) + file_end_write(file); + out: if (iov != iovstack) kfree(iov); @@ -936,16 +938,18 @@ static ssize_t compat_do_readv_writev(int type, struct file *file, } else { fn = (io_fn_t)file->f_op->write; fnv = file->f_op->aio_write; + file_start_write(file); } - if (fnv) { - file_start_write(file); + if (fnv) ret = do_sync_readv_writev(file, iov, nr_segs, tot_len, pos, fnv); - file_end_write(file); - } else + else ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn); + if (type != READ) + file_end_write(file); + out: if (iov != iovstack) 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, loff_t tmp = sd->pos; 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); + file_end_write(sd->u.file); buf->ops->unmap(pipe, buf, data); return ret; |