diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2012-08-28 12:52:22 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-09-26 22:20:08 -0400 |
commit | 2903ff019b346ab8d36ebbf54853c3aaf6590608 (patch) | |
tree | 962d94054765bb37bc00e977c3036e65c5fd91fe /fs/readdir.c | |
parent | a5b470ba06aa3f96999ede5feba178df6bdb134a (diff) |
switch simple cases of fget_light to fdget
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/readdir.c')
-rw-r--r-- | fs/readdir.c | 36 |
1 files changed, 16 insertions, 20 deletions
diff --git a/fs/readdir.c b/fs/readdir.c index 39e3370d79cf..5e69ef533b77 100644 --- a/fs/readdir.c +++ b/fs/readdir.c | |||
@@ -106,22 +106,20 @@ SYSCALL_DEFINE3(old_readdir, unsigned int, fd, | |||
106 | struct old_linux_dirent __user *, dirent, unsigned int, count) | 106 | struct old_linux_dirent __user *, dirent, unsigned int, count) |
107 | { | 107 | { |
108 | int error; | 108 | int error; |
109 | struct file * file; | 109 | struct fd f = fdget(fd); |
110 | struct readdir_callback buf; | 110 | struct readdir_callback buf; |
111 | int fput_needed; | ||
112 | 111 | ||
113 | file = fget_light(fd, &fput_needed); | 112 | if (!f.file) |
114 | if (!file) | ||
115 | return -EBADF; | 113 | return -EBADF; |
116 | 114 | ||
117 | buf.result = 0; | 115 | buf.result = 0; |
118 | buf.dirent = dirent; | 116 | buf.dirent = dirent; |
119 | 117 | ||
120 | error = vfs_readdir(file, fillonedir, &buf); | 118 | error = vfs_readdir(f.file, fillonedir, &buf); |
121 | if (buf.result) | 119 | if (buf.result) |
122 | error = buf.result; | 120 | error = buf.result; |
123 | 121 | ||
124 | fput_light(file, fput_needed); | 122 | fdput(f); |
125 | return error; | 123 | return error; |
126 | } | 124 | } |
127 | 125 | ||
@@ -191,17 +189,16 @@ efault: | |||
191 | SYSCALL_DEFINE3(getdents, unsigned int, fd, | 189 | SYSCALL_DEFINE3(getdents, unsigned int, fd, |
192 | struct linux_dirent __user *, dirent, unsigned int, count) | 190 | struct linux_dirent __user *, dirent, unsigned int, count) |
193 | { | 191 | { |
194 | struct file * file; | 192 | struct fd f; |
195 | struct linux_dirent __user * lastdirent; | 193 | struct linux_dirent __user * lastdirent; |
196 | struct getdents_callback buf; | 194 | struct getdents_callback buf; |
197 | int fput_needed; | ||
198 | int error; | 195 | int error; |
199 | 196 | ||
200 | if (!access_ok(VERIFY_WRITE, dirent, count)) | 197 | if (!access_ok(VERIFY_WRITE, dirent, count)) |
201 | return -EFAULT; | 198 | return -EFAULT; |
202 | 199 | ||
203 | file = fget_light(fd, &fput_needed); | 200 | f = fdget(fd); |
204 | if (!file) | 201 | if (!f.file) |
205 | return -EBADF; | 202 | return -EBADF; |
206 | 203 | ||
207 | buf.current_dir = dirent; | 204 | buf.current_dir = dirent; |
@@ -209,17 +206,17 @@ SYSCALL_DEFINE3(getdents, unsigned int, fd, | |||
209 | buf.count = count; | 206 | buf.count = count; |
210 | buf.error = 0; | 207 | buf.error = 0; |
211 | 208 | ||
212 | error = vfs_readdir(file, filldir, &buf); | 209 | error = vfs_readdir(f.file, filldir, &buf); |
213 | if (error >= 0) | 210 | if (error >= 0) |
214 | error = buf.error; | 211 | error = buf.error; |
215 | lastdirent = buf.previous; | 212 | lastdirent = buf.previous; |
216 | if (lastdirent) { | 213 | if (lastdirent) { |
217 | if (put_user(file->f_pos, &lastdirent->d_off)) | 214 | if (put_user(f.file->f_pos, &lastdirent->d_off)) |
218 | error = -EFAULT; | 215 | error = -EFAULT; |
219 | else | 216 | else |
220 | error = count - buf.count; | 217 | error = count - buf.count; |
221 | } | 218 | } |
222 | fput_light(file, fput_needed); | 219 | fdput(f); |
223 | return error; | 220 | return error; |
224 | } | 221 | } |
225 | 222 | ||
@@ -272,17 +269,16 @@ efault: | |||
272 | SYSCALL_DEFINE3(getdents64, unsigned int, fd, | 269 | SYSCALL_DEFINE3(getdents64, unsigned int, fd, |
273 | struct linux_dirent64 __user *, dirent, unsigned int, count) | 270 | struct linux_dirent64 __user *, dirent, unsigned int, count) |
274 | { | 271 | { |
275 | struct file * file; | 272 | struct fd f; |
276 | struct linux_dirent64 __user * lastdirent; | 273 | struct linux_dirent64 __user * lastdirent; |
277 | struct getdents_callback64 buf; | 274 | struct getdents_callback64 buf; |
278 | int fput_needed; | ||
279 | int error; | 275 | int error; |
280 | 276 | ||
281 | if (!access_ok(VERIFY_WRITE, dirent, count)) | 277 | if (!access_ok(VERIFY_WRITE, dirent, count)) |
282 | return -EFAULT; | 278 | return -EFAULT; |
283 | 279 | ||
284 | file = fget_light(fd, &fput_needed); | 280 | f = fdget(fd); |
285 | if (!file) | 281 | if (!f.file) |
286 | return -EBADF; | 282 | return -EBADF; |
287 | 283 | ||
288 | buf.current_dir = dirent; | 284 | buf.current_dir = dirent; |
@@ -290,17 +286,17 @@ SYSCALL_DEFINE3(getdents64, unsigned int, fd, | |||
290 | buf.count = count; | 286 | buf.count = count; |
291 | buf.error = 0; | 287 | buf.error = 0; |
292 | 288 | ||
293 | error = vfs_readdir(file, filldir64, &buf); | 289 | error = vfs_readdir(f.file, filldir64, &buf); |
294 | if (error >= 0) | 290 | if (error >= 0) |
295 | error = buf.error; | 291 | error = buf.error; |
296 | lastdirent = buf.previous; | 292 | lastdirent = buf.previous; |
297 | if (lastdirent) { | 293 | if (lastdirent) { |
298 | typeof(lastdirent->d_off) d_off = file->f_pos; | 294 | typeof(lastdirent->d_off) d_off = f.file->f_pos; |
299 | if (__put_user(d_off, &lastdirent->d_off)) | 295 | if (__put_user(d_off, &lastdirent->d_off)) |
300 | error = -EFAULT; | 296 | error = -EFAULT; |
301 | else | 297 | else |
302 | error = count - buf.count; | 298 | error = count - buf.count; |
303 | } | 299 | } |
304 | fput_light(file, fput_needed); | 300 | fdput(f); |
305 | return error; | 301 | return error; |
306 | } | 302 | } |