diff options
author | Jens Axboe <axboe@fb.com> | 2016-11-06 14:05:47 -0700 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2016-11-10 15:14:57 -0700 |
commit | 5651ab0cc7a2625cb7a046ab850a494ee45ae288 (patch) | |
tree | ed9fb4c766407585cbedbf0c27abdaf1621c8c79 | |
parent | 87760e5eef359788047d6fd54fc12eec74ce0d27 (diff) |
fs: add SYNC_FILE_RANGE_BACKGROUND flagfor-4.10/wb-buf-throttle
Allows userspace to submit a range for writeback, but without
the lower levels considering it important.
Signed-off-by: Jens Axboe <axboe@fb.com>
-rw-r--r-- | fs/sync.c | 6 | ||||
-rw-r--r-- | include/linux/fs.h | 3 | ||||
-rw-r--r-- | include/uapi/linux/fs.h | 1 | ||||
-rw-r--r-- | mm/fadvise.c | 2 | ||||
-rw-r--r-- | mm/filemap.c | 12 |
5 files changed, 16 insertions, 8 deletions
diff --git a/fs/sync.c b/fs/sync.c index 2a54c1f22035..21b5f666e740 100644 --- a/fs/sync.c +++ b/fs/sync.c @@ -18,7 +18,7 @@ #include "internal.h" #define VALID_FLAGS (SYNC_FILE_RANGE_WAIT_BEFORE|SYNC_FILE_RANGE_WRITE| \ - SYNC_FILE_RANGE_WAIT_AFTER) + SYNC_FILE_RANGE_WAIT_AFTER|SYNC_FILE_RANGE_BACKGROUND) /* * Do the filesystem syncing work. For simple filesystems @@ -348,8 +348,10 @@ SYSCALL_DEFINE4(sync_file_range, int, fd, loff_t, offset, loff_t, nbytes, } if (flags & SYNC_FILE_RANGE_WRITE) { + bool background = flags & SYNC_FILE_RANGE_BACKGROUND; + ret = __filemap_fdatawrite_range(mapping, offset, endbyte, - WB_SYNC_NONE); + WB_SYNC_NONE, background); if (ret < 0) goto out_put; } diff --git a/include/linux/fs.h b/include/linux/fs.h index 8533e9d59c29..0076b809f91e 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2477,7 +2477,8 @@ extern int filemap_write_and_wait(struct address_space *mapping); extern int filemap_write_and_wait_range(struct address_space *mapping, loff_t lstart, loff_t lend); extern int __filemap_fdatawrite_range(struct address_space *mapping, - loff_t start, loff_t end, int sync_mode); + loff_t start, loff_t end, int sync_mode, + bool background); extern int filemap_fdatawrite_range(struct address_space *mapping, loff_t start, loff_t end); extern int filemap_check_errors(struct address_space *mapping); diff --git a/include/uapi/linux/fs.h b/include/uapi/linux/fs.h index c1d11df07b28..9871dc35326b 100644 --- a/include/uapi/linux/fs.h +++ b/include/uapi/linux/fs.h @@ -327,6 +327,7 @@ struct fscrypt_policy { #define SYNC_FILE_RANGE_WAIT_BEFORE 1 #define SYNC_FILE_RANGE_WRITE 2 #define SYNC_FILE_RANGE_WAIT_AFTER 4 +#define SYNC_FILE_RANGE_BACKGROUND 8 /* flags for preadv2/pwritev2: */ #define RWF_HIPRI 0x00000001 /* high priority request, poll if possible */ diff --git a/mm/fadvise.c b/mm/fadvise.c index 6c707bfe02fd..37343e814ac8 100644 --- a/mm/fadvise.c +++ b/mm/fadvise.c @@ -117,7 +117,7 @@ SYSCALL_DEFINE4(fadvise64_64, int, fd, loff_t, offset, loff_t, len, int, advice) case POSIX_FADV_DONTNEED: if (!inode_write_congested(mapping->host)) __filemap_fdatawrite_range(mapping, offset, endbyte, - WB_SYNC_NONE); + WB_SYNC_NONE, true); /* * First and last FULL page! Partial pages are deliberately diff --git a/mm/filemap.c b/mm/filemap.c index 849f459ad078..026bfa133626 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -363,6 +363,7 @@ EXPORT_SYMBOL(filemap_check_errors); * @start: offset in bytes where the range starts * @end: offset in bytes where the range ends (inclusive) * @sync_mode: enable synchronous operation + * @background: This is a background write operation * * Start writeback against all of a mapping's dirty pages that lie * within the byte offsets <start, end> inclusive. @@ -373,11 +374,12 @@ EXPORT_SYMBOL(filemap_check_errors); * be waited upon, and not just skipped over. */ int __filemap_fdatawrite_range(struct address_space *mapping, loff_t start, - loff_t end, int sync_mode) + loff_t end, int sync_mode, bool background) { int ret; struct writeback_control wbc = { .sync_mode = sync_mode, + .for_background = background, .nr_to_write = LONG_MAX, .range_start = start, .range_end = end, @@ -395,7 +397,8 @@ int __filemap_fdatawrite_range(struct address_space *mapping, loff_t start, static inline int __filemap_fdatawrite(struct address_space *mapping, int sync_mode) { - return __filemap_fdatawrite_range(mapping, 0, LLONG_MAX, sync_mode); + return __filemap_fdatawrite_range(mapping, 0, LLONG_MAX, sync_mode, + false); } int filemap_fdatawrite(struct address_space *mapping) @@ -407,7 +410,8 @@ EXPORT_SYMBOL(filemap_fdatawrite); int filemap_fdatawrite_range(struct address_space *mapping, loff_t start, loff_t end) { - return __filemap_fdatawrite_range(mapping, start, end, WB_SYNC_ALL); + return __filemap_fdatawrite_range(mapping, start, end, WB_SYNC_ALL, + false); } EXPORT_SYMBOL(filemap_fdatawrite_range); @@ -578,7 +582,7 @@ int filemap_write_and_wait_range(struct address_space *mapping, if ((!dax_mapping(mapping) && mapping->nrpages) || (dax_mapping(mapping) && mapping->nrexceptional)) { err = __filemap_fdatawrite_range(mapping, lstart, lend, - WB_SYNC_ALL); + WB_SYNC_ALL, false); /* See comment of filemap_write_and_wait() */ if (err != -EIO) { int err2 = filemap_fdatawait_range(mapping, |