aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2015-04-07 11:28:12 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2015-04-11 22:29:47 -0400
commit5f380c7fa7e01f15ca0816bd241ece9a64a73192 (patch)
tree2136f54098eb85d21d17ee43f73724a5befd70a1
parent0b8def9d6dfa6b2a9a2740cf81d8d2c134688d39 (diff)
lift generic_write_checks() into callers of __generic_file_write_iter()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--fs/block_dev.c10
-rw-r--r--fs/cifs/file.c39
-rw-r--r--fs/ext4/file.c14
-rw-r--r--fs/udf/file.c10
-rw-r--r--mm/filemap.c17
5 files changed, 60 insertions, 30 deletions
diff --git a/fs/block_dev.c b/fs/block_dev.c
index 6e3de63c3055..bcd7f97beab9 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -1597,6 +1597,16 @@ ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from)
1597 struct file *file = iocb->ki_filp; 1597 struct file *file = iocb->ki_filp;
1598 struct blk_plug plug; 1598 struct blk_plug plug;
1599 ssize_t ret; 1599 ssize_t ret;
1600 size_t count = iov_iter_count(from);
1601
1602 ret = generic_write_checks(file, &iocb->ki_pos, &count, 1);
1603 if (ret)
1604 return ret;
1605
1606 if (count == 0)
1607 return 0;
1608
1609 iov_iter_truncate(from, count);
1600 1610
1601 blk_start_plug(&plug); 1611 blk_start_plug(&plug);
1602 ret = __generic_file_write_iter(iocb, from); 1612 ret = __generic_file_write_iter(iocb, from);
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index 3cb04129ddb1..3c5c9bc5cbaf 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -2673,8 +2673,8 @@ cifs_writev(struct kiocb *iocb, struct iov_iter *from)
2673 struct inode *inode = file->f_mapping->host; 2673 struct inode *inode = file->f_mapping->host;
2674 struct cifsInodeInfo *cinode = CIFS_I(inode); 2674 struct cifsInodeInfo *cinode = CIFS_I(inode);
2675 struct TCP_Server_Info *server = tlink_tcon(cfile->tlink)->ses->server; 2675 struct TCP_Server_Info *server = tlink_tcon(cfile->tlink)->ses->server;
2676 ssize_t rc = -EACCES; 2676 ssize_t rc;
2677 loff_t lock_pos = iocb->ki_pos; 2677 size_t count;
2678 2678
2679 /* 2679 /*
2680 * We need to hold the sem to be sure nobody modifies lock list 2680 * We need to hold the sem to be sure nobody modifies lock list
@@ -2682,23 +2682,30 @@ cifs_writev(struct kiocb *iocb, struct iov_iter *from)
2682 */ 2682 */
2683 down_read(&cinode->lock_sem); 2683 down_read(&cinode->lock_sem);
2684 mutex_lock(&inode->i_mutex); 2684 mutex_lock(&inode->i_mutex);
2685 if (file->f_flags & O_APPEND) 2685
2686 lock_pos = i_size_read(inode); 2686 count = iov_iter_count(from);
2687 if (!cifs_find_lock_conflict(cfile, lock_pos, iov_iter_count(from), 2687 rc = generic_write_checks(file, &iocb->ki_pos, &count, 0);
2688 if (rc)
2689 goto out;
2690
2691 if (count == 0)
2692 goto out;
2693
2694 iov_iter_truncate(from, count);
2695
2696 if (!cifs_find_lock_conflict(cfile, iocb->ki_pos, iov_iter_count(from),
2688 server->vals->exclusive_lock_type, NULL, 2697 server->vals->exclusive_lock_type, NULL,
2689 CIFS_WRITE_OP)) { 2698 CIFS_WRITE_OP))
2690 rc = __generic_file_write_iter(iocb, from); 2699 rc = __generic_file_write_iter(iocb, from);
2691 mutex_unlock(&inode->i_mutex); 2700 else
2692 2701 rc = -EACCES;
2693 if (rc > 0) { 2702out:
2694 ssize_t err; 2703 mutex_unlock(&inode->i_mutex);
2695 2704
2696 err = generic_write_sync(file, iocb->ki_pos - rc, rc); 2705 if (rc > 0) {
2697 if (err < 0) 2706 ssize_t err = generic_write_sync(file, iocb->ki_pos - rc, rc);
2698 rc = err; 2707 if (err < 0)
2699 } 2708 rc = err;
2700 } else {
2701 mutex_unlock(&inode->i_mutex);
2702 } 2709 }
2703 up_read(&cinode->lock_sem); 2710 up_read(&cinode->lock_sem);
2704 return rc; 2711 return rc;
diff --git a/fs/ext4/file.c b/fs/ext4/file.c
index 9ad03036d9f5..f7cca423dded 100644
--- a/fs/ext4/file.c
+++ b/fs/ext4/file.c
@@ -132,9 +132,8 @@ ext4_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
132 ret = -EFBIG; 132 ret = -EFBIG;
133 goto errout; 133 goto errout;
134 } 134 }
135 135 iov_iter_truncate(from, sbi->s_bitmap_maxbytes - pos);
136 if (pos + length > sbi->s_bitmap_maxbytes) 136 length = iov_iter_count(from);
137 iov_iter_truncate(from, sbi->s_bitmap_maxbytes - pos);
138 } 137 }
139 138
140 iocb->private = &overwrite; 139 iocb->private = &overwrite;
@@ -172,7 +171,16 @@ ext4_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
172 } 171 }
173 } 172 }
174 173
174 ret = generic_write_checks(file, &iocb->ki_pos, &length, 0);
175 if (ret)
176 goto out;
177
178 if (length == 0)
179 goto out;
180
181 iov_iter_truncate(from, length);
175 ret = __generic_file_write_iter(iocb, from); 182 ret = __generic_file_write_iter(iocb, from);
183out:
176 mutex_unlock(&inode->i_mutex); 184 mutex_unlock(&inode->i_mutex);
177 185
178 if (ret > 0) { 186 if (ret > 0) {
diff --git a/fs/udf/file.c b/fs/udf/file.c
index 78d42548b260..35e81ed99405 100644
--- a/fs/udf/file.c
+++ b/fs/udf/file.c
@@ -151,7 +151,17 @@ static ssize_t udf_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
151 } else 151 } else
152 up_write(&iinfo->i_data_sem); 152 up_write(&iinfo->i_data_sem);
153 153
154 retval = generic_write_checks(file, &iocb->ki_pos, &count, 0);
155 if (retval)
156 goto out;
157
158 if (count == 0)
159 goto out;
160
161 iov_iter_truncate(from, count);
162
154 retval = __generic_file_write_iter(iocb, from); 163 retval = __generic_file_write_iter(iocb, from);
164out:
155 mutex_unlock(&inode->i_mutex); 165 mutex_unlock(&inode->i_mutex);
156 166
157 if (retval > 0) { 167 if (retval > 0) {
diff --git a/mm/filemap.c b/mm/filemap.c
index 353f82e09e63..a794a7f98743 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -2560,19 +2560,9 @@ ssize_t __generic_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
2560 ssize_t written = 0; 2560 ssize_t written = 0;
2561 ssize_t err; 2561 ssize_t err;
2562 ssize_t status; 2562 ssize_t status;
2563 size_t count = iov_iter_count(from);
2564 2563
2565 /* We can write back this queue in page reclaim */ 2564 /* We can write back this queue in page reclaim */
2566 current->backing_dev_info = inode_to_bdi(inode); 2565 current->backing_dev_info = inode_to_bdi(inode);
2567 err = generic_write_checks(file, &iocb->ki_pos, &count, S_ISBLK(inode->i_mode));
2568 if (err)
2569 goto out;
2570
2571 if (count == 0)
2572 goto out;
2573
2574 iov_iter_truncate(from, count);
2575
2576 err = file_remove_suid(file); 2566 err = file_remove_suid(file);
2577 if (err) 2567 if (err)
2578 goto out; 2568 goto out;
@@ -2651,9 +2641,14 @@ ssize_t generic_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
2651 struct file *file = iocb->ki_filp; 2641 struct file *file = iocb->ki_filp;
2652 struct inode *inode = file->f_mapping->host; 2642 struct inode *inode = file->f_mapping->host;
2653 ssize_t ret; 2643 ssize_t ret;
2644 size_t count = iov_iter_count(from);
2654 2645
2655 mutex_lock(&inode->i_mutex); 2646 mutex_lock(&inode->i_mutex);
2656 ret = __generic_file_write_iter(iocb, from); 2647 ret = generic_write_checks(file, &iocb->ki_pos, &count, 0);
2648 if (!ret && count) {
2649 iov_iter_truncate(from, count);
2650 ret = __generic_file_write_iter(iocb, from);
2651 }
2657 mutex_unlock(&inode->i_mutex); 2652 mutex_unlock(&inode->i_mutex);
2658 2653
2659 if (ret > 0) { 2654 if (ret > 0) {