From: <ta...@us...> - 2010-11-12 15:14:24
|
Revision: 4899 http://gfarm.svn.sourceforge.net/gfarm/?rev=4899&view=rev Author: tatebe Date: 2010-11-12 15:14:18 +0000 (Fri, 12 Nov 2010) Log Message: ----------- merge r4720 and r4751 - check and fix file system integrity at start-up described in #57 Modified Paths: -------------- gfarm_v2/trunk/server/gfmd/gfmd.c gfarm_v2/trunk/server/gfmd/inode.c gfarm_v2/trunk/server/gfmd/inode.h Modified: gfarm_v2/trunk/server/gfmd/gfmd.c =================================================================== --- gfarm_v2/trunk/server/gfmd/gfmd.c 2010-11-12 14:42:03 UTC (rev 4898) +++ gfarm_v2/trunk/server/gfmd/gfmd.c 2010-11-12 15:14:18 UTC (rev 4899) @@ -1116,8 +1116,6 @@ int main(int argc, char **argv) { - extern char *optarg; - extern int optind; gfarm_error_t e; char *config_file = NULL, *port_number = NULL; int syslog_level = -1; @@ -1286,6 +1284,9 @@ "create_detached_thread(resumer): %s", gfarm_error_string(e)); + /* check and repair nlink */ + inode_nlink_check(); + accepting_loop(sock); /*NOTREACHED*/ Modified: gfarm_v2/trunk/server/gfmd/inode.c =================================================================== --- gfarm_v2/trunk/server/gfmd/inode.c 2010-11-12 14:42:03 UTC (rev 4898) +++ gfarm_v2/trunk/server/gfmd/inode.c 2010-11-12 15:14:18 UTC (rev 4899) @@ -71,6 +71,7 @@ gfarm_ino_t i_number; gfarm_uint64_t i_gen; gfarm_uint64_t i_nlink; + gfarm_uint64_t i_nlink_ini; gfarm_off_t i_size; struct user *i_user; struct group *i_group; @@ -573,6 +574,7 @@ inode->u.l.prev->u.l.next = inode->u.l.next; inode->i_gen++; } + inode->i_nlink_ini = 0; inode->u.c.state = NULL; gfarm_mutex_lock(&total_num_inodes_mutex, diag, total_num_inodes_diag); ++total_num_inodes; @@ -599,7 +601,7 @@ static const char diag[] = "inode_clear"; inode->i_mode = INODE_MODE_FREE; - inode->i_nlink = 0; + inode->i_nlink = inode->i_nlink_ini = 0; /* add to the inode_free_list */ inode->u.l.prev = &inode_free_list; inode->u.l.next = inode_free_list.u.l.next; @@ -972,6 +974,18 @@ return (inode->i_nlink); } +static gfarm_int64_t +inode_get_nlink_ini(struct inode *inode) +{ + return (inode->i_nlink_ini); +} + +static void +inode_increment_nlink_ini(struct inode *inode) +{ + ++inode->i_nlink_ini; +} + struct user * inode_get_user(struct inode *inode) { @@ -3123,6 +3137,7 @@ "dir_entry_add_one: already exists "); } else { dir_entry_set_inode(entry, entry_inode); + inode_increment_nlink_ini(entry_inode); } free(entry_name); } @@ -3201,7 +3216,51 @@ "loading filecopy: %s", gfarm_error_string(e)); } +static void +nlink_check(void *closure, struct inode *inode) +{ + gfarm_error_t e; + + /* XXX - nlink of a directory is the constant 2 for now */ + if (inode_is_dir(inode)) { + if (inode_get_nlink(inode) != 2) { + gflog_warning(GFARM_MSG_UNFIXED, + "directory inode %lld nlink %lld should be 2 " + "(really %lld): fixed", + inode_get_number(inode), inode_get_nlink(inode), + inode_get_nlink_ini(inode)); + inode->i_nlink = 2; + } else + return; + } else if (inode_get_nlink_ini(inode) == 0) { + gflog_warning(GFARM_MSG_UNFIXED, + "inode %lld is not referenced", inode_get_number(inode)); + /* XXX - move to the /lost+found directory */ + return; + } else if (inode_get_nlink(inode) != inode_get_nlink_ini(inode)) { + gflog_warning(GFARM_MSG_UNFIXED, + "inode %lld nlink %lld should be %lld: fixed", + inode_get_number(inode), inode_get_nlink(inode), + inode_get_nlink_ini(inode)); + inode->i_nlink = inode_get_nlink_ini(inode); + } else + return; + e = db_inode_nlink_modify( + inode_get_number(inode), inode_get_nlink(inode)); + if (e != GFARM_ERR_NO_ERROR) + gflog_error(GFARM_MSG_UNFIXED, + "db_inode_nlink_modify(%lld): %s", + (unsigned long long)inode->i_number, + gfarm_error_string(e)); +} + void +inode_nlink_check(void) +{ + inode_lookup_all(NULL, nlink_check); +} + +void dir_entry_init(void) { gfarm_error_t e; Modified: gfarm_v2/trunk/server/gfmd/inode.h =================================================================== --- gfarm_v2/trunk/server/gfmd/inode.h 2010-11-12 14:42:03 UTC (rev 4898) +++ gfarm_v2/trunk/server/gfmd/inode.h 2010-11-12 15:14:18 UTC (rev 4899) @@ -164,6 +164,9 @@ int inode_has_desired_number(struct inode *, int *); int inode_traverse_desired_replica_number(struct inode *, int *); +/* check and repair */ +void inode_nlink_check(void); + /* debug */ void dir_dump(gfarm_ino_t); void rootdir_dump(void); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |