aboutsummaryrefslogtreecommitdiffstats
path: root/fs/gfs2/super.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/super.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/super.c')
-rw-r--r--fs/gfs2/super.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c
index bae32ba0c481..9b5c31952c5d 100644
--- a/fs/gfs2/super.c
+++ b/fs/gfs2/super.c
@@ -305,7 +305,7 @@ int gfs2_jindex_hold(struct gfs2_sbd *sdp, struct gfs2_holder *ji_gh)
305 if (!jd) 305 if (!jd)
306 break; 306 break;
307 307
308 error = gfs2_lookupi(dip, &name, 1, &jd->jd_inode); 308 error = gfs2_lookupi(sdp->sd_jindex, &name, 1, &jd->jd_inode);
309 if (error) { 309 if (error) {
310 kfree(jd); 310 kfree(jd);
311 break; 311 break;
@@ -342,7 +342,7 @@ void gfs2_jindex_free(struct gfs2_sbd *sdp)
342 while (!list_empty(&list)) { 342 while (!list_empty(&list)) {
343 jd = list_entry(list.next, struct gfs2_jdesc, jd_list); 343 jd = list_entry(list.next, struct gfs2_jdesc, jd_list);
344 list_del(&jd->jd_list); 344 list_del(&jd->jd_list);
345 gfs2_inode_put(jd->jd_inode); 345 iput(jd->jd_inode);
346 kfree(jd); 346 kfree(jd);
347 } 347 }
348} 348}
@@ -411,7 +411,7 @@ struct gfs2_jdesc *gfs2_jdesc_find_dirty(struct gfs2_sbd *sdp)
411 411
412int gfs2_jdesc_check(struct gfs2_jdesc *jd) 412int gfs2_jdesc_check(struct gfs2_jdesc *jd)
413{ 413{
414 struct gfs2_inode *ip = jd->jd_inode; 414 struct gfs2_inode *ip = get_v2ip(jd->jd_inode);
415 struct gfs2_sbd *sdp = ip->i_sbd; 415 struct gfs2_sbd *sdp = ip->i_sbd;
416 int ar; 416 int ar;
417 int error; 417 int error;
@@ -462,7 +462,7 @@ int gfs2_lookup_master_dir(struct gfs2_sbd *sdp)
462 462
463int gfs2_make_fs_rw(struct gfs2_sbd *sdp) 463int gfs2_make_fs_rw(struct gfs2_sbd *sdp)
464{ 464{
465 struct gfs2_glock *j_gl = sdp->sd_jdesc->jd_inode->i_gl; 465 struct gfs2_glock *j_gl = get_v2ip(sdp->sd_jdesc->jd_inode)->i_gl;
466 struct gfs2_holder t_gh; 466 struct gfs2_holder t_gh;
467 struct gfs2_log_header head; 467 struct gfs2_log_header head;
468 int error; 468 int error;
@@ -472,7 +472,7 @@ int gfs2_make_fs_rw(struct gfs2_sbd *sdp)
472 if (error) 472 if (error)
473 return error; 473 return error;
474 474
475 gfs2_meta_cache_flush(sdp->sd_jdesc->jd_inode); 475 gfs2_meta_cache_flush(get_v2ip(sdp->sd_jdesc->jd_inode));
476 j_gl->gl_ops->go_inval(j_gl, DIO_METADATA | DIO_DATA); 476 j_gl->gl_ops->go_inval(j_gl, DIO_METADATA | DIO_DATA);
477 477
478 error = gfs2_find_jhead(sdp->sd_jdesc, &head); 478 error = gfs2_find_jhead(sdp->sd_jdesc, &head);
@@ -854,7 +854,7 @@ int gfs2_lock_fs_check_clean(struct gfs2_sbd *sdp, struct gfs2_holder *t_gh)
854 error = -ENOMEM; 854 error = -ENOMEM;
855 goto out; 855 goto out;
856 } 856 }
857 error = gfs2_glock_nq_init(jd->jd_inode->i_gl, LM_ST_SHARED, 0, 857 error = gfs2_glock_nq_init(get_v2ip(jd->jd_inode)->i_gl, LM_ST_SHARED, 0,
858 &lfcc->gh); 858 &lfcc->gh);
859 if (error) { 859 if (error) {
860 kfree(lfcc); 860 kfree(lfcc);