⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 super.c

📁 reiserfsprogs-3.6.19.tar.gz 源码 给有需要的人!
💻 C
📖 第 1 页 / 共 3 页
字号:
	    	journal_dev_name = fsck_data (fs)->journal_dev_name;	    	retval = stat(journal_dev_name, &stat_buf);	    	if (retval == -1)	    reiserfs_exit (EXIT_USER, "rebuild_sb: error while detecting the "		"specified journal device (%s): %s\n", journal_dev_name,		strerror(errno));		retval = 0;	if (magic_was_found) {	    /* Super block was found. Try to open the journal on the base of its 	     * journal parameters. */	    	    retval = reiserfs_open_journal(fs, journal_dev_name, 		O_RDWR | O_LARGEFILE);	    	    if (retval == 0) {		j_head = (struct reiserfs_journal_header *)(fs->fs_jh_bh->b_data);		retval = memcmp(&j_head->jh_journal, sb_jp(sb), 		    sizeof(struct journal_params));	    		if (retval) {		    /* journal parameters from the SB and from the J_Header does not 		     * match. Close the jouranl, ask the user about correct journal 		     * parameters. */		    reiserfs_close_journal(fs);		}	    }	    if (!reiserfs_journal_opened(fs)) {		fsck_log ("Journal cannot be opened, assuming specified "			  "journal device is correct\n");	    }	}		if (!reiserfs_journal_opened(fs)) {	    __u64 default_value;	    /* journal was not found or SB and J_Header parameters does not match. */	    if (magic_was_found == 0)                default_value = (!strcmp(fs->fs_file_name, journal_dev_name)) ? 		    p_jp_journal_1st_block : 0;            else                default_value = get_jp_journal_1st_block (sb_jp(sb));            printf("\nEnter journal offset on %s in blocks [%Lu]: \n",            		journal_dev_name, (unsigned long long)default_value);            getline (&answer, &n, stdin);            if (strcmp(answer, "\n")) {                retval = (int) strtol (answer, &tmp, 0);                if ((*tmp && strcmp(tmp, "\n")) || retval < 0)                    reiserfs_exit(EXIT_USER, "rebuild_sb: wrong offset specified\n");                set_jp_journal_1st_block (sb_jp(sb), retval);            } else                set_jp_journal_1st_block (sb_jp(sb), default_value);            if (!(p_jp_dev_size = count_blocks (journal_dev_name, fs->fs_blocksize)))		    exit(EXIT_OPER);            /* some checks for journal offset */            if (strcmp(fs->fs_file_name, journal_dev_name) != 0) {                if (p_jp_dev_size < get_jp_journal_1st_block (sb_jp(sb)) + 1)        	    reiserfs_exit(EXIT_USER, "rebuild_sb: offset is much than device size\n");            }            /* default size if magic was not found is device size - journal_1st_block;               default size if magic was found is found value + 1 block for journal 	       header */            if (magic_was_found == 0)                default_value = (!strcmp(fs->fs_file_name, journal_dev_name)) ?                    journal_default_size (fs->fs_super_bh->b_blocknr,					  fs->fs_blocksize) + 1 :                    p_jp_dev_size - get_jp_journal_1st_block (sb_jp(sb));            else                default_value = get_jp_journal_size (sb_jp(sb)) + 1;		            printf("\nEnter journal size (including 1 block for journal header) on "		"%s in blocks [%Lu]: \n", journal_dev_name, 		(unsigned long long)default_value);            getline (&answer, &n, stdin);            if (strcmp(answer, "\n")) {                retval = (int) strtol (answer, &tmp, 0);                if ((*tmp && strcmp(tmp, "\n")) || retval < 0)        	    reiserfs_exit(EXIT_USER, "rebuild_sb: wrong offset specified\n");                set_jp_journal_size (sb_jp(sb), retval - 1);            } else {                set_jp_journal_size (sb_jp(sb), default_value - 1);            }            /* some checks for journal size */            if (get_jp_journal_size (sb_jp(sb)) +                get_jp_journal_1st_block (sb_jp(sb)) + 1 > p_jp_dev_size)        	    reiserfs_exit(EXIT_USER, "rebuild_sb: journal offset + journal size is "			"greater than device size\n");            	    /* some checks for journal size */            if (get_jp_journal_size (sb_jp(sb)) < JOURNAL_MIN_SIZE)        	    reiserfs_exit(EXIT_USER, "rebuild_sb: journal size cannot be less than "			"%lu blocks.\n", JOURNAL_MIN_SIZE + 1);	    if ((retval = reiserfs_open_journal(fs, journal_dev_name, 		O_RDWR | O_LARGEFILE)))	    {		fsck_log("\nrebuild-sb: Failed to open a journal device (%s).", 		    journal_dev_name);				exit(retval < 0 ? EXIT_OPER : EXIT_USER);	    }		    /* SB was found, but journal params were broken and have been recovered. 	     * Futher work goes as SB would not be found. */	    magic_was_found = 0;	}		if (strcmp (fs->fs_file_name, journal_dev_name))	    set_jp_journal_dev (sb_jp(sb), stat_buf.st_rdev);	else	    set_jp_journal_dev (sb_jp(sb), 0);    } else {	fsck_log ("\nJournal was specified as not available. reiserfstune is "	    "needed.\n\n");		set_jp_journal_magic (sb_jp(sb), NEED_TUNE);    }    if (reiserfs_journal_opened(fs)) {	/* Journal was openned. Check/fix journal parameters and copy it the journal 	 * header. */	        if (get_jp_journal_max_trans_len (sb_jp(sb)) !=	    advise_journal_max_trans_len(   get_jp_journal_max_trans_len (sb_jp(sb)),					    get_jp_journal_size (sb_jp(sb)), 					    fs->fs_blocksize, 0))	{ 	    fsck_conditional_log (magic_was_found, "rebuild-sb: wrong journal max "		"transaction length occured (%lu), fixed (%d)\n",		get_jp_journal_max_trans_len (sb_jp(sb)),		advise_journal_max_trans_len (	get_jp_journal_max_trans_len (sb_jp(sb)),        					get_jp_journal_size (sb_jp(sb)),        					fs->fs_blocksize, 0));	     	    set_jp_journal_max_trans_len (sb_jp(sb), 	    	advise_journal_max_trans_len (	get_jp_journal_max_trans_len (sb_jp(sb)),						get_jp_journal_size (sb_jp(sb)), 	    					fs->fs_blocksize, 0));        }	        if (get_jp_journal_max_batch (sb_jp(sb)) != 	    advise_journal_max_batch(get_jp_journal_max_trans_len (sb_jp(sb)))) 	{ 	    fsck_conditional_log (magic_was_found, "rebuild-sb: wrong journal max "		"batch size occured (%lu), fixed (%d)\n", 		get_jp_journal_max_batch (sb_jp(sb)), 		advise_journal_max_batch(get_jp_journal_max_trans_len (sb_jp(sb))));	     	    set_jp_journal_max_batch (sb_jp(sb), 		advise_journal_max_batch(get_jp_journal_max_trans_len (sb_jp(sb))));        }        if (get_jp_journal_max_commit_age (sb_jp(sb)) != 	    advise_journal_max_commit_age()) 	{ 	    fsck_conditional_log (magic_was_found, "rebuild-sb: wrong journal "		"max commit age occured (%lu), fixed (%d)\n",  	        get_jp_journal_max_commit_age (sb_jp(sb)), advise_journal_max_commit_age());	     	    set_jp_journal_max_commit_age (sb_jp(sb), advise_journal_max_commit_age());        }	        if (get_jp_journal_max_trans_age (sb_jp(sb)) != advise_journal_max_trans_age()) { 	    fsck_log ("rebuild-sb: wrong journal  max commit age occured (%u), "		"fixed (%u)\n", get_jp_journal_max_trans_age (sb_jp(sb)), 		advise_journal_max_trans_age());	     	    set_jp_journal_max_trans_age (sb_jp(sb), advise_journal_max_trans_age());        }			j_head = (struct reiserfs_journal_header *)(fs->fs_jh_bh->b_data);	if (standard_journal == 0) {	    if (get_jp_journal_magic (sb_jp(sb)) == 0 || 		get_jp_journal_magic (sb_jp(sb)) == NEED_TUNE) 	    {		int magic;				magic = random();		fsck_log ("rebuild-sb: genarate the new journal magic (%d)\n", magic);		set_jp_journal_magic (sb_jp(sb), magic);		set_jp_journal_magic (&j_head->jh_journal, magic);	    }	}		retval = memcmp(&j_head->jh_journal, sb_jp(sb), sizeof(struct journal_params));		if (retval) {	    if (standard_journal == 1) {		fsck_log("\nrebuild-sb: You either have a corrupted journal or have just "		    "changed\nthe start of the partition with some partition table editor. "		    "If you are\nsure that the start of the partition is ok, rebuild the "		    "journal header.\n");	    } else if (!magic_was_found) {		fsck_log("\nrebuild-sb: journal header is not found. You either have "		    "a corrupted,\nbad configured(device/offset/size), not available "		    "journal or have just changed\nthe start of the journal partition "		    "with some partition table editor. In the \ncase of corrupted "		    "journal you need to use --no-journal-available. If you are\n"		    "sure that the start of the partition is ok and journal is "		    "available, rebuild\nthe journal header.\n");	    }	    	    if (standard_journal || !magic_was_found) {		if (!user_confirmed (stdout, "Do you want to rebuild the journal header? "		    "(y/n)[n]: ", "y\n"))		{		    exit(EXIT_USER);		} else 		    exit_code = EXIT_FIXED;	    }	    	    memcpy(&j_head->jh_journal, sb_jp(sb), sizeof(struct journal_params));	    mark_buffer_dirty(fs->fs_jh_bh);	    bwrite (fs->fs_jh_bh);	}    }        /*  whether journal header contains params with the same dev, offset, size will be 	checked in open_journal */    if (version == 1 || version == 3)        sb_size = SB_SIZE;    else        sb_size = SB_SIZE_V1;    if (ondisk_sb == NULL || 	memcmp(ondisk_sb, sb, sb_size - ((sb_size == SB_SIZE) ? 	    sizeof(fs->fs_ondisk_sb->s_unused) : 0)))     {        /* smth was changed in SB or a new one has been built */	set_sb_fs_state (sb, get_sb_fs_state (sb) | FS_ERROR);		if (ondisk_sb) {	    /* if super_block was found, we keep sb in ondisk_sb */	    fs->fs_ondisk_sb = ondisk_sb;	    memcpy (ondisk_sb, sb, sb_size);	    freemem(sb);	}	fflush(stdout); 	print_block (stderr, fs, fs->fs_super_bh);		if (user_confirmed (stderr, "Is this ok ? (y/n)[n]: ", "y\n")) {	    mark_buffer_uptodate (fs->fs_super_bh, 1);	    mark_buffer_dirty (fs->fs_super_bh);	    bwrite (fs->fs_super_bh);	    fsck_progress ("The fs may still be unconsistent. Run reiserfsck --check.\n\n");	    exit_code = EXIT_FIXED;	} else {	    mark_buffer_clean (fs->fs_super_bh);	    fsck_progress ("Super block was not written\n");	}    } else {	print_block (stderr, fs, fs->fs_super_bh);		mark_buffer_clean (fs->fs_super_bh);	fsck_progress ("\nSuper block seems to be correct\n\n");    }    exit(exit_code);}/*	if (version == 0) {	    brelse (fs->fs_super_bh);            freemem (fs);            close (fs->fs_dev);            fs = NULL;	}*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -