diff options
Diffstat (limited to 'include/linux/file.h')
| -rw-r--r-- | include/linux/file.h | 27 | 
1 files changed, 15 insertions, 12 deletions
diff --git a/include/linux/file.h b/include/linux/file.h index cbacf4faf447..4d69123377a2 100644 --- a/include/linux/file.h +++ b/include/linux/file.h @@ -28,33 +28,36 @@ static inline void fput_light(struct file *file, int fput_needed)  struct fd {  	struct file *file; -	int need_put; +	unsigned int flags;  }; +#define FDPUT_FPUT       1 +#define FDPUT_POS_UNLOCK 2  static inline void fdput(struct fd fd)  { -	if (fd.need_put) +	if (fd.flags & FDPUT_FPUT)  		fput(fd.file);  }  extern struct file *fget(unsigned int fd); -extern struct file *fget_light(unsigned int fd, int *fput_needed); +extern struct file *fget_raw(unsigned int fd); +extern unsigned long __fdget(unsigned int fd); +extern unsigned long __fdget_raw(unsigned int fd); +extern unsigned long __fdget_pos(unsigned int fd); -static inline struct fd fdget(unsigned int fd) +static inline struct fd __to_fd(unsigned long v)  { -	int b; -	struct file *f = fget_light(fd, &b); -	return (struct fd){f,b}; +	return (struct fd){(struct file *)(v & ~3),v & 3};  } -extern struct file *fget_raw(unsigned int fd); -extern struct file *fget_raw_light(unsigned int fd, int *fput_needed); +static inline struct fd fdget(unsigned int fd) +{ +	return __to_fd(__fdget(fd)); +}  static inline struct fd fdget_raw(unsigned int fd)  { -	int b; -	struct file *f = fget_raw_light(fd, &b); -	return (struct fd){f,b}; +	return __to_fd(__fdget_raw(fd));  }  extern int f_dupfd(unsigned int from, struct file *file, unsigned flags);  | 
