|
@@ -20,6 +20,7 @@
|
|
|
#include <linux/rwsem.h>
|
|
|
#include <linux/capability.h>
|
|
|
#include <linux/semaphore.h>
|
|
|
+#include <linux/fcntl.h>
|
|
|
#include <linux/fiemap.h>
|
|
|
#include <linux/rculist_bl.h>
|
|
|
#include <linux/atomic.h>
|
|
@@ -265,6 +266,18 @@ struct page;
|
|
|
struct address_space;
|
|
|
struct writeback_control;
|
|
|
|
|
|
+/*
|
|
|
+ * Write life time hint values.
|
|
|
+ */
|
|
|
+enum rw_hint {
|
|
|
+ WRITE_LIFE_NOT_SET = 0,
|
|
|
+ WRITE_LIFE_NONE = RWH_WRITE_LIFE_NONE,
|
|
|
+ WRITE_LIFE_SHORT = RWH_WRITE_LIFE_SHORT,
|
|
|
+ WRITE_LIFE_MEDIUM = RWH_WRITE_LIFE_MEDIUM,
|
|
|
+ WRITE_LIFE_LONG = RWH_WRITE_LIFE_LONG,
|
|
|
+ WRITE_LIFE_EXTREME = RWH_WRITE_LIFE_EXTREME,
|
|
|
+};
|
|
|
+
|
|
|
#define IOCB_EVENTFD (1 << 0)
|
|
|
#define IOCB_APPEND (1 << 1)
|
|
|
#define IOCB_DIRECT (1 << 2)
|
|
@@ -280,6 +293,7 @@ struct kiocb {
|
|
|
void (*ki_complete)(struct kiocb *iocb, long ret, long ret2);
|
|
|
void *private;
|
|
|
int ki_flags;
|
|
|
+ enum rw_hint ki_hint;
|
|
|
};
|
|
|
|
|
|
static inline bool is_sync_kiocb(struct kiocb *kiocb)
|
|
@@ -287,16 +301,6 @@ 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),
|
|
|
- };
|
|
|
-}
|
|
|
-
|
|
|
/*
|
|
|
* "descriptor" for what we're up to with a read.
|
|
|
* This allows us to use the same read code yet
|
|
@@ -597,6 +601,7 @@ struct inode {
|
|
|
spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */
|
|
|
unsigned short i_bytes;
|
|
|
unsigned int i_blkbits;
|
|
|
+ enum rw_hint i_write_hint;
|
|
|
blkcnt_t i_blocks;
|
|
|
|
|
|
#ifdef __NEED_I_SIZE_ORDERED
|
|
@@ -851,6 +856,7 @@ struct file {
|
|
|
* Must not be taken from IRQ context.
|
|
|
*/
|
|
|
spinlock_t f_lock;
|
|
|
+ enum rw_hint f_write_hint;
|
|
|
atomic_long_t f_count;
|
|
|
unsigned int f_flags;
|
|
|
fmode_t f_mode;
|
|
@@ -1026,8 +1032,6 @@ struct file_lock_context {
|
|
|
#define OFFT_OFFSET_MAX INT_LIMIT(off_t)
|
|
|
#endif
|
|
|
|
|
|
-#include <linux/fcntl.h>
|
|
|
-
|
|
|
extern void send_sigio(struct fown_struct *fown, int fd, int band);
|
|
|
|
|
|
/*
|
|
@@ -1878,6 +1882,25 @@ static inline bool HAS_UNMAPPED_ID(struct inode *inode)
|
|
|
return !uid_valid(inode->i_uid) || !gid_valid(inode->i_gid);
|
|
|
}
|
|
|
|
|
|
+static inline enum rw_hint file_write_hint(struct file *file)
|
|
|
+{
|
|
|
+ if (file->f_write_hint != WRITE_LIFE_NOT_SET)
|
|
|
+ return file->f_write_hint;
|
|
|
+
|
|
|
+ return file_inode(file)->i_write_hint;
|
|
|
+}
|
|
|
+
|
|
|
+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),
|
|
|
+ .ki_hint = file_write_hint(filp),
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Inode state bits. Protected by inode->i_lock
|
|
|
*
|