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

Commit 0849eb81 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "f2fs: change to use rwsem for cp_mutex"

parents 1e1b65a3 3c37a6fd
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -346,13 +346,13 @@ static int f2fs_write_meta_pages(struct address_space *mapping,
		goto skip_write;

	/* if locked failed, cp will flush dirty pages instead */
	if (!mutex_trylock(&sbi->cp_mutex))
	if (!down_write_trylock(&sbi->cp_global_sem))
		goto skip_write;

	trace_f2fs_writepages(mapping->host, wbc, META);
	diff = nr_pages_to_write(sbi, META, wbc);
	written = f2fs_sync_meta_pages(sbi, META, wbc->nr_to_write, FS_META_IO);
	mutex_unlock(&sbi->cp_mutex);
	up_write(&sbi->cp_global_sem);
	wbc->nr_to_write = max((long)0, wbc->nr_to_write - written - diff);
	return 0;

@@ -1565,7 +1565,7 @@ int f2fs_write_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc)
		f2fs_warn(sbi, "Start checkpoint disabled!");
	}
	if (cpc->reason != CP_RESIZE)
		mutex_lock(&sbi->cp_mutex);
		down_write(&sbi->cp_global_sem);

	if (!is_sbi_flag_set(sbi, SBI_IS_DIRTY) &&
		((cpc->reason & CP_FASTBOOT) || (cpc->reason & CP_SYNC) ||
@@ -1635,7 +1635,7 @@ int f2fs_write_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc)
	trace_f2fs_write_checkpoint(sbi->sb, cpc->reason, "finish checkpoint");
out:
	if (cpc->reason != CP_RESIZE)
		mutex_unlock(&sbi->cp_mutex);
		up_write(&sbi->cp_global_sem);
	return err;
}

+1 −1
Original line number Diff line number Diff line
@@ -1431,7 +1431,7 @@ struct f2fs_sb_info {
	int cur_cp_pack;			/* remain current cp pack */
	spinlock_t cp_lock;			/* for flag in ckpt */
	struct inode *meta_inode;		/* cache meta blocks */
	struct mutex cp_mutex;			/* checkpoint procedure lock */
	struct rw_semaphore cp_global_sem;	/* checkpoint procedure lock */
	struct rw_semaphore cp_rwsem;		/* blocking FS operations */
	struct rw_semaphore node_write;		/* locking node writes */
	struct rw_semaphore node_change;	/* locking node change */
+2 −2
Original line number Diff line number Diff line
@@ -1592,7 +1592,7 @@ int f2fs_resize_fs(struct f2fs_sb_info *sbi, __u64 block_count)

	freeze_super(sbi->sb);
	down_write(&sbi->gc_lock);
	mutex_lock(&sbi->cp_mutex);
	down_write(&sbi->cp_global_sem);

	spin_lock(&sbi->stat_lock);
	if (shrunk_blocks + valid_user_blocks(sbi) +
@@ -1637,7 +1637,7 @@ int f2fs_resize_fs(struct f2fs_sb_info *sbi, __u64 block_count)
		spin_unlock(&sbi->stat_lock);
	}
out_err:
	mutex_unlock(&sbi->cp_mutex);
	up_write(&sbi->cp_global_sem);
	up_write(&sbi->gc_lock);
	thaw_super(sbi->sb);
	clear_sbi_flag(sbi, SBI_IS_RESIZEFS);
+2 −2
Original line number Diff line number Diff line
@@ -793,7 +793,7 @@ int f2fs_recover_fsync_data(struct f2fs_sb_info *sbi, bool check_only)
	INIT_LIST_HEAD(&dir_list);

	/* prevent checkpoint */
	mutex_lock(&sbi->cp_mutex);
	down_write(&sbi->cp_global_sem);

	/* step #1: find fsynced inode numbers */
	err = find_fsync_dnodes(sbi, &inode_list, check_only);
@@ -844,7 +844,7 @@ int f2fs_recover_fsync_data(struct f2fs_sb_info *sbi, bool check_only)
	if (!err)
		clear_sbi_flag(sbi, SBI_POR_DOING);

	mutex_unlock(&sbi->cp_mutex);
	up_write(&sbi->cp_global_sem);

	/* let's drop all the directory inodes for clean checkpoint */
	destroy_fsync_dnodes(&dir_list, err);
+1 −1
Original line number Diff line number Diff line
@@ -3494,7 +3494,7 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent)
	sbi->valid_super_block = valid_super_block;
	init_rwsem(&sbi->gc_lock);
	mutex_init(&sbi->writepages);
	mutex_init(&sbi->cp_mutex);
	init_rwsem(&sbi->cp_global_sem);
	init_rwsem(&sbi->node_write);
	init_rwsem(&sbi->node_change);