* [Cluster-devel] cluster/gfs2/fsck metawalk.c pass1.c pass1c.c ...
@ 2007-11-16 23:21 rpeterso
0 siblings, 0 replies; 2+ messages in thread
From: rpeterso @ 2007-11-16 23:21 UTC (permalink / raw)
To: cluster-devel.redhat.com
CVSROOT: /cvs/cluster
Module name: cluster
Changes by: rpeterso at sourceware.org 2007-11-16 23:21:30
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&r1=1.13&r2=1.14
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/fsck/pass1.c.diff?cvsroot=cluster&r1=1.11&r2=1.12
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/fsck/pass1c.c.diff?cvsroot=cluster&r1=1.7&r2=1.8
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/fsck/pass2.c.diff?cvsroot=cluster&r1=1.9&r2=1.10
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/fsck/pass5.c.diff?cvsroot=cluster&r1=1.5&r2=1.6
--- cluster/gfs2/fsck/metawalk.c 2007/09/18 18:14:04 1.13
+++ cluster/gfs2/fsck/metawalk.c 2007/11/16 23:21:30 1.14
@@ -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/09/18 18:14:04 1.11
+++ cluster/gfs2/fsck/pass1.c 2007/11/16 23:21:30 1.12
@@ -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:04 1.7
+++ cluster/gfs2/fsck/pass1c.c 2007/11/16 23:21:30 1.8
@@ -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:04 1.9
+++ cluster/gfs2/fsck/pass2.c 2007/11/16 23:21:30 1.10
@@ -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:41:37 1.5
+++ cluster/gfs2/fsck/pass5.c 2007/11/16 23:21:30 1.6
@@ -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;
^ permalink raw reply [flat|nested] 2+ messages in thread
* [Cluster-devel] cluster/gfs2/fsck metawalk.c pass1.c pass1c.c ...
@ 2007-11-16 23:22 rpeterso
0 siblings, 0 replies; 2+ messages in thread
From: rpeterso @ 2007-11-16 23:22 UTC (permalink / raw)
To: cluster-devel.redhat.com
CVSROOT: /cvs/cluster
Module name: cluster
Branch: RHEL5
Changes by: rpeterso at sourceware.org 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;
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2007-11-16 23:22 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-11-16 23:21 [Cluster-devel] cluster/gfs2/fsck metawalk.c pass1.c pass1c.c rpeterso
-- strict thread matches above, loose matches on Subject: below --
2007-11-16 23:22 rpeterso
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).