CVSROOT:        /cvs/cluster
Module name:    cluster
Branch:         RHEL5
Changes by:     [EMAIL PROTECTED]       2007-11-16 23:22:23

Modified files:
        gfs2/fsck      : metawalk.c pass1.c pass1c.c pass2.c pass5.c 

Log message:
        Resolves: bz 382581: GFS2: gfs2_fsck: buffer still held for block

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/fsck/metawalk.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.3.2.10&r2=1.3.2.11
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/fsck/pass1.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.4.2.7&r2=1.4.2.8
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/fsck/pass1c.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.4.2.3&r2=1.4.2.4
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/fsck/pass2.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.4.2.5&r2=1.4.2.6
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/fsck/pass5.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.3.2.2&r2=1.3.2.3

--- cluster/gfs2/fsck/metawalk.c        2007/09/18 18:14:27     1.3.2.10
+++ cluster/gfs2/fsck/metawalk.c        2007/11/16 23:22:23     1.3.2.11
@@ -463,9 +463,11 @@
                if(error > 0) {
                        return 1;
                }
+               check_eattr_entries(ip, bh, pass);
+               if (bh)
+                       brelse(bh, not_updated);
        }
 
-       check_eattr_entries(ip, bh, pass);
        return 0;
 }
 
@@ -487,9 +489,9 @@
        log_debug("Checking EA indirect block #%"PRIu64" (0x%" PRIx64 ").\n",
                          indirect, indirect);
 
-       if (!pass->check_eattr_indir ||
+       if (pass->check_eattr_indir &&
            !pass->check_eattr_indir(ip, indirect, ip->i_di.di_num.no_addr,
-                                                                &indirect_buf, 
pass->private)) {
+                                    &indirect_buf, pass->private)) {
                ea_leaf_ptr = (uint64_t *)(indirect_buf->b_data
                                                                   + 
sizeof(struct gfs2_meta_header));
                end = ea_leaf_ptr + ((sdp->sd_sb.sb_bsize
--- cluster/gfs2/fsck/pass1.c   2007/10/11 20:32:36     1.4.2.7
+++ cluster/gfs2/fsck/pass1.c   2007/11/16 23:22:23     1.4.2.8
@@ -143,7 +143,6 @@
        int ret = 0;
        struct gfs2_block_query q = {0};
        struct block_count *bc = (struct block_count *) private;
-       uint64_t block;
 
        /* This inode contains an eattr - it may be invalid, but the
         * eattr attributes points to a non-zero block */
@@ -167,23 +166,27 @@
                ret = 1;
        }
        else {
-               log_debug("Setting %" PRIu64 " (0x%"
-                         PRIx64 ") to eattr block\n", indirect, indirect);
-               gfs2_block_set(bl, indirect, gfs2_eattr_block);
+               log_debug("Marking inode %" PRIu64 " (0x%"
+                         PRIx64 ") with eattr block\n",
+                         ip->i_di.di_num.no_addr, ip->i_di.di_num.no_addr);
+               /* Mark the inode as having an eattr in the block map
+                  so pass1c can check it. */
+               gfs2_block_mark(bl, ip->i_di.di_num.no_addr, gfs2_eattr_block);
 
                *bh = bread(sdp, indirect);
-               block = be64_to_cpu(*(*bh)->b_data);
                if(gfs2_check_meta(*bh, GFS2_METATYPE_IN)) {
                        log_warn("EA indirect block %" PRIu64 " (0x%" PRIx64
-                                        ") has incorrect type.\n", block, 
block);
-                       gfs2_block_set(bl, block, gfs2_meta_inval);
+                                ") has incorrect type.\n",
+                                indirect, indirect);
+                       gfs2_block_set(bl, indirect, gfs2_meta_inval);
                        ret = 1;
+                       brelse(*bh, not_updated);
                }
                else {
                        /* FIXME: do i need to differentiate this as an 
ea_indir? */
                        log_debug("Setting %" PRIu64 " (0x%" PRIx64
-                                         ") to indirect block\n", block, 
block);
-                       gfs2_block_set(bl, block, gfs2_indir_blk);
+                                 ") to indirect block\n", indirect, indirect);
+                       gfs2_block_set(bl, indirect, gfs2_indir_blk);
                        bc->ea_count++;
                }
        }
@@ -293,6 +296,7 @@
                                 ip->i_di.di_num.no_addr);
                        gfs2_block_set(bl, block, gfs2_meta_inval);
                        ret = -1;
