aboutsummaryrefslogtreecommitdiffstats
path: root/fs/gfs2/recovery.c
diff options
context:
space:
mode:
authorSteven Whitehouse <swhiteho@redhat.com>2006-02-13 07:27:43 -0500
committerSteven Whitehouse <swhiteho@redhat.com>2006-02-13 07:27:43 -0500
commit7359a19cc758946aba0e45233b8641256b194884 (patch)
treed96aaeb2fb239efe6fdb0b4698eb94108719f423 /fs/gfs2/recovery.c
parent18ec7d5c3f434aed9661ed10a9e1f48cdeb4981d (diff)
[GFS2] Fix for root inode ref count bug
Umount is now working correctly again. The bug was due to not getting an extra ref count when mounting the fs. We should have bumped it by two (once for the internal pointer to the root inode from the super block and once for the inode hanging off the dcache entry for root). Also this patch tidys up the code dealing with looking up and creating inodes. We now pass Linux inodes (with gfs2_inodes attached) rather than the other way around and this reduces code duplication in various places. Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Diffstat (limited to 'fs/gfs2/recovery.c')
-rw-r--r--fs/gfs2/recovery.c20
1 files changed, 10 insertions, 10 deletions
diff --git a/fs/gfs2/recovery.c b/fs/gfs2/recovery.c
index 15cd26fbcff9..bcb81c768c8b 100644
--- a/fs/gfs2/recovery.c
+++ b/fs/gfs2/recovery.c
@@ -27,17 +27,17 @@
27int gfs2_replay_read_block(struct gfs2_jdesc *jd, unsigned int blk, 27int gfs2_replay_read_block(struct gfs2_jdesc *jd, unsigned int blk,
28 struct buffer_head **bh) 28 struct buffer_head **bh)
29{ 29{
30 struct gfs2_glock *gl = jd->jd_inode->i_gl; 30 struct gfs2_glock *gl = get_v2ip(jd->jd_inode)->i_gl;
31 int new = 0; 31 int new = 0;
32 uint64_t dblock; 32 uint64_t dblock;
33 uint32_t extlen; 33 uint32_t extlen;
34 int error; 34 int error;
35 35
36 error = gfs2_block_map(jd->jd_inode, blk, &new, &dblock, &extlen); 36 error = gfs2_block_map(get_v2ip(jd->jd_inode), blk, &new, &dblock, &extlen);
37 if (error) 37 if (error)
38 return error; 38 return error;
39 if (!dblock) { 39 if (!dblock) {
40 gfs2_consist_inode(jd->jd_inode); 40 gfs2_consist_inode(get_v2ip(jd->jd_inode));
41 return -EIO; 41 return -EIO;
42 } 42 }
43 43
@@ -184,7 +184,7 @@ static int find_good_lh(struct gfs2_jdesc *jd, unsigned int *blk,
184 *blk = 0; 184 *blk = 0;
185 185
186 if (*blk == orig_blk) { 186 if (*blk == orig_blk) {
187 gfs2_consist_inode(jd->jd_inode); 187 gfs2_consist_inode(get_v2ip(jd->jd_inode));
188 return -EIO; 188 return -EIO;
189 } 189 }
190 } 190 }
@@ -218,7 +218,7 @@ static int jhead_scan(struct gfs2_jdesc *jd, struct gfs2_log_header *head)
218 continue; 218 continue;
219 219
220 if (lh.lh_sequence == head->lh_sequence) { 220 if (lh.lh_sequence == head->lh_sequence) {
221 gfs2_consist_inode(jd->jd_inode); 221 gfs2_consist_inode(get_v2ip(jd->jd_inode));
222 return -EIO; 222 return -EIO;
223 } 223 }
224 if (lh.lh_sequence < head->lh_sequence) 224 if (lh.lh_sequence < head->lh_sequence)
@@ -294,7 +294,7 @@ int gfs2_find_jhead(struct gfs2_jdesc *jd, struct gfs2_log_header *head)
294static int foreach_descriptor(struct gfs2_jdesc *jd, unsigned int start, 294static int foreach_descriptor(struct gfs2_jdesc *jd, unsigned int start,
295 unsigned int end, int pass) 295 unsigned int end, int pass)
296{ 296{
297 struct gfs2_sbd *sdp = jd->jd_inode->i_sbd; 297 struct gfs2_sbd *sdp = get_v2ip(jd->jd_inode)->i_sbd;
298 struct buffer_head *bh; 298 struct buffer_head *bh;
299 struct gfs2_log_descriptor *ld; 299 struct gfs2_log_descriptor *ld;
300 int error = 0; 300 int error = 0;
@@ -323,7 +323,7 @@ static int foreach_descriptor(struct gfs2_jdesc *jd, unsigned int start,
323 continue; 323 continue;
324 } 324 }
325 if (error == 1) { 325 if (error == 1) {
326 gfs2_consist_inode(jd->jd_inode); 326 gfs2_consist_inode(get_v2ip(jd->jd_inode));
327 error = -EIO; 327 error = -EIO;
328 } 328 }
329 brelse(bh); 329 brelse(bh);
@@ -360,7 +360,7 @@ static int foreach_descriptor(struct gfs2_jdesc *jd, unsigned int start,
360 360
361static int clean_journal(struct gfs2_jdesc *jd, struct gfs2_log_header *head) 361static int clean_journal(struct gfs2_jdesc *jd, struct gfs2_log_header *head)
362{ 362{
363 struct gfs2_inode *ip = jd->jd_inode; 363 struct gfs2_inode *ip = get_v2ip(jd->jd_inode);
364 struct gfs2_sbd *sdp = ip->i_sbd; 364 struct gfs2_sbd *sdp = ip->i_sbd;
365 unsigned int lblock; 365 unsigned int lblock;
366 int new = 0; 366 int new = 0;
@@ -419,7 +419,7 @@ static int clean_journal(struct gfs2_jdesc *jd, struct gfs2_log_header *head)
419 419
420int gfs2_recover_journal(struct gfs2_jdesc *jd, int wait) 420int gfs2_recover_journal(struct gfs2_jdesc *jd, int wait)
421{ 421{
422 struct gfs2_sbd *sdp = jd->jd_inode->i_sbd; 422 struct gfs2_sbd *sdp = get_v2ip(jd->jd_inode)->i_sbd;
423 struct gfs2_log_header head; 423 struct gfs2_log_header head;
424 struct gfs2_holder j_gh, ji_gh, t_gh; 424 struct gfs2_holder j_gh, ji_gh, t_gh;
425 unsigned long t; 425 unsigned long t;
@@ -449,7 +449,7 @@ int gfs2_recover_journal(struct gfs2_jdesc *jd, int wait)
449 goto fail; 449 goto fail;
450 }; 450 };
451 451
452 error = gfs2_glock_nq_init(jd->jd_inode->i_gl, LM_ST_SHARED, 452 error = gfs2_glock_nq_init(get_v2ip(jd->jd_inode)->i_gl, LM_ST_SHARED,
453 LM_FLAG_NOEXP, &ji_gh); 453 LM_FLAG_NOEXP, &ji_gh);
454 if (error) 454 if (error)
455 goto fail_gunlock_j; 455 goto fail_gunlock_j;