diff options
author | Oleg Nesterov <oleg@redhat.com> | 2014-01-13 10:48:40 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2014-01-25 03:14:37 -0500 |
commit | ad46183445043b562856c60b74db664668fb364b (patch) | |
tree | b13bcb8d44c49b42be5f885b180e620a4982bb8a /fs/file.c | |
parent | 1deb46e2562561255c34075825fd00f22a858bb3 (diff) |
fs: factor out common code in fget_light() and fget_raw_light()
Apart from FMODE_PATH check fget_light() and fget_raw_light() are
identical, shift the code into the new helper, __fget_light(fd, mask).
Saves 208 bytes.
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/file.c')
-rw-r--r-- | fs/file.c | 33 |
1 files changed, 9 insertions, 24 deletions
@@ -683,21 +683,21 @@ EXPORT_SYMBOL(fget_raw); | |||
683 | * The fput_needed flag returned by fget_light should be passed to the | 683 | * The fput_needed flag returned by fget_light should be passed to the |
684 | * corresponding fput_light. | 684 | * corresponding fput_light. |
685 | */ | 685 | */ |
686 | struct file *fget_light(unsigned int fd, int *fput_needed) | 686 | struct file *__fget_light(unsigned int fd, fmode_t mask, int *fput_needed) |
687 | { | 687 | { |
688 | struct file *file; | ||
689 | struct files_struct *files = current->files; | 688 | struct files_struct *files = current->files; |
689 | struct file *file; | ||
690 | 690 | ||
691 | *fput_needed = 0; | 691 | *fput_needed = 0; |
692 | if (atomic_read(&files->count) == 1) { | 692 | if (atomic_read(&files->count) == 1) { |
693 | file = __fcheck_files(files, fd); | 693 | file = __fcheck_files(files, fd); |
694 | if (file && (file->f_mode & FMODE_PATH)) | 694 | if (file && (file->f_mode & mask)) |
695 | file = NULL; | 695 | file = NULL; |
696 | } else { | 696 | } else { |
697 | rcu_read_lock(); | 697 | rcu_read_lock(); |
698 | file = fcheck_files(files, fd); | 698 | file = fcheck_files(files, fd); |
699 | if (file) { | 699 | if (file) { |
700 | if (!(file->f_mode & FMODE_PATH) && | 700 | if (!(file->f_mode & mask) && |
701 | atomic_long_inc_not_zero(&file->f_count)) | 701 | atomic_long_inc_not_zero(&file->f_count)) |
702 | *fput_needed = 1; | 702 | *fput_needed = 1; |
703 | else | 703 | else |
@@ -709,30 +709,15 @@ struct file *fget_light(unsigned int fd, int *fput_needed) | |||
709 | 709 | ||
710 | return file; | 710 | return file; |
711 | } | 711 | } |
712 | struct file *fget_light(unsigned int fd, int *fput_needed) | ||
713 | { | ||
714 | return __fget_light(fd, FMODE_PATH, fput_needed); | ||
715 | } | ||
712 | EXPORT_SYMBOL(fget_light); | 716 | EXPORT_SYMBOL(fget_light); |
713 | 717 | ||
714 | struct file *fget_raw_light(unsigned int fd, int *fput_needed) | 718 | struct file *fget_raw_light(unsigned int fd, int *fput_needed) |
715 | { | 719 | { |
716 | struct file *file; | 720 | return __fget_light(fd, 0, fput_needed); |
717 | struct files_struct *files = current->files; | ||
718 | |||
719 | *fput_needed = 0; | ||
720 | if (atomic_read(&files->count) == 1) { | ||
721 | file = __fcheck_files(files, fd); | ||
722 | } else { | ||
723 | rcu_read_lock(); | ||
724 | file = fcheck_files(files, fd); | ||
725 | if (file) { | ||
726 | if (atomic_long_inc_not_zero(&file->f_count)) | ||
727 | *fput_needed = 1; | ||
728 | else | ||
729 | /* Didn't get the reference, someone's freed */ | ||
730 | file = NULL; | ||
731 | } | ||
732 | rcu_read_unlock(); | ||
733 | } | ||
734 | |||
735 | return file; | ||
736 | } | 721 | } |
737 | 722 | ||
738 | void set_close_on_exec(unsigned int fd, int flag) | 723 | void set_close_on_exec(unsigned int fd, int flag) |