summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Axboe <axboe@fb.com>2016-11-06 14:05:47 -0700
committerJens Axboe <axboe@fb.com>2016-11-10 15:14:57 -0700
commit5651ab0cc7a2625cb7a046ab850a494ee45ae288 (patch)
treeed9fb4c766407585cbedbf0c27abdaf1621c8c79
parent87760e5eef359788047d6fd54fc12eec74ce0d27 (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.c6
-rw-r--r--include/linux/fs.h3
-rw-r--r--include/uapi/linux/fs.h1
-rw-r--r--mm/fadvise.c2
-rw-r--r--mm/filemap.c12
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,