mirror O_APPEND and O_DIRECT into iocb->ki_flags
... avoiding write_iter/fcntl races. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
3309dd04cb
commit
2ba48ce513
11 changed files with 38 additions and 23 deletions
|
|
@ -315,6 +315,8 @@ struct address_space;
|
|||
struct writeback_control;
|
||||
|
||||
#define IOCB_EVENTFD (1 << 0)
|
||||
#define IOCB_APPEND (1 << 1)
|
||||
#define IOCB_DIRECT (1 << 2)
|
||||
|
||||
struct kiocb {
|
||||
struct file *ki_filp;
|
||||
|
|
@ -329,10 +331,13 @@ static inline bool is_sync_kiocb(struct kiocb *kiocb)
|
|||
return kiocb->ki_complete == NULL;
|
||||
}
|
||||
|
||||
static inline int iocb_flags(struct file *file);
|
||||
|
||||
static inline void init_sync_kiocb(struct kiocb *kiocb, struct file *filp)
|
||||
{
|
||||
*kiocb = (struct kiocb) {
|
||||
.ki_filp = filp,
|
||||
.ki_flags = iocb_flags(filp),
|
||||
};
|
||||
}
|
||||
|
||||
|
|
@ -2779,6 +2784,16 @@ static inline bool io_is_direct(struct file *filp)
|
|||
return (filp->f_flags & O_DIRECT) || IS_DAX(file_inode(filp));
|
||||
}
|
||||
|
||||
static inline int iocb_flags(struct file *file)
|
||||
{
|
||||
int res = 0;
|
||||
if (file->f_flags & O_APPEND)
|
||||
res |= IOCB_APPEND;
|
||||
if (io_is_direct(file))
|
||||
res |= IOCB_DIRECT;
|
||||
return res;
|
||||
}
|
||||
|
||||
static inline ino_t parent_ino(struct dentry *dentry)
|
||||
{
|
||||
ino_t res;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue