aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ncpfs
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2015-04-02 23:30:18 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2015-04-11 22:28:52 -0400
commit274a48869b26c53c641f146b312486e1693f4d61 (patch)
tree4026a157f6314e87b9a40fef3f676266be7117cc /fs/ncpfs
parent6e242a1ceeb1bcf55ffefa84d3079f711fe8a667 (diff)
ncpfs: switch to ->read_iter/->write_iter
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/ncpfs')
-rw-r--r--fs/ncpfs/file.c92
-rw-r--r--fs/ncpfs/ncplib_kernel.c6
-rw-r--r--fs/ncpfs/ncplib_kernel.h2
3 files changed, 37 insertions, 63 deletions
diff --git a/fs/ncpfs/file.c b/fs/ncpfs/file.c
index 1dd7007f974d..5f9d5624e377 100644
--- a/fs/ncpfs/file.c
+++ b/fs/ncpfs/file.c
@@ -98,30 +98,24 @@ out:
98} 98}
99 99
100static ssize_t 100static ssize_t
101ncp_file_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) 101ncp_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
102{ 102{
103 struct file *file = iocb->ki_filp;
103 struct inode *inode = file_inode(file); 104 struct inode *inode = file_inode(file);
104 size_t already_read = 0; 105 size_t already_read = 0;
105 off_t pos; 106 off_t pos = iocb->ki_pos;
106 size_t bufsize; 107 size_t bufsize;
107 int error; 108 int error;
108 void* freepage; 109 void *freepage;
109 size_t freelen; 110 size_t freelen;
110 111
111 ncp_dbg(1, "enter %pD2\n", file); 112 ncp_dbg(1, "enter %pD2\n", file);
112 113
113 pos = *ppos; 114 if (!iov_iter_count(to))
114
115 if ((ssize_t) count < 0) {
116 return -EINVAL;
117 }
118 if (!count)
119 return 0; 115 return 0;
120 if (pos > inode->i_sb->s_maxbytes) 116 if (pos > inode->i_sb->s_maxbytes)
121 return 0; 117 return 0;
122 if (pos + count > inode->i_sb->s_maxbytes) { 118 iov_iter_truncate(to, inode->i_sb->s_maxbytes - pos);
123 count = inode->i_sb->s_maxbytes - pos;
124 }
125 119
126 error = ncp_make_open(inode, O_RDONLY); 120 error = ncp_make_open(inode, O_RDONLY);
127 if (error) { 121 if (error) {
@@ -138,31 +132,29 @@ ncp_file_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
138 goto outrel; 132 goto outrel;
139 error = 0; 133 error = 0;
140 /* First read in as much as possible for each bufsize. */ 134 /* First read in as much as possible for each bufsize. */
141 while (already_read < count) { 135 while (iov_iter_count(to)) {
142 int read_this_time; 136 int read_this_time;
143 size_t to_read = min_t(unsigned int, 137 size_t to_read = min_t(size_t,
144 bufsize - (pos % bufsize), 138 bufsize - (pos % bufsize),
145 count - already_read); 139 iov_iter_count(to));
146 140
147 error = ncp_read_bounce(NCP_SERVER(inode), 141 error = ncp_read_bounce(NCP_SERVER(inode),
148 NCP_FINFO(inode)->file_handle, 142 NCP_FINFO(inode)->file_handle,
149 pos, to_read, buf, &read_this_time, 143 pos, to_read, to, &read_this_time,
150 freepage, freelen); 144 freepage, freelen);
151 if (error) { 145 if (error) {
152 error = -EIO; /* NW errno -> Linux errno */ 146 error = -EIO; /* NW errno -> Linux errno */
153 break; 147 break;
154 } 148 }
155 pos += read_this_time; 149 pos += read_this_time;
156 buf += read_this_time;
157 already_read += read_this_time; 150 already_read += read_this_time;
158 151
159 if (read_this_time != to_read) { 152 if (read_this_time != to_read)
160 break; 153 break;
161 }
162 } 154 }
163 vfree(freepage); 155 vfree(freepage);
164 156
165 *ppos = pos; 157 iocb->ki_pos = pos;
166 158
167 file_accessed(file); 159 file_accessed(file);
168 160
@@ -173,42 +165,26 @@ outrel:
173} 165}
174 166
175static ssize_t 167static ssize_t
176ncp_file_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) 168ncp_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
177{ 169{
170 struct file *file = iocb->ki_filp;
178 struct inode *inode = file_inode(file); 171 struct inode *inode = file_inode(file);
179 size_t already_written = 0; 172 size_t already_written = 0;
180 off_t pos; 173 loff_t pos = iocb->ki_pos;
174 size_t count = iov_iter_count(from);
181 size_t bufsize; 175 size_t bufsize;
182 int errno; 176 int errno;
183 void* bouncebuffer; 177 void *bouncebuffer;
184 178
185 ncp_dbg(1, "enter %pD2\n", file); 179 ncp_dbg(1, "enter %pD2\n", file);
186 if ((ssize_t) count < 0) 180 errno = generic_write_checks(file, &pos, &count, 0);
187 return -EINVAL; 181 if (errno)
188 pos = *ppos; 182 return errno;
189 if (file->f_flags & O_APPEND) { 183 iov_iter_truncate(from, count);
190 pos = i_size_read(inode);
191 }
192
193 if (pos + count > MAX_NON_LFS && !(file->f_flags&O_LARGEFILE)) {
194 if (pos >= MAX_NON_LFS) {
195 return -EFBIG;
196 }
197 if (count > MAX_NON_LFS - (u32)pos) {
198 count = MAX_NON_LFS - (u32)pos;
199 }
200 }
201 if (pos >= inode->i_sb->s_maxbytes) {
202 if (count || pos > inode->i_sb->s_maxbytes) {
203 return -EFBIG;
204 }
205 }
206 if (pos + count > inode->i_sb->s_maxbytes) {
207 count = inode->i_sb->s_maxbytes - pos;
208 }
209 184
210 if (!count) 185 if (!count)
211 return 0; 186 return 0;
187
212 errno = ncp_make_open(inode, O_WRONLY); 188 errno = ncp_make_open(inode, O_WRONLY);
213 if (errno) { 189 if (errno) {
214 ncp_dbg(1, "open failed, error=%d\n", errno); 190 ncp_dbg(1, "open failed, error=%d\n", errno);
@@ -216,8 +192,6 @@ ncp_file_write(struct file *file, const char __user *buf, size_t count, loff_t *
216 } 192 }
217 bufsize = NCP_SERVER(inode)->buffer_size; 193 bufsize = NCP_SERVER(inode)->buffer_size;
218 194
219 already_written = 0;
220
221 errno = file_update_time(file); 195 errno = file_update_time(file);
222 if (errno) 196 if (errno)
223 goto outrel; 197 goto outrel;
@@ -227,13 +201,13 @@ ncp_file_write(struct file *file, const char __user *buf, size_t count, loff_t *
227 errno = -EIO; /* -ENOMEM */ 201 errno = -EIO; /* -ENOMEM */
228 goto outrel; 202 goto outrel;
229 } 203 }
230 while (already_written < count) { 204 while (iov_iter_count(from)) {
231 int written_this_time; 205 int written_this_time;
232 size_t to_write = min_t(unsigned int, 206 size_t to_write = min_t(size_t,
233 bufsize - (pos % bufsize), 207 bufsize - ((off_t)pos % bufsize),
234 count - already_written); 208 iov_iter_count(from));
235 209
236 if (copy_from_user(bouncebuffer, buf, to_write)) { 210 if (copy_from_iter(bouncebuffer, to_write, from) != to_write) {
237 errno = -EFAULT; 211 errno = -EFAULT;
238 break; 212 break;
239 } 213 }
@@ -244,16 +218,14 @@ ncp_file_write(struct file *file, const char __user *buf, size_t count, loff_t *
244 break; 218 break;
245 } 219 }
246 pos += written_this_time; 220 pos += written_this_time;
247 buf += written_this_time;
248 already_written += written_this_time; 221 already_written += written_this_time;
249 222
250 if (written_this_time != to_write) { 223 if (written_this_time != to_write)
251 break; 224 break;
252 }
253 } 225 }
254 vfree(bouncebuffer); 226 vfree(bouncebuffer);
255 227
256 *ppos = pos; 228 iocb->ki_pos = pos;
257 229
258 if (pos > i_size_read(inode)) { 230 if (pos > i_size_read(inode)) {
259 mutex_lock(&inode->i_mutex); 231 mutex_lock(&inode->i_mutex);
@@ -277,8 +249,10 @@ static int ncp_release(struct inode *inode, struct file *file) {
277const struct file_operations ncp_file_operations = 249const struct file_operations ncp_file_operations =
278{ 250{
279 .llseek = generic_file_llseek, 251 .llseek = generic_file_llseek,
280 .read = ncp_file_read, 252 .read = new_sync_read,
281 .write = ncp_file_write, 253 .write = new_sync_write,
254 .read_iter = ncp_file_read_iter,
255 .write_iter = ncp_file_write_iter,
282 .unlocked_ioctl = ncp_ioctl, 256 .unlocked_ioctl = ncp_ioctl,
283#ifdef CONFIG_COMPAT 257#ifdef CONFIG_COMPAT
284 .compat_ioctl = ncp_compat_ioctl, 258 .compat_ioctl = ncp_compat_ioctl,
diff --git a/fs/ncpfs/ncplib_kernel.c b/fs/ncpfs/ncplib_kernel.c
index 482387532f54..2b502a0d7941 100644
--- a/fs/ncpfs/ncplib_kernel.c
+++ b/fs/ncpfs/ncplib_kernel.c
@@ -1001,8 +1001,8 @@ out:
1001 */ 1001 */
1002int 1002int
1003ncp_read_bounce(struct ncp_server *server, const char *file_id, 1003ncp_read_bounce(struct ncp_server *server, const char *file_id,
1004 __u32 offset, __u16 to_read, char __user *target, int *bytes_read, 1004 __u32 offset, __u16 to_read, struct iov_iter *to,
1005 void* bounce, __u32 bufsize) 1005 int *bytes_read, void *bounce, __u32 bufsize)
1006{ 1006{
1007 int result; 1007 int result;
1008 1008
@@ -1025,7 +1025,7 @@ ncp_read_bounce(struct ncp_server *server, const char *file_id,
1025 (offset & 1); 1025 (offset & 1);
1026 *bytes_read = len; 1026 *bytes_read = len;
1027 result = 0; 1027 result = 0;
1028 if (copy_to_user(target, source, len)) 1028 if (copy_to_iter(source, len, to) != len)
1029 result = -EFAULT; 1029 result = -EFAULT;
1030 } 1030 }
1031 } 1031 }
diff --git a/fs/ncpfs/ncplib_kernel.h b/fs/ncpfs/ncplib_kernel.h
index 250e443a07f3..5233fbc1747a 100644
--- a/fs/ncpfs/ncplib_kernel.h
+++ b/fs/ncpfs/ncplib_kernel.h
@@ -53,7 +53,7 @@ static inline int ncp_read_bounce_size(__u32 size) {
53 return sizeof(struct ncp_reply_header) + 2 + 2 + size + 8; 53 return sizeof(struct ncp_reply_header) + 2 + 2 + size + 8;
54}; 54};
55int ncp_read_bounce(struct ncp_server *, const char *, __u32, __u16, 55int ncp_read_bounce(struct ncp_server *, const char *, __u32, __u16,
56 char __user *, int *, void* bounce, __u32 bouncelen); 56 struct iov_iter *, int *, void *bounce, __u32 bouncelen);
57int ncp_read_kernel(struct ncp_server *, const char *, __u32, __u16, 57int ncp_read_kernel(struct ncp_server *, const char *, __u32, __u16,
58 char *, int *); 58 char *, int *);
59int ncp_write_kernel(struct ncp_server *, const char *, __u32, __u16, 59int ncp_write_kernel(struct ncp_server *, const char *, __u32, __u16,