+                       brelse(leaf_bh, not_updated);
                }
                else {
                        log_debug("Setting block %" PRIu64 " (0x%" PRIx64
@@ -300,7 +304,6 @@
                        gfs2_block_set(bl, block, gfs2_meta_eattr);
                        bc->ea_count++;
                }
-               brelse(leaf_bh, not_updated);
        }
        *bh = leaf_bh;
 
--- cluster/gfs2/fsck/pass1c.c  2007/09/18 18:14:27     1.4.2.3
+++ cluster/gfs2/fsck/pass1c.c  2007/11/16 23:22:23     1.4.2.4
@@ -77,7 +77,6 @@
        int *update = (int *) private;
        struct gfs2_sbd *sbp = ip->i_sbd;
        struct gfs2_block_query q;
-       struct gfs2_buffer_head *leaf_bh;
 
        if(gfs2_check_range(sbp, block)) {
                log_err("Extended attributes block out of range...removing\n");
@@ -96,9 +95,8 @@
                return 1;
        }
        else 
-               leaf_bh = bread(sbp, block);
+               *bh = bread(sbp, block);
 
-       *bh = leaf_bh;
        return 0;
 }
 
@@ -237,24 +235,28 @@
 
                if (skip_this_pass || fsck_abort) /* if asked to skip the rest 
*/
                        return 0;
-               log_info("EA in inode %"PRIu64" (0x%" PRIx64 ")\n", block_no,
-                                block_no);
                bh = bread(sbp, block_no);
-               ip = inode_get(sbp, bh);
+               if (gfs2_check_meta(bh, GFS2_METATYPE_IN)) { /* if a dinode */
+                       log_info("EA in inode %"PRIu64" (0x%" PRIx64 ")\n",
+                                block_no, block_no);
+                       gfs2_block_clear(bl, block_no, gfs2_eattr_block);
+                       ip = inode_get(sbp, bh);
 
-               log_debug("Found eattr at %"PRIu64" (0x%" PRIx64 ")\n",
+                       log_debug("Found eattr at %"PRIu64" (0x%" PRIx64 ")\n",
                                  ip->i_di.di_eattr, ip->i_di.di_eattr);
-               /* FIXME: Handle walking the eattr here */
-               error = check_inode_eattr(ip, &pass1c_fxns);
-               if(error < 0) {
-                       stack;
-                       return -1;
-               }
+                       /* FIXME: Handle walking the eattr here */
+                       error = check_inode_eattr(ip, &pass1c_fxns);
+                       if(error < 0) {
+                               stack;
+                               brelse(bh, not_updated);
+                               return -1;
+                       }
 
-               if(update)
-                       gfs2_dinode_out(&ip->i_di, bh->b_data);
+                       if(update)
+                               gfs2_dinode_out(&ip->i_di, bh->b_data);
 
-               free(ip);
+                       free(ip);
+               }
                brelse(bh, update);
 
                block_no++;
--- cluster/gfs2/fsck/pass2.c   2007/09/18 18:14:27     1.4.2.5
+++ cluster/gfs2/fsck/pass2.c   2007/11/16 23:22:23     1.4.2.6
@@ -89,18 +89,13 @@
 static int check_eattr_indir(struct gfs2_inode *ip, uint64_t block,
                            uint64_t parent, struct gfs2_buffer_head **bh, void 
*private)
 {
-
+       *bh = bread(ip->i_sbd, block);
        return 0;
 }
 static int check_eattr_leaf(struct gfs2_inode *ip, uint64_t block,
                            uint64_t parent, struct gfs2_buffer_head **bh, void 
*private)
 {
-#if 0
-       struct gfs2_buffer_head *leaf_bh;
-
-       leaf_bh = bread(ip->i_sbd, block);
-       brelse(leaf_bh);
-#endif
+       *bh = bread(ip->i_sbd, block);
        return 0;
 }
 
--- cluster/gfs2/fsck/pass5.c   2007/06/28 23:42:45     1.3.2.2
+++ cluster/gfs2/fsck/pass5.c   2007/11/16 23:22:23     1.3.2.3
@@ -81,7 +81,6 @@
        while(byte < end) {
                rg_status = ((*byte >> bit) & GFS2_BIT_MASK);
                block = rg_data + *rg_block;
-               log_debug("Checking block %" PRIu64 "\n", block);
                warm_fuzzy_stuff(block);
                if (skip_this_pass || fsck_abort) /* if asked to skip the rest 
*/
                        return 0;

Reply via email to