--- lilo-22.2/lilo.c Sun Dec 30 16:10:26 2001 +++ lilo-xfs.c Mon Mar 25 15:17:53 2002 @@ -755,16 +755,49 @@ fprintf(errstd,"%7s%s -A /dev/XXX [ N ]\t\tactivate a partition\n","",name); fprintf(errstd,"%7s%s -M /dev/XXX [ mbr_file ]\tinstall master boot record\n","",name); fprintf(errstd,"%7s%s -T help \t\t\tlist additional options\n", "", name); + fprintf(errstd,"%7s%s -F \t\t\t\tforce install on XFS partition\n\t\t\t\t\tWARNING: This will corrupt\n\t\t\t\t\tthe superblock on XFS partitions.\n\n", "", name); fprintf(errstd,"%7s%s -V [ -v ]\t\t\tversion information\n\n","",name); exit(1); } +int is_xfs(char* device) +{ + FILE* mounts; + + if ((mounts = fopen("/etc/mtab", "r")) == NULL) + { /* Just some insurance. If this does not exists, there's something + seriously wrong here. How are you even in Linux in the first place? + */ + fprintf(errstd, "ERROR: I cannot find /etc/mtab! Nothing done.\n"); + exit(-1); + } + else + { + while (! feof(mounts)) + { + char mount_line[255],*fs_type,*mount_device,*mount_point; + fgets(mount_line, 255, mounts); + if (strlen(mount_line) == 0) break; + mount_device = strtok(mount_line, " "); + mount_point = strtok(NULL, " "); + fs_type = strtok(NULL, " "); + if (fs_type == NULL) break; + if ((strcmp(fs_type, "xfs") == 0) && (strcmp(mount_device,device) == 0)) + return 1; + } + fclose(mounts); + } + return 0; +} + int main(int argc,char **argv) { char *name,*reboot_arg,*identify,*ident_opt,*new_root; char *tell_param, *uninst_dev, *param, *act1, *act2, ch; int query,more,version,uninstall,validate,activate,instmbr,geom; + int force_xfs; + char *boot_device = NULL; struct stat st; int fd; long raid_offset; @@ -775,6 +808,7 @@ reboot_arg = identify = ident_opt = new_root = uninst_dev = NULL; lowest = do_md_install = zflag = query = version = uninstall = validate = activate = instmbr = 0; + force_xfs = 0; verbose = -1; name = *argv; argc--; @@ -806,6 +840,9 @@ break; case 'b': cfg_set(cf_options,"boot",param,NULL); + boot_device = (char*)malloc((sizeof (char)) * 255); + strcpy(boot_device,param); + // if (is_xfs(boot_device) == 1) die("root (%s) is XFS. Aborted.",boot_device); break; case 'c': cfg_set(cf_options,"compact",NULL,NULL); @@ -823,6 +860,11 @@ case 'f': cfg_set(cf_options,"disktab",param,NULL); break; + case 'F': + if (!nowarn) + fprintf(errstd,"WARNING: Forcing install on XFS partitions...\nBe prepared to run xfs_repair\non any XFS root partitions\nthat LILO selects as boot.\n"); + force_xfs = 1; + break; case 'g': geometric |= 1; break; @@ -1104,6 +1146,13 @@ if (verbose >=2 && do_md_install) printf("raid flags: at bsect_open 0x%02X\n", raid_flags); + if (boot_device == NULL) + { + boot_device = (char*)malloc((sizeof (char)) * 255); + strcpy(boot_device,cfg_get_strg(cf_options,"boot")); + } + if ((is_xfs(boot_device) == 1) && (force_xfs == 0)) die("root (%s) is XFS. Aborted.",boot_device); + bsect_open(cfg_get_strg(cf_options,"boot"),cfg_get_strg(cf_options,"map") ? cfg_get_strg(cf_options,"map") : MAP_FILE,cfg_get_strg(cf_options, "install"),cfg_get_strg(cf_options,"delay") ? to_number(cfg_get_strg(