This allows to wait only when it's requested.
It speeds up creation of hardlinks.
Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
                if (!rsize) {
                        /* Empty resident -> Non empty nonresident. */
                } else if (!is_data) {
-                       err = ntfs_sb_write_run(sbi, run, 0, data, rsize);
+                       err = ntfs_sb_write_run(sbi, run, 0, data, rsize, 0);
                        if (err)
                                goto out2;
                } else if (!page) {
 
 
        if (attr && attr->non_res) {
                err = ntfs_sb_write_run(ni->mi.sbi, &al->run, 0, al->le,
-                                       al->size);
+                                       al->size, 0);
                if (err)
                        return err;
                al->dirty = false;
        return true;
 }
 
-int al_update(struct ntfs_inode *ni)
+int al_update(struct ntfs_inode *ni, int sync)
 {
        int err;
        struct ATTRIB *attr;
                memcpy(resident_data(attr), al->le, al->size);
        } else {
                err = ntfs_sb_write_run(ni->mi.sbi, &al->run, 0, al->le,
-                                       al->size);
+                                       al->size, sync);
                if (err)
                        goto out;
 
 
                                        goto out;
                        }
 
-                       err = al_update(ni);
+                       err = al_update(ni, sync);
                        if (err)
                                goto out;
                }
 
 
                        err = ntfs_sb_write_run(log->ni->mi.sbi,
                                                &log->ni->file.run, off, page,
-                                               log->page_size);
+                                               log->page_size, 0);
 
                        if (err)
                                goto out;
 
        if (a_dirty) {
                attr = oa->attr;
-               err = ntfs_sb_write_run(sbi, oa->run1, vbo, buffer_le, bytes);
+               err = ntfs_sb_write_run(sbi, oa->run1, vbo, buffer_le, bytes, 0);
                if (err)
                        goto out;
        }
 
        ntfs_fix_pre_write(&rh->rhdr, log->page_size);
 
-       err = ntfs_sb_write_run(sbi, &ni->file.run, 0, rh, log->page_size);
+       err = ntfs_sb_write_run(sbi, &ni->file.run, 0, rh, log->page_size, 0);
        if (!err)
                err = ntfs_sb_write_run(sbi, &log->ni->file.run, log->page_size,
-                                       rh, log->page_size);
+                                       rh, log->page_size, 0);
 
        kfree(rh);
        if (err)
 
 }
 
 int ntfs_sb_write_run(struct ntfs_sb_info *sbi, const struct runs_tree *run,
-                     u64 vbo, const void *buf, size_t bytes)
+                     u64 vbo, const void *buf, size_t bytes, int sync)
 {
        struct super_block *sb = sbi->sb;
        u8 cluster_bits = sbi->cluster_bits;
 
        for (;;) {
                u32 op = min_t(u64, len, bytes);
-               int err = ntfs_sb_write(sb, lbo, op, buf, 0);
+               int err = ntfs_sb_write(sb, lbo, op, buf, sync);
 
                if (err)
                        return err;
 
        /* Write main SDS bucket. */
        err = ntfs_sb_write_run(sbi, &ni->file.run, sbi->security.next_off,
-                               d_security, aligned_sec_size);
+                               d_security, aligned_sec_size, 0);
 
        if (err)
                goto out;
 
        /* Write copy SDS bucket. */
        err = ntfs_sb_write_run(sbi, &ni->file.run, mirr_off, d_security,
-                               aligned_sec_size);
+                               aligned_sec_size, 0);
        if (err)
                goto out;
 
 
 
        /* Write non resident data. */
        if (nsize) {
-               err = ntfs_sb_write_run(sbi, &ni->file.run, 0, rp, nsize);
+               err = ntfs_sb_write_run(sbi, &ni->file.run, 0, rp, nsize, 0);
                if (err)
                        goto out7;
        }
 
 bool al_delete_le(struct ntfs_inode *ni, enum ATTR_TYPE type, CLST vcn,
                  const __le16 *name, size_t name_len,
                  const struct MFT_REF *ref);
-int al_update(struct ntfs_inode *ni);
+int al_update(struct ntfs_inode *ni, int sync);
 static inline size_t al_aligned(size_t size)
 {
        return (size + 1023) & ~(size_t)1023;
 int ntfs_sb_write(struct super_block *sb, u64 lbo, size_t bytes,
                  const void *buffer, int wait);
 int ntfs_sb_write_run(struct ntfs_sb_info *sbi, const struct runs_tree *run,
-                     u64 vbo, const void *buf, size_t bytes);
+                     u64 vbo, const void *buf, size_t bytes, int sync);
 struct buffer_head *ntfs_bread_run(struct ntfs_sb_info *sbi,
                                   const struct runs_tree *run, u64 vbo);
 int ntfs_read_run_nb(struct ntfs_sb_info *sbi, const struct runs_tree *run,
 
                /* Delete xattr, ATTR_EA */
                ni_remove_attr_le(ni, attr, mi, le);
        } else if (attr->non_res) {
-               err = ntfs_sb_write_run(sbi, &ea_run, 0, ea_all, size);
+               err = ntfs_sb_write_run(sbi, &ea_run, 0, ea_all, size, 0);
                if (err)
                        goto out;
        } else {