gfs2-utils: master - GFS2: Fix a compiler warning in pass2's check_dentry
by Bob Peterson
Gitweb: http://git.fedorahosted.org/git/?p=gfs2-utils.git;a=commitdiff;h=78cbff1f...
Commit: 78cbff1fab4806178f69bca3e21dc9f3a396176f
Parent: 544e8ad99a5d47eaad9e027e52bb6cc1e85075d2
Author: Bob Peterson <rpeterso(a)redhat.com>
AuthorDate: Wed Oct 31 07:30:33 2012 -0500
Committer: Bob Peterson <rpeterso(a)redhat.com>
CommitterDate: Wed Oct 31 07:30:33 2012 -0500
GFS2: Fix a compiler warning in pass2's check_dentry
This patch initializes variable "q" to 0 to get around a
compiler warning.
---
gfs2/fsck/pass2.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/gfs2/fsck/pass2.c b/gfs2/fsck/pass2.c
index 7935f8b..3053711 100644
--- a/gfs2/fsck/pass2.c
+++ b/gfs2/fsck/pass2.c
@@ -296,7 +296,7 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
uint32_t *count, void *priv)
{
struct gfs2_sbd *sdp = ip->i_sbd;
- uint8_t q;
+ uint8_t q = 0;
char tmp_name[MAX_FILENAME];
struct gfs2_inum entry;
struct dir_status *ds = (struct dir_status *) priv;
11 years, 5 months
gfs2-utils: master - fsck.gfs2: Fix build failure
by Andrew Price
Gitweb: http://git.fedorahosted.org/git/?p=gfs2-utils.git;a=commitdiff;h=544e8ad9...
Commit: 544e8ad99a5d47eaad9e027e52bb6cc1e85075d2
Parent: 885d165e685456f6c8fa4bab43c502e469ceded7
Author: Andrew Price <anprice(a)redhat.com>
AuthorDate: Wed Oct 31 11:11:22 2012 +0000
Committer: Andrew Price <anprice(a)redhat.com>
CommitterDate: Wed Oct 31 11:11:22 2012 +0000
fsck.gfs2: Fix build failure
gfs2/fsck/pass2.c:264: undefined reference to `inode_read'
Update the call to lgfs2_inode_read()
Signed-off-by: Andrew Price <anprice(a)redhat.com>
---
gfs2/fsck/pass2.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/gfs2/fsck/pass2.c b/gfs2/fsck/pass2.c
index 177b01a..7935f8b 100644
--- a/gfs2/fsck/pass2.c
+++ b/gfs2/fsck/pass2.c
@@ -261,7 +261,7 @@ static int bad_formal_ino(struct gfs2_inode *ip, struct gfs2_dirent *dent,
/* We have a directory pointing to another directory, but the
formal inode number still doesn't match. If that directory
has a '..' pointing back, just fix up the no_formal_ino. */
- child_ip = inode_read(sdp, entry.no_addr);
+ child_ip = lgfs2_inode_read(sdp, entry.no_addr);
error = dir_search(child_ip, "..", 2, NULL, &childs_dotdot);
if (!error && childs_dotdot.no_addr == ip->i_di.di_num.no_addr) {
log_err( _("The entry points to another directory with intact "
11 years, 5 months
cluster: RHEL6 - fsck.gfs2: Check for formal inode number mismatch
by Bob Peterson
Gitweb: http://git.fedorahosted.org/git/?p=cluster.git;a=commitdiff;h=44547c338ae...
Commit: 44547c338ae73be3c724629c97802e4ea2e942b1
Parent: 1b420aa98fce71f123480dd4eae31e0eb466e864
Author: Bob Peterson <rpeterso(a)redhat.com>
AuthorDate: Wed Sep 26 12:21:21 2012 -0500
Committer: Bob Peterson <rpeterso(a)redhat.com>
CommitterDate: Tue Oct 30 10:40:54 2012 -0500
fsck.gfs2: Check for formal inode number mismatch
This patch checks for directory entries that disagree with the
dinode regarding the formal inode number. Directory entries found
in this state are removed.
rhbz#860048
---
gfs2/fsck/fsck.h | 8 +-
gfs2/fsck/inode_hash.c | 13 ++--
gfs2/fsck/inode_hash.h | 2 +-
gfs2/fsck/link.c | 19 +++--
gfs2/fsck/link.h | 2 +-
gfs2/fsck/lost_n_found.c | 30 +++----
gfs2/fsck/pass1.c | 12 ++--
gfs2/fsck/pass1b.c | 10 +-
gfs2/fsck/pass2.c | 218 ++++++++++++++++++++++++++++++----------------
gfs2/fsck/pass3.c | 79 +++++++++--------
gfs2/fsck/pass4.c | 58 +++++++------
gfs2/fsck/util.c | 15 ++--
12 files changed, 274 insertions(+), 192 deletions(-)
diff --git a/gfs2/fsck/fsck.h b/gfs2/fsck/fsck.h
index edd73d7..e4f84c1 100644
--- a/gfs2/fsck/fsck.h
+++ b/gfs2/fsck/fsck.h
@@ -28,7 +28,7 @@
struct inode_info
{
struct osi_node node;
- uint64_t inode;
+ struct gfs2_inum di_num;
uint32_t di_nlink; /* the number of links the inode
* thinks it has */
uint32_t counted_links; /* the number of links we've found */
@@ -37,9 +37,9 @@ struct inode_info
struct dir_info
{
struct osi_node node;
- uint64_t dinode;
+ struct gfs2_inum dinode;
uint64_t treewalk_parent;
- uint64_t dotdot_parent;
+ struct gfs2_inum dotdot_parent;
uint8_t checked:1;
};
@@ -122,7 +122,7 @@ extern void dirtree_delete(struct dir_info *b);
/* FIXME: Hack to get this going for pass2 - this should be pulled out
* of pass1 and put somewhere else... */
-struct dir_info *dirtree_insert(uint64_t dblock);
+struct dir_info *dirtree_insert(struct gfs2_inum inum);
extern struct gfs2_options opts;
extern struct gfs2_inode *lf_dip; /* Lost and found directory inode */
diff --git a/gfs2/fsck/inode_hash.c b/gfs2/fsck/inode_hash.c
index 2ba1d05..ac88057 100644
--- a/gfs2/fsck/inode_hash.c
+++ b/gfs2/fsck/inode_hash.c
@@ -16,9 +16,9 @@ struct inode_info *inodetree_find(uint64_t block)
while (node) {
struct inode_info *data = (struct inode_info *)node;
- if (block < data->inode)
+ if (block < data->di_num.no_addr)
node = node->osi_left;
- else if (block > data->inode)
+ else if (block > data->di_num.no_addr)
node = node->osi_right;
else
return data;
@@ -26,7 +26,7 @@ struct inode_info *inodetree_find(uint64_t block)
return NULL;
}
-struct inode_info *inodetree_insert(uint64_t dblock)
+struct inode_info *inodetree_insert(struct gfs2_inum di_num)
{
struct osi_node **newn = &inodetree.osi_node, *parent = NULL;
struct inode_info *data;
@@ -36,9 +36,9 @@ struct inode_info *inodetree_insert(uint64_t dblock)
struct inode_info *cur = (struct inode_info *)*newn;
parent = *newn;
- if (dblock < cur->inode)
+ if (di_num.no_addr < cur->di_num.no_addr)
newn = &((*newn)->osi_left);
- else if (dblock > cur->inode)
+ else if (di_num.no_addr > cur->di_num.no_addr)
newn = &((*newn)->osi_right);
else
return cur;
@@ -54,7 +54,8 @@ struct inode_info *inodetree_insert(uint64_t dblock)
return NULL;
}
/* Add new node and rebalance tree. */
- data->inode = dblock;
+ data->di_num.no_addr = di_num.no_addr;
+ data->di_num.no_formal_ino = di_num.no_formal_ino;
osi_link_node(&data->node, parent, newn);
osi_insert_color(&data->node, &inodetree);
diff --git a/gfs2/fsck/inode_hash.h b/gfs2/fsck/inode_hash.h
index e18022d..ba18ab2 100644
--- a/gfs2/fsck/inode_hash.h
+++ b/gfs2/fsck/inode_hash.h
@@ -4,7 +4,7 @@
struct inode_info;
extern struct inode_info *inodetree_find(uint64_t block);
-extern struct inode_info *inodetree_insert(uint64_t dblock);
+extern struct inode_info *inodetree_insert(struct gfs2_inum di_num);
extern void inodetree_delete(struct inode_info *b);
#endif /* _INODE_HASH_H */
diff --git a/gfs2/fsck/link.c b/gfs2/fsck/link.c
index 47365d8..c2b1a95 100644
--- a/gfs2/fsck/link.c
+++ b/gfs2/fsck/link.c
@@ -14,14 +14,13 @@
int set_di_nlink(struct gfs2_inode *ip)
{
struct inode_info *ii;
- uint64_t inode_no = ip->i_di.di_num.no_addr;
/*log_debug( _("Setting link count to %u for %" PRIu64
" (0x%" PRIx64 ")\n"), count, inode_no, inode_no);*/
/* If the list has entries, look for one that matches inode_no */
- ii = inodetree_find(inode_no);
+ ii = inodetree_find(ip->i_di.di_num.no_addr);
if (!ii)
- ii = inodetree_insert(inode_no);
+ ii = inodetree_insert(ip->i_di.di_num);
if (ii)
ii->di_nlink = ip->i_di.di_nlink;
else
@@ -29,29 +28,33 @@ int set_di_nlink(struct gfs2_inode *ip)
return 0;
}
-int incr_link_count(uint64_t inode_no, uint64_t referenced_from,
+int incr_link_count(struct gfs2_inum no, struct gfs2_inode *ip,
const char *why)
{
struct inode_info *ii = NULL;
+ uint64_t referenced_from = ip ? ip->i_di.di_num.no_addr : 0;
- ii = inodetree_find(inode_no);
+ ii = inodetree_find(no.no_addr);
/* If the list has entries, look for one that matches inode_no */
if (ii) {
+ if (ii->di_num.no_formal_ino != no.no_formal_ino)
+ return 1;
+
ii->counted_links++;
log_debug( _("Dir (0x%llx) incremented counted "
"links to %u for (0x%llx) via %s\n"),
(unsigned long long)referenced_from,
- ii->counted_links, (unsigned long long)inode_no,
+ ii->counted_links, (unsigned long long)no.no_addr,
why);
return 0;
}
log_debug( _("Ref: (0x%llx) No match found when incrementing "
"link for (0x%llx)!\n"),
(unsigned long long)referenced_from,
- (unsigned long long)inode_no);
+ (unsigned long long)no.no_addr);
/* If no match was found, add a new entry and set its
* counted links to 1 */
- ii = inodetree_insert(inode_no);
+ ii = inodetree_insert(no);
if (ii)
ii->counted_links = 1;
else
diff --git a/gfs2/fsck/link.h b/gfs2/fsck/link.h
index ad040e6..842afb9 100644
--- a/gfs2/fsck/link.h
+++ b/gfs2/fsck/link.h
@@ -2,7 +2,7 @@
#define _LINK_H
int set_di_nlink(struct gfs2_inode *ip);
-int incr_link_count(uint64_t inode_no, uint64_t referenced_from,
+int incr_link_count(struct gfs2_inum no, struct gfs2_inode *ip,
const char *why);
int decr_link_count(uint64_t inode_no, uint64_t referenced_from,
const char *why);
diff --git a/gfs2/fsck/lost_n_found.c b/gfs2/fsck/lost_n_found.c
index d0e036a..06ee485 100644
--- a/gfs2/fsck/lost_n_found.c
+++ b/gfs2/fsck/lost_n_found.c
@@ -29,18 +29,19 @@ static void add_dotdot(struct gfs2_inode *ip)
/* If there's a pre-existing .. directory entry, we have to
back out the links. */
di = dirtree_find(ip->i_di.di_num.no_addr);
- if (di && valid_block(sdp, di->dotdot_parent)) {
+ if (di && valid_block(sdp, di->dotdot_parent.no_addr)) {
struct gfs2_inode *dip;
log_debug(_("Directory %lld (0x%llx) already had a "
"\"..\" link to %lld (0x%llx).\n"),
(unsigned long long)ip->i_di.di_num.no_addr,
(unsigned long long)ip->i_di.di_num.no_addr,
- (unsigned long long)di->dotdot_parent,
- (unsigned long long)di->dotdot_parent);
- decr_link_count(di->dotdot_parent, ip->i_di.di_num.no_addr,
+ (unsigned long long)di->dotdot_parent.no_addr,
+ (unsigned long long)di->dotdot_parent.no_addr);
+ decr_link_count(di->dotdot_parent.no_addr,
+ ip->i_di.di_num.no_addr,
_(".. unlinked, moving to lost+found"));
- dip = fsck_load_inode(sdp, di->dotdot_parent);
+ dip = fsck_load_inode(sdp, di->dotdot_parent.no_addr);
if (dip->i_di.di_nlink > 0) {
dip->i_di.di_nlink--;
set_di_nlink(dip); /* keep inode tree in sync */
@@ -65,7 +66,7 @@ static void add_dotdot(struct gfs2_inode *ip)
"'..' = 0x%llx\n"),
(unsigned long long)ip->i_di.di_num.no_addr,
(unsigned long long)ip->i_di.di_num.no_addr,
- (unsigned long long)di->dotdot_parent);
+ (unsigned long long)di->dotdot_parent.no_addr);
else
log_debug(_("Couldn't find directory %lld (0x%llx) "
"in directory tree.\n"),
@@ -184,14 +185,13 @@ int add_inode_to_lf(struct gfs2_inode *ip){
_("lost+found dinode"),
gfs2_inode_dir);
/* root inode links to lost+found */
- incr_link_count(sdp->md.rooti->i_di.di_num.no_addr,
- lf_dip->i_di.di_num.no_addr, _("root"));
+ incr_link_count(sdp->md.rooti->i_di.di_num,
+ lf_dip, _("root"));
/* lost+found link for '.' from itself */
- incr_link_count(lf_dip->i_di.di_num.no_addr,
- lf_dip->i_di.di_num.no_addr, "\".\"");
+ incr_link_count(lf_dip->i_di.di_num,
+ lf_dip, "\".\"");
/* lost+found link for '..' back to root */
- incr_link_count(lf_dip->i_di.di_num.no_addr,
- sdp->md.rooti->i_di.di_num.no_addr,
+ incr_link_count(lf_dip->i_di.di_num, sdp->md.rooti,
"\"..\"");
if (sdp->gfs1)
lf_dip->i_di.__pad1 = GFS_FILE_DIR;
@@ -274,12 +274,10 @@ int add_inode_to_lf(struct gfs2_inode *ip){
reprocess_inode(lf_dip, "lost+found");
/* This inode is linked from lost+found */
- incr_link_count(ip->i_di.di_num.no_addr, lf_dip->i_di.di_num.no_addr,
- _("from lost+found"));
+ incr_link_count(ip->i_di.di_num, lf_dip, _("from lost+found"));
/* If it's a directory, lost+found is back-linked to it via .. */
if (mode == S_IFDIR)
- incr_link_count(lf_dip->i_di.di_num.no_addr,
- ip->i_di.di_num.no_addr, _("to lost+found"));
+ incr_link_count(lf_dip->i_di.di_num, ip, _("to lost+found"));
log_notice( _("Added inode #%llu (0x%llx) to lost+found\n"),
(unsigned long long)ip->i_di.di_num.no_addr,
diff --git a/gfs2/fsck/pass1.c b/gfs2/fsck/pass1.c
index 52d4082..d1209e6 100644
--- a/gfs2/fsck/pass1.c
+++ b/gfs2/fsck/pass1.c
@@ -1360,7 +1360,7 @@ static int check_system_inode(struct gfs2_sbd *sdp,
filename, mark);
ds.q = mark;
if (mark == gfs2_inode_dir)
- dirtree_insert((*sysinode)->i_di.di_num.no_addr);
+ dirtree_insert((*sysinode)->i_di.di_num);
}
} else
log_info( _("System inode for '%s' is corrupt or missing.\n"),
@@ -1387,7 +1387,7 @@ static int check_system_inode(struct gfs2_sbd *sdp,
filename, mark);
ds.q = mark;
if (mark == gfs2_inode_dir)
- dirtree_insert((*sysinode)->i_di.di_num.no_addr);
+ dirtree_insert((*sysinode)->i_di.di_num);
} else {
log_err( _("Cannot continue without valid %s inode\n"),
filename);
@@ -1501,13 +1501,13 @@ static int check_system_inodes(struct gfs2_sbd *sdp)
/* gfs1 has four dinodes that are set in the superblock and
therefore not linked to anything else. We need to adjust
the link counts so pass4 doesn't get confused. */
- incr_link_count(sdp->md.statfs->i_di.di_num.no_addr, 0,
+ incr_link_count(sdp->md.statfs->i_di.di_num, NULL,
_("gfs1 statfs inode"));
- incr_link_count(sdp->md.jiinode->i_di.di_num.no_addr, 0,
+ incr_link_count(sdp->md.jiinode->i_di.di_num, NULL,
_("gfs1 jindex inode"));
- incr_link_count(sdp->md.riinode->i_di.di_num.no_addr, 0,
+ incr_link_count(sdp->md.riinode->i_di.di_num, NULL,
_("gfs1 rindex inode"));
- incr_link_count(sdp->md.qinode->i_di.di_num.no_addr, 0,
+ incr_link_count(sdp->md.qinode->i_di.di_num, NULL,
_("gfs1 quota inode"));
return 0;
}
diff --git a/gfs2/fsck/pass1b.c b/gfs2/fsck/pass1b.c
index 39c3289..e519c20 100644
--- a/gfs2/fsck/pass1b.c
+++ b/gfs2/fsck/pass1b.c
@@ -526,12 +526,12 @@ static int resolve_dup_references(struct gfs2_sbd *sdp, struct duptree *b,
check_inode_eattr(ip, &clear_dup_fxns);
/* If the dup was in data or metadata, clear the dinode */
if (id->reftypecount[ref_as_data] ||
- id->reftypecount[ref_as_meta])
+ id->reftypecount[ref_as_meta]) {
check_metatree(ip, &clear_dup_fxns);
-
- fsck_blockmap_set(ip, ip->i_di.di_num.no_addr,
- _("duplicate referencing bad"),
- gfs2_inode_invalid);
+ fsck_blockmap_set(ip, ip->i_di.di_num.no_addr,
+ _("duplicate referencing bad"),
+ gfs2_inode_invalid);
+ }
fsck_inode_put(&ip); /* out, brelse, free */
(dh->ref_inode_count)--;
/* FIXME: other option should be to duplicate the
diff --git a/gfs2/fsck/pass2.c b/gfs2/fsck/pass2.c
index c772be3..0c1c2f5 100644
--- a/gfs2/fsck/pass2.c
+++ b/gfs2/fsck/pass2.c
@@ -13,43 +13,46 @@
#include "eattr.h"
#include "metawalk.h"
#include "link.h"
+#include "inode_hash.h"
#define MAX_FILENAME 256
/* Set children's parent inode in dir_info structure - ext2 does not set
* dotdot inode here, but instead in pass3 - should we? */
-static int set_parent_dir(struct gfs2_sbd *sdp, uint64_t childblock,
- uint64_t parentblock)
+static int set_parent_dir(struct gfs2_sbd *sdp, struct gfs2_inum child,
+ struct gfs2_inum parent)
{
struct dir_info *di;
- di = dirtree_find(childblock);
+ di = dirtree_find(child.no_addr);
if (!di) {
log_err( _("Unable to find block %llu (0x%llx"
") in dir_info list\n"),
- (unsigned long long)childblock,
- (unsigned long long)childblock);
+ (unsigned long long)child.no_addr,
+ (unsigned long long)child.no_addr);
return -1;
}
- if (di->dinode == childblock) {
+ if (di->dinode.no_addr == child.no_addr &&
+ di->dinode.no_formal_ino == child.no_formal_ino) {
if (di->treewalk_parent) {
- log_err( _("Another directory at block %" PRIu64
- " (0x%" PRIx64 ") already contains this "
- "child %lld (%llx) - checking parent %"
- PRIu64 " (0x%" PRIx64 ")\n"),
- di->treewalk_parent, di->treewalk_parent,
- (unsigned long long)childblock,
- (unsigned long long)childblock,
- parentblock, parentblock);
+ log_err( _("Another directory at block %llx (0x%llx) "
+ "already contains this child %lld (%llx) - "
+ "checking parent %llx (0x%llx)\n"),
+ (unsigned long long)di->treewalk_parent,
+ (unsigned long long)di->treewalk_parent,
+ (unsigned long long)child.no_addr,
+ (unsigned long long)child.no_addr,
+ (unsigned long long)parent.no_addr,
+ (unsigned long long)parent.no_addr);
return 1;
}
log_debug( _("Child %lld (0x%llx) has parent %lld (0x%llx)\n"),
- (unsigned long long)childblock,
- (unsigned long long)childblock,
- (unsigned long long)parentblock,
- (unsigned long long)parentblock);
- di->treewalk_parent = parentblock;
+ (unsigned long long)child.no_addr,
+ (unsigned long long)child.no_addr,
+ (unsigned long long)parent.no_addr,
+ (unsigned long long)parent.no_addr);
+ di->treewalk_parent = parent.no_addr;
}
return 0;
@@ -57,7 +60,7 @@ static int set_parent_dir(struct gfs2_sbd *sdp, uint64_t childblock,
/* Set's the child's '..' directory inode number in dir_info structure */
static int set_dotdot_dir(struct gfs2_sbd *sdp, uint64_t childblock,
- uint64_t parentblock)
+ struct gfs2_inum parent)
{
struct dir_info *di;
@@ -67,29 +70,30 @@ static int set_dotdot_dir(struct gfs2_sbd *sdp, uint64_t childblock,
") in dir_info tree\n"), childblock, childblock);
return -1;
}
- if (di->dinode != childblock) {
+ if (di->dinode.no_addr != childblock) {
log_debug("'..' doesn't point to what we found: childblock "
"(0x%llx) != dinode (0x%llx)\n",
(unsigned long long)childblock,
- (unsigned long long)di->dinode);
+ (unsigned long long)di->dinode.no_addr);
return -1;
}
/* Special case for root inode because we set it earlier */
- if (di->dotdot_parent &&
- sdp->md.rooti->i_di.di_num.no_addr != di->dinode) {
+ if (di->dotdot_parent.no_addr &&
+ sdp->md.rooti->i_di.di_num.no_addr != di->dinode.no_addr) {
/* This should never happen */
log_crit( _("Dotdot parent already set for block %llu (0x%llx)"
"-> %llu (0x%llx)\n"),
(unsigned long long)childblock,
(unsigned long long)childblock,
- (unsigned long long)di->dotdot_parent,
- (unsigned long long)di->dotdot_parent);
+ (unsigned long long)di->dotdot_parent.no_addr,
+ (unsigned long long)di->dotdot_parent.no_addr);
return -1;
}
log_debug("Setting '..' for directory block (0x%llx) to parent "
"(0x%llx)\n", (unsigned long long)childblock,
- (unsigned long long)parentblock);
- di->dotdot_parent = parentblock;
+ (unsigned long long)parent.no_addr);
+ di->dotdot_parent.no_addr = parent.no_addr;
+ di->dotdot_parent.no_formal_ino = parent.no_formal_ino;
return 0;
}
@@ -219,6 +223,69 @@ struct metawalk_fxns pass2_fxns_delete = {
.check_eattr_extentry = delete_eattr_extentry,
};
+/* bad_formal_ino - handle mismatches in formal inode number
+ * Returns: 0 if the dirent was repaired
+ * 1 if the caller should delete the dirent
+ */
+static int bad_formal_ino(struct gfs2_inode *ip, struct gfs2_dirent *dent,
+ struct gfs2_inum entry, const char *tmp_name,
+ uint8_t q, struct gfs2_dirent *de,
+ struct gfs2_buffer_head *bh)
+{
+ struct inode_info *ii;
+ struct gfs2_inode *child_ip;
+ struct gfs2_inum childs_dotdot;
+ struct gfs2_sbd *sdp = ip->i_sbd;
+ int error;
+
+ ii = inodetree_find(entry.no_addr);
+ log_err( _("Directory entry '%s' pointing to block %llu (0x%llx) in "
+ "directory %llu (0x%llx) has the wrong 'formal' inode "
+ "number.\n"), tmp_name, (unsigned long long)entry.no_addr,
+ (unsigned long long)entry.no_addr,
+ (unsigned long long)ip->i_di.di_num.no_addr,
+ (unsigned long long)ip->i_di.di_num.no_addr);
+ log_err( _("The directory entry has %llu (0x%llx) but the inode has "
+ "%llu (0x%llx)\n"), (unsigned long long)entry.no_formal_ino,
+ (unsigned long long)entry.no_formal_ino,
+ (unsigned long long)ii->di_num.no_formal_ino,
+ (unsigned long long)ii->di_num.no_formal_ino);
+ if (q != gfs2_inode_dir) {
+ if (query( _("Remove the corrupt directory entry? (y/n) ")))
+ return 1;
+ log_err( _("Corrupt directory entry not removed.\n"));
+ return 0;
+ }
+ /* We have a directory pointing to another directory, but the
+ formal inode number still doesn't match. If that directory
+ has a '..' pointing back, just fix up the no_formal_ino. */
+ child_ip = inode_read(sdp, entry.no_addr);
+ error = dir_search(child_ip, "..", 2, NULL, &childs_dotdot);
+ if (!error && childs_dotdot.no_addr == ip->i_di.di_num.no_addr) {
+ log_err( _("The entry points to another directory with intact "
+ "linkage.\n"));
+ if (query( _("Fix the bad directory entry? (y/n) "))) {
+ log_err( _("Fixing the corrupt directory entry.\n"));
+ entry.no_formal_ino = ii->di_num.no_formal_ino;
+ de->de_inum.no_formal_ino = entry.no_formal_ino;
+ gfs2_dirent_out(de, (char *)dent);
+ bmodified(bh);
+ incr_link_count(entry, ip, _("fixed reference"));
+ set_parent_dir(sdp, entry, ip->i_di.di_num);
+ } else {
+ log_err( _("Directory entry not fixed.\n"));
+ }
+ } else {
+ if (query( _("Remove the corrupt directory entry? (y/n) "))) {
+ inode_put(&child_ip);
+ return 1;
+ }
+ log_err( _("Corrupt directory entry not removed.\n"));
+ }
+ inode_put(&child_ip);
+ return 0;
+}
+
/* FIXME: should maybe refactor this a bit - but need to deal with
* FIXMEs internally first */
static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
@@ -227,9 +294,9 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
uint32_t *count, void *priv)
{
struct gfs2_sbd *sdp = ip->i_sbd;
- uint8_t q;
+ uint8_t q = 0;
char tmp_name[MAX_FILENAME];
- uint64_t entryblock;
+ struct gfs2_inum entry;
struct dir_status *ds = (struct dir_status *) priv;
int error;
struct gfs2_inode *entry_ip = NULL;
@@ -246,7 +313,8 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
clear_eattrs.check_eattr_entry = clear_eattr_entry;
clear_eattrs.check_eattr_extentry = clear_eattr_extentry;
- entryblock = de->de_inum.no_addr;
+ entry.no_addr = de->de_inum.no_addr;
+ entry.no_formal_ino = de->de_inum.no_formal_ino;
/* Start of checks */
memset(tmp_name, 0, MAX_FILENAME);
@@ -255,7 +323,7 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
else
strncpy(tmp_name, filename, MAX_FILENAME - 1);
- if (!valid_block(ip->i_sbd, entryblock)) {
+ if (!valid_block(ip->i_sbd, entry.no_addr)) {
log_err( _("Block # referenced by directory entry %s in inode "
"%lld (0x%llx) is invalid\n"),
tmp_name, (unsigned long long)ip->i_di.di_num.no_addr,
@@ -268,7 +336,7 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
(*count)++;
ds->entry_count++;
/* can't do this because the block is out of range:
- incr_link_count(entryblock); */
+ incr_link_count(entry); */
return 0;
}
}
@@ -310,7 +378,7 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
tmp_name);
}
- q = block_type(entryblock);
+ q = block_type(entry.no_addr);
/* Get the status of the directory inode */
/**
* 1. Blocks marked "invalid" were invalidated due to duplicate
@@ -330,8 +398,8 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
/* Handle bad blocks */
log_err( _("Found directory entry '%s' pointing to invalid "
"block %lld (0x%llx)\n"), tmp_name,
- (unsigned long long)entryblock,
- (unsigned long long)entryblock);
+ (unsigned long long)entry.no_addr,
+ (unsigned long long)entry.no_addr);
if (!query( _("Delete inode containing bad blocks? (y/n)"))) {
log_warn( _("Entry to inode containing bad blocks remains\n"));
@@ -339,10 +407,10 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
}
if (q == gfs2_bad_block) {
- if (ip->i_di.di_num.no_addr == entryblock)
+ if (ip->i_di.di_num.no_addr == entry.no_addr)
entry_ip = ip;
else
- entry_ip = fsck_load_inode(sdp, entryblock);
+ entry_ip = fsck_load_inode(sdp, entry.no_addr);
if (ip->i_di.di_eattr) {
check_inode_eattr(entry_ip,
&pass2_fxns_delete);
@@ -351,19 +419,19 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
if (entry_ip != ip)
fsck_inode_put(&entry_ip);
}
- fsck_blockmap_set(ip, entryblock,
+ fsck_blockmap_set(ip, entry.no_addr,
_("bad directory entry"), gfs2_block_free);
log_err( _("Inode %lld (0x%llx) was deleted.\n"),
- (unsigned long long)entryblock,
- (unsigned long long)entryblock);
+ (unsigned long long)entry.no_addr,
+ (unsigned long long)entry.no_addr);
goto nuke_dentry;
}
if (q < gfs2_inode_dir || q > gfs2_inode_sock) {
log_err( _("Directory entry '%s' referencing inode %llu "
"(0x%llx) in dir inode %llu (0x%llx) block type "
"%d: %s.\n"), tmp_name,
- (unsigned long long)entryblock,
- (unsigned long long)entryblock,
+ (unsigned long long)entry.no_addr,
+ (unsigned long long)entry.no_addr,
(unsigned long long)ip->i_di.di_num.no_addr,
(unsigned long long)ip->i_di.di_num.no_addr,
q, q == gfs2_inode_invalid ?
@@ -400,8 +468,8 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
log_err( _("Error: directory entry type is "
"incompatible with block type at block %lld "
"(0x%llx) in directory inode %llu (0x%llx).\n"),
- (unsigned long long)entryblock,
- (unsigned long long)entryblock,
+ (unsigned long long)entry.no_addr,
+ (unsigned long long)entry.no_addr,
(unsigned long long)ip->i_di.di_num.no_addr,
(unsigned long long)ip->i_di.di_num.no_addr);
log_err( _("Directory entry type is %d, block type is %d.\n"),
@@ -413,17 +481,17 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
log_err( _("Type '%s' in dir entry (%s, %llu/0x%llx) conflicts"
" with type '%s' in dinode. (Dir entry is stale.)\n"),
de_type_string(de->de_type), tmp_name,
- (unsigned long long)entryblock,
- (unsigned long long)entryblock,
+ (unsigned long long)entry.no_addr,
+ (unsigned long long)entry.no_addr,
block_type_string(q));
if (!query( _("Clear stale directory entry? (y/n) "))) {
log_err( _("Stale directory entry remains\n"));
goto dentry_is_valid;
}
- if (ip->i_di.di_num.no_addr == entryblock)
+ if (ip->i_di.di_num.no_addr == entry.no_addr)
entry_ip = ip;
else
- entry_ip = fsck_load_inode(sdp, entryblock);
+ entry_ip = fsck_load_inode(sdp, entry.no_addr);
check_inode_eattr(entry_ip, &clear_eattrs);
if (entry_ip != ip)
fsck_inode_put(&entry_ip);
@@ -446,10 +514,10 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
* and check the rest of the '.' entry? */
goto dentry_is_valid;
}
- if (ip->i_di.di_num.no_addr == entryblock)
+ if (ip->i_di.di_num.no_addr == entry.no_addr)
entry_ip = ip;
else
- entry_ip = fsck_load_inode(sdp, entryblock);
+ entry_ip = fsck_load_inode(sdp, entry.no_addr);
check_inode_eattr(entry_ip, &clear_eattrs);
if (entry_ip != ip)
fsck_inode_put(&entry_ip);
@@ -460,15 +528,15 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
* location */
/* check that '.' refers to this inode */
- if (entryblock != ip->i_di.di_num.no_addr) {
+ if (entry.no_addr != ip->i_di.di_num.no_addr) {
log_err( _("'.' entry's value incorrect in directory %llu"
" (0x%llx). Points to %llu"
" (0x%llx) when it should point to %llu"
" (0x%llx).\n"),
- (unsigned long long)entryblock,
- (unsigned long long)entryblock,
- (unsigned long long)entryblock,
- (unsigned long long)entryblock,
+ (unsigned long long)entry.no_addr,
+ (unsigned long long)entry.no_addr,
+ (unsigned long long)entry.no_addr,
+ (unsigned long long)entry.no_addr,
(unsigned long long)ip->i_di.di_num.no_addr,
(unsigned long long)ip->i_di.di_num.no_addr);
if (!query( _("Remove '.' reference? (y/n) "))) {
@@ -477,10 +545,10 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
* this '.' entry is invalid */
goto dentry_is_valid;
}
- if (ip->i_di.di_num.no_addr == entryblock)
+ if (ip->i_di.di_num.no_addr == entry.no_addr)
entry_ip = ip;
else
- entry_ip = fsck_load_inode(sdp, entryblock);
+ entry_ip = fsck_load_inode(sdp, entry.no_addr);
check_inode_eattr(entry_ip, &clear_eattrs);
if (entry_ip != ip)
fsck_inode_put(&entry_ip);
@@ -507,10 +575,10 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
goto dentry_is_valid;
}
- if (ip->i_di.di_num.no_addr == entryblock)
+ if (ip->i_di.di_num.no_addr == entry.no_addr)
entry_ip = ip;
else
- entry_ip = fsck_load_inode(sdp, entryblock);
+ entry_ip = fsck_load_inode(sdp, entry.no_addr);
check_inode_eattr(entry_ip, &clear_eattrs);
if (entry_ip != ip)
fsck_inode_put(&entry_ip);
@@ -527,10 +595,10 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
log_err( _("Bad '..' directory entry remains\n"));
goto dentry_is_valid;
}
- if (ip->i_di.di_num.no_addr == entryblock)
+ if (ip->i_di.di_num.no_addr == entry.no_addr)
entry_ip = ip;
else
- entry_ip = fsck_load_inode(sdp, entryblock);
+ entry_ip = fsck_load_inode(sdp, entry.no_addr);
check_inode_eattr(entry_ip, &clear_eattrs);
if (entry_ip != ip)
fsck_inode_put(&entry_ip);
@@ -542,7 +610,7 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
/* Add the address this entry is pointing to
* to this inode's dotdot_parent in
* dir_info */
- if (set_dotdot_dir(sdp, ip->i_di.di_num.no_addr, entryblock)) {
+ if (set_dotdot_dir(sdp, ip->i_di.di_num.no_addr, entry)) {
stack;
return -1;
}
@@ -555,18 +623,18 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
if (q != gfs2_inode_dir) {
log_debug( _("Found non-dir inode dentry pointing to %lld "
"(0x%llx)\n"),
- (unsigned long long)entryblock,
- (unsigned long long)entryblock);
+ (unsigned long long)entry.no_addr,
+ (unsigned long long)entry.no_addr);
goto dentry_is_valid;
}
/*log_debug( _("Found plain directory dentry\n"));*/
- error = set_parent_dir(sdp, entryblock, ip->i_di.di_num.no_addr);
+ error = set_parent_dir(sdp, entry, ip->i_di.di_num);
if (error > 0) {
log_err( _("%s: Hard link to block %llu (0x%llx"
") detected.\n"), tmp_name,
- (unsigned long long)entryblock,
- (unsigned long long)entryblock);
+ (unsigned long long)entry.no_addr,
+ (unsigned long long)entry.no_addr);
if (query( _("Clear hard link to directory? (y/n) ")))
goto nuke_dentry;
@@ -580,8 +648,12 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
}
dentry_is_valid:
/* This directory inode links to this inode via this dentry */
- incr_link_count(entryblock, ip->i_di.di_num.no_addr,
- _("valid reference"));
+ error = incr_link_count(entry, ip, _("valid reference"));
+ if (error > 0) {
+ if (bad_formal_ino(ip, dent, entry, tmp_name, q, de, bh) == 1)
+ goto nuke_dentry;
+ }
+
(*count)++;
ds->entry_count++;
/* End of checks */
@@ -679,8 +751,7 @@ static int check_system_dir(struct gfs2_inode *sysinode, const char *dirname,
if (cur_blks != sysinode->i_di.di_blocks)
reprocess_inode(sysinode, dirname);
/* This system inode is linked to itself via '.' */
- incr_link_count(sysinode->i_di.di_num.no_addr,
- sysinode->i_di.di_num.no_addr,
+ incr_link_count(sysinode->i_di.di_num, sysinode,
"sysinode \".\"");
ds.entry_count++;
free(filename);
@@ -905,8 +976,7 @@ int pass2(struct gfs2_sbd *sdp)
reprocess_inode(ip, dirname);
}
/* directory links to itself via '.' */
- incr_link_count(ip->i_di.di_num.no_addr,
- ip->i_di.di_num.no_addr,
+ incr_link_count(ip->i_di.di_num, ip,
_("\". (itself)\""));
ds.entry_count++;
free(filename);
diff --git a/gfs2/fsck/pass3.c b/gfs2/fsck/pass3.c
index daa1809..f5f38c5 100644
--- a/gfs2/fsck/pass3.c
+++ b/gfs2/fsck/pass3.c
@@ -67,7 +67,7 @@ static int attach_dotdot_to(struct gfs2_sbd *sdp, uint64_t newdotdot,
(unsigned long long)ip->i_di.di_num.no_addr);
reprocess_inode(ip, dirname);
}
- incr_link_count(newdotdot, block, _("new \"..\""));
+ incr_link_count(pip->i_di.di_num, ip, _("new \"..\""));
fsck_inode_put(&ip);
fsck_inode_put(&pip);
free(filename);
@@ -86,27 +86,28 @@ static struct dir_info *mark_and_return_parent(struct gfs2_sbd *sdp,
if (!di->treewalk_parent)
return NULL;
- if (di->dotdot_parent == di->treewalk_parent) {
- q_dotdot = block_type(di->dotdot_parent);
+ if (di->dotdot_parent.no_addr == di->treewalk_parent) {
+ q_dotdot = block_type(di->dotdot_parent.no_addr);
if (q_dotdot != gfs2_inode_dir) {
log_err( _("Orphaned directory at block %llu (0x%llx) "
"moved to lost+found\n"),
- (unsigned long long)di->dinode,
- (unsigned long long)di->dinode);
+ (unsigned long long)di->dinode.no_addr,
+ (unsigned long long)di->dinode.no_addr);
return NULL;
}
goto out;
}
log_warn( _("Directory '..' and treewalk connections disagree for "
- "inode %llu (0x%llx)\n"), (unsigned long long)di->dinode,
- (unsigned long long)di->dinode);
+ "inode %llu (0x%llx)\n"),
+ (unsigned long long)di->dinode.no_addr,
+ (unsigned long long)di->dinode.no_addr);
log_notice( _("'..' has %llu (0x%llx), treewalk has %llu (0x%llx)\n"),
- (unsigned long long)di->dotdot_parent,
- (unsigned long long)di->dotdot_parent,
+ (unsigned long long)di->dotdot_parent.no_addr,
+ (unsigned long long)di->dotdot_parent.no_addr,
(unsigned long long)di->treewalk_parent,
(unsigned long long)di->treewalk_parent);
- q_dotdot = block_type(di->dotdot_parent);
+ q_dotdot = block_type(di->dotdot_parent.no_addr);
q_treewalk = block_type(di->treewalk_parent);
/* if the dotdot entry isn't a directory, but the
* treewalk is, treewalk is correct - if the treewalk
@@ -126,8 +127,9 @@ static struct dir_info *mark_and_return_parent(struct gfs2_sbd *sdp,
(unsigned long long)di->treewalk_parent,
(unsigned long long)di->treewalk_parent);
attach_dotdot_to(sdp, di->treewalk_parent,
- di->dotdot_parent, di->dinode);
- di->dotdot_parent = di->treewalk_parent;
+ di->dotdot_parent.no_addr,
+ di->dinode.no_addr);
+ di->dotdot_parent.no_addr = di->treewalk_parent;
}
goto out;
}
@@ -135,8 +137,9 @@ static struct dir_info *mark_and_return_parent(struct gfs2_sbd *sdp,
log_err( _("Both .. and treewalk parents are directories, "
"going with treewalk...\n"));
attach_dotdot_to(sdp, di->treewalk_parent,
- di->dotdot_parent, di->dinode);
- di->dotdot_parent = di->treewalk_parent;
+ di->dotdot_parent.no_addr,
+ di->dinode.no_addr);
+ di->dotdot_parent.no_addr = di->treewalk_parent;
goto out;
}
log_warn( _(".. parent is valid, but treewalk is bad - reattaching to "
@@ -146,14 +149,15 @@ static struct dir_info *mark_and_return_parent(struct gfs2_sbd *sdp,
if (!query( _("Remove directory entry for bad inode %llu (0x%llx) in "
"%llu (0x%llx)? (y/n)"),
- (unsigned long long)di->dinode,
- (unsigned long long)di->dinode,
+ (unsigned long long)di->dinode.no_addr,
+ (unsigned long long)di->dinode.no_addr,
(unsigned long long)di->treewalk_parent,
(unsigned long long)di->treewalk_parent)) {
log_err( _("Directory entry to invalid inode remains\n"));
return NULL;
}
- error = remove_dentry_from_dir(sdp, di->treewalk_parent, di->dinode);
+ error = remove_dentry_from_dir(sdp, di->treewalk_parent,
+ di->dinode.no_addr);
if (error < 0) {
stack;
return NULL;
@@ -161,8 +165,8 @@ static struct dir_info *mark_and_return_parent(struct gfs2_sbd *sdp,
if (error > 0)
log_warn( _("Unable to find dentry for block %llu"
" (0x%llx) in %llu (0x%llx)\n"),
- (unsigned long long)di->dinode,
- (unsigned long long)di->dinode,
+ (unsigned long long)di->dinode.no_addr,
+ (unsigned long long)di->dinode.no_addr,
(unsigned long long)di->treewalk_parent,
(unsigned long long)di->treewalk_parent);
log_warn( _("Directory entry removed\n"));
@@ -171,7 +175,7 @@ static struct dir_info *mark_and_return_parent(struct gfs2_sbd *sdp,
return NULL;
out:
- pdi = dirtree_find(di->dotdot_parent);
+ pdi = dirtree_find(di->dotdot_parent.no_addr);
return pdi;
}
@@ -245,13 +249,14 @@ int pass3(struct gfs2_sbd *sdp)
tdi = mark_and_return_parent(sdp, di);
if (tdi) {
- log_debug( _("Directory at block %" PRIu64
- " (0x%" PRIx64 ") connected\n"),
- di->dinode, di->dinode);
+ log_debug( _("Directory at block %llu "
+ "(0x%llx) connected\n"),
+ (unsigned long long)di->dinode.no_addr,
+ (unsigned long long)di->dinode.no_addr);
di = tdi;
continue;
}
- q = block_type(di->dinode);
+ q = block_type(di->dinode.no_addr);
if (q == gfs2_bad_block) {
log_err( _("Found unlinked directory "
"containing bad block\n"));
@@ -260,14 +265,14 @@ int pass3(struct gfs2_sbd *sdp)
log_warn( _("inode %lld (0x%llx) is "
"now marked as free\n"),
(unsigned long long)
- di->dinode,
+ di->dinode.no_addr,
(unsigned long long)
- di->dinode);
+ di->dinode.no_addr);
/* Can't use fsck_blockmap_set
because we don't have ip */
- gfs2_blockmap_set(bl, di->dinode,
+ gfs2_blockmap_set(bl, di->dinode.no_addr,
gfs2_block_free);
- check_n_fix_bitmap(sdp, di->dinode,
+ check_n_fix_bitmap(sdp, di->dinode.no_addr,
gfs2_block_free);
break;
} else
@@ -286,29 +291,31 @@ int pass3(struct gfs2_sbd *sdp)
}
log_warn( _("inode %lld (0x%llx) is now "
"marked as free\n"),
- (unsigned long long)di->dinode,
- (unsigned long long)di->dinode);
+ (unsigned long long)di->dinode.no_addr,
+ (unsigned long long)di->dinode.no_addr);
/* Can't use fsck_blockmap_set
because we don't have ip */
- gfs2_blockmap_set(bl, di->dinode,
+ gfs2_blockmap_set(bl, di->dinode.no_addr,
gfs2_block_free);
- check_n_fix_bitmap(sdp, di->dinode,
+ check_n_fix_bitmap(sdp, di->dinode.no_addr,
gfs2_block_free);
log_err( _("The block was cleared\n"));
break;
}
log_err( _("Found unlinked directory at block %llu"
- " (0x%llx)\n"), (unsigned long long)di->dinode,
- (unsigned long long)di->dinode);
- ip = fsck_load_inode(sdp, di->dinode);
+ " (0x%llx)\n"),
+ (unsigned long long)di->dinode.no_addr,
+ (unsigned long long)di->dinode.no_addr);
+ ip = fsck_load_inode(sdp, di->dinode.no_addr);
/* Don't skip zero size directories with eattrs */
if (!ip->i_di.di_size && !ip->i_di.di_eattr){
log_err( _("Unlinked directory has zero "
"size.\n"));
if (query( _("Remove zero-size unlinked "
"directory? (y/n) "))) {
- fsck_blockmap_set(ip, di->dinode,
+ fsck_blockmap_set(ip,
+ di->dinode.no_addr,
_("zero-sized unlinked inode"),
gfs2_block_free);
fsck_inode_put(&ip);
diff --git a/gfs2/fsck/pass4.c b/gfs2/fsck/pass4.c
index 6d933e9..4605671 100644
--- a/gfs2/fsck/pass4.c
+++ b/gfs2/fsck/pass4.c
@@ -58,28 +58,28 @@ static int scan_inode_list(struct gfs2_sbd *sdp) {
}
/* Don't check reference counts on the special gfs files */
if (sdp->gfs1 &&
- ((ii->inode == sdp->md.riinode->i_di.di_num.no_addr) ||
- (ii->inode == sdp->md.jiinode->i_di.di_num.no_addr) ||
- (ii->inode == sdp->md.qinode->i_di.di_num.no_addr) ||
- (ii->inode == sdp->md.statfs->i_di.di_num.no_addr)))
+ ((ii->di_num.no_addr == sdp->md.riinode->i_di.di_num.no_addr) ||
+ (ii->di_num.no_addr == sdp->md.jiinode->i_di.di_num.no_addr) ||
+ (ii->di_num.no_addr == sdp->md.qinode->i_di.di_num.no_addr) ||
+ (ii->di_num.no_addr == sdp->md.statfs->i_di.di_num.no_addr)))
continue;
if (ii->counted_links == 0) {
log_err( _("Found unlinked inode at %llu (0x%llx)\n"),
- (unsigned long long)ii->inode,
- (unsigned long long)ii->inode);
- q = block_type(ii->inode);
+ (unsigned long long)ii->di_num.no_addr,
+ (unsigned long long)ii->di_num.no_addr);
+ q = block_type(ii->di_num.no_addr);
if (q == gfs2_bad_block) {
log_err( _("Unlinked inode %llu (0x%llx) contains "
"bad blocks\n"),
- (unsigned long long)ii->inode,
- (unsigned long long)ii->inode);
+ (unsigned long long)ii->di_num.no_addr,
+ (unsigned long long)ii->di_num.no_addr);
if (query( _("Delete unlinked inode with bad "
"blocks? (y/n) "))) {
- ip = fsck_load_inode(sdp, ii->inode);
+ ip = fsck_load_inode(sdp, ii->di_num.no_addr);
check_inode_eattr(ip,
&pass4_fxns_delete);
check_metatree(ip, &pass4_fxns_delete);
- fsck_blockmap_set(ip, ii->inode,
+ fsck_blockmap_set(ip, ii->di_num.no_addr,
_("bad unlinked"),
gfs2_block_free);
fsck_inode_put(&ip);
@@ -96,14 +96,14 @@ static int scan_inode_list(struct gfs2_sbd *sdp) {
log_err( _("Unlinked block %lld (0x%llx) "
"marked as inode is "
"not an inode (%d)\n"),
- (unsigned long long)ii->inode,
- (unsigned long long)ii->inode, q);
- ip = fsck_load_inode(sdp, ii->inode);
+ (unsigned long long)ii->di_num.no_addr,
+ (unsigned long long)ii->di_num.no_addr, q);
+ ip = fsck_load_inode(sdp, ii->di_num.no_addr);
if (query(_("Delete unlinked inode? (y/n) "))) {
check_inode_eattr(ip,
&pass4_fxns_delete);
check_metatree(ip, &pass4_fxns_delete);
- fsck_blockmap_set(ip, ii->inode,
+ fsck_blockmap_set(ip, ii->di_num.no_addr,
_("invalid unlinked"),
gfs2_block_free);
fsck_inode_put(&ip);
@@ -115,7 +115,7 @@ static int scan_inode_list(struct gfs2_sbd *sdp) {
}
continue;
}
- ip = fsck_load_inode(sdp, ii->inode);
+ ip = fsck_load_inode(sdp, ii->di_num.no_addr);
/* We don't want to clear zero-size files with
* eattrs - there might be relevent info in
@@ -124,7 +124,7 @@ static int scan_inode_list(struct gfs2_sbd *sdp) {
log_err( _("Unlinked inode has zero size\n"));
if (query(_("Clear zero-size unlinked inode? "
"(y/n) "))) {
- fsck_blockmap_set(ip, ii->inode,
+ fsck_blockmap_set(ip, ii->di_num.no_addr,
_("unlinked zero-length"),
gfs2_block_free);
fsck_inode_put(&ip);
@@ -149,32 +149,34 @@ static int scan_inode_list(struct gfs2_sbd *sdp) {
else if (ii->di_nlink != ii->counted_links) {
log_err( _("Link count inconsistent for inode %llu"
" (0x%llx) has %u but fsck found %u.\n"),
- (unsigned long long)ii->inode,
- (unsigned long long)ii->inode, ii->di_nlink,
+ (unsigned long long)ii->di_num.no_addr,
+ (unsigned long long)ii->di_num.no_addr, ii->di_nlink,
ii->counted_links);
/* Read in the inode, adjust the link count,
* and write it back out */
if (query( _("Update link count for inode %llu"
" (0x%llx) ? (y/n) "),
- (unsigned long long)ii->inode,
- (unsigned long long)ii->inode)) {
- ip = fsck_load_inode(sdp, ii->inode); /* bread, inode_get */
+ (unsigned long long)ii->di_num.no_addr,
+ (unsigned long long)ii->di_num.no_addr)) {
+ ip = fsck_load_inode(sdp, ii->di_num.no_addr); /* bread, inode_get */
fix_link_count(ii, ip);
ii->di_nlink = ii->counted_links;
fsck_inode_put(&ip); /* out, brelse, free */
log_warn( _("Link count updated to %d for "
"inode %llu (0x%llx)\n"),
ii->di_nlink,
- (unsigned long long)ii->inode,
- (unsigned long long)ii->inode);
+ (unsigned long long)ii->di_num.no_addr,
+ (unsigned long long)ii->di_num.no_addr);
} else {
- log_err( _("Link count for inode %" PRIu64 " (0x%" PRIx64
- ") still incorrect\n"), ii->inode, ii->inode);
+ log_err( _("Link count for inode %llu (0x%llx"
+ ") still incorrect\n"),
+ (unsigned long long)ii->di_num.no_addr,
+ (unsigned long long)ii->di_num.no_addr);
}
}
log_debug( _("block %llu (0x%llx) has link count %d\n"),
- (unsigned long long)ii->inode,
- (unsigned long long)ii->inode, ii->di_nlink);
+ (unsigned long long)ii->di_num.no_addr,
+ (unsigned long long)ii->di_num.no_addr, ii->di_nlink);
} /* osi_list_foreach(tmp, list) */
if (lf_addition) {
diff --git a/gfs2/fsck/util.c b/gfs2/fsck/util.c
index 92818fb..24bae6f 100644
--- a/gfs2/fsck/util.c
+++ b/gfs2/fsck/util.c
@@ -309,7 +309,7 @@ int add_duplicate_ref(struct gfs2_inode *ip, uint64_t block,
return 0;
}
-struct dir_info *dirtree_insert(uint64_t dblock)
+struct dir_info *dirtree_insert(struct gfs2_inum inum)
{
struct osi_node **newn = &dirtree.osi_node, *parent = NULL;
struct dir_info *data;
@@ -319,9 +319,9 @@ struct dir_info *dirtree_insert(uint64_t dblock)
struct dir_info *cur = (struct dir_info *)*newn;
parent = *newn;
- if (dblock < cur->dinode)
+ if (inum.no_addr < cur->dinode.no_addr)
newn = &((*newn)->osi_left);
- else if (dblock > cur->dinode)
+ else if (inum.no_addr > cur->dinode.no_addr)
newn = &((*newn)->osi_right);
else
return cur;
@@ -337,7 +337,8 @@ struct dir_info *dirtree_insert(uint64_t dblock)
return NULL;
}
/* Add new node and rebalance tree. */
- data->dinode = dblock;
+ data->dinode.no_addr = inum.no_addr;
+ data->dinode.no_formal_ino = inum.no_formal_ino;
osi_link_node(&data->node, parent, newn);
osi_insert_color(&data->node, &dirtree);
@@ -351,9 +352,9 @@ struct dir_info *dirtree_find(uint64_t block)
while (node) {
struct dir_info *data = (struct dir_info *)node;
- if (block < data->dinode)
+ if (block < data->dinode.no_addr)
node = node->osi_left;
- else if (block > data->dinode)
+ else if (block > data->dinode.no_addr)
node = node->osi_right;
else
return data;
@@ -488,7 +489,7 @@ int set_ip_blockmap(struct gfs2_inode *ip, int instree)
if (fsck_blockmap_set(ip, block, _("directory"),
gfs2_inode_dir))
goto bad_dinode;
- if (instree && !dirtree_insert(block))
+ if (instree && !dirtree_insert(ip->i_di.di_num))
goto bad_dinode;
break;
case S_IFREG:
11 years, 5 months
gfs2-utils: master - fsck.gfs2: Check for formal inode number mismatch
by Bob Peterson
Gitweb: http://git.fedorahosted.org/git/?p=gfs2-utils.git;a=commitdiff;h=885d165e...
Commit: 885d165e685456f6c8fa4bab43c502e469ceded7
Parent: 74f4384b361eb05b40c463d40067a3f9a1b1b7da
Author: Bob Peterson <rpeterso(a)redhat.com>
AuthorDate: Tue Oct 30 08:45:52 2012 -0500
Committer: Bob Peterson <rpeterso(a)redhat.com>
CommitterDate: Tue Oct 30 08:45:52 2012 -0500
fsck.gfs2: Check for formal inode number mismatch
This patch checks for directory entries that disagree with the
dinode regarding the formal inode number. Directory entries found
in this state are removed.
---
gfs2/fsck/fsck.h | 8 +-
gfs2/fsck/inode_hash.c | 13 ++--
gfs2/fsck/inode_hash.h | 2 +-
gfs2/fsck/link.c | 19 +++--
gfs2/fsck/link.h | 2 +-
gfs2/fsck/lost_n_found.c | 30 +++----
gfs2/fsck/pass1.c | 12 ++--
gfs2/fsck/pass1b.c | 10 +-
gfs2/fsck/pass2.c | 214 ++++++++++++++++++++++++++++++----------------
gfs2/fsck/pass3.c | 79 +++++++++--------
gfs2/fsck/pass4.c | 59 +++++++------
gfs2/fsck/util.c | 15 ++--
12 files changed, 271 insertions(+), 192 deletions(-)
diff --git a/gfs2/fsck/fsck.h b/gfs2/fsck/fsck.h
index ecd37ad..5313bb3 100644
--- a/gfs2/fsck/fsck.h
+++ b/gfs2/fsck/fsck.h
@@ -28,7 +28,7 @@
struct inode_info
{
struct osi_node node;
- uint64_t inode;
+ struct gfs2_inum di_num;
uint32_t di_nlink; /* the number of links the inode
* thinks it has */
uint32_t counted_links; /* the number of links we've found */
@@ -37,9 +37,9 @@ struct inode_info
struct dir_info
{
struct osi_node node;
- uint64_t dinode;
+ struct gfs2_inum dinode;
uint64_t treewalk_parent;
- uint64_t dotdot_parent;
+ struct gfs2_inum dotdot_parent;
uint8_t checked:1;
};
@@ -122,7 +122,7 @@ extern void dirtree_delete(struct dir_info *b);
/* FIXME: Hack to get this going for pass2 - this should be pulled out
* of pass1 and put somewhere else... */
-struct dir_info *dirtree_insert(uint64_t dblock);
+struct dir_info *dirtree_insert(struct gfs2_inum inum);
struct gfs2_options {
char *device;
diff --git a/gfs2/fsck/inode_hash.c b/gfs2/fsck/inode_hash.c
index e2d3c29..d5a35ce 100644
--- a/gfs2/fsck/inode_hash.c
+++ b/gfs2/fsck/inode_hash.c
@@ -18,9 +18,9 @@ struct inode_info *inodetree_find(uint64_t block)
while (node) {
struct inode_info *data = (struct inode_info *)node;
- if (block < data->inode)
+ if (block < data->di_num.no_addr)
node = node->osi_left;
- else if (block > data->inode)
+ else if (block > data->di_num.no_addr)
node = node->osi_right;
else
return data;
@@ -28,7 +28,7 @@ struct inode_info *inodetree_find(uint64_t block)
return NULL;
}
-struct inode_info *inodetree_insert(uint64_t dblock)
+struct inode_info *inodetree_insert(struct gfs2_inum di_num)
{
struct osi_node **newn = &inodetree.osi_node, *parent = NULL;
struct inode_info *data;
@@ -38,9 +38,9 @@ struct inode_info *inodetree_insert(uint64_t dblock)
struct inode_info *cur = (struct inode_info *)*newn;
parent = *newn;
- if (dblock < cur->inode)
+ if (di_num.no_addr < cur->di_num.no_addr)
newn = &((*newn)->osi_left);
- else if (dblock > cur->inode)
+ else if (di_num.no_addr > cur->di_num.no_addr)
newn = &((*newn)->osi_right);
else
return cur;
@@ -56,7 +56,8 @@ struct inode_info *inodetree_insert(uint64_t dblock)
return NULL;
}
/* Add new node and rebalance tree. */
- data->inode = dblock;
+ data->di_num.no_addr = di_num.no_addr;
+ data->di_num.no_formal_ino = di_num.no_formal_ino;
osi_link_node(&data->node, parent, newn);
osi_insert_color(&data->node, &inodetree);
diff --git a/gfs2/fsck/inode_hash.h b/gfs2/fsck/inode_hash.h
index e18022d..ba18ab2 100644
--- a/gfs2/fsck/inode_hash.h
+++ b/gfs2/fsck/inode_hash.h
@@ -4,7 +4,7 @@
struct inode_info;
extern struct inode_info *inodetree_find(uint64_t block);
-extern struct inode_info *inodetree_insert(uint64_t dblock);
+extern struct inode_info *inodetree_insert(struct gfs2_inum di_num);
extern void inodetree_delete(struct inode_info *b);
#endif /* _INODE_HASH_H */
diff --git a/gfs2/fsck/link.c b/gfs2/fsck/link.c
index 5dc1a1e..72fe7d5 100644
--- a/gfs2/fsck/link.c
+++ b/gfs2/fsck/link.c
@@ -16,14 +16,13 @@
int set_di_nlink(struct gfs2_inode *ip)
{
struct inode_info *ii;
- uint64_t inode_no = ip->i_di.di_num.no_addr;
/*log_debug( _("Setting link count to %u for %" PRIu64
" (0x%" PRIx64 ")\n"), count, inode_no, inode_no);*/
/* If the list has entries, look for one that matches inode_no */
- ii = inodetree_find(inode_no);
+ ii = inodetree_find(ip->i_di.di_num.no_addr);
if (!ii)
- ii = inodetree_insert(inode_no);
+ ii = inodetree_insert(ip->i_di.di_num);
if (ii)
ii->di_nlink = ip->i_di.di_nlink;
else
@@ -31,29 +30,33 @@ int set_di_nlink(struct gfs2_inode *ip)
return 0;
}
-int incr_link_count(uint64_t inode_no, uint64_t referenced_from,
+int incr_link_count(struct gfs2_inum no, struct gfs2_inode *ip,
const char *why)
{
struct inode_info *ii = NULL;
+ uint64_t referenced_from = ip ? ip->i_di.di_num.no_addr : 0;
- ii = inodetree_find(inode_no);
+ ii = inodetree_find(no.no_addr);
/* If the list has entries, look for one that matches inode_no */
if (ii) {
+ if (ii->di_num.no_formal_ino != no.no_formal_ino)
+ return 1;
+
ii->counted_links++;
log_debug( _("Dir (0x%llx) incremented counted "
"links to %u for (0x%llx) via %s\n"),
(unsigned long long)referenced_from,
- ii->counted_links, (unsigned long long)inode_no,
+ ii->counted_links, (unsigned long long)no.no_addr,
why);
return 0;
}
log_debug( _("Ref: (0x%llx) No match found when incrementing "
"link for (0x%llx)!\n"),
(unsigned long long)referenced_from,
- (unsigned long long)inode_no);
+ (unsigned long long)no.no_addr);
/* If no match was found, add a new entry and set its
* counted links to 1 */
- ii = inodetree_insert(inode_no);
+ ii = inodetree_insert(no);
if (ii)
ii->counted_links = 1;
else
diff --git a/gfs2/fsck/link.h b/gfs2/fsck/link.h
index ad040e6..842afb9 100644
--- a/gfs2/fsck/link.h
+++ b/gfs2/fsck/link.h
@@ -2,7 +2,7 @@
#define _LINK_H
int set_di_nlink(struct gfs2_inode *ip);
-int incr_link_count(uint64_t inode_no, uint64_t referenced_from,
+int incr_link_count(struct gfs2_inum no, struct gfs2_inode *ip,
const char *why);
int decr_link_count(uint64_t inode_no, uint64_t referenced_from,
const char *why);
diff --git a/gfs2/fsck/lost_n_found.c b/gfs2/fsck/lost_n_found.c
index e4fccd5..570f3a8 100644
--- a/gfs2/fsck/lost_n_found.c
+++ b/gfs2/fsck/lost_n_found.c
@@ -31,18 +31,19 @@ static void add_dotdot(struct gfs2_inode *ip)
/* If there's a pre-existing .. directory entry, we have to
back out the links. */
di = dirtree_find(ip->i_di.di_num.no_addr);
- if (di && valid_block(sdp, di->dotdot_parent)) {
+ if (di && valid_block(sdp, di->dotdot_parent.no_addr)) {
struct gfs2_inode *dip;
log_debug(_("Directory %lld (0x%llx) already had a "
"\"..\" link to %lld (0x%llx).\n"),
(unsigned long long)ip->i_di.di_num.no_addr,
(unsigned long long)ip->i_di.di_num.no_addr,
- (unsigned long long)di->dotdot_parent,
- (unsigned long long)di->dotdot_parent);
- decr_link_count(di->dotdot_parent, ip->i_di.di_num.no_addr,
+ (unsigned long long)di->dotdot_parent.no_addr,
+ (unsigned long long)di->dotdot_parent.no_addr);
+ decr_link_count(di->dotdot_parent.no_addr,
+ ip->i_di.di_num.no_addr,
_(".. unlinked, moving to lost+found"));
- dip = fsck_load_inode(sdp, di->dotdot_parent);
+ dip = fsck_load_inode(sdp, di->dotdot_parent.no_addr);
if (dip->i_di.di_nlink > 0) {
dip->i_di.di_nlink--;
set_di_nlink(dip); /* keep inode tree in sync */
@@ -67,7 +68,7 @@ static void add_dotdot(struct gfs2_inode *ip)
"'..' = 0x%llx\n"),
(unsigned long long)ip->i_di.di_num.no_addr,
(unsigned long long)ip->i_di.di_num.no_addr,
- (unsigned long long)di->dotdot_parent);
+ (unsigned long long)di->dotdot_parent.no_addr);
else
log_debug(_("Couldn't find directory %lld (0x%llx) "
"in directory tree.\n"),
@@ -187,14 +188,13 @@ int add_inode_to_lf(struct gfs2_inode *ip){
_("lost+found dinode"),
gfs2_inode_dir);
/* root inode links to lost+found */
- incr_link_count(sdp->md.rooti->i_di.di_num.no_addr,
- lf_dip->i_di.di_num.no_addr, _("root"));
+ incr_link_count(sdp->md.rooti->i_di.di_num,
+ lf_dip, _("root"));
/* lost+found link for '.' from itself */
- incr_link_count(lf_dip->i_di.di_num.no_addr,
- lf_dip->i_di.di_num.no_addr, "\".\"");
+ incr_link_count(lf_dip->i_di.di_num,
+ lf_dip, "\".\"");
/* lost+found link for '..' back to root */
- incr_link_count(lf_dip->i_di.di_num.no_addr,
- sdp->md.rooti->i_di.di_num.no_addr,
+ incr_link_count(lf_dip->i_di.di_num, sdp->md.rooti,
"\"..\"");
if (sdp->gfs1)
lf_dip->i_di.__pad1 = GFS_FILE_DIR;
@@ -277,12 +277,10 @@ int add_inode_to_lf(struct gfs2_inode *ip){
reprocess_inode(lf_dip, "lost+found");
/* This inode is linked from lost+found */
- incr_link_count(ip->i_di.di_num.no_addr, lf_dip->i_di.di_num.no_addr,
- _("from lost+found"));
+ incr_link_count(ip->i_di.di_num, lf_dip, _("from lost+found"));
/* If it's a directory, lost+found is back-linked to it via .. */
if (mode == S_IFDIR)
- incr_link_count(lf_dip->i_di.di_num.no_addr,
- ip->i_di.di_num.no_addr, _("to lost+found"));
+ incr_link_count(lf_dip->i_di.di_num, ip, _("to lost+found"));
log_notice( _("Added inode #%llu (0x%llx) to lost+found\n"),
(unsigned long long)ip->i_di.di_num.no_addr,
diff --git a/gfs2/fsck/pass1.c b/gfs2/fsck/pass1.c
index 18757fe..0f80f87 100644
--- a/gfs2/fsck/pass1.c
+++ b/gfs2/fsck/pass1.c
@@ -1363,7 +1363,7 @@ static int check_system_inode(struct gfs2_sbd *sdp,
filename, mark);
ds.q = mark;
if (mark == gfs2_inode_dir)
- dirtree_insert((*sysinode)->i_di.di_num.no_addr);
+ dirtree_insert((*sysinode)->i_di.di_num);
}
} else
log_info( _("System inode for '%s' is corrupt or missing.\n"),
@@ -1390,7 +1390,7 @@ static int check_system_inode(struct gfs2_sbd *sdp,
filename, mark);
ds.q = mark;
if (mark == gfs2_inode_dir)
- dirtree_insert((*sysinode)->i_di.di_num.no_addr);
+ dirtree_insert((*sysinode)->i_di.di_num);
} else {
log_err( _("Cannot continue without valid %s inode\n"),
filename);
@@ -1504,13 +1504,13 @@ static int check_system_inodes(struct gfs2_sbd *sdp)
/* gfs1 has four dinodes that are set in the superblock and
therefore not linked to anything else. We need to adjust
the link counts so pass4 doesn't get confused. */
- incr_link_count(sdp->md.statfs->i_di.di_num.no_addr, 0,
+ incr_link_count(sdp->md.statfs->i_di.di_num, NULL,
_("gfs1 statfs inode"));
- incr_link_count(sdp->md.jiinode->i_di.di_num.no_addr, 0,
+ incr_link_count(sdp->md.jiinode->i_di.di_num, NULL,
_("gfs1 jindex inode"));
- incr_link_count(sdp->md.riinode->i_di.di_num.no_addr, 0,
+ incr_link_count(sdp->md.riinode->i_di.di_num, NULL,
_("gfs1 rindex inode"));
- incr_link_count(sdp->md.qinode->i_di.di_num.no_addr, 0,
+ incr_link_count(sdp->md.qinode->i_di.di_num, NULL,
_("gfs1 quota inode"));
return 0;
}
diff --git a/gfs2/fsck/pass1b.c b/gfs2/fsck/pass1b.c
index 9e6f376..e8c39be 100644
--- a/gfs2/fsck/pass1b.c
+++ b/gfs2/fsck/pass1b.c
@@ -530,12 +530,12 @@ static int resolve_dup_references(struct gfs2_sbd *sdp, struct duptree *b,
check_inode_eattr(ip, &clear_dup_fxns);
/* If the dup was in data or metadata, clear the dinode */
if (id->reftypecount[ref_as_data] ||
- id->reftypecount[ref_as_meta])
+ id->reftypecount[ref_as_meta]) {
check_metatree(ip, &clear_dup_fxns);
-
- fsck_blockmap_set(ip, ip->i_di.di_num.no_addr,
- _("duplicate referencing bad"),
- gfs2_inode_invalid);
+ fsck_blockmap_set(ip, ip->i_di.di_num.no_addr,
+ _("duplicate referencing bad"),
+ gfs2_inode_invalid);
+ }
fsck_inode_put(&ip); /* out, brelse, free */
(dh->ref_inode_count)--;
/* FIXME: other option should be to duplicate the
diff --git a/gfs2/fsck/pass2.c b/gfs2/fsck/pass2.c
index 78c9f47..177b01a 100644
--- a/gfs2/fsck/pass2.c
+++ b/gfs2/fsck/pass2.c
@@ -15,45 +15,46 @@
#include "eattr.h"
#include "metawalk.h"
#include "link.h"
+#include "inode_hash.h"
#define MAX_FILENAME 256
/* Set children's parent inode in dir_info structure - ext2 does not set
* dotdot inode here, but instead in pass3 - should we? */
-static int set_parent_dir(struct gfs2_sbd *sdp, uint64_t childblock,
- uint64_t parentblock)
+static int set_parent_dir(struct gfs2_sbd *sdp, struct gfs2_inum child,
+ struct gfs2_inum parent)
{
struct dir_info *di;
- di = dirtree_find(childblock);
+ di = dirtree_find(child.no_addr);
if (!di) {
log_err( _("Unable to find block %llu (0x%llx"
") in dir_info list\n"),
- (unsigned long long)childblock,
- (unsigned long long)childblock);
+ (unsigned long long)child.no_addr,
+ (unsigned long long)child.no_addr);
return -1;
}
- if (di->dinode == childblock) {
+ if (di->dinode.no_addr == child.no_addr &&
+ di->dinode.no_formal_ino == child.no_formal_ino) {
if (di->treewalk_parent) {
- log_err( _("Another directory at block %llu"
- " (0x%llx) already contains this "
- "child %llu (%llx) - checking parent %llu"
- " (0x%llx)\n"),
+ log_err( _("Another directory at block %llx (0x%llx) "
+ "already contains this child %lld (%llx) - "
+ "checking parent %llx (0x%llx)\n"),
(unsigned long long)di->treewalk_parent,
(unsigned long long)di->treewalk_parent,
- (unsigned long long)childblock,
- (unsigned long long)childblock,
- (unsigned long long)parentblock,
- (unsigned long long)parentblock);
+ (unsigned long long)child.no_addr,
+ (unsigned long long)child.no_addr,
+ (unsigned long long)parent.no_addr,
+ (unsigned long long)parent.no_addr);
return 1;
}
log_debug( _("Child %lld (0x%llx) has parent %lld (0x%llx)\n"),
- (unsigned long long)childblock,
- (unsigned long long)childblock,
- (unsigned long long)parentblock,
- (unsigned long long)parentblock);
- di->treewalk_parent = parentblock;
+ (unsigned long long)child.no_addr,
+ (unsigned long long)child.no_addr,
+ (unsigned long long)parent.no_addr,
+ (unsigned long long)parent.no_addr);
+ di->treewalk_parent = parent.no_addr;
}
return 0;
@@ -61,7 +62,7 @@ static int set_parent_dir(struct gfs2_sbd *sdp, uint64_t childblock,
/* Set's the child's '..' directory inode number in dir_info structure */
static int set_dotdot_dir(struct gfs2_sbd *sdp, uint64_t childblock,
- uint64_t parentblock)
+ struct gfs2_inum parent)
{
struct dir_info *di;
@@ -71,29 +72,30 @@ static int set_dotdot_dir(struct gfs2_sbd *sdp, uint64_t childblock,
") in dir_info tree\n"), childblock, childblock);
return -1;
}
- if (di->dinode != childblock) {
+ if (di->dinode.no_addr != childblock) {
log_debug("'..' doesn't point to what we found: childblock "
"(0x%llx) != dinode (0x%llx)\n",
(unsigned long long)childblock,
- (unsigned long long)di->dinode);
+ (unsigned long long)di->dinode.no_addr);
return -1;
}
/* Special case for root inode because we set it earlier */
- if (di->dotdot_parent &&
- sdp->md.rooti->i_di.di_num.no_addr != di->dinode) {
+ if (di->dotdot_parent.no_addr &&
+ sdp->md.rooti->i_di.di_num.no_addr != di->dinode.no_addr) {
/* This should never happen */
log_crit( _("Dotdot parent already set for block %llu (0x%llx)"
"-> %llu (0x%llx)\n"),
(unsigned long long)childblock,
(unsigned long long)childblock,
- (unsigned long long)di->dotdot_parent,
- (unsigned long long)di->dotdot_parent);
+ (unsigned long long)di->dotdot_parent.no_addr,
+ (unsigned long long)di->dotdot_parent.no_addr);
return -1;
}
log_debug("Setting '..' for directory block (0x%llx) to parent "
"(0x%llx)\n", (unsigned long long)childblock,
- (unsigned long long)parentblock);
- di->dotdot_parent = parentblock;
+ (unsigned long long)parent.no_addr);
+ di->dotdot_parent.no_addr = parent.no_addr;
+ di->dotdot_parent.no_formal_ino = parent.no_formal_ino;
return 0;
}
@@ -223,6 +225,69 @@ struct metawalk_fxns pass2_fxns_delete = {
.check_eattr_extentry = delete_eattr_extentry,
};
+/* bad_formal_ino - handle mismatches in formal inode number
+ * Returns: 0 if the dirent was repaired
+ * 1 if the caller should delete the dirent
+ */
+static int bad_formal_ino(struct gfs2_inode *ip, struct gfs2_dirent *dent,
+ struct gfs2_inum entry, const char *tmp_name,
+ uint8_t q, struct gfs2_dirent *de,
+ struct gfs2_buffer_head *bh)
+{
+ struct inode_info *ii;
+ struct gfs2_inode *child_ip;
+ struct gfs2_inum childs_dotdot;
+ struct gfs2_sbd *sdp = ip->i_sbd;
+ int error;
+
+ ii = inodetree_find(entry.no_addr);
+ log_err( _("Directory entry '%s' pointing to block %llu (0x%llx) in "
+ "directory %llu (0x%llx) has the wrong 'formal' inode "
+ "number.\n"), tmp_name, (unsigned long long)entry.no_addr,
+ (unsigned long long)entry.no_addr,
+ (unsigned long long)ip->i_di.di_num.no_addr,
+ (unsigned long long)ip->i_di.di_num.no_addr);
+ log_err( _("The directory entry has %llu (0x%llx) but the inode has "
+ "%llu (0x%llx)\n"), (unsigned long long)entry.no_formal_ino,
+ (unsigned long long)entry.no_formal_ino,
+ (unsigned long long)ii->di_num.no_formal_ino,
+ (unsigned long long)ii->di_num.no_formal_ino);
+ if (q != gfs2_inode_dir) {
+ if (query( _("Remove the corrupt directory entry? (y/n) ")))
+ return 1;
+ log_err( _("Corrupt directory entry not removed.\n"));
+ return 0;
+ }
+ /* We have a directory pointing to another directory, but the
+ formal inode number still doesn't match. If that directory
+ has a '..' pointing back, just fix up the no_formal_ino. */
+ child_ip = inode_read(sdp, entry.no_addr);
+ error = dir_search(child_ip, "..", 2, NULL, &childs_dotdot);
+ if (!error && childs_dotdot.no_addr == ip->i_di.di_num.no_addr) {
+ log_err( _("The entry points to another directory with intact "
+ "linkage.\n"));
+ if (query( _("Fix the bad directory entry? (y/n) "))) {
+ log_err( _("Fixing the corrupt directory entry.\n"));
+ entry.no_formal_ino = ii->di_num.no_formal_ino;
+ de->de_inum.no_formal_ino = entry.no_formal_ino;
+ gfs2_dirent_out(de, (char *)dent);
+ bmodified(bh);
+ incr_link_count(entry, ip, _("fixed reference"));
+ set_parent_dir(sdp, entry, ip->i_di.di_num);
+ } else {
+ log_err( _("Directory entry not fixed.\n"));
+ }
+ } else {
+ if (query( _("Remove the corrupt directory entry? (y/n) "))) {
+ inode_put(&child_ip);
+ return 1;
+ }
+ log_err( _("Corrupt directory entry not removed.\n"));
+ }
+ inode_put(&child_ip);
+ return 0;
+}
+
/* FIXME: should maybe refactor this a bit - but need to deal with
* FIXMEs internally first */
static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
@@ -233,7 +298,7 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
struct gfs2_sbd *sdp = ip->i_sbd;
uint8_t q;
char tmp_name[MAX_FILENAME];
- uint64_t entryblock;
+ struct gfs2_inum entry;
struct dir_status *ds = (struct dir_status *) priv;
int error;
struct gfs2_inode *entry_ip = NULL;
@@ -250,7 +315,8 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
clear_eattrs.check_eattr_entry = clear_eattr_entry;
clear_eattrs.check_eattr_extentry = clear_eattr_extentry;
- entryblock = de->de_inum.no_addr;
+ entry.no_addr = de->de_inum.no_addr;
+ entry.no_formal_ino = de->de_inum.no_formal_ino;
/* Start of checks */
memset(tmp_name, 0, MAX_FILENAME);
@@ -259,7 +325,7 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
else
strncpy(tmp_name, filename, MAX_FILENAME - 1);
- if (!valid_block(ip->i_sbd, entryblock)) {
+ if (!valid_block(ip->i_sbd, entry.no_addr)) {
log_err( _("Block # referenced by directory entry %s in inode "
"%lld (0x%llx) is invalid\n"),
tmp_name, (unsigned long long)ip->i_di.di_num.no_addr,
@@ -272,7 +338,7 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
(*count)++;
ds->entry_count++;
/* can't do this because the block is out of range:
- incr_link_count(entryblock); */
+ incr_link_count(entry); */
return 0;
}
}
@@ -314,7 +380,7 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
tmp_name);
}
- q = block_type(entryblock);
+ q = block_type(entry.no_addr);
/* Get the status of the directory inode */
/**
* 1. Blocks marked "invalid" were invalidated due to duplicate
@@ -334,8 +400,8 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
/* Handle bad blocks */
log_err( _("Found directory entry '%s' pointing to invalid "
"block %lld (0x%llx)\n"), tmp_name,
- (unsigned long long)entryblock,
- (unsigned long long)entryblock);
+ (unsigned long long)entry.no_addr,
+ (unsigned long long)entry.no_addr);
if (!query( _("Delete inode containing bad blocks? (y/n)"))) {
log_warn( _("Entry to inode containing bad blocks remains\n"));
@@ -343,10 +409,10 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
}
if (q == gfs2_bad_block) {
- if (ip->i_di.di_num.no_addr == entryblock)
+ if (ip->i_di.di_num.no_addr == entry.no_addr)
entry_ip = ip;
else
- entry_ip = fsck_load_inode(sdp, entryblock);
+ entry_ip = fsck_load_inode(sdp, entry.no_addr);
if (ip->i_di.di_eattr) {
check_inode_eattr(entry_ip,
&pass2_fxns_delete);
@@ -355,19 +421,19 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
if (entry_ip != ip)
fsck_inode_put(&entry_ip);
}
- fsck_blockmap_set(ip, entryblock,
+ fsck_blockmap_set(ip, entry.no_addr,
_("bad directory entry"), gfs2_block_free);
log_err( _("Inode %lld (0x%llx) was deleted.\n"),
- (unsigned long long)entryblock,
- (unsigned long long)entryblock);
+ (unsigned long long)entry.no_addr,
+ (unsigned long long)entry.no_addr);
goto nuke_dentry;
}
if (q < gfs2_inode_dir || q > gfs2_inode_sock) {
log_err( _("Directory entry '%s' referencing inode %llu "
"(0x%llx) in dir inode %llu (0x%llx) block type "
"%d: %s.\n"), tmp_name,
- (unsigned long long)entryblock,
- (unsigned long long)entryblock,
+ (unsigned long long)entry.no_addr,
+ (unsigned long long)entry.no_addr,
(unsigned long long)ip->i_di.di_num.no_addr,
(unsigned long long)ip->i_di.di_num.no_addr,
q, q == gfs2_inode_invalid ?
@@ -404,8 +470,8 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
log_err( _("Error: directory entry type is "
"incompatible with block type at block %lld "
"(0x%llx) in directory inode %llu (0x%llx).\n"),
- (unsigned long long)entryblock,
- (unsigned long long)entryblock,
+ (unsigned long long)entry.no_addr,
+ (unsigned long long)entry.no_addr,
(unsigned long long)ip->i_di.di_num.no_addr,
(unsigned long long)ip->i_di.di_num.no_addr);
log_err( _("Directory entry type is %d, block type is %d.\n"),
@@ -417,17 +483,17 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
log_err( _("Type '%s' in dir entry (%s, %llu/0x%llx) conflicts"
" with type '%s' in dinode. (Dir entry is stale.)\n"),
de_type_string(de->de_type), tmp_name,
- (unsigned long long)entryblock,
- (unsigned long long)entryblock,
+ (unsigned long long)entry.no_addr,
+ (unsigned long long)entry.no_addr,
block_type_string(q));
if (!query( _("Clear stale directory entry? (y/n) "))) {
log_err( _("Stale directory entry remains\n"));
goto dentry_is_valid;
}
- if (ip->i_di.di_num.no_addr == entryblock)
+ if (ip->i_di.di_num.no_addr == entry.no_addr)
entry_ip = ip;
else
- entry_ip = fsck_load_inode(sdp, entryblock);
+ entry_ip = fsck_load_inode(sdp, entry.no_addr);
check_inode_eattr(entry_ip, &clear_eattrs);
if (entry_ip != ip)
fsck_inode_put(&entry_ip);
@@ -450,10 +516,10 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
* and check the rest of the '.' entry? */
goto dentry_is_valid;
}
- if (ip->i_di.di_num.no_addr == entryblock)
+ if (ip->i_di.di_num.no_addr == entry.no_addr)
entry_ip = ip;
else
- entry_ip = fsck_load_inode(sdp, entryblock);
+ entry_ip = fsck_load_inode(sdp, entry.no_addr);
check_inode_eattr(entry_ip, &clear_eattrs);
if (entry_ip != ip)
fsck_inode_put(&entry_ip);
@@ -464,15 +530,15 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
* location */
/* check that '.' refers to this inode */
- if (entryblock != ip->i_di.di_num.no_addr) {
+ if (entry.no_addr != ip->i_di.di_num.no_addr) {
log_err( _("'.' entry's value incorrect in directory %llu"
" (0x%llx). Points to %llu"
" (0x%llx) when it should point to %llu"
" (0x%llx).\n"),
- (unsigned long long)entryblock,
- (unsigned long long)entryblock,
- (unsigned long long)entryblock,
- (unsigned long long)entryblock,
+ (unsigned long long)entry.no_addr,
+ (unsigned long long)entry.no_addr,
+ (unsigned long long)entry.no_addr,
+ (unsigned long long)entry.no_addr,
(unsigned long long)ip->i_di.di_num.no_addr,
(unsigned long long)ip->i_di.di_num.no_addr);
if (!query( _("Remove '.' reference? (y/n) "))) {
@@ -481,10 +547,10 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
* this '.' entry is invalid */
goto dentry_is_valid;
}
- if (ip->i_di.di_num.no_addr == entryblock)
+ if (ip->i_di.di_num.no_addr == entry.no_addr)
entry_ip = ip;
else
- entry_ip = fsck_load_inode(sdp, entryblock);
+ entry_ip = fsck_load_inode(sdp, entry.no_addr);
check_inode_eattr(entry_ip, &clear_eattrs);
if (entry_ip != ip)
fsck_inode_put(&entry_ip);
@@ -511,10 +577,10 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
goto dentry_is_valid;
}
- if (ip->i_di.di_num.no_addr == entryblock)
+ if (ip->i_di.di_num.no_addr == entry.no_addr)
entry_ip = ip;
else
- entry_ip = fsck_load_inode(sdp, entryblock);
+ entry_ip = fsck_load_inode(sdp, entry.no_addr);
check_inode_eattr(entry_ip, &clear_eattrs);
if (entry_ip != ip)
fsck_inode_put(&entry_ip);
@@ -531,10 +597,10 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
log_err( _("Bad '..' directory entry remains\n"));
goto dentry_is_valid;
}
- if (ip->i_di.di_num.no_addr == entryblock)
+ if (ip->i_di.di_num.no_addr == entry.no_addr)
entry_ip = ip;
else
- entry_ip = fsck_load_inode(sdp, entryblock);
+ entry_ip = fsck_load_inode(sdp, entry.no_addr);
check_inode_eattr(entry_ip, &clear_eattrs);
if (entry_ip != ip)
fsck_inode_put(&entry_ip);
@@ -546,7 +612,7 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
/* Add the address this entry is pointing to
* to this inode's dotdot_parent in
* dir_info */
- if (set_dotdot_dir(sdp, ip->i_di.di_num.no_addr, entryblock)) {
+ if (set_dotdot_dir(sdp, ip->i_di.di_num.no_addr, entry)) {
stack;
return -1;
}
@@ -559,18 +625,18 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
if (q != gfs2_inode_dir) {
log_debug( _("Found non-dir inode dentry pointing to %lld "
"(0x%llx)\n"),
- (unsigned long long)entryblock,
- (unsigned long long)entryblock);
+ (unsigned long long)entry.no_addr,
+ (unsigned long long)entry.no_addr);
goto dentry_is_valid;
}
/*log_debug( _("Found plain directory dentry\n"));*/
- error = set_parent_dir(sdp, entryblock, ip->i_di.di_num.no_addr);
+ error = set_parent_dir(sdp, entry, ip->i_di.di_num);
if (error > 0) {
log_err( _("%s: Hard link to block %llu (0x%llx"
") detected.\n"), tmp_name,
- (unsigned long long)entryblock,
- (unsigned long long)entryblock);
+ (unsigned long long)entry.no_addr,
+ (unsigned long long)entry.no_addr);
if (query( _("Clear hard link to directory? (y/n) ")))
goto nuke_dentry;
@@ -584,8 +650,12 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
}
dentry_is_valid:
/* This directory inode links to this inode via this dentry */
- incr_link_count(entryblock, ip->i_di.di_num.no_addr,
- _("valid reference"));
+ error = incr_link_count(entry, ip, _("valid reference"));
+ if (error > 0) {
+ if (bad_formal_ino(ip, dent, entry, tmp_name, q, de, bh) == 1)
+ goto nuke_dentry;
+ }
+
(*count)++;
ds->entry_count++;
/* End of checks */
@@ -690,8 +760,7 @@ static int check_system_dir(struct gfs2_inode *sysinode, const char *dirname,
if (cur_blks != sysinode->i_di.di_blocks)
reprocess_inode(sysinode, dirname);
/* This system inode is linked to itself via '.' */
- incr_link_count(sysinode->i_di.di_num.no_addr,
- sysinode->i_di.di_num.no_addr,
+ incr_link_count(sysinode->i_di.di_num, sysinode,
"sysinode \".\"");
ds.entry_count++;
free(filename);
@@ -917,8 +986,7 @@ int pass2(struct gfs2_sbd *sdp)
reprocess_inode(ip, dirname);
}
/* directory links to itself via '.' */
- incr_link_count(ip->i_di.di_num.no_addr,
- ip->i_di.di_num.no_addr,
+ incr_link_count(ip->i_di.di_num, ip,
_("\". (itself)\""));
ds.entry_count++;
free(filename);
diff --git a/gfs2/fsck/pass3.c b/gfs2/fsck/pass3.c
index ef4340e..53052b6 100644
--- a/gfs2/fsck/pass3.c
+++ b/gfs2/fsck/pass3.c
@@ -69,7 +69,7 @@ static int attach_dotdot_to(struct gfs2_sbd *sdp, uint64_t newdotdot,
(unsigned long long)ip->i_di.di_num.no_addr);
reprocess_inode(ip, dirname);
}
- incr_link_count(newdotdot, block, _("new \"..\""));
+ incr_link_count(pip->i_di.di_num, ip, _("new \"..\""));
fsck_inode_put(&ip);
fsck_inode_put(&pip);
free(filename);
@@ -88,27 +88,28 @@ static struct dir_info *mark_and_return_parent(struct gfs2_sbd *sdp,
if (!di->treewalk_parent)
return NULL;
- if (di->dotdot_parent == di->treewalk_parent) {
- q_dotdot = block_type(di->dotdot_parent);
+ if (di->dotdot_parent.no_addr == di->treewalk_parent) {
+ q_dotdot = block_type(di->dotdot_parent.no_addr);
if (q_dotdot != gfs2_inode_dir) {
log_err( _("Orphaned directory at block %llu (0x%llx) "
"moved to lost+found\n"),
- (unsigned long long)di->dinode,
- (unsigned long long)di->dinode);
+ (unsigned long long)di->dinode.no_addr,
+ (unsigned long long)di->dinode.no_addr);
return NULL;
}
goto out;
}
log_warn( _("Directory '..' and treewalk connections disagree for "
- "inode %llu (0x%llx)\n"), (unsigned long long)di->dinode,
- (unsigned long long)di->dinode);
+ "inode %llu (0x%llx)\n"),
+ (unsigned long long)di->dinode.no_addr,
+ (unsigned long long)di->dinode.no_addr);
log_notice( _("'..' has %llu (0x%llx), treewalk has %llu (0x%llx)\n"),
- (unsigned long long)di->dotdot_parent,
- (unsigned long long)di->dotdot_parent,
+ (unsigned long long)di->dotdot_parent.no_addr,
+ (unsigned long long)di->dotdot_parent.no_addr,
(unsigned long long)di->treewalk_parent,
(unsigned long long)di->treewalk_parent);
- q_dotdot = block_type(di->dotdot_parent);
+ q_dotdot = block_type(di->dotdot_parent.no_addr);
q_treewalk = block_type(di->treewalk_parent);
/* if the dotdot entry isn't a directory, but the
* treewalk is, treewalk is correct - if the treewalk
@@ -128,8 +129,9 @@ static struct dir_info *mark_and_return_parent(struct gfs2_sbd *sdp,
(unsigned long long)di->treewalk_parent,
(unsigned long long)di->treewalk_parent);
attach_dotdot_to(sdp, di->treewalk_parent,
- di->dotdot_parent, di->dinode);
- di->dotdot_parent = di->treewalk_parent;
+ di->dotdot_parent.no_addr,
+ di->dinode.no_addr);
+ di->dotdot_parent.no_addr = di->treewalk_parent;
}
goto out;
}
@@ -137,8 +139,9 @@ static struct dir_info *mark_and_return_parent(struct gfs2_sbd *sdp,
log_err( _("Both .. and treewalk parents are directories, "
"going with treewalk...\n"));
attach_dotdot_to(sdp, di->treewalk_parent,
- di->dotdot_parent, di->dinode);
- di->dotdot_parent = di->treewalk_parent;
+ di->dotdot_parent.no_addr,
+ di->dinode.no_addr);
+ di->dotdot_parent.no_addr = di->treewalk_parent;
goto out;
}
log_warn( _(".. parent is valid, but treewalk is bad - reattaching to "
@@ -148,14 +151,15 @@ static struct dir_info *mark_and_return_parent(struct gfs2_sbd *sdp,
if (!query( _("Remove directory entry for bad inode %llu (0x%llx) in "
"%llu (0x%llx)? (y/n)"),
- (unsigned long long)di->dinode,
- (unsigned long long)di->dinode,
+ (unsigned long long)di->dinode.no_addr,
+ (unsigned long long)di->dinode.no_addr,
(unsigned long long)di->treewalk_parent,
(unsigned long long)di->treewalk_parent)) {
log_err( _("Directory entry to invalid inode remains\n"));
return NULL;
}
- error = remove_dentry_from_dir(sdp, di->treewalk_parent, di->dinode);
+ error = remove_dentry_from_dir(sdp, di->treewalk_parent,
+ di->dinode.no_addr);
if (error < 0) {
stack;
return NULL;
@@ -163,8 +167,8 @@ static struct dir_info *mark_and_return_parent(struct gfs2_sbd *sdp,
if (error > 0)
log_warn( _("Unable to find dentry for block %llu"
" (0x%llx) in %llu (0x%llx)\n"),
- (unsigned long long)di->dinode,
- (unsigned long long)di->dinode,
+ (unsigned long long)di->dinode.no_addr,
+ (unsigned long long)di->dinode.no_addr,
(unsigned long long)di->treewalk_parent,
(unsigned long long)di->treewalk_parent);
log_warn( _("Directory entry removed\n"));
@@ -173,7 +177,7 @@ static struct dir_info *mark_and_return_parent(struct gfs2_sbd *sdp,
return NULL;
out:
- pdi = dirtree_find(di->dotdot_parent);
+ pdi = dirtree_find(di->dotdot_parent.no_addr);
return pdi;
}
@@ -247,13 +251,14 @@ int pass3(struct gfs2_sbd *sdp)
tdi = mark_and_return_parent(sdp, di);
if (tdi) {
- log_debug( _("Directory at block %llu (0x%llx) connected\n"),
- (unsigned long long)di->dinode,
- (unsigned long long)di->dinode);
+ log_debug( _("Directory at block %llu "
+ "(0x%llx) connected\n"),
+ (unsigned long long)di->dinode.no_addr,
+ (unsigned long long)di->dinode.no_addr);
di = tdi;
continue;
}
- q = block_type(di->dinode);
+ q = block_type(di->dinode.no_addr);
if (q == gfs2_bad_block) {
log_err( _("Found unlinked directory "
"containing bad block\n"));
@@ -262,14 +267,14 @@ int pass3(struct gfs2_sbd *sdp)
log_warn( _("inode %lld (0x%llx) is "
"now marked as free\n"),
(unsigned long long)
- di->dinode,
+ di->dinode.no_addr,
(unsigned long long)
- di->dinode);
+ di->dinode.no_addr);
/* Can't use fsck_blockmap_set
because we don't have ip */
- gfs2_blockmap_set(bl, di->dinode,
+ gfs2_blockmap_set(bl, di->dinode.no_addr,
gfs2_block_free);
- check_n_fix_bitmap(sdp, di->dinode,
+ check_n_fix_bitmap(sdp, di->dinode.no_addr,
gfs2_block_free);
break;
} else
@@ -288,29 +293,31 @@ int pass3(struct gfs2_sbd *sdp)
}
log_warn( _("inode %lld (0x%llx) is now "
"marked as free\n"),
- (unsigned long long)di->dinode,
- (unsigned long long)di->dinode);
+ (unsigned long long)di->dinode.no_addr,
+ (unsigned long long)di->dinode.no_addr);
/* Can't use fsck_blockmap_set
because we don't have ip */
- gfs2_blockmap_set(bl, di->dinode,
+ gfs2_blockmap_set(bl, di->dinode.no_addr,
gfs2_block_free);
- check_n_fix_bitmap(sdp, di->dinode,
+ check_n_fix_bitmap(sdp, di->dinode.no_addr,
gfs2_block_free);
log_err( _("The block was cleared\n"));
break;
}
log_err( _("Found unlinked directory at block %llu"
- " (0x%llx)\n"), (unsigned long long)di->dinode,
- (unsigned long long)di->dinode);
- ip = fsck_load_inode(sdp, di->dinode);
+ " (0x%llx)\n"),
+ (unsigned long long)di->dinode.no_addr,
+ (unsigned long long)di->dinode.no_addr);
+ ip = fsck_load_inode(sdp, di->dinode.no_addr);
/* Don't skip zero size directories with eattrs */
if (!ip->i_di.di_size && !ip->i_di.di_eattr){
log_err( _("Unlinked directory has zero "
"size.\n"));
if (query( _("Remove zero-size unlinked "
"directory? (y/n) "))) {
- fsck_blockmap_set(ip, di->dinode,
+ fsck_blockmap_set(ip,
+ di->dinode.no_addr,
_("zero-sized unlinked inode"),
gfs2_block_free);
fsck_inode_put(&ip);
diff --git a/gfs2/fsck/pass4.c b/gfs2/fsck/pass4.c
index 80ecb38..311b96b 100644
--- a/gfs2/fsck/pass4.c
+++ b/gfs2/fsck/pass4.c
@@ -60,28 +60,28 @@ static int scan_inode_list(struct gfs2_sbd *sdp) {
}
/* Don't check reference counts on the special gfs files */
if (sdp->gfs1 &&
- ((ii->inode == sdp->md.riinode->i_di.di_num.no_addr) ||
- (ii->inode == sdp->md.jiinode->i_di.di_num.no_addr) ||
- (ii->inode == sdp->md.qinode->i_di.di_num.no_addr) ||
- (ii->inode == sdp->md.statfs->i_di.di_num.no_addr)))
+ ((ii->di_num.no_addr == sdp->md.riinode->i_di.di_num.no_addr) ||
+ (ii->di_num.no_addr == sdp->md.jiinode->i_di.di_num.no_addr) ||
+ (ii->di_num.no_addr == sdp->md.qinode->i_di.di_num.no_addr) ||
+ (ii->di_num.no_addr == sdp->md.statfs->i_di.di_num.no_addr)))
continue;
if (ii->counted_links == 0) {
log_err( _("Found unlinked inode at %llu (0x%llx)\n"),
- (unsigned long long)ii->inode,
- (unsigned long long)ii->inode);
- q = block_type(ii->inode);
+ (unsigned long long)ii->di_num.no_addr,
+ (unsigned long long)ii->di_num.no_addr);
+ q = block_type(ii->di_num.no_addr);
if (q == gfs2_bad_block) {
log_err( _("Unlinked inode %llu (0x%llx) contains "
"bad blocks\n"),
- (unsigned long long)ii->inode,
- (unsigned long long)ii->inode);
+ (unsigned long long)ii->di_num.no_addr,
+ (unsigned long long)ii->di_num.no_addr);
if (query( _("Delete unlinked inode with bad "
"blocks? (y/n) "))) {
- ip = fsck_load_inode(sdp, ii->inode);
+ ip = fsck_load_inode(sdp, ii->di_num.no_addr);
check_inode_eattr(ip,
&pass4_fxns_delete);
check_metatree(ip, &pass4_fxns_delete);
- fsck_blockmap_set(ip, ii->inode,
+ fsck_blockmap_set(ip, ii->di_num.no_addr,
_("bad unlinked"),
gfs2_block_free);
fsck_inode_put(&ip);
@@ -98,14 +98,14 @@ static int scan_inode_list(struct gfs2_sbd *sdp) {
log_err( _("Unlinked block %lld (0x%llx) "
"marked as inode is "
"not an inode (%d)\n"),
- (unsigned long long)ii->inode,
- (unsigned long long)ii->inode, q);
- ip = fsck_load_inode(sdp, ii->inode);
+ (unsigned long long)ii->di_num.no_addr,
+ (unsigned long long)ii->di_num.no_addr, q);
+ ip = fsck_load_inode(sdp, ii->di_num.no_addr);
if (query(_("Delete unlinked inode? (y/n) "))) {
check_inode_eattr(ip,
&pass4_fxns_delete);
check_metatree(ip, &pass4_fxns_delete);
- fsck_blockmap_set(ip, ii->inode,
+ fsck_blockmap_set(ip, ii->di_num.no_addr,
_("invalid unlinked"),
gfs2_block_free);
fsck_inode_put(&ip);
@@ -117,7 +117,7 @@ static int scan_inode_list(struct gfs2_sbd *sdp) {
}
continue;
}
- ip = fsck_load_inode(sdp, ii->inode);
+ ip = fsck_load_inode(sdp, ii->di_num.no_addr);
/* We don't want to clear zero-size files with
* eattrs - there might be relevent info in
@@ -126,7 +126,7 @@ static int scan_inode_list(struct gfs2_sbd *sdp) {
log_err( _("Unlinked inode has zero size\n"));
if (query(_("Clear zero-size unlinked inode? "
"(y/n) "))) {
- fsck_blockmap_set(ip, ii->inode,
+ fsck_blockmap_set(ip, ii->di_num.no_addr,
_("unlinked zero-length"),
gfs2_block_free);
fsck_inode_put(&ip);
@@ -151,33 +151,34 @@ static int scan_inode_list(struct gfs2_sbd *sdp) {
else if (ii->di_nlink != ii->counted_links) {
log_err( _("Link count inconsistent for inode %llu"
" (0x%llx) has %u but fsck found %u.\n"),
- (unsigned long long)ii->inode,
- (unsigned long long)ii->inode, ii->di_nlink,
+ (unsigned long long)ii->di_num.no_addr,
+ (unsigned long long)ii->di_num.no_addr, ii->di_nlink,
ii->counted_links);
/* Read in the inode, adjust the link count,
* and write it back out */
if (query( _("Update link count for inode %llu"
" (0x%llx) ? (y/n) "),
- (unsigned long long)ii->inode,
- (unsigned long long)ii->inode)) {
- ip = fsck_load_inode(sdp, ii->inode); /* bread, inode_get */
+ (unsigned long long)ii->di_num.no_addr,
+ (unsigned long long)ii->di_num.no_addr)) {
+ ip = fsck_load_inode(sdp, ii->di_num.no_addr); /* bread, inode_get */
fix_link_count(ii, ip);
ii->di_nlink = ii->counted_links;
fsck_inode_put(&ip); /* out, brelse, free */
log_warn( _("Link count updated to %d for "
"inode %llu (0x%llx)\n"),
ii->di_nlink,
- (unsigned long long)ii->inode,
- (unsigned long long)ii->inode);
+ (unsigned long long)ii->di_num.no_addr,
+ (unsigned long long)ii->di_num.no_addr);
} else {
- log_err( _("Link count for inode %llu (0x%llx) still incorrect\n"),
- (unsigned long long)ii->inode,
- (unsigned long long)ii->inode);
+ log_err( _("Link count for inode %llu (0x%llx"
+ ") still incorrect\n"),
+ (unsigned long long)ii->di_num.no_addr,
+ (unsigned long long)ii->di_num.no_addr);
}
}
log_debug( _("block %llu (0x%llx) has link count %d\n"),
- (unsigned long long)ii->inode,
- (unsigned long long)ii->inode, ii->di_nlink);
+ (unsigned long long)ii->di_num.no_addr,
+ (unsigned long long)ii->di_num.no_addr, ii->di_nlink);
} /* osi_list_foreach(tmp, list) */
if (lf_addition) {
diff --git a/gfs2/fsck/util.c b/gfs2/fsck/util.c
index eff7382..7c89155 100644
--- a/gfs2/fsck/util.c
+++ b/gfs2/fsck/util.c
@@ -392,7 +392,7 @@ int add_duplicate_ref(struct gfs2_inode *ip, uint64_t block,
return 0;
}
-struct dir_info *dirtree_insert(uint64_t dblock)
+struct dir_info *dirtree_insert(struct gfs2_inum inum)
{
struct osi_node **newn = &dirtree.osi_node, *parent = NULL;
struct dir_info *data;
@@ -402,9 +402,9 @@ struct dir_info *dirtree_insert(uint64_t dblock)
struct dir_info *cur = (struct dir_info *)*newn;
parent = *newn;
- if (dblock < cur->dinode)
+ if (inum.no_addr < cur->dinode.no_addr)
newn = &((*newn)->osi_left);
- else if (dblock > cur->dinode)
+ else if (inum.no_addr > cur->dinode.no_addr)
newn = &((*newn)->osi_right);
else
return cur;
@@ -420,7 +420,8 @@ struct dir_info *dirtree_insert(uint64_t dblock)
return NULL;
}
/* Add new node and rebalance tree. */
- data->dinode = dblock;
+ data->dinode.no_addr = inum.no_addr;
+ data->dinode.no_formal_ino = inum.no_formal_ino;
osi_link_node(&data->node, parent, newn);
osi_insert_color(&data->node, &dirtree);
@@ -434,9 +435,9 @@ struct dir_info *dirtree_find(uint64_t block)
while (node) {
struct dir_info *data = (struct dir_info *)node;
- if (block < data->dinode)
+ if (block < data->dinode.no_addr)
node = node->osi_left;
- else if (block > data->dinode)
+ else if (block > data->dinode.no_addr)
node = node->osi_right;
else
return data;
@@ -571,7 +572,7 @@ int set_ip_blockmap(struct gfs2_inode *ip, int instree)
if (fsck_blockmap_set(ip, block, _("directory"),
gfs2_inode_dir))
goto bad_dinode;
- if (instree && !dirtree_insert(block))
+ if (instree && !dirtree_insert(ip->i_di.di_num))
goto bad_dinode;
break;
case S_IFREG:
11 years, 5 months
gfs2-utils: master - libgfs2: gfs2_get_bitmap performance enhancements
by Andrew Price
Gitweb: http://git.fedorahosted.org/git/?p=gfs2-utils.git;a=commitdiff;h=74f4384b...
Commit: 74f4384b361eb05b40c463d40067a3f9a1b1b7da
Parent: 31710448d37825078494fb63c4af1f9dd83bcb24
Author: Andrew Price <anprice(a)redhat.com>
AuthorDate: Thu Oct 25 22:08:14 2012 +0100
Committer: Andrew Price <anprice(a)redhat.com>
CommitterDate: Thu Oct 25 22:29:21 2012 +0100
libgfs2: gfs2_get_bitmap performance enhancements
This patch takes the bit lookup strategy from the kernel code (an
amalgamation of gfs2_rbm_from_block and gfs2_testbit) to speed up
gfs2_get_bitmap, which is renamed lgfs2_get_bitmap.
Timings obtained running fsck.gfs2 on a 5% full, 10G local fs with 512
byte blocks (to maximize the number of leaf blocks) and many large
directories:
HEAD~2 HEAD
------- -------
2:15.70 2:10.03
2:14.32 2:09.89
2:14.32 2:09.83
2:14.66 2:09.84
2:14.30 2:09.89
2:14.62 2:10.23
2:14.58 2:09.64
2:14.50 2:09.68
2:14.99 2:09.49
2:14.79 2:09.97
For sanity the output of the new lgfs2_get_bitmap was checked against
the output of the old gfs2_get_bitmap over 1 million block state
lookups.
Signed-off-by: Andrew Price <anprice(a)redhat.com>
---
gfs2/edit/hexedit.c | 8 ++++----
gfs2/fsck/fsck.h | 2 +-
gfs2/fsck/metawalk.c | 2 +-
gfs2/libgfs2/fs_bits.c | 44 ++++++++++++++++++++++++--------------------
gfs2/libgfs2/lang.c | 2 +-
gfs2/libgfs2/libgfs2.h | 4 ++--
gfs2/libgfs2/rgrp.c | 17 ++++++-----------
gfs2/libgfs2/super.c | 2 ++
8 files changed, 41 insertions(+), 40 deletions(-)
diff --git a/gfs2/edit/hexedit.c b/gfs2/edit/hexedit.c
index ff0dca9..6f5f5af 100644
--- a/gfs2/edit/hexedit.c
+++ b/gfs2/edit/hexedit.c
@@ -698,7 +698,7 @@ int display_block_type(int from_restore)
(be32_to_cpu(mh->mh_type) == GFS2_METATYPE_RB))
type = 4;
else {
- type = gfs2_get_bitmap(&sbd, block, rgd);
+ type = lgfs2_get_bitmap(&sbd, block, rgd);
}
} else
type = 4;
@@ -726,7 +726,7 @@ int display_block_type(int from_restore)
print_gfs2(" blk ");
for (b = blknum; b < blknum + 4; b++) {
- btype = gfs2_get_bitmap(&sbd, b, rgd);
+ btype = lgfs2_get_bitmap(&sbd, b, rgd);
if (btype >= 0) {
print_gfs2("0x%x-%s ", b,
allocdesc[sbd.gfs1][btype]);
@@ -760,7 +760,7 @@ int display_block_type(int from_restore)
blknum += rgd->ri.ri_data0;
print_gfs2(" blk ");
for (b = blknum; b < blknum + 4; b++) {
- btype = gfs2_get_bitmap(&sbd, b, rgd);
+ btype = lgfs2_get_bitmap(&sbd, b, rgd);
if (btype >= 0) {
print_gfs2("0x%x-%s ", b,
allocdesc[sbd.gfs1][btype]);
@@ -2053,7 +2053,7 @@ static void find_change_block_alloc(int *newval)
else
printf("%d\n", *newval);
} else {
- type = gfs2_get_bitmap(&sbd, ablock, rgd);
+ type = lgfs2_get_bitmap(&sbd, ablock, rgd);
if (type < 0) {
printf("-1 (block invalid or part of "
"an rgrp).\n");
diff --git a/gfs2/fsck/fsck.h b/gfs2/fsck/fsck.h
index dd49280..ecd37ad 100644
--- a/gfs2/fsck/fsck.h
+++ b/gfs2/fsck/fsck.h
@@ -151,7 +151,7 @@ extern struct gfs_sb *sbd1;
static inline int valid_block(struct gfs2_sbd *sdp, uint64_t blkno)
{
return !((blkno > sdp->fssize) || (blkno <= sdp->sb_addr) ||
- (gfs2_get_bitmap(sdp, blkno, NULL) < 0));
+ (lgfs2_get_bitmap(sdp, blkno, NULL) < 0));
}
#endif /* _FSCK_H */
diff --git a/gfs2/fsck/metawalk.c b/gfs2/fsck/metawalk.c
index 24de901..f19c0f7 100644
--- a/gfs2/fsck/metawalk.c
+++ b/gfs2/fsck/metawalk.c
@@ -34,7 +34,7 @@ int check_n_fix_bitmap(struct gfs2_sbd *sdp, uint64_t blk,
rgd = gfs2_blk2rgrpd(sdp, blk);
- old_bitmap_state = gfs2_get_bitmap(sdp, blk, rgd);
+ old_bitmap_state = lgfs2_get_bitmap(sdp, blk, rgd);
if (old_bitmap_state < 0) {
log_err( _("Block %llu (0x%llx) is not represented in the "
"system bitmap; part of an rgrp or superblock.\n"),
diff --git a/gfs2/libgfs2/fs_bits.c b/gfs2/libgfs2/fs_bits.c
index fdc3bb3..94a612b 100644
--- a/gfs2/libgfs2/fs_bits.c
+++ b/gfs2/libgfs2/fs_bits.c
@@ -4,6 +4,7 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <limits.h>
#include "libgfs2.h"
@@ -175,14 +176,12 @@ int gfs2_set_bitmap(struct gfs2_sbd *sdp, uint64_t blkno, int state)
*
* Returns: state on success, -1 on error
*/
-int gfs2_get_bitmap(struct gfs2_sbd *sdp, uint64_t blkno,
- struct rgrp_tree *rgd)
+int lgfs2_get_bitmap(struct gfs2_sbd *sdp, uint64_t blkno, struct rgrp_tree *rgd)
{
- int i, val;
- uint32_t rgrp_block;
- struct gfs2_bitmap *bits = NULL;
- unsigned int bit;
- unsigned char *byte;
+ uint64_t offset;
+ uint32_t i = 0;
+ char *byte;
+ unsigned int bit;
if (rgd == NULL) {
rgd = gfs2_blk2rgrpd(sdp, blkno);
@@ -190,23 +189,28 @@ int gfs2_get_bitmap(struct gfs2_sbd *sdp, uint64_t blkno,
return -1;
}
- rgrp_block = (uint32_t)(blkno - rgd->ri.ri_data0);
+ offset = blkno - rgd->ri.ri_data0;
+ if (offset > UINT_MAX) {
+ errno = EINVAL;
+ return -1;
+ }
+ if (offset >= rgd->ri.ri_data0 + rgd->ri.ri_data) {
+ errno = E2BIG;
+ return -1;
+ }
- for (i = 0; i < rgd->ri.ri_length; i++) {
- bits = &(rgd->bits[i]);
- if(rgrp_block < ((bits->bi_start + bits->bi_len)*GFS2_NBBY))
- break;
+ if (offset >= (rgd->bits->bi_start + rgd->bits->bi_len) * GFS2_NBBY) {
+ offset += (sizeof(struct gfs2_rgrp) - sizeof(struct gfs2_meta_header))
+ * GFS2_NBBY;
+ i = offset / sdp->sd_blocks_per_bitmap;
+ offset -= i * sdp->sd_blocks_per_bitmap;
}
- if (i >= rgd->ri.ri_length)
- return -1;
if (!rgd->bh || !rgd->bh[i])
- return 0;
- byte = (unsigned char *)(rgd->bh[i]->b_data + bits->bi_offset) +
- (rgrp_block/GFS2_NBBY - bits->bi_start);
- bit = (rgrp_block % GFS2_NBBY) * GFS2_BIT_SIZE;
+ return GFS2_BLKST_FREE;
- val = ((*byte >> bit) & GFS2_BIT_MASK);
+ byte = (rgd->bh[i]->b_data + rgd->bits[i].bi_offset) + (offset/GFS2_NBBY);
+ bit = (offset % GFS2_NBBY) * GFS2_BIT_SIZE;
- return val;
+ return (*byte >> bit) & GFS2_BIT_MASK;
}
diff --git a/gfs2/libgfs2/lang.c b/gfs2/libgfs2/lang.c
index 12ca7bd..ad9382f 100644
--- a/gfs2/libgfs2/lang.c
+++ b/gfs2/libgfs2/lang.c
@@ -329,7 +329,7 @@ static int ast_get_bitstate(uint64_t bn, struct gfs2_sbd *sbd)
return -1;
}
- state = gfs2_get_bitmap(sbd, bn, rgd);
+ state = lgfs2_get_bitmap(sbd, bn, rgd);
if (state == -1) {
fprintf(stderr, "Failed to acquire bitmap state for block %"PRIu64"\n", bn);
return -1;
diff --git a/gfs2/libgfs2/libgfs2.h b/gfs2/libgfs2/libgfs2.h
index bf65922..2b109fb 100644
--- a/gfs2/libgfs2/libgfs2.h
+++ b/gfs2/libgfs2/libgfs2.h
@@ -276,6 +276,7 @@ struct gfs2_sbd {
uint32_t sd_hash_bsize;
uint32_t sd_hash_bsize_shift;
uint32_t sd_hash_ptrs;
+ uint32_t sd_blocks_per_bitmap;
uint32_t sd_max_dirres;
uint32_t sd_max_height;
uint64_t sd_heightsize[GFS2_MAX_META_HEIGHT];
@@ -408,8 +409,7 @@ extern uint32_t gfs2_blkalloc_internal(struct rgrp_tree *rgd, uint32_t goal,
extern int gfs2_check_range(struct gfs2_sbd *sdp, uint64_t blkno);
/* functions with blk #'s that are file system relative */
-extern int gfs2_get_bitmap(struct gfs2_sbd *sdp, uint64_t blkno,
- struct rgrp_tree *rgd);
+extern int lgfs2_get_bitmap(struct gfs2_sbd *sdp, uint64_t blkno, struct rgrp_tree *rgd);
extern int gfs2_set_bitmap(struct gfs2_sbd *sdp, uint64_t blkno, int state);
/* fs_geometry.c */
diff --git a/gfs2/libgfs2/rgrp.c b/gfs2/libgfs2/rgrp.c
index c0f72fd..cbab2a3 100644
--- a/gfs2/libgfs2/rgrp.c
+++ b/gfs2/libgfs2/rgrp.c
@@ -98,17 +98,12 @@ int gfs2_compute_bitstructs(struct gfs2_sbd *sdp, struct rgrp_tree *rgd)
*/
struct rgrp_tree *gfs2_blk2rgrpd(struct gfs2_sbd *sdp, uint64_t blk)
{
- struct osi_node *node = sdp->rgtree.osi_node;
- struct gfs2_rindex *ri;
-
- while (node) {
- struct rgrp_tree *rgd = (struct rgrp_tree *)node;
- ri = &rgd->ri;
-
- if (blk < ri->ri_addr)
- node = node->osi_left;
- else if (blk >= ri->ri_data0 + ri->ri_data)
- node = node->osi_right;
+ struct rgrp_tree *rgd = (struct rgrp_tree *)sdp->rgtree.osi_node;
+ while (rgd) {
+ if (blk < rgd->ri.ri_addr)
+ rgd = (struct rgrp_tree *)rgd->node.osi_left;
+ else if (blk >= rgd->ri.ri_data0 + rgd->ri.ri_data)
+ rgd = (struct rgrp_tree *)rgd->node.osi_right;
else
return rgd;
}
diff --git a/gfs2/libgfs2/super.c b/gfs2/libgfs2/super.c
index fdf0e60..8317862 100644
--- a/gfs2/libgfs2/super.c
+++ b/gfs2/libgfs2/super.c
@@ -116,6 +116,8 @@ int read_sb(struct gfs2_sbd *sdp)
}
sdp->fssize = lseek(sdp->device_fd, 0, SEEK_END) / sdp->sd_sb.sb_bsize;
sdp->sb_addr = GFS2_SB_ADDR * GFS2_BASIC_BLOCK / sdp->bsize;
+ sdp->sd_blocks_per_bitmap = (sdp->sd_sb.sb_bsize - sizeof(struct gfs2_meta_header))
+ * GFS2_NBBY;
return 0;
}
11 years, 5 months
gfs2-utils: master - libgfs2: Move valid_block into fsck.gfs2
by Andrew Price
Gitweb: http://git.fedorahosted.org/git/?p=gfs2-utils.git;a=commitdiff;h=31710448...
Commit: 31710448d37825078494fb63c4af1f9dd83bcb24
Parent: ad15965a9449e68dc83aa21190262c493089f05d
Author: Andrew Price <anprice(a)redhat.com>
AuthorDate: Thu Oct 18 14:43:53 2012 +0100
Committer: Andrew Price <anprice(a)redhat.com>
CommitterDate: Thu Oct 18 14:43:53 2012 +0100
libgfs2: Move valid_block into fsck.gfs2
valid_block() is only used by fsck.gfs2 as none of the other utils
require the same level of paranoia so we can move it into fsck.h and
make it static inline.
In my (small) tests the speedup effect is barely noticeable but it
should make a difference for larger file systems, particularly those
with very large directories.
Also fsck/fs_bits.h is no longer used so this patch removes it.
Signed-off-by: Andrew Price <anprice(a)redhat.com>
---
gfs2/fsck/Makefile.am | 2 +-
gfs2/fsck/fs_bits.h | 17 -----------------
gfs2/fsck/fsck.h | 6 ++++++
gfs2/fsck/util.c | 1 -
gfs2/libgfs2/fs_bits.c | 17 -----------------
gfs2/libgfs2/libgfs2.h | 1 -
6 files changed, 7 insertions(+), 37 deletions(-)
diff --git a/gfs2/fsck/Makefile.am b/gfs2/fsck/Makefile.am
index 261f6b1..b92c745 100644
--- a/gfs2/fsck/Makefile.am
+++ b/gfs2/fsck/Makefile.am
@@ -10,7 +10,7 @@ sbindir := $(shell rpl=0; test '$(exec_prefix):$(sbindir)' = /usr:/usr/sbin \
sbin_PROGRAMS = fsck.gfs2
-noinst_HEADERS = eattr.h fs_bits.h fsck.h fs_recovery.h \
+noinst_HEADERS = eattr.h fsck.h fs_recovery.h \
inode_hash.h link.h lost_n_found.h metawalk.h util.h
fsck_gfs2_SOURCES = eattr.c fs_recovery.c initialize.c \
diff --git a/gfs2/fsck/fs_bits.h b/gfs2/fsck/fs_bits.h
deleted file mode 100644
index d4f262e..0000000
--- a/gfs2/fsck/fs_bits.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef __FS_BITS_H__
-#define __FS_BITS_H__
-
-#include "libgfs2.h"
-#include "fsck.h"
-
-#define BFITNOENT (0xFFFFFFFF)
-
-struct fs_bitmap
-{
- uint32_t bi_offset; /* The offset in the buffer of the first byte */
- uint32_t bi_start; /* The position of the first byte in this block */
- uint32_t bi_len; /* The number of bytes in this block */
-};
-typedef struct fs_bitmap fs_bitmap_t;
-
-#endif /* __FS_BITS_H__ */
diff --git a/gfs2/fsck/fsck.h b/gfs2/fsck/fsck.h
index 70fc3d7..dd49280 100644
--- a/gfs2/fsck/fsck.h
+++ b/gfs2/fsck/fsck.h
@@ -148,4 +148,10 @@ extern int dups_found_first; /* How many duplicates have we found the original
reference for? */
extern struct gfs_sb *sbd1;
+static inline int valid_block(struct gfs2_sbd *sdp, uint64_t blkno)
+{
+ return !((blkno > sdp->fssize) || (blkno <= sdp->sb_addr) ||
+ (gfs2_get_bitmap(sdp, blkno, NULL) < 0));
+}
+
#endif /* _FSCK_H */
diff --git a/gfs2/fsck/util.c b/gfs2/fsck/util.c
index 6c80ae8..eff7382 100644
--- a/gfs2/fsck/util.c
+++ b/gfs2/fsck/util.c
@@ -13,7 +13,6 @@
#define _(String) gettext(String)
#include "libgfs2.h"
-#include "fs_bits.h"
#include "metawalk.h"
#include "util.h"
diff --git a/gfs2/libgfs2/fs_bits.c b/gfs2/libgfs2/fs_bits.c
index 5eeb920..fdc3bb3 100644
--- a/gfs2/libgfs2/fs_bits.c
+++ b/gfs2/libgfs2/fs_bits.c
@@ -113,23 +113,6 @@ int gfs2_check_range(struct gfs2_sbd *sdp, uint64_t blkno)
}
/*
- * valid_block - check if blkno is valid and not part of our rgrps or bitmaps
- * @sdp: super block
- * @blkno: block number
- *
- * Returns: 1 if ok, 0 if out of bounds
- */
-int valid_block(struct gfs2_sbd *sdp, uint64_t blkno)
-{
- if((blkno > sdp->fssize) || (blkno <= sdp->sb_addr))
- return 0;
- /* Check if the block is one of our rgrp or bitmap blocks */
- if (gfs2_get_bitmap(sdp, blkno, NULL) < 0)
- return 0;
- return 1;
-}
-
-/*
* gfs2_set_bitmap
* @sdp: super block
* @blkno: block number relative to file system
diff --git a/gfs2/libgfs2/libgfs2.h b/gfs2/libgfs2/libgfs2.h
index 3045337..bf65922 100644
--- a/gfs2/libgfs2/libgfs2.h
+++ b/gfs2/libgfs2/libgfs2.h
@@ -408,7 +408,6 @@ extern uint32_t gfs2_blkalloc_internal(struct rgrp_tree *rgd, uint32_t goal,
extern int gfs2_check_range(struct gfs2_sbd *sdp, uint64_t blkno);
/* functions with blk #'s that are file system relative */
-extern int valid_block(struct gfs2_sbd *sdp, uint64_t blkno);
extern int gfs2_get_bitmap(struct gfs2_sbd *sdp, uint64_t blkno,
struct rgrp_tree *rgd);
extern int gfs2_set_bitmap(struct gfs2_sbd *sdp, uint64_t blkno, int state);
11 years, 5 months
fence-agents: master - fabric fence agents: Fix dealing with enable/disable and support on/off options for fabric fence agents
by Marek Grác
Gitweb: http://git.fedorahosted.org/git/?p=fence-agents.git;a=commitdiff;h=c7ba00...
Commit: c7ba00daf03a19d7557e825e637a220b5cc4deae
Parent: b0303c783b9ee4d4214828d88344547549a04d11
Author: Marek 'marx' Grac <mgrac(a)redhat.com>
AuthorDate: Thu Oct 25 12:48:12 2012 +0200
Committer: Marek 'marx' Grac <mgrac(a)redhat.com>
CommitterDate: Mon Oct 29 12:30:09 2012 +0100
fabric fence agents: Fix dealing with enable/disable and support on/off options for fabric fence agents
---
fence/agents/cisco_mds/fence_cisco_mds.py | 16 +--------
fence/agents/ifmib/fence_ifmib.py | 17 +---------
fence/agents/lib/fencing.py.py | 50 ++++++++++++++---------------
fence/agents/sanbox2/fence_sanbox2.py | 2 +-
4 files changed, 29 insertions(+), 56 deletions(-)
diff --git a/fence/agents/cisco_mds/fence_cisco_mds.py b/fence/agents/cisco_mds/fence_cisco_mds.py
index a007fde..e2a1e91 100644
--- a/fence/agents/cisco_mds/fence_cisco_mds.py
+++ b/fence/agents/cisco_mds/fence_cisco_mds.py
@@ -81,7 +81,7 @@ def get_outlets_status(conn, options):
def main():
global port_oid
- device_opt = [ "ipaddr", "login", "passwd", "passwd_script",
+ device_opt = [ "fabric_fencing", "ipaddr", "login", "passwd", "passwd_script",
"test", "port", "separator", "no_login", "no_password",
"snmp_version", "community", "snmp_auth_prot", "snmp_sec_level",
"snmp_priv_prot", "snmp_priv_passwd", "snmp_priv_passwd_script",
@@ -90,20 +90,8 @@ def main():
atexit.register(atexit_handler)
snmp_define_defaults ()
- options=process_input(device_opt)
- # Emulate enable/disable functionality
- if (options.has_key("-o")):
- options["-o"]=options["-o"].lower()
-
- if (options["-o"]=="enable"):
- options["-o"]="on"
- if (options["-o"]=="disable"):
- options["-o"]="off"
- else:
- options["-o"]="off"
-
- options = check_input(device_opt, options)
+ options = check_input(device_opt, process_input(device_opt))
docs = { }
docs["shortdesc"] = "Fence agent for Cisco MDS"
diff --git a/fence/agents/ifmib/fence_ifmib.py b/fence/agents/ifmib/fence_ifmib.py
index a43bf38..0b0a71d 100644
--- a/fence/agents/ifmib/fence_ifmib.py
+++ b/fence/agents/ifmib/fence_ifmib.py
@@ -97,7 +97,7 @@ def get_outlets_status(conn, options):
def main():
global port_oid
- device_opt = [ "ipaddr", "login", "passwd", "passwd_script",
+ device_opt = [ "fabric_fencing", "ipaddr", "login", "passwd", "passwd_script",
"test", "port", "separator", "no_login", "no_password",
"snmp_version", "community", "snmp_auth_prot", "snmp_sec_level",
"snmp_priv_prot", "snmp_priv_passwd", "snmp_priv_passwd_script",
@@ -108,20 +108,7 @@ def main():
snmp_define_defaults ()
all_opt["snmp_version"]["default"]="2c"
- options=process_input(device_opt)
-
- # Emulate enable/disable functionality
- if (options.has_key("-o")):
- options["-o"]=options["-o"].lower()
-
- if (options["-o"]=="enable"):
- options["-o"]="on"
- if (options["-o"]=="disable"):
- options["-o"]="off"
- else:
- options["-o"]="off"
-
- options = check_input(device_opt, options)
+ options = check_input(device_opt, process_input(device_opt))
docs = { }
docs["shortdesc"] = "Fence agent for IF MIB"
diff --git a/fence/agents/lib/fencing.py.py b/fence/agents/lib/fencing.py.py
index e26f9b3..c1851d1 100644
--- a/fence/agents/lib/fencing.py.py
+++ b/fence/agents/lib/fencing.py.py
@@ -89,13 +89,9 @@ all_opt = {
"shortdesc" : "Fencing Action",
"default" : "reboot",
"order" : 1 },
- "io_fencing" : {
- "getopt" : "o:",
- "longopt" : "action",
- "help" : "-o, --action=<action> Action: status, enable or disable",
- "required" : "1",
- "shortdesc" : "Fencing Action",
- "default" : "disable",
+ "fabric_fencing" : {
+ "getopt" : "",
+ "help" : "",
"order" : 1 },
"ipaddr" : {
"getopt" : "a:",
@@ -522,13 +518,11 @@ def metadata(avail_opt, options, docs):
print "\t</parameter>"
print "</parameters>"
print "<actions>"
- if avail_opt.count("io_fencing") == 0:
- print "\t<action name=\"on\" />"
- print "\t<action name=\"off\" />"
+ print "\t<action name=\"on\" />"
+ print "\t<action name=\"off\" />"
+
+ if avail_opt.count("fabric_fencing") == 0:
print "\t<action name=\"reboot\" />"
- else:
- print "\t<action name=\"enable\" />"
- print "\t<action name=\"disable\" />"
print "\t<action name=\"status\" />"
print "\t<action name=\"list\" />"
@@ -629,8 +623,6 @@ def process_input(avail_opt):
name = "ipaddr"
elif name == "modulename":
name = "module_name"
- elif name == "action" and 1 == avail_opt.count("io_fencing"):
- name = "io_fencing"
elif name == "port" and 1 == avail_opt.count("drac_version"):
name = "module_name"
@@ -683,19 +675,30 @@ def check_input(device_opt, opt):
if 0 == options.has_key(getopt):
options[getopt] = all_opt[opt]["default"]
- options["-o"]=options["-o"].lower()
+ options["-o"] = options["-o"].lower()
if options.has_key("-v"):
options["log"] = LOG_MODE_VERBOSE
else:
options["log"] = LOG_MODE_QUIET
- if 0 == device_opt.count("io_fencing"):
- if 0 == ["on", "off", "reboot", "status", "list", "monitor"].count(options["-o"].lower()):
- fail_usage("Failed: Unrecognised action '" + options["-o"] + "'")
+ acceptable_actions = [ "on", "off", "status", "list", "monitor" ]
+ if 0 == device_opt.count("fabric_fencing"):
+ ## Compatibility layer
+ #####
+ acceptable_actions.extend(["enable", "disable"])
else:
- if 0 == ["enable", "disable", "status", "list", "monitor"].count(options["-o"].lower()):
- fail_usage("Failed: Unrecognised action '" + options["-o"] + "'")
+ acceptable_actions.extend(["reboot"])
+
+ if 0 == acceptable_actions.count(options["-o"]):
+ fail_usage("Failed: Unrecognised action '" + options["-o"] + "'")
+
+ ## Compatibility layer
+ #####
+ if options["-o"] == "enable":
+ options["-o"] = "on"
+ if options["-o"] == "disable":
+ options["-o"] = "off"
if (0 == options.has_key("-l")) and device_opt.count("login") and (device_opt.count("no_login") == 0):
fail_usage("Failed: You have to set login name")
@@ -807,11 +810,6 @@ def fence_action(tn, options, set_power_fn, get_power_fn, get_outlet_list = None
if status != "on" and status != "off":
fail(EC_STATUS)
-
- if options["-o"] == "enable":
- options["-o"] = "on"
- if options["-o"] == "disable":
- options["-o"] = "off"
if options["-o"] == "on":
if status == "on":
diff --git a/fence/agents/sanbox2/fence_sanbox2.py b/fence/agents/sanbox2/fence_sanbox2.py
index fdbea06..51781f9 100644
--- a/fence/agents/sanbox2/fence_sanbox2.py
+++ b/fence/agents/sanbox2/fence_sanbox2.py
@@ -108,7 +108,7 @@ def get_list_devices(conn, options):
return outlets
def main():
- device_opt = [ "io_fencing", "ipaddr", "login", "passwd", "passwd_script",
+ device_opt = [ "fabric_fencing", "ipaddr", "login", "passwd", "passwd_script",
"cmd_prompt", "port", "ipport", "separator" ]
atexit.register(atexit_handler)
11 years, 5 months
fence-agents: master - fence-agents: Use default values for device options instead of per-agent solutions
by Marek Grác
Gitweb: http://git.fedorahosted.org/git/?p=fence-agents.git;a=commitdiff;h=b0303c...
Commit: b0303c783b9ee4d4214828d88344547549a04d11
Parent: 9851b2aec92f30456fb88a1c69ca964fae58e1ec
Author: Marek 'marx' Grac <mgrac(a)redhat.com>
AuthorDate: Mon Oct 29 12:24:36 2012 +0100
Committer: Marek 'marx' Grac <mgrac(a)redhat.com>
CommitterDate: Mon Oct 29 12:24:36 2012 +0100
fence-agents: Use default values for device options instead of per-agent solutions
Majority of these changes concern:
* (-x / ssh) to be turn on by default
* command prompt default which differs across fence agents
---
fence/agents/alom/fence_alom.py | 12 ++++--------
fence/agents/apc/fence_apc.py | 11 +++--------
fence/agents/drac5/fence_drac5.py | 8 ++------
fence/agents/eaton_snmp/fence_eaton_snmp.py | 8 ++------
fence/agents/ibmblade/fence_ibmblade.py | 6 +-----
fence/agents/ifmib/fence_ifmib.py | 5 +----
fence/agents/ilo/fence_ilo.py | 7 ++-----
fence/agents/ipdu/fence_ipdu.py | 14 +++++---------
fence/agents/ldom/fence_ldom.py | 15 +++++----------
fence/agents/lpar/fence_lpar.py | 7 +------
fence/agents/rsa/fence_rsa.py | 8 ++------
fence/agents/rsb/fence_rsb.py | 2 --
fence/agents/sanbox2/fence_sanbox2.py | 8 ++------
fence/agents/virsh/fence_virsh.py | 11 ++++-------
fence/agents/vmware/fence_vmware.py | 10 ++--------
fence/agents/wti/fence_wti.py | 8 ++------
fence/agents/xenapi/fence_xenapi.py | 4 +---
17 files changed, 39 insertions(+), 105 deletions(-)
diff --git a/fence/agents/alom/fence_alom.py b/fence/agents/alom/fence_alom.py
index 6d62d73..0f68050 100644
--- a/fence/agents/alom/fence_alom.py
+++ b/fence/agents/alom/fence_alom.py
@@ -43,19 +43,15 @@ def set_power_status(conn, options):
fail(EC_TIMED_OUT)
def main():
- device_opt = [ "ipaddr", "login", "passwd", "passwd_script", "secure",
+ device_opt = [ "ipaddr", "login", "passwd", "passwd_script", "cmd_prompt", "secure",
"identity_file", "test", "inet4_only", "inet6_only", "ipport" ]
atexit.register(atexit_handler)
-
- pinput = process_input(device_opt)
- pinput["-x"] = 1
- options = check_input(device_opt, pinput)
- # Default command is sc>
- if (not options.has_key("-c")):
- options["-c"] = "sc\>\ "
+ all_opt["secure"]["default"] = "1"
+ all_opt["cmd_prompt"]["default"] = [ "sc\>\ " ]
+ options = check_input(device_opt, process_input(device_opt))
options["telnet_over_ssh"] = 1
docs = { }
diff --git a/fence/agents/apc/fence_apc.py b/fence/agents/apc/fence_apc.py
index 46f8b84..0406955 100644
--- a/fence/agents/apc/fence_apc.py
+++ b/fence/agents/apc/fence_apc.py
@@ -182,22 +182,17 @@ def set_power_status(conn, options):
fail(EC_TIMED_OUT)
def main():
- device_opt = [ "ipaddr", "login", "passwd", "passwd_script",
+ device_opt = [ "ipaddr", "login", "passwd", "passwd_script", "cmd_prompt",
"secure", "port", "identity_file", "switch", "test", "separator",
"inet4_only", "inet6_only", "ipport" ]
atexit.register(atexit_handler)
- options = check_input(device_opt, process_input(device_opt))
+ all_opt["cmd_prompt"]["default"] = "\n>"
- ##
- ## Fence agent specific defaults
- #####
+ options = check_input(device_opt, process_input(device_opt))
options["ssh_options"] = "-1 -c blowfish"
- if 0 == options.has_key("-c"):
- options["-c"] = "\n>"
-
docs = { }
docs["shortdesc"] = "Fence agent for APC over telnet/ssh"
docs["longdesc"] = "fence_apc is an I/O Fencing agent \
diff --git a/fence/agents/drac5/fence_drac5.py b/fence/agents/drac5/fence_drac5.py
index 755f2b4..b261e50 100644
--- a/fence/agents/drac5/fence_drac5.py
+++ b/fence/agents/drac5/fence_drac5.py
@@ -91,13 +91,9 @@ def main():
atexit.register(atexit_handler)
- options = check_input(device_opt, process_input(device_opt))
+ all_opt["cmd_prompt"]["default"] = [ "\$" ]
- ##
- ## Fence agent specific defaults
- #####
- if 0 == options.has_key("-c"):
- options["-c"] = "\$"
+ options = check_input(device_opt, process_input(device_opt))
docs = { }
docs["shortdesc"] = "Fence agent for Dell DRAC CMC/5"
diff --git a/fence/agents/eaton_snmp/fence_eaton_snmp.py b/fence/agents/eaton_snmp/fence_eaton_snmp.py
index 2c0b54e..e4c3ea3 100644
--- a/fence/agents/eaton_snmp/fence_eaton_snmp.py
+++ b/fence/agents/eaton_snmp/fence_eaton_snmp.py
@@ -197,11 +197,6 @@ def get_outlets_status(conn, options):
return result
-# Define new options
-def eaton_snmp_define_defaults():
- all_opt["snmp_version"]["default"]="1"
- all_opt["community"]["default"]="private"
-
# Main agent method
def main():
device_opt = [ "ipaddr", "login", "passwd", "passwd_script",
@@ -213,10 +208,11 @@ def main():
atexit.register(atexit_handler)
snmp_define_defaults ()
- eaton_snmp_define_defaults()
all_opt["switch"]["default"] = 1
all_opt["power_wait"]["default"] = 2
+ all_opt["snmp_version"]["default"] = "1"
+ all_opt["community"]["default"] = "private"
options=check_input(device_opt,process_input(device_opt))
# Plug indexing start from zero on ePDU Managed, so we substract '1' from
diff --git a/fence/agents/ibmblade/fence_ibmblade.py b/fence/agents/ibmblade/fence_ibmblade.py
index 96d2a76..ec992f4 100644
--- a/fence/agents/ibmblade/fence_ibmblade.py
+++ b/fence/agents/ibmblade/fence_ibmblade.py
@@ -48,10 +48,6 @@ def get_outlets_status(conn, options):
return result
-# Define new options
-def ibmblade_define_defaults():
- all_opt["snmp_version"]["default"]="1"
-
# Main agent method
def main():
global port_oid
@@ -65,7 +61,7 @@ def main():
atexit.register(atexit_handler)
snmp_define_defaults ()
- ibmblade_define_defaults()
+ all_opt["snmp_version"]["default"]="1"
options=check_input(device_opt,process_input(device_opt))
diff --git a/fence/agents/ifmib/fence_ifmib.py b/fence/agents/ifmib/fence_ifmib.py
index bbbec22..a43bf38 100644
--- a/fence/agents/ifmib/fence_ifmib.py
+++ b/fence/agents/ifmib/fence_ifmib.py
@@ -93,10 +93,6 @@ def get_outlets_status(conn, options):
return result
-# Define new options
-def ifmib_define_defaults():
- all_opt["snmp_version"]["default"]="2c"
-
# Main agent method
def main():
global port_oid
@@ -110,6 +106,7 @@ def main():
atexit.register(atexit_handler)
snmp_define_defaults ()
+ all_opt["snmp_version"]["default"]="2c"
options=process_input(device_opt)
diff --git a/fence/agents/ilo/fence_ilo.py b/fence/agents/ilo/fence_ilo.py
index 4c8f7ca..fca72a7 100644
--- a/fence/agents/ilo/fence_ilo.py
+++ b/fence/agents/ilo/fence_ilo.py
@@ -65,12 +65,9 @@ def main():
all_opt["login_timeout"]["default"] = "10"
all_opt["retry_on"]["default"] = "3"
+ all_opt["ssl"]["default"] = "1"
- pinput = process_input(device_opt)
- pinput["-z"] = 1
- options = check_input(device_opt, pinput)
-
- LOGIN_TIMEOUT = 10
+ options = check_input(device_opt, process_input(device_opt))
docs = { }
docs["shortdesc"] = "Fence agent for HP iLO"
diff --git a/fence/agents/ipdu/fence_ipdu.py b/fence/agents/ipdu/fence_ipdu.py
index 2749e44..0243afd 100644
--- a/fence/agents/ipdu/fence_ipdu.py
+++ b/fence/agents/ipdu/fence_ipdu.py
@@ -129,13 +129,6 @@ def get_outlets_status(conn, options):
return result
-# Define new options
-def ipdu_snmp_define_defaults():
- all_opt["snmp_version"]["default"]="3"
- all_opt["community"]["default"]="private"
- all_opt["switch"]["default"]="1"
- device=IBMiPDU
-
# Main agent method
def main():
device_opt = [ "ipaddr", "login", "passwd", "passwd_script",
@@ -147,9 +140,12 @@ def main():
atexit.register(atexit_handler)
snmp_define_defaults ()
- ipdu_snmp_define_defaults()
+ all_opt["snmp_version"]["default"] = "3"
+ all_opt["community"]["default"] = "private"
+ all_opt["switch"]["default"] = "1"
+ device = IBMiPDU
- options=check_input(device_opt,process_input(device_opt))
+ options = check_input(device_opt,process_input(device_opt))
docs = { }
docs["shortdesc"] = "Fence agent for iPDU over SNMP"
diff --git a/fence/agents/ldom/fence_ldom.py b/fence/agents/ldom/fence_ldom.py
index d106255..498d0d7 100644
--- a/fence/agents/ldom/fence_ldom.py
+++ b/fence/agents/ldom/fence_ldom.py
@@ -87,16 +87,11 @@ def main():
atexit.register(atexit_handler)
- pinput = process_input(device_opt)
- pinput["-x"] = 1
- options = check_input(device_opt, pinput)
-
- ##
- ## Fence agent specific defaults
- #####
- if (not options.has_key("-c")):
- options["-c"] = "\ $"
-
+ all_opt["secure"]["default"] = "1"
+ all_opt["cmd_prompt"]["default"] = [ "\ $" ]
+
+ options = check_input(device_opt, process_input(device_opt))
+
docs = { }
docs["shortdesc"] = "Fence agent for Sun LDOM"
docs["longdesc"] = "fence_ldom is an I/O Fencing agent \
diff --git a/fence/agents/lpar/fence_lpar.py b/fence/agents/lpar/fence_lpar.py
index b9121e4..a5d4195 100644
--- a/fence/agents/lpar/fence_lpar.py
+++ b/fence/agents/lpar/fence_lpar.py
@@ -138,15 +138,10 @@ def main():
all_opt["login_timeout"]["default"] = "15"
all_opt["secure"]["default"] = "1"
+ all_opt["cmd_prompt"]["default"] = [ ":~>", "]\$", "\$ " ]
options = check_input(device_opt, process_input(device_opt))
- ##
- ## Fence agent specific settings and default values
- #####
- if 0 == options.has_key("-c"):
- options["-c"] = [ ":~>", "]\$", "\$ " ]
-
docs = { }
docs["shortdesc"] = "Fence agent for IBM LPAR"
docs["longdesc"] = ""
diff --git a/fence/agents/rsa/fence_rsa.py b/fence/agents/rsa/fence_rsa.py
index 3ba2c80..44ad33f 100644
--- a/fence/agents/rsa/fence_rsa.py
+++ b/fence/agents/rsa/fence_rsa.py
@@ -50,14 +50,10 @@ def main():
atexit.register(atexit_handler)
all_opt["login_timeout"]["default"] = 10
+ all_opt["cmd_prompt"]["default"] = [ ">" ]
+
options = check_input(device_opt, process_input(device_opt))
- ##
- ## Fence agent specific defaults
- #####
- if 0 == options.has_key("-c"):
- options["-c"] = ">"
-
# This device will not allow us to login even with LANG=C
options["ssh_options"] = "-F /dev/null"
diff --git a/fence/agents/rsb/fence_rsb.py b/fence/agents/rsb/fence_rsb.py
index bc3df9a..f8cd827 100755
--- a/fence/agents/rsb/fence_rsb.py
+++ b/fence/agents/rsb/fence_rsb.py
@@ -85,8 +85,6 @@ will block any necessary fencing actions."
##
## Operate the fencing device
####
- print options["-u"]
-
conn = fence_login(options)
result = fence_action(conn, options, set_power_status, get_power_status, None)
diff --git a/fence/agents/sanbox2/fence_sanbox2.py b/fence/agents/sanbox2/fence_sanbox2.py
index 8c67ac2..fdbea06 100644
--- a/fence/agents/sanbox2/fence_sanbox2.py
+++ b/fence/agents/sanbox2/fence_sanbox2.py
@@ -113,13 +113,9 @@ def main():
atexit.register(atexit_handler)
- options = check_input(device_opt, process_input(device_opt))
+ all_opt["cmd_prompt"]["default"] = [ " #> " ]
- ##
- ## Fence agent specific defaults
- #####
- if 0 == options.has_key("-c"):
- options["-c"] = [ " #> " ]
+ options = check_input(device_opt, process_input(device_opt))
docs = { }
docs["shortdesc"] = "Fence agent for QLogic SANBox2 FC switches"
diff --git a/fence/agents/virsh/fence_virsh.py b/fence/agents/virsh/fence_virsh.py
index 6e6a43d..ebf6666 100644
--- a/fence/agents/virsh/fence_virsh.py
+++ b/fence/agents/virsh/fence_virsh.py
@@ -71,19 +71,16 @@ def set_power_status(conn, options):
fail(EC_TIMED_OUT)
def main():
- device_opt = [ "ipaddr", "login", "passwd", "passwd_script",
+ device_opt = [ "ipaddr", "login", "passwd", "passwd_script", "cmd_prompt",
"secure", "identity_file", "test", "port", "separator",
"inet4_only", "inet6_only", "ipport", "sudo" ]
atexit.register(atexit_handler)
- pinput = process_input(device_opt)
- pinput["-x"] = 1
- options = check_input(device_opt, pinput)
+ all_opt["secure"]["default"] = "1"
+ all_opt["cmd_prompt"]["default"] = [ "\[EXPECT\]#\ " ]
- ## Defaults for fence agent
- if 0 == options.has_key("-c"):
- options["-c"] = "\[EXPECT\]#\ "
+ options = check_input(device_opt, process_input(device_opt))
options["ssh_options"]="-t '/bin/bash -c \"PS1=\[EXPECT\]#\ /bin/bash --noprofile --norc\"'"
diff --git a/fence/agents/vmware/fence_vmware.py b/fence/agents/vmware/fence_vmware.py
index 0b81d1d..885a876 100644
--- a/fence/agents/vmware/fence_vmware.py
+++ b/fence/agents/vmware/fence_vmware.py
@@ -256,10 +256,6 @@ def vmware_is_supported_vmrun_version(options):
return True
-# Define new options
-def vmware_define_defaults():
- all_opt["vmware_type"]["default"]=VMWARE_DEFAULT_TYPE
-
# Check vmware type, set vmware_internal_type to one of VMWARE_TYPE_ value and
# options["-e"] to path (if not specified)
def vmware_check_vmware_type(options):
@@ -290,13 +286,11 @@ def main():
atexit.register(atexit_handler)
- vmware_define_defaults()
+ all_opt["secure"]["default"] = "1"
+ all_opt["vmware_type"]["default"] = VMWARE_DEFAULT_TYPE
options = check_input(device_opt, process_input(device_opt))
- # Default is secure connection
- options["-x"] = 1
-
docs = { }
docs["shortdesc"] = "Fence agent for VMWare"
docs["longdesc"] = "fence_vmware is an I/O Fencing agent \
diff --git a/fence/agents/wti/fence_wti.py b/fence/agents/wti/fence_wti.py
index f013953..9aa9959 100644
--- a/fence/agents/wti/fence_wti.py
+++ b/fence/agents/wti/fence_wti.py
@@ -96,13 +96,9 @@ def main():
atexit.register(atexit_handler)
- options = check_input(device_opt, process_input(device_opt))
+ all_opt["cmd_prompt"]["default"] = [ "RSM>", "MPC>", "IPS>", "TPS>", "NBB>", "NPS>", "VMR>" ]
- ##
- ## Fence agent specific defaults
- #####
- if 0 == options.has_key("-c"):
- options["-c"] = [ "RSM>", "MPC>", "IPS>", "TPS>", "NBB>", "NPS>", "VMR>" ]
+ options = check_input(device_opt, process_input(device_opt))
docs = { }
docs["shortdesc"] = "Fence agent for WTI"
diff --git a/fence/agents/xenapi/fence_xenapi.py b/fence/agents/xenapi/fence_xenapi.py
index 0b07ed6..017908f 100644
--- a/fence/agents/xenapi/fence_xenapi.py
+++ b/fence/agents/xenapi/fence_xenapi.py
@@ -204,9 +204,7 @@ def main():
atexit.register(atexit_handler)
- options=process_input(device_opt)
-
- options = check_input(device_opt, options)
+ options = check_input(device_opt, process_input(device_opt))
docs = { }
docs["shortdesc"] = "XenAPI based fencing for the Citrix XenServer virtual machines."
11 years, 5 months
fence-agents: master - fence_cisco_ucs: Incorrect timeout was used during login
by Marek Grác
Gitweb: http://git.fedorahosted.org/git/?p=fence-agents.git;a=commitdiff;h=9851b2...
Commit: 9851b2aec92f30456fb88a1c69ca964fae58e1ec
Parent: 62004c338202dfadfa4b8f2cefd959867c9afa74
Author: Marek 'marx' Grac <mgrac(a)redhat.com>
AuthorDate: Mon Oct 22 15:51:55 2012 +0200
Committer: Marek 'marx' Grac <mgrac(a)redhat.com>
CommitterDate: Mon Oct 29 12:23:57 2012 +0100
fence_cisco_ucs: Incorrect timeout was used during login
Previously, login command was bound with shell_timeout instead of login_timeout.
---
fence/agents/cisco_ucs/fence_cisco_ucs.py | 14 +++++++-------
1 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/fence/agents/cisco_ucs/fence_cisco_ucs.py b/fence/agents/cisco_ucs/fence_cisco_ucs.py
index 8020d96..84cb4fd 100644
--- a/fence/agents/cisco_ucs/fence_cisco_ucs.py
+++ b/fence/agents/cisco_ucs/fence_cisco_ucs.py
@@ -18,7 +18,7 @@ re_get_desc = re.compile(" descr=\"(.*?)\"", re.IGNORECASE)
def get_power_status(conn, options):
try:
- res = send_command(options, "<configResolveDn cookie=\"" + options["cookie"] + "\" inHierarchical=\"false\" dn=\"org-root" + options["-s"] + "/ls-" + options["-n"] + "/power\"/>")
+ res = send_command(options, "<configResolveDn cookie=\"" + options["cookie"] + "\" inHierarchical=\"false\" dn=\"org-root" + options["-s"] + "/ls-" + options["-n"] + "/power\"/>", int(options["-Y"]))
except pycurl.error, e:
sys.stderr.write(e[1] + "\n")
fail(EC_TIMED_OUT)
@@ -41,7 +41,7 @@ def set_power_status(conn, options):
}[options["-o"]]
try:
- res = send_command(options, "<configConfMos cookie=\"" + options["cookie"] + "\" inHierarchical=\"no\"><inConfigs><pair key=\"org-root" + options["-s"] + "/ls-" + options["-n"] + "/power\"><lsPower dn=\"org-root/ls-" + options["-n"] + "/power\" state=\"" + action + "\" status=\"modified\" /></pair></inConfigs></configConfMos>")
+ res = send_command(options, "<configConfMos cookie=\"" + options["cookie"] + "\" inHierarchical=\"no\"><inConfigs><pair key=\"org-root" + options["-s"] + "/ls-" + options["-n"] + "/power\"><lsPower dn=\"org-root/ls-" + options["-n"] + "/power\" state=\"" + action + "\" status=\"modified\" /></pair></inConfigs></configConfMos>", int(options["-Y"]))
except pycurl.error, e:
sys.stderr.write(e[1] + "\n")
fail(EC_TIMED_OUT)
@@ -53,7 +53,7 @@ def get_list(conn, options):
try:
try:
- res = send_command(options, "<configResolveClass cookie=\"" + options["cookie"] + "\" inHierarchical=\"false\" classId=\"lsServer\"/>")
+ res = send_command(options, "<configResolveClass cookie=\"" + options["cookie"] + "\" inHierarchical=\"false\" classId=\"lsServer\"/>", int(options["-Y"]))
except pycurl.error, e:
sys.stderr.write(e[1] + "\n")
fail(EC_TIMED_OUT)
@@ -70,7 +70,7 @@ def get_list(conn, options):
return outlets
-def send_command(opt, command):
+def send_command(opt, command, timeout):
## setup correct URL
if opt.has_key("-z"):
url = "https:"
@@ -86,7 +86,7 @@ def send_command(opt, command):
c.setopt(pycurl.HTTPHEADER, [ "Content-type: text/xml" ])
c.setopt(pycurl.POSTFIELDS, command)
c.setopt(pycurl.WRITEFUNCTION, b.write)
- c.setopt(pycurl.TIMEOUT, int(opt["-Y"]))
+ c.setopt(pycurl.TIMEOUT, timeout)
c.setopt(pycurl.SSL_VERIFYPEER, 0)
c.setopt(pycurl.SSL_VERIFYHOST, 0)
c.perform()
@@ -115,7 +115,7 @@ used with Cisco UCS to fence machines."
show_docs(options, docs)
### Login
- res = send_command(options, "<aaaLogin inName=\"" + options["-l"] + "\" inPassword=\"" + options["-p"] + "\" />")
+ res = send_command(options, "<aaaLogin inName=\"" + options["-l"] + "\" inPassword=\"" + options["-p"] + "\" />", int(options["-y"]))
result = re_cookie.search(res)
if (result == None):
## Cookie is absenting in response
@@ -137,7 +137,7 @@ used with Cisco UCS to fence machines."
result = fence_action(None, options, set_power_status, get_power_status, get_list)
### Logout; we do not care about result as we will end in any case
- send_command(options, "<aaaLogout inCookie=\"" + options["cookie"] + "\" />")
+ send_command(options, "<aaaLogout inCookie=\"" + options["cookie"] + "\" />", int(options["-Y"]))
sys.exit(result)
11 years, 5 months
fence-agents: master - fence-agents: Extend set of default device options
by Marek Grác
Gitweb: http://git.fedorahosted.org/git/?p=fence-agents.git;a=commitdiff;h=62004c...
Commit: 62004c338202dfadfa4b8f2cefd959867c9afa74
Parent: 8bb87b1704ddb923228d3306380250a0908a8877
Author: Marek 'marx' Grac <mgrac(a)redhat.com>
AuthorDate: Mon Oct 22 15:35:57 2012 +0200
Committer: Marek 'marx' Grac <mgrac(a)redhat.com>
CommitterDate: Mon Oct 29 12:23:39 2012 +0100
fence-agents: Extend set of default device options
There are device options which are common for every fence agent. This feature was introduced before
but only new features were added. This patch removes common features from individual fence agents and
adds it to the common set in fencing library.
---
fence/agents/alom/fence_alom.py | 6 ++----
fence/agents/apc/fence_apc.py | 6 ++----
fence/agents/apc_snmp/fence_apc_snmp.py | 6 ++----
fence/agents/bladecenter/fence_bladecenter.py | 6 ++----
fence/agents/cisco_mds/fence_cisco_mds.py | 6 ++----
fence/agents/cisco_ucs/fence_cisco_ucs.py | 6 ++----
fence/agents/drac5/fence_drac5.py | 6 ++----
fence/agents/eaton_snmp/fence_eaton_snmp.py | 6 ++----
fence/agents/eps/fence_eps.py | 6 ++----
fence/agents/hpblade/fence_hpblade.py | 6 ++----
fence/agents/ibmblade/fence_ibmblade.py | 6 ++----
fence/agents/ifmib/fence_ifmib.py | 6 ++----
fence/agents/ilo/fence_ilo.py | 6 ++----
fence/agents/ilo_mp/fence_ilo_mp.py | 6 ++----
fence/agents/intelmodular/fence_intelmodular.py | 6 ++----
fence/agents/ipdu/fence_ipdu.py | 6 ++----
fence/agents/ldom/fence_ldom.py | 6 ++----
fence/agents/lib/fencing.py.py | 3 ++-
fence/agents/lpar/fence_lpar.py | 8 +++-----
fence/agents/rhevm/fence_rhevm.py | 7 ++-----
fence/agents/rsa/fence_rsa.py | 6 ++----
fence/agents/rsb/fence_rsb.py | 6 ++----
fence/agents/sanbox2/fence_sanbox2.py | 6 ++----
fence/agents/virsh/fence_virsh.py | 6 ++----
fence/agents/vmware/fence_vmware.py | 6 ++----
fence/agents/vmware_soap/fence_vmware_soap.py | 6 ++----
fence/agents/wti/fence_wti.py | 6 ++----
fence/agents/xenapi/fence_xenapi.py | 6 ++----
28 files changed, 57 insertions(+), 111 deletions(-)
diff --git a/fence/agents/alom/fence_alom.py b/fence/agents/alom/fence_alom.py
index a964be5..6d62d73 100644
--- a/fence/agents/alom/fence_alom.py
+++ b/fence/agents/alom/fence_alom.py
@@ -43,10 +43,8 @@ def set_power_status(conn, options):
fail(EC_TIMED_OUT)
def main():
- device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug",
- "action", "ipaddr", "login", "passwd", "passwd_script",
- "secure", "identity_file", "test", "inet4_only", "inet6_only", "ipport",
- "power_timeout", "shell_timeout", "login_timeout", "power_wait" ]
+ device_opt = [ "ipaddr", "login", "passwd", "passwd_script", "secure",
+ "identity_file", "test", "inet4_only", "inet6_only", "ipport" ]
atexit.register(atexit_handler)
diff --git a/fence/agents/apc/fence_apc.py b/fence/agents/apc/fence_apc.py
index 61463d0..46f8b84 100644
--- a/fence/agents/apc/fence_apc.py
+++ b/fence/agents/apc/fence_apc.py
@@ -182,11 +182,9 @@ def set_power_status(conn, options):
fail(EC_TIMED_OUT)
def main():
- device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug",
- "action", "ipaddr", "login", "passwd", "passwd_script",
+ device_opt = [ "ipaddr", "login", "passwd", "passwd_script",
"secure", "port", "identity_file", "switch", "test", "separator",
- "inet4_only", "inet6_only", "ipport",
- "power_timeout", "shell_timeout", "login_timeout", "power_wait" ]
+ "inet4_only", "inet6_only", "ipport" ]
atexit.register(atexit_handler)
diff --git a/fence/agents/apc_snmp/fence_apc_snmp.py b/fence/agents/apc_snmp/fence_apc_snmp.py
index 71e978e..660eaf7 100644
--- a/fence/agents/apc_snmp/fence_apc_snmp.py
+++ b/fence/agents/apc_snmp/fence_apc_snmp.py
@@ -164,13 +164,11 @@ def apc_snmp_define_defaults():
# Main agent method
def main():
- device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug",
- "action", "ipaddr", "login", "passwd", "passwd_script",
+ device_opt = [ "ipaddr", "login", "passwd", "passwd_script",
"test", "port", "separator", "no_login", "no_password",
"snmp_version", "community", "snmp_auth_prot", "snmp_sec_level",
"snmp_priv_prot", "snmp_priv_passwd", "snmp_priv_passwd_script",
- "udpport","inet4_only","inet6_only",
- "power_timeout", "shell_timeout", "login_timeout", "power_wait" ]
+ "udpport","inet4_only","inet6_only" ]
atexit.register(atexit_handler)
diff --git a/fence/agents/bladecenter/fence_bladecenter.py b/fence/agents/bladecenter/fence_bladecenter.py
index 958ceb0..ab06b27 100644
--- a/fence/agents/bladecenter/fence_bladecenter.py
+++ b/fence/agents/bladecenter/fence_bladecenter.py
@@ -98,11 +98,9 @@ def get_blades_list(conn, options):
return outlets
def main():
- device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug",
- "action", "ipaddr", "login", "passwd", "passwd_script",
+ device_opt = [ "ipaddr", "login", "passwd", "passwd_script",
"cmd_prompt", "secure", "port", "identity_file", "separator",
- "inet4_only", "inet6_only", "ipport",
- "power_timeout", "shell_timeout", "login_timeout", "power_wait", "missing_as_off" ]
+ "inet4_only", "inet6_only", "ipport", "missing_as_off" ]
atexit.register(atexit_handler)
diff --git a/fence/agents/cisco_mds/fence_cisco_mds.py b/fence/agents/cisco_mds/fence_cisco_mds.py
index d20efe4..a007fde 100644
--- a/fence/agents/cisco_mds/fence_cisco_mds.py
+++ b/fence/agents/cisco_mds/fence_cisco_mds.py
@@ -81,13 +81,11 @@ def get_outlets_status(conn, options):
def main():
global port_oid
- device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug",
- "action", "ipaddr", "login", "passwd", "passwd_script",
+ device_opt = [ "ipaddr", "login", "passwd", "passwd_script",
"test", "port", "separator", "no_login", "no_password",
"snmp_version", "community", "snmp_auth_prot", "snmp_sec_level",
"snmp_priv_prot", "snmp_priv_passwd", "snmp_priv_passwd_script",
- "udpport","inet4_only","inet6_only",
- "power_timeout", "shell_timeout", "login_timeout", "power_wait" ]
+ "udpport", "inet4_only", "inet6_only" ]
atexit.register(atexit_handler)
diff --git a/fence/agents/cisco_ucs/fence_cisco_ucs.py b/fence/agents/cisco_ucs/fence_cisco_ucs.py
index eda6aed..8020d96 100644
--- a/fence/agents/cisco_ucs/fence_cisco_ucs.py
+++ b/fence/agents/cisco_ucs/fence_cisco_ucs.py
@@ -99,11 +99,9 @@ def send_command(opt, command):
return result
def main():
- device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug",
- "action", "ipaddr", "login", "passwd", "passwd_script",
+ device_opt = [ "ipaddr", "login", "passwd", "passwd_script",
"ssl", "inet4_only", "inet6_only", "ipport", "port",
- "web", "separator", "power_wait", "power_timeout",
- "shell_timeout", "suborg" ]
+ "web", "separator", "suborg" ]
atexit.register(atexit_handler)
diff --git a/fence/agents/drac5/fence_drac5.py b/fence/agents/drac5/fence_drac5.py
index 3e9a8d2..755f2b4 100644
--- a/fence/agents/drac5/fence_drac5.py
+++ b/fence/agents/drac5/fence_drac5.py
@@ -85,11 +85,9 @@ def get_list_devices(conn, options):
return outlets
def main():
- device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug",
- "action", "ipaddr", "login", "passwd", "passwd_script",
+ device_opt = [ "ipaddr", "login", "passwd", "passwd_script",
"cmd_prompt", "secure", "identity_file", "drac_version", "module_name",
- "separator", "inet4_only", "inet6_only", "ipport",
- "power_timeout", "shell_timeout", "login_timeout", "power_wait" ]
+ "separator", "inet4_only", "inet6_only", "ipport" ]
atexit.register(atexit_handler)
diff --git a/fence/agents/eaton_snmp/fence_eaton_snmp.py b/fence/agents/eaton_snmp/fence_eaton_snmp.py
index 5b54b79..2c0b54e 100644
--- a/fence/agents/eaton_snmp/fence_eaton_snmp.py
+++ b/fence/agents/eaton_snmp/fence_eaton_snmp.py
@@ -204,13 +204,11 @@ def eaton_snmp_define_defaults():
# Main agent method
def main():
- device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug",
- "action", "ipaddr", "login", "passwd", "passwd_script",
+ device_opt = [ "ipaddr", "login", "passwd", "passwd_script",
"test", "port", "separator", "no_login", "no_password",
"snmp_version", "community", "snmp_auth_prot", "snmp_sec_level",
"snmp_priv_prot", "snmp_priv_passwd", "snmp_priv_passwd_script",
- "udpport","inet4_only","inet6_only",
- "power_timeout", "shell_timeout", "login_timeout", "power_wait" ]
+ "udpport", "inet4_only", "inet6_only" ]
atexit.register(atexit_handler)
diff --git a/fence/agents/eps/fence_eps.py b/fence/agents/eps/fence_eps.py
index 21530e6..106fd1c 100644
--- a/fence/agents/eps/fence_eps.py
+++ b/fence/agents/eps/fence_eps.py
@@ -98,10 +98,8 @@ def eps_define_new_opts():
# Starting point of fence agent
def main():
- device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug",
- "action", "ipaddr", "login", "passwd", "passwd_script",
- "test", "port", "hidden_page", "no_login", "no_password",
- "separator" ]
+ device_opt = [ "ipaddr", "login", "passwd", "passwd_script", "test",
+ "port", "hidden_page", "no_login", "no_password", "separator" ]
atexit.register(atexit_handler)
diff --git a/fence/agents/hpblade/fence_hpblade.py b/fence/agents/hpblade/fence_hpblade.py
index b4e9f1b..4e125c1 100644
--- a/fence/agents/hpblade/fence_hpblade.py
+++ b/fence/agents/hpblade/fence_hpblade.py
@@ -71,11 +71,9 @@ def get_blades_list(conn, options):
return outlets
def main():
- device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug",
- "action", "ipaddr", "login", "passwd", "passwd_script",
+ device_opt = [ "ipaddr", "login", "passwd", "passwd_script",
"cmd_prompt", "secure", "port", "identity_file", "separator",
- "inet4_only", "inet6_only", "ipport", "missing_as_off",
- "power_timeout", "shell_timeout", "login_timeout", "power_wait"]
+ "inet4_only", "inet6_only", "ipport", "missing_as_off" ]
atexit.register(atexit_handler)
diff --git a/fence/agents/ibmblade/fence_ibmblade.py b/fence/agents/ibmblade/fence_ibmblade.py
index 323a4ad..96d2a76 100644
--- a/fence/agents/ibmblade/fence_ibmblade.py
+++ b/fence/agents/ibmblade/fence_ibmblade.py
@@ -56,13 +56,11 @@ def ibmblade_define_defaults():
def main():
global port_oid
- device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug",
- "action", "ipaddr", "login", "passwd", "passwd_script",
+ device_opt = [ "ipaddr", "login", "passwd", "passwd_script",
"test", "port", "separator", "no_login", "no_password",
"snmp_version", "community", "snmp_auth_prot", "snmp_sec_level",
"snmp_priv_prot", "snmp_priv_passwd", "snmp_priv_passwd_script",
- "udpport","inet4_only","inet6_only",
- "power_timeout", "shell_timeout", "login_timeout", "power_wait" ]
+ "udpport", "inet4_only", "inet6_only" ]
atexit.register(atexit_handler)
diff --git a/fence/agents/ifmib/fence_ifmib.py b/fence/agents/ifmib/fence_ifmib.py
index 2914301..bbbec22 100644
--- a/fence/agents/ifmib/fence_ifmib.py
+++ b/fence/agents/ifmib/fence_ifmib.py
@@ -101,13 +101,11 @@ def ifmib_define_defaults():
def main():
global port_oid
- device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug",
- "action", "ipaddr", "login", "passwd", "passwd_script",
+ device_opt = [ "ipaddr", "login", "passwd", "passwd_script",
"test", "port", "separator", "no_login", "no_password",
"snmp_version", "community", "snmp_auth_prot", "snmp_sec_level",
"snmp_priv_prot", "snmp_priv_passwd", "snmp_priv_passwd_script",
- "udpport","inet4_only","inet6_only",
- "power_timeout", "shell_timeout", "login_timeout", "power_wait" ]
+ "udpport", "inet4_only", "inet6_only" ]
atexit.register(atexit_handler)
diff --git a/fence/agents/ilo/fence_ilo.py b/fence/agents/ilo/fence_ilo.py
index d4e34df..4c8f7ca 100644
--- a/fence/agents/ilo/fence_ilo.py
+++ b/fence/agents/ilo/fence_ilo.py
@@ -58,10 +58,8 @@ def set_power_status(conn, options):
return
def main():
- device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug",
- "action", "ipaddr", "login", "passwd", "passwd_script",
- "ssl", "ribcl", "inet4_only", "inet6_only", "ipport",
- "power_timeout", "shell_timeout", "login_timeout", "power_wait" ]
+ device_opt = [ "ipaddr", "login", "passwd", "passwd_script",
+ "ssl", "ribcl", "inet4_only", "inet6_only", "ipport" ]
atexit.register(atexit_handler)
diff --git a/fence/agents/ilo_mp/fence_ilo_mp.py b/fence/agents/ilo_mp/fence_ilo_mp.py
index 3af3048..9ac8701 100644
--- a/fence/agents/ilo_mp/fence_ilo_mp.py
+++ b/fence/agents/ilo_mp/fence_ilo_mp.py
@@ -44,11 +44,9 @@ def set_power_status(conn, options):
fail(EC_TIMED_OUT)
def main():
- device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug",
- "action", "ipaddr", "login", "passwd", "passwd_script",
+ device_opt = [ "ipaddr", "login", "passwd", "passwd_script",
"secure", "identity_file", "cmd_prompt", "ipport",
- "separator", "inet4_only", "inet6_only",
- "power_timeout", "shell_timeout", "login_timeout", "power_wait" ]
+ "separator", "inet4_only", "inet6_only" ]
atexit.register(atexit_handler)
diff --git a/fence/agents/intelmodular/fence_intelmodular.py b/fence/agents/intelmodular/fence_intelmodular.py
index 11ff9bc..52dd27f 100644
--- a/fence/agents/intelmodular/fence_intelmodular.py
+++ b/fence/agents/intelmodular/fence_intelmodular.py
@@ -63,13 +63,11 @@ def get_outlets_status(conn, options):
def main():
global port_oid
- device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug",
- "action", "ipaddr", "login", "passwd", "passwd_script",
+ device_opt = [ "ipaddr", "login", "passwd", "passwd_script",
"test", "port", "separator", "no_login", "no_password",
"snmp_version", "community", "snmp_auth_prot", "snmp_sec_level",
"snmp_priv_prot", "snmp_priv_passwd", "snmp_priv_passwd_script",
- "udpport","inet4_only","inet6_only",
- "power_timeout", "shell_timeout", "login_timeout", "power_wait" ]
+ "udpport", "inet4_only", "inet6_only" ]
atexit.register(atexit_handler)
diff --git a/fence/agents/ipdu/fence_ipdu.py b/fence/agents/ipdu/fence_ipdu.py
index aac0b7d..2749e44 100644
--- a/fence/agents/ipdu/fence_ipdu.py
+++ b/fence/agents/ipdu/fence_ipdu.py
@@ -138,13 +138,11 @@ def ipdu_snmp_define_defaults():
# Main agent method
def main():
- device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug",
- "action", "ipaddr", "login", "passwd", "passwd_script",
+ device_opt = [ "ipaddr", "login", "passwd", "passwd_script",
"test", "port", "separator", "no_login", "no_password",
"snmp_version", "community", "snmp_auth_prot", "snmp_sec_level",
"snmp_priv_prot", "snmp_priv_passwd", "snmp_priv_passwd_script",
- "udpport","inet4_only","inet6_only",
- "power_timeout", "shell_timeout", "login_timeout", "power_wait" ]
+ "udpport", "inet4_only", "inet6_only" ]
atexit.register(atexit_handler)
diff --git a/fence/agents/ldom/fence_ldom.py b/fence/agents/ldom/fence_ldom.py
index c971c04..d106255 100644
--- a/fence/agents/ldom/fence_ldom.py
+++ b/fence/agents/ldom/fence_ldom.py
@@ -81,11 +81,9 @@ def set_power_status(conn, options):
fail(EC_TIMED_OUT)
def main():
- device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug",
- "action", "ipaddr", "login", "passwd", "passwd_script",
+ device_opt = [ "ipaddr", "login", "passwd", "passwd_script",
"secure", "identity_file", "test" , "port", "cmd_prompt",
- "separator", "inet4_only", "inet6_only", "ipport",
- "power_timeout", "shell_timeout", "login_timeout", "power_wait" ]
+ "separator", "inet4_only", "inet6_only", "ipport" ]
atexit.register(atexit_handler)
diff --git a/fence/agents/lib/fencing.py.py b/fence/agents/lib/fencing.py.py
index 2cc6e7b..e26f9b3 100644
--- a/fence/agents/lib/fencing.py.py
+++ b/fence/agents/lib/fencing.py.py
@@ -407,7 +407,8 @@ all_opt = {
"order" : 205}
}
-common_opt = [ "retry_on", "delay" ]
+common_opt = [ "help", "debug", "verbose", "quiet", "version", "action", "agent",
+ "power_timeout", "shell_timeout", "login_timeout", "power_wait", "retry_on", "delay" ]
class fspawn(pexpect.spawn):
def __init__(self, options, command):
diff --git a/fence/agents/lpar/fence_lpar.py b/fence/agents/lpar/fence_lpar.py
index 00ea66c..b9121e4 100644
--- a/fence/agents/lpar/fence_lpar.py
+++ b/fence/agents/lpar/fence_lpar.py
@@ -130,11 +130,9 @@ def get_lpar_list(conn, options):
return outlets
def main():
- device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug",
- "action", "ipaddr", "login", "passwd", "passwd_script",
- "secure", "identity_file", "partition", "managed", "hmc_version", "cmd_prompt",
- "separator", "inet4_only", "inet6_only", "ipport",
- "power_timeout", "shell_timeout", "login_timeout", "power_wait" ]
+ device_opt = [ "ipaddr", "login", "passwd", "passwd_script", "secure",
+ "identity_file", "partition", "managed", "hmc_version", "cmd_prompt",
+ "separator", "inet4_only", "inet6_only", "ipport" ]
atexit.register(atexit_handler)
diff --git a/fence/agents/rhevm/fence_rhevm.py b/fence/agents/rhevm/fence_rhevm.py
index 4310dd0..9bb9581 100644
--- a/fence/agents/rhevm/fence_rhevm.py
+++ b/fence/agents/rhevm/fence_rhevm.py
@@ -116,11 +116,8 @@ def send_command(opt, command, method = "GET"):
return result
def main():
- device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug",
- "action", "ipaddr", "login", "passwd", "passwd_script",
- "ssl", "inet4_only", "inet6_only", "ipport", "port",
- "web", "separator", "power_wait", "power_timeout",
- "shell_timeout" ]
+ device_opt = [ "ipaddr", "login", "passwd", "passwd_script", "ssl",
+ "inet4_only", "inet6_only", "ipport", "port", "web", "separator" ]
atexit.register(atexit_handler)
diff --git a/fence/agents/rsa/fence_rsa.py b/fence/agents/rsa/fence_rsa.py
index e9f87cd..3ba2c80 100644
--- a/fence/agents/rsa/fence_rsa.py
+++ b/fence/agents/rsa/fence_rsa.py
@@ -44,10 +44,8 @@ def set_power_status(conn, options):
fail(EC_TIMED_OUT)
def main():
- device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug",
- "action", "ipaddr", "login", "passwd", "passwd_script",
- "cmd_prompt", "secure", "identity_file", "ipport",
- "power_timeout", "shell_timeout", "login_timeout", "power_wait" ]
+ device_opt = [ "ipaddr", "login", "passwd", "passwd_script",
+ "cmd_prompt", "secure", "identity_file", "ipport" ]
atexit.register(atexit_handler)
diff --git a/fence/agents/rsb/fence_rsb.py b/fence/agents/rsb/fence_rsb.py
index 7ce1906..bc3df9a 100755
--- a/fence/agents/rsb/fence_rsb.py
+++ b/fence/agents/rsb/fence_rsb.py
@@ -47,11 +47,9 @@ def set_power_status(conn, options):
fail(EC_TIMED_OUT)
def main():
- device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug",
- "action", "ipaddr", "login", "passwd", "passwd_script",
+ device_opt = [ "ipaddr", "login", "passwd", "passwd_script",
"secure", "identity_file", "separator", "cmd_prompt",
- "inet4_only", "inet6_only", "ipport", "telnet_port",
- "power_timeout", "shell_timeout", "login_timeout", "power_wait" ]
+ "inet4_only", "inet6_only", "ipport", "telnet_port" ]
atexit.register(atexit_handler)
all_opt["telnet_port"] = {
diff --git a/fence/agents/sanbox2/fence_sanbox2.py b/fence/agents/sanbox2/fence_sanbox2.py
index 92c5d4a..8c67ac2 100644
--- a/fence/agents/sanbox2/fence_sanbox2.py
+++ b/fence/agents/sanbox2/fence_sanbox2.py
@@ -108,10 +108,8 @@ def get_list_devices(conn, options):
return outlets
def main():
- device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug",
- "io_fencing", "ipaddr", "login", "passwd", "passwd_script",
- "cmd_prompt", "port", "ipport", "separator",
- "power_timeout", "shell_timeout", "login_timeout", "power_wait" ]
+ device_opt = [ "io_fencing", "ipaddr", "login", "passwd", "passwd_script",
+ "cmd_prompt", "port", "ipport", "separator" ]
atexit.register(atexit_handler)
diff --git a/fence/agents/virsh/fence_virsh.py b/fence/agents/virsh/fence_virsh.py
index 4859d7d..6e6a43d 100644
--- a/fence/agents/virsh/fence_virsh.py
+++ b/fence/agents/virsh/fence_virsh.py
@@ -71,11 +71,9 @@ def set_power_status(conn, options):
fail(EC_TIMED_OUT)
def main():
- device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug",
- "action", "ipaddr", "login", "passwd", "passwd_script",
+ device_opt = [ "ipaddr", "login", "passwd", "passwd_script",
"secure", "identity_file", "test", "port", "separator",
- "inet4_only", "inet6_only", "ipport", "sudo",
- "power_timeout", "shell_timeout", "login_timeout", "power_wait" ]
+ "inet4_only", "inet6_only", "ipport", "sudo" ]
atexit.register(atexit_handler)
diff --git a/fence/agents/vmware/fence_vmware.py b/fence/agents/vmware/fence_vmware.py
index 99e5ca9..0b81d1d 100644
--- a/fence/agents/vmware/fence_vmware.py
+++ b/fence/agents/vmware/fence_vmware.py
@@ -284,11 +284,9 @@ def vmware_check_vmware_type(options):
# Main agent method
def main():
- device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug",
- "action", "ipaddr", "login", "passwd", "passwd_script",
+ device_opt = [ "ipaddr", "login", "passwd", "passwd_script",
"test", "port", "separator", "exec", "vmware_type",
- "vmware_datacenter", "secure", "identity_file",
- "power_timeout", "shell_timeout", "login_timeout", "power_wait" ]
+ "vmware_datacenter", "secure", "identity_file" ]
atexit.register(atexit_handler)
diff --git a/fence/agents/vmware_soap/fence_vmware_soap.py b/fence/agents/vmware_soap/fence_vmware_soap.py
index 0da7f0d..21dad66 100644
--- a/fence/agents/vmware_soap/fence_vmware_soap.py
+++ b/fence/agents/vmware_soap/fence_vmware_soap.py
@@ -158,10 +158,8 @@ def set_power_status(conn, options):
conn.service.PowerOffVM_Task(mo_machine)
def main():
- device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug",
- "action", "ipaddr", "login", "passwd", "passwd_script",
- "ssl", "port", "uuid", "separator", "ipport",
- "power_timeout", "shell_timeout", "login_timeout", "power_wait" ]
+ device_opt = [ "ipaddr", "login", "passwd", "passwd_script",
+ "ssl", "port", "uuid", "separator", "ipport" ]
atexit.register(atexit_handler)
diff --git a/fence/agents/wti/fence_wti.py b/fence/agents/wti/fence_wti.py
index b7c41f3..f013953 100644
--- a/fence/agents/wti/fence_wti.py
+++ b/fence/agents/wti/fence_wti.py
@@ -90,11 +90,9 @@ def set_power_status(conn, options):
fail(EC_TIMED_OUT)
def main():
- device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug",
- "action", "ipaddr", "login", "passwd", "passwd_script",
+ device_opt = [ "ipaddr", "login", "passwd", "passwd_script",
"cmd_prompt", "secure", "identity_file", "port", "no_login", "no_password",
- "test", "separator", "inet4_only", "inet6_only", "ipport",
- "power_timeout", "shell_timeout", "login_timeout", "power_wait" ]
+ "test", "separator", "inet4_only", "inet6_only", "ipport" ]
atexit.register(atexit_handler)
diff --git a/fence/agents/xenapi/fence_xenapi.py b/fence/agents/xenapi/fence_xenapi.py
index cae53e6..0b07ed6 100644
--- a/fence/agents/xenapi/fence_xenapi.py
+++ b/fence/agents/xenapi/fence_xenapi.py
@@ -199,10 +199,8 @@ def return_vm_reference(session, options):
def main():
- device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug", "action",
- "login", "passwd", "passwd_script", "port", "test", "separator",
- "no_login", "no_password", "power_timeout", "shell_timeout",
- "login_timeout", "power_wait", "session_url", "uuid" ]
+ device_opt = [ "login", "passwd", "passwd_script", "port", "test", "separator",
+ "no_login", "no_password", "session_url", "uuid" ]
atexit.register(atexit_handler)
11 years, 5 months