fs: add SYNC_FILE_RANGE_BACKGROUND flag for-4.10/wb-buf-throttle
authorJens Axboe <axboe@fb.com>
Sun, 6 Nov 2016 21:05:47 +0000 (14:05 -0700)
committerJens Axboe <axboe@fb.com>
Thu, 10 Nov 2016 22:14:57 +0000 (15:14 -0700)
Allows userspace to submit a range for writeback, but without
the lower levels considering it important.

Signed-off-by: Jens Axboe <axboe@fb.com>
fs/sync.c
include/linux/fs.h
include/uapi/linux/fs.h
mm/fadvise.c
mm/filemap.c

index 2a54c1f2203595823df1bd97680b9a1fb163e400..21b5f666e740415858d87ae3e9f6d3662f11b6ab 100644 (file)
--- 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;
        }
index 8533e9d59c29daa0542e5f571427dd1bb9564919..0076b809f91e04421dbfbd5a37dc504fbd343e97 100644 (file)
@@ -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);
index c1d11df07b289fe47af000de9cf94e7e84cc120f..9871dc35326b299d2ed8722151426455dbec40d7 100644 (file)
@@ -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 */
index 6c707bfe02fde002feae9ea2fab3fc9647c3baa0..37343e814ac8f2f8d6eaedafcc88f32e81622a49 100644 (file)
@@ -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
index 849f459ad0780e27bc256ff13fd52fa8c9007661..026bfa133626e1407c7f5e631d58dfc99d6eb06c 100644 (file)
@@ -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,