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

Commit 1b50259b authored by Steven Whitehouse's avatar Steven Whitehouse
Browse files

[GFS2] Drop log lock on I/O error & tidy up



This patch drops the log spinlock when an I/O error occurs
to avoid any possible problems in case of blocking or
recursion in the I/O error routine. It also has a few
cosmetic changes to tidy up various other files.

Signed-off-by: default avatarSteven Whitehouse <swhiteho@redhat.com>
parent 02f211f4
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -226,8 +226,11 @@ void gfs2_ail1_start_one(struct gfs2_sbd *sdp, struct gfs2_ail *ai)
			gfs2_assert(sdp, bd->bd_ail == ai);

			if (!buffer_busy(bh)) {
				if (!buffer_uptodate(bh))
				if (!buffer_uptodate(bh)) {
					gfs2_log_unlock(sdp);
					gfs2_io_error_bh(sdp, bh);
					gfs2_log_lock(sdp);
				}
				list_move(&bd->bd_ail_st_list,
					  &ai->ai_ail2_list);
				continue;
+2 −3
Original line number Diff line number Diff line
@@ -213,8 +213,7 @@ static int gfs2_link(struct dentry *old_dentry, struct inode *dir,
		if (error)
			goto out_gunlock_q;

		error = gfs2_trans_begin(sdp,
					 sdp->sd_max_dirres +
		error = gfs2_trans_begin(sdp, sdp->sd_max_dirres +
					 al->al_rgd->rd_ri.ri_length +
					 2 * RES_DINODE + RES_STATFS +
					 RES_QUOTA, 0);
+2 −4
Original line number Diff line number Diff line
@@ -155,11 +155,9 @@ int gfs2_unstuffer_page(struct gfs2_inode *ip, struct buffer_head *dibh,
	if (!PageUptodate(page)) {
		void *kaddr = kmap(page);

		memcpy(kaddr,
		       dibh->b_data + sizeof(struct gfs2_dinode),
		memcpy(kaddr, dibh->b_data + sizeof(struct gfs2_dinode),
		       ip->i_di.di_size);
		memset(kaddr + ip->i_di.di_size,
		       0,
		memset(kaddr + ip->i_di.di_size, 0,
		       PAGE_CACHE_SIZE - ip->i_di.di_size);
		kunmap(page);

+9 −8
Original line number Diff line number Diff line
@@ -130,11 +130,12 @@ static void enforce_limit(struct gfs2_sbd *sdp)
	unsigned int tries = 0, min = 0;
	int error;

	if (atomic_read(&sdp->sd_unlinked_count) >=
	    gfs2_tune_get(sdp, gt_ilimit)) {
	if (atomic_read(&sdp->sd_unlinked_count) <
	    gfs2_tune_get(sdp, gt_ilimit))
		return;

	tries = gfs2_tune_get(sdp, gt_ilimit_tries);
	min = gfs2_tune_get(sdp, gt_ilimit_min);
	}

	while (tries--) {
		struct gfs2_unlinked *ul = ul_fish(sdp);