diff options
| -rw-r--r-- | fs/file.c | 19 |
1 files changed, 4 insertions, 15 deletions
| @@ -713,27 +713,16 @@ unsigned long __fdget_raw(unsigned int fd) | |||
| 713 | 713 | ||
| 714 | unsigned long __fdget_pos(unsigned int fd) | 714 | unsigned long __fdget_pos(unsigned int fd) |
| 715 | { | 715 | { |
| 716 | struct files_struct *files = current->files; | 716 | unsigned long v = __fdget(fd); |
| 717 | struct file *file; | 717 | struct file *file = (struct file *)(v & ~3); |
| 718 | unsigned long v; | ||
| 719 | |||
| 720 | if (atomic_read(&files->count) == 1) { | ||
| 721 | file = __fcheck_files(files, fd); | ||
| 722 | v = 0; | ||
| 723 | } else { | ||
| 724 | file = __fget(fd, 0); | ||
| 725 | v = FDPUT_FPUT; | ||
| 726 | } | ||
| 727 | if (!file) | ||
| 728 | return 0; | ||
| 729 | 718 | ||
| 730 | if (file->f_mode & FMODE_ATOMIC_POS) { | 719 | if (file && (file->f_mode & FMODE_ATOMIC_POS)) { |
| 731 | if (file_count(file) > 1) { | 720 | if (file_count(file) > 1) { |
| 732 | v |= FDPUT_POS_UNLOCK; | 721 | v |= FDPUT_POS_UNLOCK; |
| 733 | mutex_lock(&file->f_pos_lock); | 722 | mutex_lock(&file->f_pos_lock); |
| 734 | } | 723 | } |
| 735 | } | 724 | } |
| 736 | return v | (unsigned long)file; | 725 | return v; |
| 737 | } | 726 | } |
| 738 | 727 | ||
| 739 | /* | 728 | /* |
