cluster: RHEL6 - rgmanager: Fix uninitialized variable
by Lon Hohberger
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=...
Commit: 3a113c9b3b60f2a18a3b653b83edac5c89074af7
Parent: c899e38f3dd412dd2f8263a301805312f54fbb60
Author: Lon Hohberger <lhh(a)redhat.com>
AuthorDate: Tue Sep 6 15:41:03 2011 -0400
Committer: Lon Hohberger <lhh(a)redhat.com>
CommitterDate: Wed Sep 7 10:55:42 2011 -0400
rgmanager: Fix uninitialized variable
Resolves: rhbz#734730
Signed-off-by: Lon Hohberger <lhh(a)redhat.com>
Reviewed-by: Fabio M. Di Nitto <fdinitto(a)redhat.com>
---
rgmanager/src/daemons/main.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/rgmanager/src/daemons/main.c b/rgmanager/src/daemons/main.c
index 38c7007..94047c3 100644
--- a/rgmanager/src/daemons/main.c
+++ b/rgmanager/src/daemons/main.c
@@ -798,7 +798,7 @@ rgmanager_disabled(int ccsfd)
{
char *v;
int disabled = 0;
- int internal;
+ int internal = 0;
if (ccsfd < 0) {
internal = 1;
12 years, 7 months
cluster: STABLE31 - rgmanager: Resolve rare deadlock
by Lon Hohberger
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=...
Commit: cebf9e1fc3fb524223f49382c43ac2044d69c3be
Parent: 37ec5dcb9a71a60bfda5a8653ec42b2626a59eb9
Author: Lon Hohberger <lhh(a)redhat.com>
AuthorDate: Tue Sep 6 15:42:41 2011 -0400
Committer: Lon Hohberger <lhh(a)redhat.com>
CommitterDate: Tue Sep 6 15:42:41 2011 -0400
rgmanager: Resolve rare deadlock
In very rare cases, it was possible to fill up a pipe used for
IPC between threads during reconfiguration, causing a deadlock.
This patch resolves the issue.
Signed-off-by: Lon Hohberger <lhh(a)redhat.com>
---
rgmanager/src/daemons/groups.c | 2 --
1 files changed, 0 insertions(+), 2 deletions(-)
diff --git a/rgmanager/src/daemons/groups.c b/rgmanager/src/daemons/groups.c
index 276009d..c4929e4 100644
--- a/rgmanager/src/daemons/groups.c
+++ b/rgmanager/src/daemons/groups.c
@@ -1709,8 +1709,6 @@ init_resource_groups(int reconfigure, int do_init)
free(val);
}
- /* Wait for any pending requests */
- rg_wait_threads();
/* Block operations that would break during configuration
changes */
rg_clear_initialized(FL_CONFIG);
12 years, 7 months
cluster: STABLE31 - rgmanager: Fix uninitialized variable
by Lon Hohberger
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=...
Commit: 37ec5dcb9a71a60bfda5a8653ec42b2626a59eb9
Parent: 4d0d4354647bd7ca96a46e2af9319cd1da78fa26
Author: Lon Hohberger <lhh(a)redhat.com>
AuthorDate: Tue Sep 6 15:41:03 2011 -0400
Committer: Lon Hohberger <lhh(a)redhat.com>
CommitterDate: Tue Sep 6 15:41:03 2011 -0400
rgmanager: Fix uninitialized variable
Resolves: rhbz#734730
Signed-off-by: Lon Hohberger <lhh(a)redhat.com>
---
rgmanager/src/daemons/main.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/rgmanager/src/daemons/main.c b/rgmanager/src/daemons/main.c
index 4e12c68..931d95e 100644
--- a/rgmanager/src/daemons/main.c
+++ b/rgmanager/src/daemons/main.c
@@ -802,7 +802,7 @@ rgmanager_disabled(int ccsfd)
{
char *v;
int disabled = 0;
- int internal;
+ int internal = 0;
if (ccsfd < 0) {
internal = 1;
12 years, 7 months
cluster: STABLE31 - rgmanager: Mark services on dead nodes as stopped
by Lon Hohberger
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=...
Commit: 4d0d4354647bd7ca96a46e2af9319cd1da78fa26
Parent: 3a796d7d5cce3c76ed145040a56e1bc445e70f83
Author: Lon Hohberger <lhh(a)redhat.com>
AuthorDate: Thu Aug 11 10:39:04 2011 -0400
Committer: Lon Hohberger <lhh(a)redhat.com>
CommitterDate: Tue Sep 6 15:40:16 2011 -0400
rgmanager: Mark services on dead nodes as stopped
Cleans up clustat reporting and avoids a race.
Signed-off-by: Lon Hohberger <lhh(a)redhat.com>
---
rgmanager/src/daemons/groups.c | 26 ++++++++++++++++++++++++++
1 files changed, 26 insertions(+), 0 deletions(-)
diff --git a/rgmanager/src/daemons/groups.c b/rgmanager/src/daemons/groups.c
index e9413cd..276009d 100644
--- a/rgmanager/src/daemons/groups.c
+++ b/rgmanager/src/daemons/groups.c
@@ -723,6 +723,32 @@ eval_groups(int local, uint32_t nodeid, int nodeStatus)
continue;
}
+ /* Mark the service as stopped if applicable */
+ if ((svcStatus.rs_owner == nodeid && !nodeStatus) &&
+ (svcStatus.rs_state == RG_STATE_STARTED ||
+ svcStatus.rs_state == RG_STATE_RECOVER ||
+ svcStatus.rs_state == RG_STATE_STARTING ||
+ svcStatus.rs_state == RG_STATE_STOPPING )) {
+
+ logt_print(LOG_DEBUG,
+ "Marking %s on down member %d as stopped",
+ svcName, nodeid);
+
+ svcStatus.rs_last_owner = svcStatus.rs_owner;
+ svcStatus.rs_state = RG_STATE_STOPPED;
+ svcStatus.rs_owner = 0;
+ svcStatus.rs_transition = (uint64_t)time(NULL);
+ svcStatus.rs_flags = 0;
+
+ if (set_rg_state(svcName, &svcStatus) != 0) {
+ logt_print(LOG_ERR, "Failed to update state"
+ " of %s during recovery; cannot "
+ "fail over", svcName);
+ rg_unlock(&lockp);
+ continue;
+ }
+ }
+
rg_unlock(&lockp);
if (svcStatus.rs_owner == 0)
12 years, 7 months
gfs2-utils: master - libgfs2: Fix null pointer dereference in linked_leaf_search
by Andrew Price
Gitweb: http://git.fedorahosted.org/git/gfs2-utils.git?p=gfs2-utils.git;a=commitd...
Commit: 35a6232630c764fb1c33e0a28fdc8edf556aa9d8
Parent: 355e6e070ed0763312bf3ac149ac8ab021e9d7c3
Author: Andrew Price <anprice(a)redhat.com>
AuthorDate: Tue Sep 6 17:29:07 2011 +0100
Committer: Andrew Price <anprice(a)redhat.com>
CommitterDate: Tue Sep 6 17:29:07 2011 +0100
libgfs2: Fix null pointer dereference in linked_leaf_search
Fix a null pointer dereference by checking the value of the bh set by
get_first_leaf(). Looking down the call tree the bh is set to NULL when
__bread fails to allocate memory so we can use errno as the return value
here.
Signed-off-by: Andrew Price <anprice(a)redhat.com>
---
gfs2/libgfs2/fs_ops.c | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)
diff --git a/gfs2/libgfs2/fs_ops.c b/gfs2/libgfs2/fs_ops.c
index d344bc4..ecd54ca 100644
--- a/gfs2/libgfs2/fs_ops.c
+++ b/gfs2/libgfs2/fs_ops.c
@@ -1510,6 +1510,8 @@ static int linked_leaf_search(struct gfs2_inode *dip, const char *filename,
error = get_first_leaf(dip, lindex, &bh_next);
if (error)
return error;
+ if (bh_next == NULL)
+ return errno;
/* Find the entry */
do{
12 years, 7 months
gfs2-utils: master - fsck.gfs2: Add return code checks and initializations
by Bob Peterson
Gitweb: http://git.fedorahosted.org/git/gfs2-utils.git?p=gfs2-utils.git;a=commitd...
Commit: 355e6e070ed0763312bf3ac149ac8ab021e9d7c3
Parent: 3406d7e9c36f2ecab9dbceefbacb9f8d0ff430db
Author: Bob Peterson <rpeterso(a)redhat.com>
AuthorDate: Tue Sep 6 08:07:55 2011 -0500
Committer: Bob Peterson <rpeterso(a)redhat.com>
CommitterDate: Tue Sep 6 08:07:55 2011 -0500
fsck.gfs2: Add return code checks and initializations
This patch fixes several problems detected by the coverity
tool whereby variables could be accessed without being
initialized, and where return codes should be checked and
were not.
rhbz#675723
---
gfs2/fsck/fs_recovery.c | 9 +++++++++
gfs2/fsck/initialize.c | 29 +++++++++++++++++++++--------
gfs2/fsck/metawalk.c | 9 ++++++---
gfs2/fsck/pass1.c | 19 +++++++++++++------
gfs2/fsck/pass1b.c | 2 +-
gfs2/fsck/pass2.c | 2 +-
gfs2/fsck/pass5.c | 24 +++++++++++++++++++-----
7 files changed, 70 insertions(+), 24 deletions(-)
diff --git a/gfs2/fsck/fs_recovery.c b/gfs2/fsck/fs_recovery.c
index 7bee86a..8c3062b 100644
--- a/gfs2/fsck/fs_recovery.c
+++ b/gfs2/fsck/fs_recovery.c
@@ -127,6 +127,10 @@ static int buf_lo_scan_elements(struct gfs2_inode *ip, unsigned int start,
(unsigned long long)blkno, (unsigned long long)blkno,
start);
bh_ip = bget(sdp, blkno);
+ if (!bh_ip) {
+ log_err(_("Out of memory when replaying journals.\n"));
+ return FSCK_ERROR;
+ }
memcpy(bh_ip->b_data, bh_log->b_data, sdp->bsize);
check_magic = ((struct gfs2_meta_header *)
@@ -235,6 +239,10 @@ static int databuf_lo_scan_elements(struct gfs2_inode *ip, unsigned int start,
(unsigned long long)blkno, (unsigned long long)blkno,
start);
bh_ip = bget(sdp, blkno);
+ if (!bh_ip) {
+ log_err(_("Out of memory when replaying journals.\n"));
+ return FSCK_ERROR;
+ }
memcpy(bh_ip->b_data, bh_log->b_data, sdp->bsize);
/* Unescape */
@@ -359,6 +367,7 @@ static int fix_journal_seq_no(struct gfs2_inode *ip)
uint32_t extlen;
struct gfs2_buffer_head *bh;
+ memset(&lh, 0, sizeof(lh));
for (blk = 0; blk < jd_blocks; blk++) {
error = get_log_header(ip, blk, &lh);
if (error == 1) /* if not a log header */
diff --git a/gfs2/fsck/initialize.c b/gfs2/fsck/initialize.c
index 3483560..ba0df41 100644
--- a/gfs2/fsck/initialize.c
+++ b/gfs2/fsck/initialize.c
@@ -597,7 +597,7 @@ static int fetch_rgrps(struct gfs2_sbd *sdp)
*/
static int init_system_inodes(struct gfs2_sbd *sdp)
{
- uint64_t inumbuf;
+ uint64_t inumbuf = 0;
char *buf;
struct gfs2_statfs_change sc;
uint64_t addl_mem_needed;
@@ -644,8 +644,13 @@ static int init_system_inodes(struct gfs2_sbd *sdp)
}
}
/* Read inum entry into buffer */
- gfs2_readi(sdp->md.inum, &inumbuf, 0,
- sdp->md.inum->i_di.di_size);
+ err = gfs2_readi(sdp->md.inum, &inumbuf, 0,
+ sdp->md.inum->i_di.di_size);
+ if (err != sdp->md.inum->i_di.di_size) {
+ log_crit(_("Error %d reading system inum inode. "
+ "Aborting.\n"), err);
+ goto fail;
+ }
/* call gfs2_inum_range_in() to retrieve range */
sdp->md.next_inum = be64_to_cpu(inumbuf);
}
@@ -678,8 +683,13 @@ static int init_system_inodes(struct gfs2_sbd *sdp)
if (sdp->md.statfs->i_di.di_size) {
buf = malloc(sdp->md.statfs->i_di.di_size);
if (buf) {
- gfs2_readi(sdp->md.statfs, buf, 0,
- sdp->md.statfs->i_di.di_size);
+ err = gfs2_readi(sdp->md.statfs, buf, 0,
+ sdp->md.statfs->i_di.di_size);
+ if (err != sdp->md.statfs->i_di.di_size) {
+ log_crit(_("Error %d reading statfs file. "
+ "Aborting.\n"), err);
+ goto fail;
+ }
/* call gfs2_inum_range_in() to retrieve range */
gfs2_statfs_change_in(&sc, buf);
free(buf);
@@ -1305,14 +1315,17 @@ static int reconstruct_single_journal(struct gfs2_sbd *sdp, int jnum,
*/
static int reconstruct_journals(struct gfs2_sbd *sdp)
{
- int i;
+ int i, count;
struct gfs_jindex ji;
char buf[sizeof(struct gfs_jindex)];
log_err("Clearing GFS journals (this may take a while)\n");
for (i = 0; i < sdp->md.journals; i++) {
- gfs2_readi(sdp->md.jiinode, buf, i * sizeof(struct gfs_jindex),
- sizeof(struct gfs_jindex));
+ count = gfs2_readi(sdp->md.jiinode, buf,
+ i * sizeof(struct gfs_jindex),
+ sizeof(struct gfs_jindex));
+ if (count != sizeof(struct gfs_jindex))
+ return 0;
gfs_jindex_in(&ji, buf);
if ((i % 2) == 0)
log_err(".");
diff --git a/gfs2/fsck/metawalk.c b/gfs2/fsck/metawalk.c
index 7adf73d..ef7f05d 100644
--- a/gfs2/fsck/metawalk.c
+++ b/gfs2/fsck/metawalk.c
@@ -1534,7 +1534,8 @@ static int alloc_metalist(struct gfs2_inode *ip, uint64_t block,
after the bitmap has been set but before the blockmap has. */
*bh = bread(ip->i_sbd, block);
q = block_type(block);
- if (blockmap_to_bitmap(q, ip->i_sbd->gfs1) == GFS2_BLKST_FREE) {
+ if (q < 0 ||
+ blockmap_to_bitmap(q, ip->i_sbd->gfs1) == GFS2_BLKST_FREE) {
log_debug(_("%s reference to new metadata block "
"%lld (0x%llx) is now marked as indirect.\n"),
desc, (unsigned long long)block,
@@ -1553,7 +1554,8 @@ static int alloc_data(struct gfs2_inode *ip, uint64_t block, void *private)
/* We can't check the bitmap here because this function is called
after the bitmap has been set but before the blockmap has. */
q = block_type(block);
- if (blockmap_to_bitmap(q, ip->i_sbd->gfs1) == GFS2_BLKST_FREE) {
+ if (q < 0 ||
+ blockmap_to_bitmap(q, ip->i_sbd->gfs1) == GFS2_BLKST_FREE) {
log_debug(_("%s reference to new data block "
"%lld (0x%llx) is now marked as data.\n"),
desc, (unsigned long long)block,
@@ -1571,7 +1573,8 @@ static int alloc_leaf(struct gfs2_inode *ip, uint64_t block, void *private)
/* We can't check the bitmap here because this function is called
after the bitmap has been set but before the blockmap has. */
q = block_type(block);
- if (blockmap_to_bitmap(q, ip->i_sbd->gfs1) == GFS2_BLKST_FREE)
+ if (q < 0 ||
+ blockmap_to_bitmap(q, ip->i_sbd->gfs1) == GFS2_BLKST_FREE)
fsck_blockmap_set(ip, block, _("newly allocated leaf"),
gfs2_leaf_blk);
return 0;
diff --git a/gfs2/fsck/pass1.c b/gfs2/fsck/pass1.c
index 60b82d0..18757fe 100644
--- a/gfs2/fsck/pass1.c
+++ b/gfs2/fsck/pass1.c
@@ -1328,7 +1328,7 @@ static int check_system_inode(struct gfs2_sbd *sdp,
{
uint64_t iblock = 0;
struct dir_status ds = {0};
- int error;
+ int error, err = 0;
log_info( _("Checking system inode '%s'\n"), filename);
if (*sysinode) {
@@ -1403,12 +1403,19 @@ static int check_system_inode(struct gfs2_sbd *sdp,
sysdir_fxns.private = &bc;
if ((*sysinode)->i_di.di_flags & GFS2_DIF_EXHASH)
check_metatree(*sysinode, &sysdir_fxns);
- else
- check_linear_dir(*sysinode, (*sysinode)->i_bh,
- &sysdir_fxns);
+ else {
+ err = check_linear_dir(*sysinode, (*sysinode)->i_bh,
+ &sysdir_fxns);
+ /* If we encountered an error in our directory check
+ we should still call handle_ip, but return the
+ error later. */
+ if (err)
+ log_err(_("Error found in %s while checking "
+ "directory entries.\n"), filename);
+ }
}
error = handle_ip(sdp, *sysinode);
- return error;
+ return error ? error : err;
}
static int build_a_journal(struct gfs2_sbd *sdp)
@@ -1540,7 +1547,7 @@ int pass1(struct gfs2_sbd *sdp)
{
struct osi_node *n, *next = NULL;
struct gfs2_buffer_head *bh;
- uint64_t block;
+ uint64_t block = 0;
struct rgrp_tree *rgd;
int first;
uint64_t i;
diff --git a/gfs2/fsck/pass1b.c b/gfs2/fsck/pass1b.c
index ae6d45c..1879cc4 100644
--- a/gfs2/fsck/pass1b.c
+++ b/gfs2/fsck/pass1b.c
@@ -701,7 +701,7 @@ static int handle_dup_blk(struct gfs2_sbd *sdp, struct duptree *b)
ip = fsck_load_inode(sdp, id->block_no);
q = block_type(id->block_no);
- if (q == gfs2_inode_invalid) {
+ if (q < 0 || q == gfs2_inode_invalid) {
log_debug( _("The remaining reference inode %lld "
"(0x%llx) is marked invalid: Marking "
"the block as free.\n"),
diff --git a/gfs2/fsck/pass2.c b/gfs2/fsck/pass2.c
index d89dd4f..8562b6a 100644
--- a/gfs2/fsck/pass2.c
+++ b/gfs2/fsck/pass2.c
@@ -328,7 +328,7 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
* 2. Blocks marked "bad" need to have their entire
* metadata tree deleted.
*/
- if (q == gfs2_inode_invalid || q == gfs2_bad_block) {
+ if (q < 0 || q == gfs2_inode_invalid || q == gfs2_bad_block) {
/* This entry's inode has bad blocks in it */
/* Handle bad blocks */
diff --git a/gfs2/fsck/pass5.c b/gfs2/fsck/pass5.c
index 340df20..cb18b5a 100644
--- a/gfs2/fsck/pass5.c
+++ b/gfs2/fsck/pass5.c
@@ -99,14 +99,14 @@ static int gfs2_convert_mark(uint8_t q, uint32_t *count)
return -1;
}
-
static int check_block_status(struct gfs2_sbd *sdp, char *buffer,
unsigned int buflen, uint64_t *rg_block,
uint64_t rg_data, uint32_t *count)
{
unsigned char *byte, *end;
unsigned int bit;
- unsigned char rg_status, block_status;
+ unsigned char rg_status;
+ int block_status;
uint8_t q;
uint64_t block;
@@ -121,13 +121,26 @@ static int check_block_status(struct gfs2_sbd *sdp, char *buffer,
warm_fuzzy_stuff(block);
if (skip_this_pass || fsck_abort) /* if asked to skip the rest */
return 0;
+
q = block_type(block);
+ if (q < 0) {
+ log_err( _("Invalid block type for block #%llu "
+ "(0x%llx)\n"), (unsigned long long)block,
+ (unsigned long long)block);
+ return q;
+ }
if (sdp->gfs1)
block_status = gfs1_convert_mark(q, count);
else
block_status = gfs2_convert_mark(q, count);
+ if (block_status < 0) {
+ log_err( _("Invalid status for block %llu (0x%llx).\n"),
+ (unsigned long long)block,
+ (unsigned long long)block);
+ return block_status;
+ }
/* If one node opens a file and another node deletes it, we
may be left with a block that appears to be "unlinked" in
the bitmap, but nothing links to it. This is a valid case
@@ -208,9 +221,10 @@ static void update_rgrp(struct gfs2_sbd *sdp, struct rgrp_tree *rgp,
bits = &rgp->bits[i];
/* update the bitmaps */
- check_block_status(sdp, rgp->bh[i]->b_data + bits->bi_offset,
- bits->bi_len, &rg_block, rgp->ri.ri_data0,
- count);
+ if (check_block_status(sdp, rgp->bh[i]->b_data +
+ bits->bi_offset, bits->bi_len,
+ &rg_block, rgp->ri.ri_data0, count))
+ return;
if (skip_this_pass || fsck_abort) /* if asked to skip the rest */
return;
}
12 years, 8 months
gfs2-utils: master - fsck.gfs2: Fix memory leak in initialize.c
by Bob Peterson
Gitweb: http://git.fedorahosted.org/git/gfs2-utils.git?p=gfs2-utils.git;a=commitd...
Commit: 3406d7e9c36f2ecab9dbceefbacb9f8d0ff430db
Parent: b69562137b9b3243a949fe6baf3941b57a050844
Author: Bob Peterson <rpeterso(a)redhat.com>
AuthorDate: Tue Sep 6 08:02:30 2011 -0500
Committer: Bob Peterson <rpeterso(a)redhat.com>
CommitterDate: Tue Sep 6 08:02:30 2011 -0500
fsck.gfs2: Fix memory leak in initialize.c
This patch fixes a memory leak whereby dinodes were not being freed
under certain conditions.
rhbz#675723
---
gfs2/fsck/initialize.c | 25 ++++++++++++++++---------
1 files changed, 16 insertions(+), 9 deletions(-)
diff --git a/gfs2/fsck/initialize.c b/gfs2/fsck/initialize.c
index 77dd72a..3483560 100644
--- a/gfs2/fsck/initialize.c
+++ b/gfs2/fsck/initialize.c
@@ -831,7 +831,7 @@ static void peruse_system_dinode(struct gfs2_sbd *sdp, struct gfs2_dinode *di,
(sdp->gfs1 && (di->di_flags & GFS2_DIF_JDATA) &&
(di->di_size % sizeof(struct gfs_jindex) == 0))) {
if (fix_md.jiinode || is_journal_copy(ip, bh))
- return;
+ goto out_discard_ip;
log_warn(_("Found system jindex file at: 0x%llx\n"),
di->di_num.no_addr);
fix_md.jiinode = ip;
@@ -840,8 +840,10 @@ static void peruse_system_dinode(struct gfs2_sbd *sdp, struct gfs2_dinode *di,
jindex: master */
gfs2_lookupi(ip, "jindex", 6, &child_ip);
if (child_ip) {
- if (fix_md.jiinode || is_journal_copy(ip, bh))
- return;
+ if (fix_md.jiinode || is_journal_copy(ip, bh)) {
+ inode_put(&child_ip);
+ goto out_discard_ip;
+ }
fix_md.jiinode = child_ip;
sdp->sd_sb.sb_master_dir.no_addr = di->di_num.no_addr;
log_warn(_("Found system master directory at: "
@@ -853,8 +855,9 @@ static void peruse_system_dinode(struct gfs2_sbd *sdp, struct gfs2_dinode *di,
has a statfs_change: per_node, and its .. will be master. */
gfs2_lookupi(ip, "statfs_change0", 14, &child_ip);
if (child_ip) {
+ inode_put(&child_ip);
if (fix_md.pinode || is_journal_copy(ip, bh))
- return;
+ goto out_discard_ip;
log_warn(_("Found system per_node directory at: "
"0x%llx\n"), ip->i_di.di_num.no_addr);
fix_md.pinode = ip;
@@ -870,22 +873,22 @@ static void peruse_system_dinode(struct gfs2_sbd *sdp, struct gfs2_dinode *di,
}
log_debug(_("Unknown system directory at block 0x%llx\n"),
di->di_num.no_addr);
- inode_put(&ip);
+ goto out_discard_ip;
} else if (!sdp->gfs1 && di->di_size == 8) {
if (fix_md.inum || is_journal_copy(ip, bh))
- return;
+ goto out_discard_ip;
fix_md.inum = ip;
log_warn(_("Found system inum file at: 0x%llx\n"),
di->di_num.no_addr);
} else if (di->di_size == 24) {
if (fix_md.statfs || is_journal_copy(ip, bh))
- return;
+ goto out_discard_ip;
fix_md.statfs = ip;
log_warn(_("Found system statfs file at: 0x%llx\n"),
di->di_num.no_addr);
} else if ((di->di_size % 96) == 0) {
if (fix_md.riinode || is_journal_copy(ip, bh))
- return;
+ goto out_discard_ip;
fix_md.riinode = ip;
log_warn(_("Found system rindex file at: 0x%llx\n"),
di->di_num.no_addr);
@@ -893,11 +896,15 @@ static void peruse_system_dinode(struct gfs2_sbd *sdp, struct gfs2_dinode *di,
di->di_num.no_formal_ino >= 12 &&
di->di_num.no_formal_ino <= 100) {
if (is_journal_copy(ip, bh))
- return;
+ goto out_discard_ip;
fix_md.qinode = ip;
log_warn(_("Found system quota file at: 0x%llx\n"),
di->di_num.no_addr);
}
+ return;
+
+out_discard_ip:
+ inode_put(&ip);
}
/**
12 years, 8 months
gfs2-utils: master - fsck.gfs2: Don't use strerror for libgfs2 errors
by Bob Peterson
Gitweb: http://git.fedorahosted.org/git/gfs2-utils.git?p=gfs2-utils.git;a=commitd...
Commit: b69562137b9b3243a949fe6baf3941b57a050844
Parent: 84fcd36e09ab7799fa28e055893b5daa60dad09a
Author: Bob Peterson <rpeterso(a)redhat.com>
AuthorDate: Tue Sep 6 07:52:31 2011 -0500
Committer: Bob Peterson <rpeterso(a)redhat.com>
CommitterDate: Tue Sep 6 08:01:43 2011 -0500
fsck.gfs2: Don't use strerror for libgfs2 errors
This patch removes the calls to strerror from initialize.c.
The errors returned by libgfs2 currently don't conform to system
errors. For example, they can return positive or negative numbers.
Therefore, strerror could segfault or give nonsense messages.
I hate numeric error messages as much as the next guy, but using
strerror won't work until we systematically go through libgfs2 and
make all the return codes conform to the rules strerror lives by.
rhbz#675723
---
gfs2/fsck/initialize.c | 51 ++++++++++++++++++++---------------------------
gfs2/fsck/pass1.c | 2 +-
2 files changed, 23 insertions(+), 30 deletions(-)
diff --git a/gfs2/fsck/initialize.c b/gfs2/fsck/initialize.c
index d715bad..77dd72a 100644
--- a/gfs2/fsck/initialize.c
+++ b/gfs2/fsck/initialize.c
@@ -375,14 +375,14 @@ static int rebuild_master(struct gfs2_sbd *sdp)
err = dir_add(sdp->master_dir, "jindex", 6, &inum,
IF2DT(S_IFDIR | 0700));
if (err) {
- log_crit(_("Error adding jindex directory: %s\n"), strerror(err));
+ log_crit(_("Error %d adding jindex directory\n"), err);
exit(FSCK_ERROR);
}
sdp->master_dir->i_di.di_nlink++;
} else {
err = build_jindex(sdp);
if (err) {
- log_crit(_("Error building jindex: %s\n"), strerror(err));
+ log_crit(_("Error %d building jindex\n"), err);
exit(FSCK_ERROR);
}
}
@@ -393,15 +393,16 @@ static int rebuild_master(struct gfs2_sbd *sdp)
err = dir_add(sdp->master_dir, "per_node", 8, &inum,
IF2DT(S_IFDIR | 0700));
if (err) {
- log_crit(_("Error adding per_node directory: %s\n"), strerror(err));
+ log_crit(_("Error %d adding per_node directory\n"),
+ err);
exit(FSCK_ERROR);
}
sdp->master_dir->i_di.di_nlink++;
} else {
err = build_per_node(sdp);
if (err) {
- log_crit(_("Error building per_node directory: %s\n"),
- strerror(err));
+ log_crit(_("Error %d building per_node directory\n"),
+ err);
exit(FSCK_ERROR);
}
}
@@ -412,14 +413,13 @@ static int rebuild_master(struct gfs2_sbd *sdp)
err = dir_add(sdp->master_dir, "inum", 4, &inum,
IF2DT(S_IFREG | 0600));
if (err) {
- log_crit(_("Error adding inum inode: %s\n"), strerror(err));
+ log_crit(_("Error %d adding inum inode\n"), err);
exit(FSCK_ERROR);
}
} else {
err = build_inum(sdp);
if (err) {
- log_crit(_("Error building inum inode: %s\n"),
- strerror(err));
+ log_crit(_("Error %d building inum inode\n"), err);
exit(FSCK_ERROR);
}
gfs2_lookupi(sdp->master_dir, "inum", 4, &sdp->md.inum);
@@ -431,14 +431,13 @@ static int rebuild_master(struct gfs2_sbd *sdp)
err = dir_add(sdp->master_dir, "statfs", 6, &inum,
IF2DT(S_IFREG | 0600));
if (err) {
- log_crit(_("Error adding statfs inode: %s\n"), strerror(err));
+ log_crit(_("Error %d adding statfs inode\n"), err);
exit(FSCK_ERROR);
}
} else {
err = build_statfs(sdp);
if (err) {
- log_crit(_("Error building statfs inode: %s\n"),
- strerror(err));
+ log_crit(_("Error %d building statfs inode\n"), err);
exit(FSCK_ERROR);
}
gfs2_lookupi(sdp->master_dir, "statfs", 6, &sdp->md.statfs);
@@ -450,14 +449,13 @@ static int rebuild_master(struct gfs2_sbd *sdp)
err = dir_add(sdp->master_dir, "rindex", 6, &inum,
IF2DT(S_IFREG | 0600));
if (err) {
- log_crit(_("Error adding rindex inode: %s\n"), strerror(err));
+ log_crit(_("Error %d adding rindex inode\n"), err);
exit(FSCK_ERROR);
}
} else {
err = build_rindex(sdp);
if (err) {
- log_crit(_("Error building rindex inode: %s\n"),
- strerror(err));
+ log_crit(_("Error %d building rindex inode\n"), err);
exit(FSCK_ERROR);
}
}
@@ -468,14 +466,13 @@ static int rebuild_master(struct gfs2_sbd *sdp)
err = dir_add(sdp->master_dir, "quota", 5, &inum,
IF2DT(S_IFREG | 0600));
if (err) {
- log_crit(_("Error adding quota inode: %s\n"), strerror(err));
+ log_crit(_("Error %d adding quota inode\n"), err);
exit(FSCK_ERROR);
}
} else {
err = build_quota(sdp);
if (err) {
- log_crit(_("Error building quota inode: %s\n"),
- strerror(err));
+ log_crit(_("Error %d building quota inode\n"), err);
exit(FSCK_ERROR);
}
}
@@ -521,8 +518,8 @@ static void lookup_per_node(struct gfs2_sbd *sdp, int allow_rebuild)
err = build_per_node(sdp);
if (err) {
- log_crit(_("Error rebuilding per_node directory: %s\n"),
- strerror(err));
+ log_crit(_("Error %d rebuilding per_node directory\n"),
+ err);
exit(FSCK_ERROR);
}
}
@@ -634,8 +631,8 @@ static int init_system_inodes(struct gfs2_sbd *sdp)
}
err = build_inum(sdp);
if (err) {
- log_crit(_("Error rebuilding inum inode: %s\n"),
- strerror(err));
+ log_crit(_("Error %d rebuilding inum inode\n"),
+ err);
exit(FSCK_ERROR);
}
gfs2_lookupi(sdp->master_dir, "inum", 4,
@@ -666,8 +663,7 @@ static int init_system_inodes(struct gfs2_sbd *sdp)
}
err = build_statfs(sdp);
if (err) {
- log_crit(_("Error rebuilding statfs inode: %s\n"),
- strerror(err));
+ log_crit(_("Error %d rebuilding statfs inode\n"), err);
exit(FSCK_ERROR);
}
gfs2_lookupi(sdp->master_dir, "statfs", 6, &sdp->md.statfs);
@@ -703,8 +699,7 @@ static int init_system_inodes(struct gfs2_sbd *sdp)
}
err = build_quota(sdp);
if (err) {
- log_crit(_("Error rebuilding quota inode: %s\n"),
- strerror(err));
+ log_crit(_("Error %d rebuilding quota inode\n"), err);
exit(FSCK_ERROR);
}
gfs2_lookupi(sdp->master_dir, "quota", 5, &sdp->md.qinode);
@@ -1342,8 +1337,7 @@ static int init_rindex(struct gfs2_sbd *sdp)
return -1;
}
if ((err = build_rindex(sdp))) {
- log_crit(_("Error rebuilding rindex: %s\n"),
- strerror(err));
+ log_crit(_("Error %d rebuilding rindex\n"), err);
return -1;
}
return 0;
@@ -1384,8 +1378,7 @@ static int init_jindex(struct gfs2_sbd *sdp)
/* Free rgrps read in earlier (re-read them later) */
gfs2_rgrp_free(&sdp->rgtree);
if (err) {
- log_crit(_("Error rebuilding jindex: %s\n"),
- strerror(err));
+ log_crit(_("Error %d rebuilding jindex\n"), err);
return err;
}
}
diff --git a/gfs2/fsck/pass1.c b/gfs2/fsck/pass1.c
index 0ed4e24..60b82d0 100644
--- a/gfs2/fsck/pass1.c
+++ b/gfs2/fsck/pass1.c
@@ -1422,7 +1422,7 @@ static int build_a_journal(struct gfs2_sbd *sdp)
/* Now rebuild it */
err = build_journal(sdp, sdp->md.journals, sdp->md.jiinode);
if (err) {
- log_crit(_("Error building journal: %s\n"), strerror(err));
+ log_crit(_("Error %d building journal\n"), err);
exit(FSCK_ERROR);
}
return 0;
12 years, 8 months
gfs2-utils: master - fsck.gfs2: Fix initialization error return codes
by Bob Peterson
Gitweb: http://git.fedorahosted.org/git/gfs2-utils.git?p=gfs2-utils.git;a=commitd...
Commit: 84fcd36e09ab7799fa28e055893b5daa60dad09a
Parent: 47c358c9c2ad12bd80df51a1620f6f93fbe26da9
Author: Bob Peterson <rpeterso(a)redhat.com>
AuthorDate: Tue Sep 6 07:44:39 2011 -0500
Committer: Bob Peterson <rpeterso(a)redhat.com>
CommitterDate: Tue Sep 6 07:44:39 2011 -0500
fsck.gfs2: Fix initialization error return codes
In initialize.c there are several places where it can exit with an error.
These places return with -1 where they should return the standard fsck
error FSCK_ERROR.
rhbz#675723
---
gfs2/fsck/initialize.c | 36 ++++++++++++++++++------------------
1 files changed, 18 insertions(+), 18 deletions(-)
diff --git a/gfs2/fsck/initialize.c b/gfs2/fsck/initialize.c
index 37d8b92..d715bad 100644
--- a/gfs2/fsck/initialize.c
+++ b/gfs2/fsck/initialize.c
@@ -376,14 +376,14 @@ static int rebuild_master(struct gfs2_sbd *sdp)
IF2DT(S_IFDIR | 0700));
if (err) {
log_crit(_("Error adding jindex directory: %s\n"), strerror(err));
- exit(-1);
+ exit(FSCK_ERROR);
}
sdp->master_dir->i_di.di_nlink++;
} else {
err = build_jindex(sdp);
if (err) {
log_crit(_("Error building jindex: %s\n"), strerror(err));
- exit(-1);
+ exit(FSCK_ERROR);
}
}
@@ -394,7 +394,7 @@ static int rebuild_master(struct gfs2_sbd *sdp)
IF2DT(S_IFDIR | 0700));
if (err) {
log_crit(_("Error adding per_node directory: %s\n"), strerror(err));
- exit(-1);
+ exit(FSCK_ERROR);
}
sdp->master_dir->i_di.di_nlink++;
} else {
@@ -402,7 +402,7 @@ static int rebuild_master(struct gfs2_sbd *sdp)
if (err) {
log_crit(_("Error building per_node directory: %s\n"),
strerror(err));
- exit(-1);
+ exit(FSCK_ERROR);
}
}
@@ -413,14 +413,14 @@ static int rebuild_master(struct gfs2_sbd *sdp)
IF2DT(S_IFREG | 0600));
if (err) {
log_crit(_("Error adding inum inode: %s\n"), strerror(err));
- exit(-1);
+ exit(FSCK_ERROR);
}
} else {
err = build_inum(sdp);
if (err) {
log_crit(_("Error building inum inode: %s\n"),
strerror(err));
- exit(-1);
+ exit(FSCK_ERROR);
}
gfs2_lookupi(sdp->master_dir, "inum", 4, &sdp->md.inum);
}
@@ -432,14 +432,14 @@ static int rebuild_master(struct gfs2_sbd *sdp)
IF2DT(S_IFREG | 0600));
if (err) {
log_crit(_("Error adding statfs inode: %s\n"), strerror(err));
- exit(-1);
+ exit(FSCK_ERROR);
}
} else {
err = build_statfs(sdp);
if (err) {
log_crit(_("Error building statfs inode: %s\n"),
strerror(err));
- exit(-1);
+ exit(FSCK_ERROR);
}
gfs2_lookupi(sdp->master_dir, "statfs", 6, &sdp->md.statfs);
}
@@ -451,14 +451,14 @@ static int rebuild_master(struct gfs2_sbd *sdp)
IF2DT(S_IFREG | 0600));
if (err) {
log_crit(_("Error adding rindex inode: %s\n"), strerror(err));
- exit(-1);
+ exit(FSCK_ERROR);
}
} else {
err = build_rindex(sdp);
if (err) {
log_crit(_("Error building rindex inode: %s\n"),
strerror(err));
- exit(-1);
+ exit(FSCK_ERROR);
}
}
@@ -469,14 +469,14 @@ static int rebuild_master(struct gfs2_sbd *sdp)
IF2DT(S_IFREG | 0600));
if (err) {
log_crit(_("Error adding quota inode: %s\n"), strerror(err));
- exit(-1);
+ exit(FSCK_ERROR);
}
} else {
err = build_quota(sdp);
if (err) {
log_crit(_("Error building quota inode: %s\n"),
strerror(err));
- exit(-1);
+ exit(FSCK_ERROR);
}
}
@@ -523,13 +523,13 @@ static void lookup_per_node(struct gfs2_sbd *sdp, int allow_rebuild)
if (err) {
log_crit(_("Error rebuilding per_node directory: %s\n"),
strerror(err));
- exit(-1);
+ exit(FSCK_ERROR);
}
}
gfs2_lookupi(sdp->master_dir, "per_node", 8, &sdp->md.pinode);
if (!sdp->md.pinode) {
log_err( _("Unable to rebuild per_node; aborting.\n"));
- exit(-1);
+ exit(FSCK_ERROR);
}
}
@@ -636,7 +636,7 @@ static int init_system_inodes(struct gfs2_sbd *sdp)
if (err) {
log_crit(_("Error rebuilding inum inode: %s\n"),
strerror(err));
- exit(-1);
+ exit(FSCK_ERROR);
}
gfs2_lookupi(sdp->master_dir, "inum", 4,
&sdp->md.inum);
@@ -668,7 +668,7 @@ static int init_system_inodes(struct gfs2_sbd *sdp)
if (err) {
log_crit(_("Error rebuilding statfs inode: %s\n"),
strerror(err));
- exit(-1);
+ exit(FSCK_ERROR);
}
gfs2_lookupi(sdp->master_dir, "statfs", 6, &sdp->md.statfs);
if (!sdp->md.statfs) {
@@ -705,7 +705,7 @@ static int init_system_inodes(struct gfs2_sbd *sdp)
if (err) {
log_crit(_("Error rebuilding quota inode: %s\n"),
strerror(err));
- exit(-1);
+ exit(FSCK_ERROR);
}
gfs2_lookupi(sdp->master_dir, "quota", 5, &sdp->md.qinode);
if (!sdp->md.qinode) {
@@ -1213,7 +1213,7 @@ static int fill_super_block(struct gfs2_sbd *sdp)
if (compute_constants(sdp)) {
log_crit(_("Bad constants (1)\n"));
- exit(-1);
+ exit(FSCK_ERROR);
}
ret = read_sb(sdp, 1);
if (ret < 0) {
12 years, 8 months
gfs2-utils: master - fsck.gfs2: Rearrange block types to group all inode types
by Bob Peterson
Gitweb: http://git.fedorahosted.org/git/gfs2-utils.git?p=gfs2-utils.git;a=commitd...
Commit: 47c358c9c2ad12bd80df51a1620f6f93fbe26da9
Parent: 3b0d981b18e1d9c0126c80b14af2c922fe841465
Author: Bob Peterson <rpeterso(a)redhat.com>
AuthorDate: Tue Sep 6 07:31:55 2011 -0500
Committer: Bob Peterson <rpeterso(a)redhat.com>
CommitterDate: Tue Sep 6 07:31:55 2011 -0500
fsck.gfs2: Rearrange block types to group all inode types
This patch rearranges the declares in util.h such that all the inode
types are grouped together. There's a place in fsck.gfs2 that checks
whether a block is an inode by checking the range of block types.
But that's only valid if they are all grouped together. Since a
previous patch put GFS journaled data blocks in the range, they could
mistakenly pass that test and be treated as an inode for that test.
I never saw an error resulting from this mistake, but I'm fixing it
anyway.
rhbz#675723
---
gfs2/fsck/util.h | 22 ++++++++++++----------
1 files changed, 12 insertions(+), 10 deletions(-)
diff --git a/gfs2/fsck/util.h b/gfs2/fsck/util.h
index 2f74af3..b56fe69 100644
--- a/gfs2/fsck/util.h
+++ b/gfs2/fsck/util.h
@@ -40,16 +40,18 @@ enum gfs2_mark_block {
gfs2_block_free = (0x0),
gfs2_block_used = (0x1),
gfs2_indir_blk = (0x2),
+ /* These are inode block types (only): */
gfs2_inode_dir = (0x3),
gfs2_inode_file = (0x4),
gfs2_inode_lnk = (0x5),
gfs2_inode_device = (0x6), /* char or block device */
- gfs2_jdata = (0x7), /* gfs journaled data blocks */
- gfs2_inode_fifo = (0x8),
- gfs2_inode_sock = (0x9),
+ gfs2_inode_fifo = (0x7),
+ gfs2_inode_sock = (0x8),
+ gfs2_inode_invalid = (0x9),
- gfs2_inode_invalid = (0xa),
+ /* misc block types: */
+ gfs2_jdata = (0xa), /* gfs journaled data blocks */
gfs2_meta_inval = (0xb),
gfs2_leaf_blk = (0xc),
gfs2_freemeta = (0xd), /* was: gfs2_meta_rgrp */
@@ -69,11 +71,11 @@ static const inline char *block_type_string(uint8_t q)
"symlink",
"device",
- "journaled data",
"fifo",
"socket",
-
"invalid inode",
+
+ "journaled data",
"invalid meta",
"dir leaf",
"free metadata",
@@ -99,11 +101,11 @@ static inline int blockmap_to_bitmap(enum gfs2_mark_block m, int gfs1)
GFS2_BLKST_DINODE, /* symlink */
GFS2_BLKST_DINODE, /* block or char device */
- GFS2_BLKST_USED, /* journaled data */
GFS2_BLKST_DINODE, /* fifo */
GFS2_BLKST_DINODE, /* socket */
-
GFS2_BLKST_FREE, /* invalid inode */
+
+ GFS2_BLKST_USED, /* journaled data */
GFS2_BLKST_FREE, /* invalid meta */
GFS2_BLKST_USED, /* dir leaf */
GFS2_BLKST_UNLINKED, /* GFS unlinked metadata */
@@ -119,11 +121,11 @@ static inline int blockmap_to_bitmap(enum gfs2_mark_block m, int gfs1)
GFS2_BLKST_DINODE, /* symlink */
GFS2_BLKST_DINODE, /* block or char device */
- GFS2_BLKST_DINODE, /* journaled data */
GFS2_BLKST_DINODE, /* fifo */
GFS2_BLKST_DINODE, /* socket */
-
GFS2_BLKST_FREE, /* invalid inode */
+
+ GFS2_BLKST_DINODE, /* journaled data */
GFS2_BLKST_FREE, /* invalid meta */
GFS2_BLKST_DINODE, /* dir leaf */
GFS2_BLKST_UNLINKED, /* GFS unlinked metadata */
12 years, 8 months