[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: Steven Whitehouse <swhiteho@redhat.com>
This commit is contained in:
Родитель
02f211f4d0
Коммит
1b50259bc3
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
@ -303,7 +302,7 @@ static int gfs2_unlink(struct inode *dir, struct dentry *dentry)
|
|||
if (error)
|
||||
goto out_gunlock;
|
||||
|
||||
error = gfs2_unlinki(dip, &dentry->d_name, ip,ul);
|
||||
error = gfs2_unlinki(dip, &dentry->d_name, ip, ul);
|
||||
|
||||
gfs2_trans_end(sdp);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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)) {
|
||||
tries = gfs2_tune_get(sdp, gt_ilimit_tries);
|
||||
min = gfs2_tune_get(sdp, gt_ilimit_min);
|
||||
}
|
||||
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);
|
||||
|
@ -187,7 +188,7 @@ int gfs2_unlinked_get(struct gfs2_sbd *sdp, struct gfs2_unlinked **ul)
|
|||
|
||||
goto fail;
|
||||
|
||||
found:
|
||||
found:
|
||||
for (b = 0; b < 8; b++)
|
||||
if (!(byte & (1 << b)))
|
||||
break;
|
||||
|
@ -202,7 +203,7 @@ int gfs2_unlinked_get(struct gfs2_sbd *sdp, struct gfs2_unlinked **ul)
|
|||
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
fail:
|
||||
spin_unlock(&sdp->sd_unlinked_spin);
|
||||
kfree(*ul);
|
||||
return -ENOSPC;
|
||||
|
@ -410,7 +411,7 @@ int gfs2_unlinked_init(struct gfs2_sbd *sdp)
|
|||
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
fail:
|
||||
gfs2_unlinked_cleanup(sdp);
|
||||
return error;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче