Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d29460e5 authored by Jaegeuk Kim's avatar Jaegeuk Kim
Browse files

f2fs: avoid deadlock caused by lock order of page and lock_op



- punch_hole
 - fill_zero
  - f2fs_lock_op
  - get_new_data_page
   - lock_page

- f2fs_write_data_pages
 - lock_page
 - do_write_data_page
  - f2fs_lock_op

Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent d1aa2453
Loading
Loading
Loading
Loading
+13 −3
Original line number Diff line number Diff line
@@ -1404,8 +1404,9 @@ int do_write_data_page(struct f2fs_io_info *fio)
		}
	}

	if (fio->need_lock == LOCK_REQ)
		f2fs_lock_op(fio->sbi);
	/* Deadlock due to between page->lock and f2fs_lock_op */
	if (fio->need_lock == LOCK_REQ && !f2fs_trylock_op(fio->sbi))
		return -EAGAIN;

	err = get_dnode_of_data(&dn, page->index, LOOKUP_NODE);
	if (err)
@@ -1667,7 +1668,7 @@ static int f2fs_write_cache_pages(struct address_space *mapping,
			}

			done_index = page->index;

retry_write:
			lock_page(page);

			if (unlikely(page->mapping != mapping)) {
@@ -1703,6 +1704,15 @@ static int f2fs_write_cache_pages(struct address_space *mapping,
					unlock_page(page);
					ret = 0;
					continue;
				} else if (ret == -EAGAIN) {
					ret = 0;
					if (wbc->sync_mode == WB_SYNC_ALL) {
						cond_resched();
						congestion_wait(BLK_RW_ASYNC,
									HZ/50);
						goto retry_write;
					}
					continue;
				}
				done_index = page->index + 1;
				done = 1;