fs/ntfs3: Add sync flag to ntfs_sb_write_run and al_update

This allows to wait only when it's requested.
It speeds up creation of hardlinks.
Signed-off-by: NKonstantin Komarov <almaz.alexandrovich@paragon-software.com>
上级 56eaeb10
...@@ -287,7 +287,7 @@ int attr_make_nonresident(struct ntfs_inode *ni, struct ATTRIB *attr, ...@@ -287,7 +287,7 @@ int attr_make_nonresident(struct ntfs_inode *ni, struct ATTRIB *attr,
if (!rsize) { if (!rsize) {
/* Empty resident -> Non empty nonresident. */ /* Empty resident -> Non empty nonresident. */
} else if (!is_data) { } 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) if (err)
goto out2; goto out2;
} else if (!page) { } else if (!page) {
......
...@@ -333,7 +333,7 @@ int al_add_le(struct ntfs_inode *ni, enum ATTR_TYPE type, const __le16 *name, ...@@ -333,7 +333,7 @@ int al_add_le(struct ntfs_inode *ni, enum ATTR_TYPE type, const __le16 *name,
if (attr && attr->non_res) { if (attr && attr->non_res) {
err = ntfs_sb_write_run(ni->mi.sbi, &al->run, 0, al->le, err = ntfs_sb_write_run(ni->mi.sbi, &al->run, 0, al->le,
al->size); al->size, 0);
if (err) if (err)
return err; return err;
al->dirty = false; al->dirty = false;
...@@ -420,7 +420,7 @@ bool al_delete_le(struct ntfs_inode *ni, enum ATTR_TYPE type, CLST vcn, ...@@ -420,7 +420,7 @@ bool al_delete_le(struct ntfs_inode *ni, enum ATTR_TYPE type, CLST vcn,
return true; return true;
} }
int al_update(struct ntfs_inode *ni) int al_update(struct ntfs_inode *ni, int sync)
{ {
int err; int err;
struct ATTRIB *attr; struct ATTRIB *attr;
...@@ -442,7 +442,7 @@ int al_update(struct ntfs_inode *ni) ...@@ -442,7 +442,7 @@ int al_update(struct ntfs_inode *ni)
memcpy(resident_data(attr), al->le, al->size); memcpy(resident_data(attr), al->le, al->size);
} else { } else {
err = ntfs_sb_write_run(ni->mi.sbi, &al->run, 0, al->le, err = ntfs_sb_write_run(ni->mi.sbi, &al->run, 0, al->le,
al->size); al->size, sync);
if (err) if (err)
goto out; goto out;
......
...@@ -3208,7 +3208,7 @@ int ni_write_inode(struct inode *inode, int sync, const char *hint) ...@@ -3208,7 +3208,7 @@ int ni_write_inode(struct inode *inode, int sync, const char *hint)
goto out; goto out;
} }
err = al_update(ni); err = al_update(ni, sync);
if (err) if (err)
goto out; goto out;
} }
......
...@@ -2215,7 +2215,7 @@ static int last_log_lsn(struct ntfs_log *log) ...@@ -2215,7 +2215,7 @@ static int last_log_lsn(struct ntfs_log *log)
err = ntfs_sb_write_run(log->ni->mi.sbi, err = ntfs_sb_write_run(log->ni->mi.sbi,
&log->ni->file.run, off, page, &log->ni->file.run, off, page,
log->page_size); log->page_size, 0);
if (err) if (err)
goto out; goto out;
...@@ -3706,7 +3706,7 @@ static int do_action(struct ntfs_log *log, struct OPEN_ATTR_ENRTY *oe, ...@@ -3706,7 +3706,7 @@ static int do_action(struct ntfs_log *log, struct OPEN_ATTR_ENRTY *oe,
if (a_dirty) { if (a_dirty) {
attr = oa->attr; 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) if (err)
goto out; goto out;
} }
...@@ -5148,10 +5148,10 @@ int log_replay(struct ntfs_inode *ni, bool *initialized) ...@@ -5148,10 +5148,10 @@ int log_replay(struct ntfs_inode *ni, bool *initialized)
ntfs_fix_pre_write(&rh->rhdr, log->page_size); 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) if (!err)
err = ntfs_sb_write_run(sbi, &log->ni->file.run, log->page_size, err = ntfs_sb_write_run(sbi, &log->ni->file.run, log->page_size,
rh, log->page_size); rh, log->page_size, 0);
kfree(rh); kfree(rh);
if (err) if (err)
......
...@@ -1077,7 +1077,7 @@ int ntfs_sb_write(struct super_block *sb, u64 lbo, size_t bytes, ...@@ -1077,7 +1077,7 @@ int ntfs_sb_write(struct super_block *sb, u64 lbo, size_t bytes,
} }
int ntfs_sb_write_run(struct ntfs_sb_info *sbi, const struct runs_tree *run, 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; struct super_block *sb = sbi->sb;
u8 cluster_bits = sbi->cluster_bits; u8 cluster_bits = sbi->cluster_bits;
...@@ -1097,7 +1097,7 @@ int ntfs_sb_write_run(struct ntfs_sb_info *sbi, const struct runs_tree *run, ...@@ -1097,7 +1097,7 @@ int ntfs_sb_write_run(struct ntfs_sb_info *sbi, const struct runs_tree *run,
for (;;) { for (;;) {
u32 op = min_t(u64, len, bytes); 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) if (err)
return err; return err;
...@@ -2172,7 +2172,7 @@ int ntfs_insert_security(struct ntfs_sb_info *sbi, ...@@ -2172,7 +2172,7 @@ int ntfs_insert_security(struct ntfs_sb_info *sbi,
/* Write main SDS bucket. */ /* Write main SDS bucket. */
err = ntfs_sb_write_run(sbi, &ni->file.run, sbi->security.next_off, 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) if (err)
goto out; goto out;
...@@ -2190,7 +2190,7 @@ int ntfs_insert_security(struct ntfs_sb_info *sbi, ...@@ -2190,7 +2190,7 @@ int ntfs_insert_security(struct ntfs_sb_info *sbi,
/* Write copy SDS bucket. */ /* Write copy SDS bucket. */
err = ntfs_sb_write_run(sbi, &ni->file.run, mirr_off, d_security, err = ntfs_sb_write_run(sbi, &ni->file.run, mirr_off, d_security,
aligned_sec_size); aligned_sec_size, 0);
if (err) if (err)
goto out; goto out;
......
...@@ -1584,7 +1584,7 @@ struct inode *ntfs_create_inode(struct user_namespace *mnt_userns, ...@@ -1584,7 +1584,7 @@ struct inode *ntfs_create_inode(struct user_namespace *mnt_userns,
/* Write non resident data. */ /* Write non resident data. */
if (nsize) { 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) if (err)
goto out7; goto out7;
} }
......
...@@ -465,7 +465,7 @@ bool al_remove_le(struct ntfs_inode *ni, struct ATTR_LIST_ENTRY *le); ...@@ -465,7 +465,7 @@ bool al_remove_le(struct ntfs_inode *ni, struct ATTR_LIST_ENTRY *le);
bool al_delete_le(struct ntfs_inode *ni, enum ATTR_TYPE type, CLST vcn, bool al_delete_le(struct ntfs_inode *ni, enum ATTR_TYPE type, CLST vcn,
const __le16 *name, size_t name_len, const __le16 *name, size_t name_len,
const struct MFT_REF *ref); 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) static inline size_t al_aligned(size_t size)
{ {
return (size + 1023) & ~(size_t)1023; return (size + 1023) & ~(size_t)1023;
...@@ -606,7 +606,7 @@ int ntfs_sb_read(struct super_block *sb, u64 lbo, size_t bytes, void *buffer); ...@@ -606,7 +606,7 @@ int ntfs_sb_read(struct super_block *sb, u64 lbo, size_t bytes, void *buffer);
int ntfs_sb_write(struct super_block *sb, u64 lbo, size_t bytes, int ntfs_sb_write(struct super_block *sb, u64 lbo, size_t bytes,
const void *buffer, int wait); const void *buffer, int wait);
int ntfs_sb_write_run(struct ntfs_sb_info *sbi, const struct runs_tree *run, 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, struct buffer_head *ntfs_bread_run(struct ntfs_sb_info *sbi,
const struct runs_tree *run, u64 vbo); const struct runs_tree *run, u64 vbo);
int ntfs_read_run_nb(struct ntfs_sb_info *sbi, const struct runs_tree *run, int ntfs_read_run_nb(struct ntfs_sb_info *sbi, const struct runs_tree *run,
......
...@@ -441,7 +441,7 @@ static noinline int ntfs_set_ea(struct inode *inode, const char *name, ...@@ -441,7 +441,7 @@ static noinline int ntfs_set_ea(struct inode *inode, const char *name,
/* Delete xattr, ATTR_EA */ /* Delete xattr, ATTR_EA */
ni_remove_attr_le(ni, attr, mi, le); ni_remove_attr_le(ni, attr, mi, le);
} else if (attr->non_res) { } 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) if (err)
goto out; goto out;
} else { } else {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册