diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2012-04-21 18:42:19 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-05-29 23:28:30 -0400 |
commit | 545ec2c7945bf7d22d0779e7dc9bf16f7dd9ae34 (patch) | |
tree | 3f9b528d8e5ed427e5a811c1e99d5b0768e2ef33 /fs/fcntl.c | |
parent | 7449af1e8b795abf4ef829ac507861f34dca30b4 (diff) |
switch fcntl to fget_raw_light/fput_light
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/fcntl.c')
-rw-r--r-- | fs/fcntl.c | 42 |
1 files changed, 17 insertions, 25 deletions
diff --git a/fs/fcntl.c b/fs/fcntl.c index d078b75572a7..81b70e665bf0 100644 --- a/fs/fcntl.c +++ b/fs/fcntl.c | |||
@@ -442,28 +442,24 @@ static int check_fcntl_cmd(unsigned cmd) | |||
442 | SYSCALL_DEFINE3(fcntl, unsigned int, fd, unsigned int, cmd, unsigned long, arg) | 442 | SYSCALL_DEFINE3(fcntl, unsigned int, fd, unsigned int, cmd, unsigned long, arg) |
443 | { | 443 | { |
444 | struct file *filp; | 444 | struct file *filp; |
445 | int fput_needed; | ||
445 | long err = -EBADF; | 446 | long err = -EBADF; |
446 | 447 | ||
447 | filp = fget_raw(fd); | 448 | filp = fget_raw_light(fd, &fput_needed); |
448 | if (!filp) | 449 | if (!filp) |
449 | goto out; | 450 | goto out; |
450 | 451 | ||
451 | if (unlikely(filp->f_mode & FMODE_PATH)) { | 452 | if (unlikely(filp->f_mode & FMODE_PATH)) { |
452 | if (!check_fcntl_cmd(cmd)) { | 453 | if (!check_fcntl_cmd(cmd)) |
453 | fput(filp); | 454 | goto out1; |
454 | goto out; | ||
455 | } | ||
456 | } | 455 | } |
457 | 456 | ||
458 | err = security_file_fcntl(filp, cmd, arg); | 457 | err = security_file_fcntl(filp, cmd, arg); |
459 | if (err) { | 458 | if (!err) |
460 | fput(filp); | 459 | err = do_fcntl(fd, cmd, arg, filp); |
461 | return err; | ||
462 | } | ||
463 | 460 | ||
464 | err = do_fcntl(fd, cmd, arg, filp); | 461 | out1: |
465 | 462 | fput_light(filp, fput_needed); | |
466 | fput(filp); | ||
467 | out: | 463 | out: |
468 | return err; | 464 | return err; |
469 | } | 465 | } |
@@ -473,26 +469,21 @@ SYSCALL_DEFINE3(fcntl64, unsigned int, fd, unsigned int, cmd, | |||
473 | unsigned long, arg) | 469 | unsigned long, arg) |
474 | { | 470 | { |
475 | struct file * filp; | 471 | struct file * filp; |
476 | long err; | 472 | long err = -EBADF; |
473 | int fput_needed; | ||
477 | 474 | ||
478 | err = -EBADF; | 475 | filp = fget_raw_light(fd, &fput_needed); |
479 | filp = fget_raw(fd); | ||
480 | if (!filp) | 476 | if (!filp) |
481 | goto out; | 477 | goto out; |
482 | 478 | ||
483 | if (unlikely(filp->f_mode & FMODE_PATH)) { | 479 | if (unlikely(filp->f_mode & FMODE_PATH)) { |
484 | if (!check_fcntl_cmd(cmd)) { | 480 | if (!check_fcntl_cmd(cmd)) |
485 | fput(filp); | 481 | goto out1; |
486 | goto out; | ||
487 | } | ||
488 | } | 482 | } |
489 | 483 | ||
490 | err = security_file_fcntl(filp, cmd, arg); | 484 | err = security_file_fcntl(filp, cmd, arg); |
491 | if (err) { | 485 | if (err) |
492 | fput(filp); | 486 | goto out1; |
493 | return err; | ||
494 | } | ||
495 | err = -EBADF; | ||
496 | 487 | ||
497 | switch (cmd) { | 488 | switch (cmd) { |
498 | case F_GETLK64: | 489 | case F_GETLK64: |
@@ -507,7 +498,8 @@ SYSCALL_DEFINE3(fcntl64, unsigned int, fd, unsigned int, cmd, | |||
507 | err = do_fcntl(fd, cmd, arg, filp); | 498 | err = do_fcntl(fd, cmd, arg, filp); |
508 | break; | 499 | break; |
509 | } | 500 | } |
510 | fput(filp); | 501 | out1: |
502 | fput_light(filp, fput_needed); | ||
511 | out: | 503 | out: |
512 | return err; | 504 | return err; |
513 | } | 505 | } |