diff options
| -rw-r--r-- | fs/f2fs/data.c | 7 | ||||
| -rw-r--r-- | fs/f2fs/f2fs.h | 1 | ||||
| -rw-r--r-- | fs/f2fs/super.c | 1 |
3 files changed, 9 insertions, 0 deletions
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index b91b0e10678e..1e1aae669fa8 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c | |||
| @@ -1513,6 +1513,7 @@ static int f2fs_write_data_pages(struct address_space *mapping, | |||
| 1513 | { | 1513 | { |
| 1514 | struct inode *inode = mapping->host; | 1514 | struct inode *inode = mapping->host; |
| 1515 | struct f2fs_sb_info *sbi = F2FS_I_SB(inode); | 1515 | struct f2fs_sb_info *sbi = F2FS_I_SB(inode); |
| 1516 | bool locked = false; | ||
| 1516 | int ret; | 1517 | int ret; |
| 1517 | long diff; | 1518 | long diff; |
| 1518 | 1519 | ||
| @@ -1533,7 +1534,13 @@ static int f2fs_write_data_pages(struct address_space *mapping, | |||
| 1533 | 1534 | ||
| 1534 | diff = nr_pages_to_write(sbi, DATA, wbc); | 1535 | diff = nr_pages_to_write(sbi, DATA, wbc); |
| 1535 | 1536 | ||
| 1537 | if (!S_ISDIR(inode->i_mode)) { | ||
| 1538 | mutex_lock(&sbi->writepages); | ||
| 1539 | locked = true; | ||
| 1540 | } | ||
| 1536 | ret = write_cache_pages(mapping, wbc, __f2fs_writepage, mapping); | 1541 | ret = write_cache_pages(mapping, wbc, __f2fs_writepage, mapping); |
| 1542 | if (locked) | ||
| 1543 | mutex_unlock(&sbi->writepages); | ||
| 1537 | 1544 | ||
| 1538 | f2fs_submit_merged_bio(sbi, DATA, WRITE); | 1545 | f2fs_submit_merged_bio(sbi, DATA, WRITE); |
| 1539 | 1546 | ||
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index d8921cf2ba9a..8de34ab6d5b1 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h | |||
| @@ -625,6 +625,7 @@ struct f2fs_sb_info { | |||
| 625 | struct mutex cp_mutex; /* checkpoint procedure lock */ | 625 | struct mutex cp_mutex; /* checkpoint procedure lock */ |
| 626 | struct rw_semaphore cp_rwsem; /* blocking FS operations */ | 626 | struct rw_semaphore cp_rwsem; /* blocking FS operations */ |
| 627 | struct rw_semaphore node_write; /* locking node writes */ | 627 | struct rw_semaphore node_write; /* locking node writes */ |
| 628 | struct mutex writepages; /* mutex for writepages() */ | ||
| 628 | wait_queue_head_t cp_wait; | 629 | wait_queue_head_t cp_wait; |
| 629 | 630 | ||
| 630 | struct inode_management im[MAX_INO_ENTRY]; /* manage inode cache */ | 631 | struct inode_management im[MAX_INO_ENTRY]; /* manage inode cache */ |
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 160b88346b24..b2dd1b01f076 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c | |||
| @@ -1035,6 +1035,7 @@ try_onemore: | |||
| 1035 | sbi->raw_super = raw_super; | 1035 | sbi->raw_super = raw_super; |
| 1036 | sbi->raw_super_buf = raw_super_buf; | 1036 | sbi->raw_super_buf = raw_super_buf; |
| 1037 | mutex_init(&sbi->gc_mutex); | 1037 | mutex_init(&sbi->gc_mutex); |
| 1038 | mutex_init(&sbi->writepages); | ||
| 1038 | mutex_init(&sbi->cp_mutex); | 1039 | mutex_init(&sbi->cp_mutex); |
| 1039 | init_rwsem(&sbi->node_write); | 1040 | init_rwsem(&sbi->node_write); |
| 1040 | clear_sbi_flag(sbi, SBI_POR_DOING); | 1041 | clear_sbi_flag(sbi, SBI_POR_DOING); |
