]> Pileus Git - ~andy/linux/commitdiff
[GFS2] Fix a couple of refcount leaks.
authorRussell Cattelan <cattelan@redhat.com>
Thu, 10 Aug 2006 16:08:40 +0000 (11:08 -0500)
committerSteven Whitehouse <swhiteho@redhat.com>
Thu, 10 Aug 2006 21:18:59 +0000 (17:18 -0400)
recovery.c add a brelse to deal with gfs2_replay_read_block being called
twice on the same block.

add a dput to drop the ref count on the root inode.
This was causing lingering glocks and thus causing
a mount failure to hang.

Fix a endian conversion macro that was was swizzling
16bits when it should have been swizzling 32.

Signed-off-by: Russell Cattelan <cattelan@redhat.com>
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
fs/gfs2/glock.c
fs/gfs2/ops_fstype.c
fs/gfs2/recovery.c

index b6edf7c0923bc8fa045835dec36cf1d0e02bccf2..a5e16e5399995ce88b616dab0d85d1037d3aaebd 100644 (file)
@@ -2167,7 +2167,9 @@ static int dump_glock(struct gfs2_glock *gl)
 
        spin_lock(&gl->gl_spin);
 
-       printk(KERN_INFO "Glock (%u, %llu)\n", gl->gl_name.ln_type,
+       printk(KERN_INFO "Glock 0x%p (%u, %llu)\n",
+              gl,
+              gl->gl_name.ln_type,
               (unsigned long long)gl->gl_name.ln_number);
        printk(KERN_INFO "  gl_flags =");
        for (x = 0; x < 32; x++)
@@ -2187,8 +2189,9 @@ static int dump_glock(struct gfs2_glock *gl)
        printk(KERN_INFO "  reclaim = %s\n",
                    (list_empty(&gl->gl_reclaim)) ? "no" : "yes");
        if (gl->gl_aspace)
-               printk(KERN_INFO "  aspace = %lu\n",
-                           gl->gl_aspace->i_mapping->nrpages);
+               printk(KERN_INFO "  aspace = 0x%p nrpages = %lu\n",
+                      gl->gl_aspace,
+                      gl->gl_aspace->i_mapping->nrpages);
        else
                printk(KERN_INFO "  aspace = no\n");
        printk(KERN_INFO "  ail = %d\n", atomic_read(&gl->gl_ail_count));
index de18923eea708f9673faad8c56efb222d9ac0b7c..444000968cf4c72f44b495561863cd3cff55ef3a 100644 (file)
@@ -279,6 +279,10 @@ static int init_sb(struct gfs2_sbd *sdp, int silent, int undo)
        int error = 0;
 
        if (undo) {
+               if (sb->s_root) {
+                       dput(sb->s_root);
+                       sb->s_root = NULL;
+               }
                return 0;
        }
        
index bbd44a4b1a1f15748c857f0f506efcf1f2899663..8fe518cfb3de0c8891fb4000c7a968544242abff 100644 (file)
@@ -325,6 +325,7 @@ static int foreach_descriptor(struct gfs2_jdesc *jd, unsigned int start,
                        error = get_log_header(jd, start, &lh);
                        if (!error) {
                                gfs2_replay_incr_blk(sdp, &start);
+                               brelse(bh);
                                continue;
                        }
                        if (error == 1) {
@@ -396,7 +397,7 @@ static int clean_journal(struct gfs2_jdesc *jd, struct gfs2_log_header *head)
        lh = (struct gfs2_log_header *)bh->b_data;
        memset(lh, 0, sizeof(struct gfs2_log_header));
        lh->lh_header.mh_magic = cpu_to_be32(GFS2_MAGIC);
-       lh->lh_header.mh_type = cpu_to_be16(GFS2_METATYPE_LH);
+       lh->lh_header.mh_type = cpu_to_be32(GFS2_METATYPE_LH);
        lh->lh_header.mh_format = cpu_to_be32(GFS2_FORMAT_LH);
        lh->lh_sequence = cpu_to_be64(head->lh_sequence + 1);
        lh->lh_flags = cpu_to_be32(GFS2_LOG_HEAD_UNMOUNT);