Gitweb: http://git.fedorahosted.org/git/?p=cluster.git;a=commitdiff;h=872b99e0a25694... Commit: 872b99e0a2569404c49f4483260b5a1b8023d372 Parent: 1325bb4d27bffbcaa5c2170bb1300d8e2c3a9807 Author: Bob Peterson rpeterso@redhat.com AuthorDate: Wed Mar 6 10:28:20 2013 -0700 Committer: Bob Peterson rpeterso@redhat.com CommitterDate: Fri May 17 14:56:44 2013 -0500
fsck.gfs2: Check for formal inode mismatch when adding to lost+found
This patch adds a check to the code that adds inodes to lost+found so that dinodes with formal inode mismatches are logged, but not added.
rhbz#902920 --- gfs2/fsck/lost_n_found.c | 44 ++++++++++++++++++++++++++++---------------- 1 files changed, 28 insertions(+), 16 deletions(-)
diff --git a/gfs2/fsck/lost_n_found.c b/gfs2/fsck/lost_n_found.c index 751cbd8..42d97ee 100644 --- a/gfs2/fsck/lost_n_found.c +++ b/gfs2/fsck/lost_n_found.c @@ -38,24 +38,36 @@ static void add_dotdot(struct gfs2_inode *ip) (unsigned long long)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.no_addr); - if (dip->i_di.di_nlink > 0) { - dip->i_di.di_nlink--; - set_di_nlink(dip); /* keep inode tree in sync */ - log_debug(_("Decrementing its links to %d\n"), - dip->i_di.di_nlink); - bmodified(dip->i_bh); - } else if (!dip->i_di.di_nlink) { - log_debug(_("Its link count is zero.\n")); + if (dip->i_di.di_num.no_formal_ino == + di->dotdot_parent.no_formal_ino) { + decr_link_count(di->dotdot_parent.no_addr, + ip->i_di.di_num.no_addr, + _(".. unlinked, moving to lost+found")); + if (dip->i_di.di_nlink > 0) { + dip->i_di.di_nlink--; + set_di_nlink(dip); /* keep inode tree in sync */ + log_debug(_("Decrementing its links to %d\n"), + dip->i_di.di_nlink); + bmodified(dip->i_bh); + } else if (!dip->i_di.di_nlink) { + log_debug(_("Its link count is zero.\n")); + } else { + log_debug(_("Its link count is %d! Changing " + "it to 0.\n"), dip->i_di.di_nlink); + dip->i_di.di_nlink = 0; + set_di_nlink(dip); /* keep inode tree in sync */ + bmodified(dip->i_bh); + } } else { - log_debug(_("Its link count is %d! Changing " - "it to 0.\n"), dip->i_di.di_nlink); - dip->i_di.di_nlink = 0; - set_di_nlink(dip); /* keep inode tree in sync */ - bmodified(dip->i_bh); + log_debug(_("Directory (0x%llx)'s link to parent " + "(0x%llx) had a formal inode discrepancy: " + "was 0x%llx, expected 0x%llx\n"), + (unsigned long long)ip->i_di.di_num.no_addr, + (unsigned long long)di->dotdot_parent.no_addr, + di->dotdot_parent.no_formal_ino, + dip->i_di.di_num.no_formal_ino); + log_debug(_("The parent directory was not changed.\n")); } fsck_inode_put(&dip); di = NULL;
cluster-commits@lists.stg.fedorahosted.org