diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2015-04-02 23:30:18 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2015-04-11 22:28:52 -0400 |
commit | 274a48869b26c53c641f146b312486e1693f4d61 (patch) | |
tree | 4026a157f6314e87b9a40fef3f676266be7117cc /fs/ncpfs | |
parent | 6e242a1ceeb1bcf55ffefa84d3079f711fe8a667 (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.c | 92 | ||||
-rw-r--r-- | fs/ncpfs/ncplib_kernel.c | 6 | ||||
-rw-r--r-- | fs/ncpfs/ncplib_kernel.h | 2 |
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 | ||
100 | static ssize_t | 100 | static ssize_t |
101 | ncp_file_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) | 101 | ncp_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 | ||
175 | static ssize_t | 167 | static ssize_t |
176 | ncp_file_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) | 168 | ncp_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) { | |||
277 | const struct file_operations ncp_file_operations = | 249 | const 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 | */ |
1002 | int | 1002 | int |
1003 | ncp_read_bounce(struct ncp_server *server, const char *file_id, | 1003 | ncp_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 | }; |
55 | int ncp_read_bounce(struct ncp_server *, const char *, __u32, __u16, | 55 | int 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); |
57 | int ncp_read_kernel(struct ncp_server *, const char *, __u32, __u16, | 57 | int ncp_read_kernel(struct ncp_server *, const char *, __u32, __u16, |
58 | char *, int *); | 58 | char *, int *); |
59 | int ncp_write_kernel(struct ncp_server *, const char *, __u32, __u16, | 59 | int ncp_write_kernel(struct ncp_server *, const char *, __u32, __u16, |