exfat: write multiple sectors at once
Write multiple sectors at once when updating dir-entries. Add exfat_update_bhs() for that. It wait for write completion once instead of sector by sector. It's only effective if sync enabled. Signed-off-by: Tetsuhiro Kohada <kohada.t2@gmail.com> Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com>
This commit is contained in:
parent
2c7f8937ef
commit
3db3c3fb84
|
@ -606,13 +606,16 @@ void exfat_update_dir_chksum_with_entry_set(struct exfat_entry_set_cache *es)
|
|||
|
||||
void exfat_free_dentry_set(struct exfat_entry_set_cache *es, int sync)
|
||||
{
|
||||
int i;
|
||||
int i, err = 0;
|
||||
|
||||
for (i = 0; i < es->num_bh; i++) {
|
||||
if (es->modified)
|
||||
exfat_update_bh(es->bh[i], sync);
|
||||
err = exfat_update_bhs(es->bh, es->num_bh, sync);
|
||||
|
||||
for (i = 0; i < es->num_bh; i++)
|
||||
if (err)
|
||||
bforget(es->bh[i]);
|
||||
else
|
||||
brelse(es->bh[i]);
|
||||
}
|
||||
kfree(es);
|
||||
}
|
||||
|
||||
|
|
|
@ -513,6 +513,7 @@ void exfat_set_entry_time(struct exfat_sb_info *sbi, struct timespec64 *ts,
|
|||
u16 exfat_calc_chksum16(void *data, int len, u16 chksum, int type);
|
||||
u32 exfat_calc_chksum32(void *data, int len, u32 chksum, int type);
|
||||
void exfat_update_bh(struct buffer_head *bh, int sync);
|
||||
int exfat_update_bhs(struct buffer_head **bhs, int nr_bhs, int sync);
|
||||
void exfat_chain_set(struct exfat_chain *ec, unsigned int dir,
|
||||
unsigned int size, unsigned char flags);
|
||||
void exfat_chain_dup(struct exfat_chain *dup, struct exfat_chain *ec);
|
||||
|
|
|
@ -172,6 +172,25 @@ void exfat_update_bh(struct buffer_head *bh, int sync)
|
|||
sync_dirty_buffer(bh);
|
||||
}
|
||||
|
||||
int exfat_update_bhs(struct buffer_head **bhs, int nr_bhs, int sync)
|
||||
{
|
||||
int i, err = 0;
|
||||
|
||||
for (i = 0; i < nr_bhs; i++) {
|
||||
set_buffer_uptodate(bhs[i]);
|
||||
mark_buffer_dirty(bhs[i]);
|
||||
if (sync)
|
||||
write_dirty_buffer(bhs[i], 0);
|
||||
}
|
||||
|
||||
for (i = 0; i < nr_bhs && sync; i++) {
|
||||
wait_on_buffer(bhs[i]);
|
||||
if (!err && !buffer_uptodate(bhs[i]))
|
||||
err = -EIO;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
void exfat_chain_set(struct exfat_chain *ec, unsigned int dir,
|
||||
unsigned int size, unsigned char flags)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue