|
@@ -146,8 +146,8 @@ static u64 gfs2_log_bmap(struct gfs2_sbd *sdp)
|
|
struct gfs2_journal_extent *je;
|
|
struct gfs2_journal_extent *je;
|
|
u64 block;
|
|
u64 block;
|
|
|
|
|
|
- list_for_each_entry(je, &sdp->sd_jdesc->extent_list, extent_list) {
|
|
|
|
- if (lbn >= je->lblock && lbn < je->lblock + je->blocks) {
|
|
|
|
|
|
+ list_for_each_entry(je, &sdp->sd_jdesc->extent_list, list) {
|
|
|
|
+ if ((lbn >= je->lblock) && (lbn < (je->lblock + je->blocks))) {
|
|
block = je->dblock + lbn - je->lblock;
|
|
block = je->dblock + lbn - je->lblock;
|
|
gfs2_log_incr_head(sdp);
|
|
gfs2_log_incr_head(sdp);
|
|
return block;
|
|
return block;
|
|
@@ -491,44 +491,40 @@ static void gfs2_before_commit(struct gfs2_sbd *sdp, unsigned int limit,
|
|
gfs2_log_unlock(sdp);
|
|
gfs2_log_unlock(sdp);
|
|
}
|
|
}
|
|
|
|
|
|
-static void buf_lo_before_commit(struct gfs2_sbd *sdp)
|
|
|
|
|
|
+static void buf_lo_before_commit(struct gfs2_sbd *sdp, struct gfs2_trans *tr)
|
|
{
|
|
{
|
|
unsigned int limit = buf_limit(sdp); /* 503 for 4k blocks */
|
|
unsigned int limit = buf_limit(sdp); /* 503 for 4k blocks */
|
|
-
|
|
|
|
- gfs2_before_commit(sdp, limit, sdp->sd_log_num_buf,
|
|
|
|
- &sdp->sd_log_le_buf, 0);
|
|
|
|
|
|
+ unsigned int nbuf;
|
|
|
|
+ if (tr == NULL)
|
|
|
|
+ return;
|
|
|
|
+ nbuf = tr->tr_num_buf_new - tr->tr_num_buf_rm;
|
|
|
|
+ gfs2_before_commit(sdp, limit, nbuf, &tr->tr_buf, 0);
|
|
}
|
|
}
|
|
|
|
|
|
static void buf_lo_after_commit(struct gfs2_sbd *sdp, struct gfs2_trans *tr)
|
|
static void buf_lo_after_commit(struct gfs2_sbd *sdp, struct gfs2_trans *tr)
|
|
{
|
|
{
|
|
- struct list_head *head = &sdp->sd_log_le_buf;
|
|
|
|
|
|
+ struct list_head *head;
|
|
struct gfs2_bufdata *bd;
|
|
struct gfs2_bufdata *bd;
|
|
|
|
|
|
- if (tr == NULL) {
|
|
|
|
- gfs2_assert(sdp, list_empty(head));
|
|
|
|
|
|
+ if (tr == NULL)
|
|
return;
|
|
return;
|
|
- }
|
|
|
|
|
|
|
|
|
|
+ head = &tr->tr_buf;
|
|
while (!list_empty(head)) {
|
|
while (!list_empty(head)) {
|
|
bd = list_entry(head->next, struct gfs2_bufdata, bd_list);
|
|
bd = list_entry(head->next, struct gfs2_bufdata, bd_list);
|
|
list_del_init(&bd->bd_list);
|
|
list_del_init(&bd->bd_list);
|
|
- sdp->sd_log_num_buf--;
|
|
|
|
-
|
|
|
|
gfs2_unpin(sdp, bd->bd_bh, tr);
|
|
gfs2_unpin(sdp, bd->bd_bh, tr);
|
|
}
|
|
}
|
|
- gfs2_assert_warn(sdp, !sdp->sd_log_num_buf);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
static void buf_lo_before_scan(struct gfs2_jdesc *jd,
|
|
static void buf_lo_before_scan(struct gfs2_jdesc *jd,
|
|
struct gfs2_log_header_host *head, int pass)
|
|
struct gfs2_log_header_host *head, int pass)
|
|
{
|
|
{
|
|
- struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
|
|
|
|
-
|
|
|
|
if (pass != 0)
|
|
if (pass != 0)
|
|
return;
|
|
return;
|
|
|
|
|
|
- sdp->sd_found_blocks = 0;
|
|
|
|
- sdp->sd_replayed_blocks = 0;
|
|
|
|
|
|
+ jd->jd_found_blocks = 0;
|
|
|
|
+ jd->jd_replayed_blocks = 0;
|
|
}
|
|
}
|
|
|
|
|
|
static int buf_lo_scan_elements(struct gfs2_jdesc *jd, unsigned int start,
|
|
static int buf_lo_scan_elements(struct gfs2_jdesc *jd, unsigned int start,
|
|
@@ -551,9 +547,9 @@ static int buf_lo_scan_elements(struct gfs2_jdesc *jd, unsigned int start,
|
|
for (; blks; gfs2_replay_incr_blk(sdp, &start), blks--) {
|
|
for (; blks; gfs2_replay_incr_blk(sdp, &start), blks--) {
|
|
blkno = be64_to_cpu(*ptr++);
|
|
blkno = be64_to_cpu(*ptr++);
|
|
|
|
|
|
- sdp->sd_found_blocks++;
|
|
|
|
|
|
+ jd->jd_found_blocks++;
|
|
|
|
|
|
- if (gfs2_revoke_check(sdp, blkno, start))
|
|
|
|
|
|
+ if (gfs2_revoke_check(jd, blkno, start))
|
|
continue;
|
|
continue;
|
|
|
|
|
|
error = gfs2_replay_read_block(jd, start, &bh_log);
|
|
error = gfs2_replay_read_block(jd, start, &bh_log);
|
|
@@ -574,7 +570,7 @@ static int buf_lo_scan_elements(struct gfs2_jdesc *jd, unsigned int start,
|
|
if (error)
|
|
if (error)
|
|
break;
|
|
break;
|
|
|
|
|
|
- sdp->sd_replayed_blocks++;
|
|
|
|
|
|
+ jd->jd_replayed_blocks++;
|
|
}
|
|
}
|
|
|
|
|
|
return error;
|
|
return error;
|
|
@@ -617,10 +613,10 @@ static void buf_lo_after_scan(struct gfs2_jdesc *jd, int error, int pass)
|
|
gfs2_meta_sync(ip->i_gl);
|
|
gfs2_meta_sync(ip->i_gl);
|
|
|
|
|
|
fs_info(sdp, "jid=%u: Replayed %u of %u blocks\n",
|
|
fs_info(sdp, "jid=%u: Replayed %u of %u blocks\n",
|
|
- jd->jd_jid, sdp->sd_replayed_blocks, sdp->sd_found_blocks);
|
|
|
|
|
|
+ jd->jd_jid, jd->jd_replayed_blocks, jd->jd_found_blocks);
|
|
}
|
|
}
|
|
|
|
|
|
-static void revoke_lo_before_commit(struct gfs2_sbd *sdp)
|
|
|
|
|
|
+static void revoke_lo_before_commit(struct gfs2_sbd *sdp, struct gfs2_trans *tr)
|
|
{
|
|
{
|
|
struct gfs2_meta_header *mh;
|
|
struct gfs2_meta_header *mh;
|
|
unsigned int offset;
|
|
unsigned int offset;
|
|
@@ -679,13 +675,11 @@ static void revoke_lo_after_commit(struct gfs2_sbd *sdp, struct gfs2_trans *tr)
|
|
static void revoke_lo_before_scan(struct gfs2_jdesc *jd,
|
|
static void revoke_lo_before_scan(struct gfs2_jdesc *jd,
|
|
struct gfs2_log_header_host *head, int pass)
|
|
struct gfs2_log_header_host *head, int pass)
|
|
{
|
|
{
|
|
- struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
|
|
|
|
-
|
|
|
|
if (pass != 0)
|
|
if (pass != 0)
|
|
return;
|
|
return;
|
|
|
|
|
|
- sdp->sd_found_revokes = 0;
|
|
|
|
- sdp->sd_replay_tail = head->lh_tail;
|
|
|
|
|
|
+ jd->jd_found_revokes = 0;
|
|
|
|
+ jd->jd_replay_tail = head->lh_tail;
|
|
}
|
|
}
|
|
|
|
|
|
static int revoke_lo_scan_elements(struct gfs2_jdesc *jd, unsigned int start,
|
|
static int revoke_lo_scan_elements(struct gfs2_jdesc *jd, unsigned int start,
|
|
@@ -717,13 +711,13 @@ static int revoke_lo_scan_elements(struct gfs2_jdesc *jd, unsigned int start,
|
|
while (offset + sizeof(u64) <= sdp->sd_sb.sb_bsize) {
|
|
while (offset + sizeof(u64) <= sdp->sd_sb.sb_bsize) {
|
|
blkno = be64_to_cpu(*(__be64 *)(bh->b_data + offset));
|
|
blkno = be64_to_cpu(*(__be64 *)(bh->b_data + offset));
|
|
|
|
|
|
- error = gfs2_revoke_add(sdp, blkno, start);
|
|
|
|
|
|
+ error = gfs2_revoke_add(jd, blkno, start);
|
|
if (error < 0) {
|
|
if (error < 0) {
|
|
brelse(bh);
|
|
brelse(bh);
|
|
return error;
|
|
return error;
|
|
}
|
|
}
|
|
else if (error)
|
|
else if (error)
|
|
- sdp->sd_found_revokes++;
|
|
|
|
|
|
+ jd->jd_found_revokes++;
|
|
|
|
|
|
if (!--revokes)
|
|
if (!--revokes)
|
|
break;
|
|
break;
|
|
@@ -743,16 +737,16 @@ static void revoke_lo_after_scan(struct gfs2_jdesc *jd, int error, int pass)
|
|
struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
|
|
struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
|
|
|
|
|
|
if (error) {
|
|
if (error) {
|
|
- gfs2_revoke_clean(sdp);
|
|
|
|
|
|
+ gfs2_revoke_clean(jd);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
if (pass != 1)
|
|
if (pass != 1)
|
|
return;
|
|
return;
|
|
|
|
|
|
fs_info(sdp, "jid=%u: Found %u revoke tags\n",
|
|
fs_info(sdp, "jid=%u: Found %u revoke tags\n",
|
|
- jd->jd_jid, sdp->sd_found_revokes);
|
|
|
|
|
|
+ jd->jd_jid, jd->jd_found_revokes);
|
|
|
|
|
|
- gfs2_revoke_clean(sdp);
|
|
|
|
|
|
+ gfs2_revoke_clean(jd);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -760,12 +754,14 @@ static void revoke_lo_after_scan(struct gfs2_jdesc *jd, int error, int pass)
|
|
*
|
|
*
|
|
*/
|
|
*/
|
|
|
|
|
|
-static void databuf_lo_before_commit(struct gfs2_sbd *sdp)
|
|
|
|
|
|
+static void databuf_lo_before_commit(struct gfs2_sbd *sdp, struct gfs2_trans *tr)
|
|
{
|
|
{
|
|
- unsigned int limit = buf_limit(sdp) / 2;
|
|
|
|
-
|
|
|
|
- gfs2_before_commit(sdp, limit, sdp->sd_log_num_databuf,
|
|
|
|
- &sdp->sd_log_le_databuf, 1);
|
|
|
|
|
|
+ unsigned int limit = databuf_limit(sdp);
|
|
|
|
+ unsigned int nbuf;
|
|
|
|
+ if (tr == NULL)
|
|
|
|
+ return;
|
|
|
|
+ nbuf = tr->tr_num_databuf_new - tr->tr_num_databuf_rm;
|
|
|
|
+ gfs2_before_commit(sdp, limit, nbuf, &tr->tr_databuf, 1);
|
|
}
|
|
}
|
|
|
|
|
|
static int databuf_lo_scan_elements(struct gfs2_jdesc *jd, unsigned int start,
|
|
static int databuf_lo_scan_elements(struct gfs2_jdesc *jd, unsigned int start,
|
|
@@ -789,9 +785,9 @@ static int databuf_lo_scan_elements(struct gfs2_jdesc *jd, unsigned int start,
|
|
blkno = be64_to_cpu(*ptr++);
|
|
blkno = be64_to_cpu(*ptr++);
|
|
esc = be64_to_cpu(*ptr++);
|
|
esc = be64_to_cpu(*ptr++);
|
|
|
|
|
|
- sdp->sd_found_blocks++;
|
|
|
|
|
|
+ jd->jd_found_blocks++;
|
|
|
|
|
|
- if (gfs2_revoke_check(sdp, blkno, start))
|
|
|
|
|
|
+ if (gfs2_revoke_check(jd, blkno, start))
|
|
continue;
|
|
continue;
|
|
|
|
|
|
error = gfs2_replay_read_block(jd, start, &bh_log);
|
|
error = gfs2_replay_read_block(jd, start, &bh_log);
|
|
@@ -811,7 +807,7 @@ static int databuf_lo_scan_elements(struct gfs2_jdesc *jd, unsigned int start,
|
|
brelse(bh_log);
|
|
brelse(bh_log);
|
|
brelse(bh_ip);
|
|
brelse(bh_ip);
|
|
|
|
|
|
- sdp->sd_replayed_blocks++;
|
|
|
|
|
|
+ jd->jd_replayed_blocks++;
|
|
}
|
|
}
|
|
|
|
|
|
return error;
|
|
return error;
|
|
@@ -835,26 +831,23 @@ static void databuf_lo_after_scan(struct gfs2_jdesc *jd, int error, int pass)
|
|
gfs2_meta_sync(ip->i_gl);
|
|
gfs2_meta_sync(ip->i_gl);
|
|
|
|
|
|
fs_info(sdp, "jid=%u: Replayed %u of %u data blocks\n",
|
|
fs_info(sdp, "jid=%u: Replayed %u of %u data blocks\n",
|
|
- jd->jd_jid, sdp->sd_replayed_blocks, sdp->sd_found_blocks);
|
|
|
|
|
|
+ jd->jd_jid, jd->jd_replayed_blocks, jd->jd_found_blocks);
|
|
}
|
|
}
|
|
|
|
|
|
static void databuf_lo_after_commit(struct gfs2_sbd *sdp, struct gfs2_trans *tr)
|
|
static void databuf_lo_after_commit(struct gfs2_sbd *sdp, struct gfs2_trans *tr)
|
|
{
|
|
{
|
|
- struct list_head *head = &sdp->sd_log_le_databuf;
|
|
|
|
|
|
+ struct list_head *head;
|
|
struct gfs2_bufdata *bd;
|
|
struct gfs2_bufdata *bd;
|
|
|
|
|
|
- if (tr == NULL) {
|
|
|
|
- gfs2_assert(sdp, list_empty(head));
|
|
|
|
|
|
+ if (tr == NULL)
|
|
return;
|
|
return;
|
|
- }
|
|
|
|
|
|
|
|
|
|
+ head = &tr->tr_databuf;
|
|
while (!list_empty(head)) {
|
|
while (!list_empty(head)) {
|
|
bd = list_entry(head->next, struct gfs2_bufdata, bd_list);
|
|
bd = list_entry(head->next, struct gfs2_bufdata, bd_list);
|
|
list_del_init(&bd->bd_list);
|
|
list_del_init(&bd->bd_list);
|
|
- sdp->sd_log_num_databuf--;
|
|
|
|
gfs2_unpin(sdp, bd->bd_bh, tr);
|
|
gfs2_unpin(sdp, bd->bd_bh, tr);
|
|
}
|
|
}
|
|
- gfs2_assert_warn(sdp, !sdp->sd_log_num_databuf);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|