* 'linux-4.14.y' of https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux: (205 commits) Linux 4.14.259 xen/netback: don't queue unlimited number of packages xen/netback: fix rx queue stall detection xen/console: harden hvc_xen against event channel storms xen/netfront: harden netfront against event channel storms xen/blkfront: harden blkfront against event channel storms Input: touchscreen - avoid bitwise vs logical OR warning ARM: 8800/1: use choice for kernel unwinders mwifiex: Remove unnecessary braces from HostCmd_SET_SEQ_NO_BSS_INFO ARM: 8805/2: remove unneeded naked function usage net: lan78xx: Avoid unnecessary self assignment scsi: scsi_debug: Sanity check block descriptor length in resp_mode_select() fuse: annotate lock in fuse_reverse_inval_entry() ARM: dts: imx6ull-pinfunc: Fix CSI_DATA07__ESAI_TX0 pad name firmware: arm_scpi: Fix string overflow in SCPI genpd driver net: systemport: Add global locking for descriptor lifecycle libata: if T_LENGTH is zero, dma direction should be DMA_NONE timekeeping: Really make sure wall_to_monotonic isn't positive USB: serial: option: add Telit FN990 compositions PCI/MSI: Mask MSI-X vectors only on success ... Signed-off-by: SagarMakhar <sagarmakhar@gmail.com>
94 lines
2.2 KiB
C
94 lines
2.2 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* Wrapper functions for accessing the file_struct fd array.
|
|
*/
|
|
|
|
#ifndef __LINUX_FILE_H
|
|
#define __LINUX_FILE_H
|
|
|
|
#include <linux/compiler.h>
|
|
#include <linux/types.h>
|
|
#include <linux/posix_types.h>
|
|
|
|
struct file;
|
|
|
|
extern void fput(struct file *);
|
|
extern void fput_many(struct file *, unsigned int);
|
|
|
|
struct file_operations;
|
|
struct vfsmount;
|
|
struct dentry;
|
|
struct path;
|
|
extern struct file *alloc_file(const struct path *, fmode_t mode,
|
|
const struct file_operations *fop);
|
|
|
|
static inline void fput_light(struct file *file, int fput_needed)
|
|
{
|
|
if (fput_needed)
|
|
fput(file);
|
|
}
|
|
|
|
struct fd {
|
|
struct file *file;
|
|
unsigned int flags;
|
|
};
|
|
#define FDPUT_FPUT 1
|
|
#define FDPUT_POS_UNLOCK 2
|
|
|
|
static inline void fdput(struct fd fd)
|
|
{
|
|
if (fd.flags & FDPUT_FPUT)
|
|
fput(fd.file);
|
|
}
|
|
|
|
extern struct file *fget(unsigned int fd);
|
|
extern struct file *fget_many(unsigned int fd, unsigned int refs);
|
|
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);
|
|
extern void __f_unlock_pos(struct file *);
|
|
|
|
static inline struct fd __to_fd(unsigned long v)
|
|
{
|
|
return (struct fd){(struct file *)(v & ~3),v & 3};
|
|
}
|
|
|
|
static inline struct fd fdget(unsigned int fd)
|
|
{
|
|
return __to_fd(__fdget(fd));
|
|
}
|
|
|
|
static inline struct fd fdget_raw(unsigned int fd)
|
|
{
|
|
return __to_fd(__fdget_raw(fd));
|
|
}
|
|
|
|
static inline struct fd fdget_pos(int fd)
|
|
{
|
|
return __to_fd(__fdget_pos(fd));
|
|
}
|
|
|
|
static inline void fdput_pos(struct fd f)
|
|
{
|
|
if (f.flags & FDPUT_POS_UNLOCK)
|
|
__f_unlock_pos(f.file);
|
|
fdput(f);
|
|
}
|
|
|
|
extern int f_dupfd(unsigned int from, struct file *file, unsigned flags);
|
|
extern int replace_fd(unsigned fd, struct file *file, unsigned flags);
|
|
extern void set_close_on_exec(unsigned int fd, int flag);
|
|
extern bool get_close_on_exec(unsigned int fd);
|
|
extern void put_filp(struct file *);
|
|
extern int get_unused_fd_flags(unsigned flags);
|
|
extern void put_unused_fd(unsigned int fd);
|
|
|
|
extern void fd_install(unsigned int fd, struct file *file);
|
|
|
|
extern void flush_delayed_fput(void);
|
|
extern void flush_delayed_fput_wait(void);
|
|
extern void __fput_sync(struct file *);
|
|
|
|
#endif /* __LINUX_FILE_H */
|