|
@@ -2612,11 +2612,14 @@ static int ext4_writepages(struct address_space *mapping,
|
|
|
struct blk_plug plug;
|
|
|
bool give_up_on_write = false;
|
|
|
|
|
|
+ percpu_down_read(&sbi->s_journal_flag_rwsem);
|
|
|
trace_ext4_writepages(inode, wbc);
|
|
|
|
|
|
- if (dax_mapping(mapping))
|
|
|
- return dax_writeback_mapping_range(mapping, inode->i_sb->s_bdev,
|
|
|
- wbc);
|
|
|
+ if (dax_mapping(mapping)) {
|
|
|
+ ret = dax_writeback_mapping_range(mapping, inode->i_sb->s_bdev,
|
|
|
+ wbc);
|
|
|
+ goto out_writepages;
|
|
|
+ }
|
|
|
|
|
|
/*
|
|
|
* No pages to write? This is mainly a kludge to avoid starting
|
|
@@ -2786,6 +2789,7 @@ retry:
|
|
|
out_writepages:
|
|
|
trace_ext4_writepages_result(inode, wbc, ret,
|
|
|
nr_to_write - wbc->nr_to_write);
|
|
|
+ percpu_up_read(&sbi->s_journal_flag_rwsem);
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
@@ -5436,6 +5440,7 @@ int ext4_change_inode_journal_flag(struct inode *inode, int val)
|
|
|
journal_t *journal;
|
|
|
handle_t *handle;
|
|
|
int err;
|
|
|
+ struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
|
|
|
|
|
|
/*
|
|
|
* We have to be very careful here: changing a data block's
|
|
@@ -5475,6 +5480,7 @@ int ext4_change_inode_journal_flag(struct inode *inode, int val)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ percpu_down_write(&sbi->s_journal_flag_rwsem);
|
|
|
jbd2_journal_lock_updates(journal);
|
|
|
|
|
|
/*
|
|
@@ -5491,6 +5497,7 @@ int ext4_change_inode_journal_flag(struct inode *inode, int val)
|
|
|
err = jbd2_journal_flush(journal);
|
|
|
if (err < 0) {
|
|
|
jbd2_journal_unlock_updates(journal);
|
|
|
+ percpu_up_write(&sbi->s_journal_flag_rwsem);
|
|
|
ext4_inode_resume_unlocked_dio(inode);
|
|
|
return err;
|
|
|
}
|
|
@@ -5499,6 +5506,8 @@ int ext4_change_inode_journal_flag(struct inode *inode, int val)
|
|
|
ext4_set_aops(inode);
|
|
|
|
|
|
jbd2_journal_unlock_updates(journal);
|
|
|
+ percpu_up_write(&sbi->s_journal_flag_rwsem);
|
|
|
+
|
|
|
if (val)
|
|
|
up_write(&EXT4_I(inode)->i_mmap_sem);
|
|
|
ext4_inode_resume_unlocked_dio(inode);
|