diff options
| -rw-r--r-- | fs/aio.c | 2 | ||||
| -rw-r--r-- | include/linux/fs.h | 13 |
2 files changed, 12 insertions, 3 deletions
| @@ -1434,7 +1434,7 @@ static int aio_prep_rw(struct kiocb *req, struct iocb *iocb) | |||
| 1434 | req->ki_flags = iocb_flags(req->ki_filp); | 1434 | req->ki_flags = iocb_flags(req->ki_filp); |
| 1435 | if (iocb->aio_flags & IOCB_FLAG_RESFD) | 1435 | if (iocb->aio_flags & IOCB_FLAG_RESFD) |
| 1436 | req->ki_flags |= IOCB_EVENTFD; | 1436 | req->ki_flags |= IOCB_EVENTFD; |
| 1437 | req->ki_hint = file_write_hint(req->ki_filp); | 1437 | req->ki_hint = ki_hint_validate(file_write_hint(req->ki_filp)); |
| 1438 | ret = kiocb_set_rw_flags(req, iocb->aio_rw_flags); | 1438 | ret = kiocb_set_rw_flags(req, iocb->aio_rw_flags); |
| 1439 | if (unlikely(ret)) | 1439 | if (unlikely(ret)) |
| 1440 | fput(req->ki_filp); | 1440 | fput(req->ki_filp); |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 4b6045ebb2f2..b432fc3feb93 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -299,7 +299,7 @@ struct kiocb { | |||
| 299 | void (*ki_complete)(struct kiocb *iocb, long ret, long ret2); | 299 | void (*ki_complete)(struct kiocb *iocb, long ret, long ret2); |
| 300 | void *private; | 300 | void *private; |
| 301 | int ki_flags; | 301 | int ki_flags; |
| 302 | enum rw_hint ki_hint; | 302 | u16 ki_hint; |
| 303 | } __randomize_layout; | 303 | } __randomize_layout; |
| 304 | 304 | ||
| 305 | static inline bool is_sync_kiocb(struct kiocb *kiocb) | 305 | static inline bool is_sync_kiocb(struct kiocb *kiocb) |
| @@ -1929,12 +1929,21 @@ static inline enum rw_hint file_write_hint(struct file *file) | |||
| 1929 | 1929 | ||
| 1930 | static inline int iocb_flags(struct file *file); | 1930 | static inline int iocb_flags(struct file *file); |
| 1931 | 1931 | ||
| 1932 | static inline u16 ki_hint_validate(enum rw_hint hint) | ||
| 1933 | { | ||
| 1934 | typeof(((struct kiocb *)0)->ki_hint) max_hint = -1; | ||
| 1935 | |||
| 1936 | if (hint <= max_hint) | ||
| 1937 | return hint; | ||
| 1938 | return 0; | ||
| 1939 | } | ||
| 1940 | |||
| 1932 | static inline void init_sync_kiocb(struct kiocb *kiocb, struct file *filp) | 1941 | static inline void init_sync_kiocb(struct kiocb *kiocb, struct file *filp) |
| 1933 | { | 1942 | { |
| 1934 | *kiocb = (struct kiocb) { | 1943 | *kiocb = (struct kiocb) { |
| 1935 | .ki_filp = filp, | 1944 | .ki_filp = filp, |
| 1936 | .ki_flags = iocb_flags(filp), | 1945 | .ki_flags = iocb_flags(filp), |
| 1937 | .ki_hint = file_write_hint(filp), | 1946 | .ki_hint = ki_hint_validate(file_write_hint(filp)), |
| 1938 | }; | 1947 | }; |
| 1939 | } | 1948 | } |
| 1940 | 1949 | ||
