X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=src%2Fgeometry.c;h=196a8924d995a4e691c12caa6e7e5322a9863e1f;hb=6474a619fc4572914f921cbff9d72784c1792966;hp=6b581743c9be9c236d2cd703ffdf92ea44618aeb;hpb=0a7ead9db7967764f0d93d30f9a83c94cb6fc358;p=rrq%2Fmaintain_lilo.git diff --git a/src/geometry.c b/src/geometry.c index 6b58174..196a892 100644 --- a/src/geometry.c +++ b/src/geometry.c @@ -1,14 +1,13 @@ -/* geometry.c - Device and file geometry computation */ -/* -Copyright 1992-1998 Werner Almesberger. -Copyright 1999-2005 John Coffman. -All rights reserved. - -Licensed under the terms contained in the file 'COPYING' in the -source directory. - -*/ -/* Patched for linux-2.4.0 - Glibc-2.2 by Sergey Ostrovsky 11/16/2000 */ +/* geometry.c - Device and file geometry computation + * + * Copyright 1992-1998 Werner Almesberger + * Copyright 1999-2005 John Coffman + * Copyright 2009-2015 Joachim Wiedorn + * All rights reserved. + * + * Licensed under the terms contained in the file 'COPYING' + * in the source directory. + */ #define _GNU_SOURCE #include @@ -56,7 +55,7 @@ source directory. #endif #ifndef REISERFS_IOC_UNPACK -#define REISERFS_IOC_UNPACK _IOW(0xCD,1,long) +#define REISERFS_IOC_UNPACK _IOW(0xCD,1,int32_t) #endif #ifndef REISER4_SUPER_MAGIC @@ -64,7 +63,7 @@ source directory. /* (*(__u32 *)"R4Sb"); */ #endif #ifndef REISER4_IOC_UNPACK -#define REISER4_IOC_UNPACK _IOW(0xCD,1,long) +#define REISER4_IOC_UNPACK _IOW(0xCD,1,int32_t) #endif #endif @@ -281,32 +280,49 @@ int has_partitions_beta(dev_t dev) { int major = MAJOR(dev); - if ( - major == MAJOR_HD || major == MAJOR_IDE2 || - major == MAJOR_IDE3 || major == MAJOR_IDE4 || - major == MAJOR_IDE5 || major == MAJOR_IDE6 || - major == MAJOR_EMD || - (major >= MAJOR_IDE7 && major <= MAJOR_IDE10) || - major == MAJOR_XT || major == MAJOR_ESDI || major == MAJOR_ACORN - ) return 0xFFFFFFC0; /* 6 bit partition mask */ + if ( + major == MAJOR_IDE || + major == MAJOR_IDE2 || + major == MAJOR_IDE3 || + major == MAJOR_IDE4 || + major == MAJOR_IDE5 || + major == MAJOR_IDE6 || + major == MAJOR_EMD || + (major >= MAJOR_IDE7 && major <= MAJOR_IDE10) || + major == MAJOR_XT || + major == MAJOR_ESDI || + major == MAJOR_ACORN + ) return 0xFFFFFFC0; /* 6 bit partition mask */ - if ( - major == MAJOR_SD || (major >= MAJOR_SD2 && major <= MAJOR_SD8) || - major == MAJOR_AMI_HYP || major == MAJOR_HPT370 || - (major >= MAJOR_EXPR && major <= MAJOR_EXPR+3) || - (major >= MAJOR_I2O && major <= MAJOR_I2O+7) || - (major >= MAJOR_SMART2 && major <= MAJOR_SMART2+7) || - (major >= MAJOR_CISS && major <= MAJOR_CISS+7) || - major == MAJOR_FTL || major == MAJOR_NFTL || major == MAJOR_DOC || - (major >= MAJOR_SD9 && major <= MAJOR_SD16) - ) return 0xFFFFFFF0; /* 4 bit partition mask */ - - if ( major == MAJOR_SATA || major == MAJOR_SATA2 + if ( + major == MAJOR_CARM1 || + major == MAJOR_CARM2 ) return 0xFFFFFFE0; /* 5 bit partition mask */ - if ( major == MAJOR_IBM_iSER || - (major >= MAJOR_DAC960 && major <= MAJOR_DAC960+7) || - (major >= MAJOR_DAC960_8 && major <= MAJOR_DAC960_8+7) + if ( + major == MAJOR_SD || + (major >= MAJOR_SD2 && major <= MAJOR_SD8) || + (major >= MAJOR_SD9 && major <= MAJOR_SD16) || + major == MAJOR_AMI || + major == MAJOR_HPT370 || + (major >= MAJOR_EXPR && major <= MAJOR_EXPR4) || + (major >= MAJOR_EXPR5 && major <= MAJOR_EXPR12) || + (major >= MAJOR_I2O && major <= MAJOR_I2O7) || + (major >= MAJOR_SMART && major <= MAJOR_SMART8) || + (major >= MAJOR_CISS && major <= MAJOR_CISS8) || + major == MAJOR_FTL || + major == MAJOR_NFTL || + major == MAJOR_DOC || + major == MAJOR_PP || + major == MAJOR_PPCD || + major == MAJOR_PPFD || + (major >= MAJOR_SATA1 && major <= MAJOR_SATA2) + ) return 0xFFFFFFF0; /* 4 bit partition mask */ + + if ( + major == MAJOR_IBM_ISER || + (major >= MAJOR_DAC && major <= MAJOR_DAC8) || + (major >= MAJOR_DAC9 && major <= MAJOR_DAC16) ) return 0xFFFFFFF8; /* 3 bit partition mask */ return 0; @@ -394,10 +410,10 @@ void do_disk(void) maxpart = cfg_get_strg(cf_disk,"max-partitions"); if (maxpart) { if (major %d", (int)nelem(max_partno)-1); @@ -492,12 +508,8 @@ static int scan_last_dev(ST_BUF *next,char *parent,int major,int increment) static int last_dev(int major,int increment) { /* - * In version 12 to 18, LILO only relied on scan_last_dev (or last_dev). This - * obviously didn't work if entries in /dev were missing. Versions 18 and 19 - * added the probe loop, which seems to be okay, but which may probe for - * invalid minor numbers. The IDE driver objects to that. Since last_dev is - * only used to count IDE drives anyway, we try now only the first two devices - * and forget about scan_last_dev. + * Since last_dev is only used to count IDE drives anyway, we try + * now only the first two devices and forget about scan_last_dev. */ DEVICE dev; int devs; @@ -610,13 +622,9 @@ void geo_query_dev(GEOMETRY *geo,int device,int all) struct hd_geometry hdprm; if (verbose>=5) printf("geo_query_dev: device=%04X\n", device); -#if 0 -/* Werner's original */ - get_all = all || MAJOR(device) != MAJOR_FD; */ -#else -/* simplify the condition -- JRC 2003-06-04 */ + /* simplified condition -- JRC 2003-06-04 */ get_all = all; -#endif + if (!MAJOR(device)) die("Trying to map files from unnamed device 0x%04x (NFS/RAID mirror down ?)",device); if (device == MAJMIN_RAM) @@ -643,24 +651,22 @@ void geo_query_dev(GEOMETRY *geo,int device,int all) geo->sectors = fdprm.sect; geo->start = 0; break; - case MAJOR_HD: + case MAJOR_ACORN: + case MAJOR_ESDI: + case MAJOR_IDE: case MAJOR_IDE2: case MAJOR_IDE3: case MAJOR_IDE4: -#ifdef MAJOR_IDE5 case MAJOR_IDE5: -#endif case MAJOR_IDE6: case MAJOR_IDE7: case MAJOR_IDE8: case MAJOR_IDE9: case MAJOR_IDE10: - case MAJOR_ESDI: case MAJOR_XT: - case MAJOR_ACORN: MASK63: geo->device = 0x80 + (MINOR(device) >> 6) + - (MAJOR(device) == MAJOR_HD ? 0 : last_dev(MAJOR_HD,64)); + (MAJOR(device) == MAJOR_IDE ? 0 : last_dev(MAJOR_IDE,64)); if (!get_all) break; if (ioctl(fd,HDIO_GETGEO,&hdprm) < 0) die("geo_query_dev HDIO_GETGEO (dev 0x%04x): %s",device, @@ -678,8 +684,17 @@ void geo_query_dev(GEOMETRY *geo,int device,int all) case MAJOR_SD6: case MAJOR_SD7: case MAJOR_SD8: + case MAJOR_SD9: + case MAJOR_SD10: + case MAJOR_SD11: + case MAJOR_SD12: + case MAJOR_SD13: + case MAJOR_SD14: + case MAJOR_SD15: + case MAJOR_SD16: + case MAJOR_XVD: MASK15: - geo->device = 0x80 + last_dev(MAJOR_HD,64) + (MINOR(device) >> 4); + geo->device = 0x80 + last_dev(MAJOR_IDE,64) + (MINOR(device) >> 4); if (!get_all) break; if (ioctl(fd,HDIO_GETGEO,&hdprm) < 0) die("geo_query_dev HDIO_GETGEO (dev 0x%04x): %s",device, @@ -692,8 +707,16 @@ void geo_query_dev(GEOMETRY *geo,int device,int all) geo->sectors = hdprm.sectors; geo->start = hdprm.start; break; + case MAJOR_SATA1: + case MAJOR_SATA2: + printf("WARNING: SATA partition in the high region (>15):\n"); + printf("LILO needs the kernel in one of the first 15 SATA partitions. If \n"); + printf("you need support for kernel in SATA partitions of the high region \n"); + printf("than try grub2 for this purpose! \n"); + die("Sorry, cannot handle device 0x%04x",device); + break; MASK31: - geo->device = 0x80 + last_dev(MAJOR_HD,64) + (MINOR(device) >> 5); + geo->device = 0x80 + last_dev(MAJOR_IDE,64) + (MINOR(device) >> 5); if (!get_all) break; if (ioctl(fd,HDIO_GETGEO,&hdprm) < 0) die("geo_query_dev HDIO_GETGEO (dev 0x%04x): %s",device, @@ -706,17 +729,26 @@ void geo_query_dev(GEOMETRY *geo,int device,int all) geo->sectors = hdprm.sectors; geo->start = hdprm.start; break; - case MAJOR_DAC960: - case MAJOR_DAC960+1: - case MAJOR_DAC960+2: - case MAJOR_DAC960+3: - case MAJOR_DAC960+4: - case MAJOR_DAC960+5: - case MAJOR_DAC960+6: - case MAJOR_DAC960+7: - case MAJOR_IBM_iSER: + case MAJOR_DAC: + case MAJOR_DAC2: + case MAJOR_DAC3: + case MAJOR_DAC4: + case MAJOR_DAC5: + case MAJOR_DAC6: + case MAJOR_DAC7: + case MAJOR_DAC8: + case MAJOR_DAC9: + case MAJOR_DAC10: + case MAJOR_DAC11: + case MAJOR_DAC12: + case MAJOR_DAC13: + case MAJOR_DAC14: + case MAJOR_DAC15: + case MAJOR_DAC16: + case MAJOR_IBM_ISER: + case MAJOR_MMC: MASK7: - geo->device = 0x80 + last_dev(MAJOR_HD,64) + (MINOR(device) >> 3); + geo->device = 0x80 + last_dev(MAJOR_IDE,64) + (MINOR(device) >> 3); if (!get_all) break; if (ioctl(fd,HDIO_GETGEO,&hdprm) < 0) die("geo_query_dev HDIO_GETGEO (dev 0x%04x): %s",device, @@ -729,40 +761,51 @@ void geo_query_dev(GEOMETRY *geo,int device,int all) geo->sectors = hdprm.sectors; geo->start = hdprm.start; break; - case MAJOR_AMI_HYP: - case MAJOR_HPT370: + case MAJOR_AMI: + case MAJOR_CISS: + case MAJOR_CISS2: + case MAJOR_CISS3: + case MAJOR_CISS4: + case MAJOR_CISS5: + case MAJOR_CISS6: + case MAJOR_CISS7: + case MAJOR_CISS8: + case MAJOR_DOC: case MAJOR_EXPR: - case MAJOR_EXPR+1: - case MAJOR_EXPR+2: - case MAJOR_EXPR+3: + case MAJOR_EXPR2: + case MAJOR_EXPR3: + case MAJOR_EXPR4: + case MAJOR_EXPR5: + case MAJOR_EXPR6: + case MAJOR_EXPR7: + case MAJOR_EXPR8: + case MAJOR_EXPR9: + case MAJOR_EXPR10: + case MAJOR_EXPR11: + case MAJOR_EXPR12: + case MAJOR_HPT370: case MAJOR_FTL: case MAJOR_NFTL: - case MAJOR_DOC: - case MAJOR_SMART2+0: - case MAJOR_SMART2+1: - case MAJOR_SMART2+2: - case MAJOR_SMART2+3: - case MAJOR_SMART2+4: - case MAJOR_SMART2+5: - case MAJOR_SMART2+6: - case MAJOR_SMART2+7: - case MAJOR_CISS+0: - case MAJOR_CISS+1: - case MAJOR_CISS+2: - case MAJOR_CISS+3: - case MAJOR_CISS+4: - case MAJOR_CISS+5: - case MAJOR_CISS+6: - case MAJOR_CISS+7: case MAJOR_I2O: - case MAJOR_I2O+1: - case MAJOR_I2O+2: - case MAJOR_I2O+3: - case MAJOR_I2O+4: - case MAJOR_I2O+5: - case MAJOR_I2O+6: - case MAJOR_I2O+7: - geo->device = 0x80 + last_dev(MAJOR_HD,64) + (MINOR(device) >> 4); + case MAJOR_I2O2: + case MAJOR_I2O3: + case MAJOR_I2O4: + case MAJOR_I2O5: + case MAJOR_I2O6: + case MAJOR_I2O7: + case MAJOR_I2O8: + case MAJOR_PP: + case MAJOR_PPCD: + case MAJOR_PPFD: + case MAJOR_SMART: + case MAJOR_SMART2: + case MAJOR_SMART3: + case MAJOR_SMART4: + case MAJOR_SMART5: + case MAJOR_SMART6: + case MAJOR_SMART7: + case MAJOR_SMART8: + geo->device = 0x80 + last_dev(MAJOR_IDE,64) + (MINOR(device) >> 4); if (!get_all) break; if (ioctl(fd,HDIO_GETGEO,&hdprm) < 0) die("geo_query_dev HDIO_GETGEO (dev 0x%04x): %s",device, @@ -783,7 +826,8 @@ void geo_query_dev(GEOMETRY *geo,int device,int all) if (max_partno[major] == 15) goto MASK15; if (max_partno[major] == 7) goto MASK7; - if ((MAJOR(device)>=120 && MAJOR(device)<=127) || + if ((MAJOR(device)>=60 && MAJOR(device)<=63) || + (MAJOR(device)>=120 && MAJOR(device)<=127) || (MAJOR(device)>=240 && MAJOR(device)<=254) ) die("Linux experimental device 0x%04x needs to be defined.\n" "Check 'man lilo.conf' under 'disk=' and 'max-partitions='", device); @@ -806,19 +850,18 @@ int is_first(int device) if (walk && !walk->heads) die("Device 0x%04X: Configured as inaccessible.\n",device); if (walk && walk->bios != -1) return !(walk->bios & 0x7f); + switch (MAJOR(device)) { case MAJOR_FD: return !(device & 3); - case MAJOR_HD: + case MAJOR_IDE: return !(MINOR(device) >> 6); case MAJOR_IDE2: case MAJOR_IDE3: case MAJOR_IDE4: -#ifdef MAJOR_IDE5 case MAJOR_IDE5: -#endif case MAJOR_IDE6: case MAJOR_IDE7: case MAJOR_IDE8: @@ -826,7 +869,7 @@ int is_first(int device) case MAJOR_IDE10: case MAJOR_ESDI: case MAJOR_XT: - return MINOR(device) >> 6 ? 0 : !last_dev(MAJOR_HD,64); + return MINOR(device) >> 6 ? 0 : !last_dev(MAJOR_IDE,64); case MAJOR_SD: case MAJOR_SD2: @@ -836,50 +879,79 @@ int is_first(int device) case MAJOR_SD6: case MAJOR_SD7: case MAJOR_SD8: - case MAJOR_AMI_HYP: - case MAJOR_HPT370: - case MAJOR_EXPR+0: - case MAJOR_EXPR+1: - case MAJOR_EXPR+2: - case MAJOR_EXPR+3: - case MAJOR_NFTL: + case MAJOR_SD9: + case MAJOR_SD10: + case MAJOR_SD11: + case MAJOR_SD12: + case MAJOR_SD13: + case MAJOR_SD14: + case MAJOR_SD15: + case MAJOR_SD16: + case MAJOR_XVD: + case MAJOR_AMI: + case MAJOR_CISS: + case MAJOR_CISS2: + case MAJOR_CISS3: + case MAJOR_CISS4: + case MAJOR_CISS5: + case MAJOR_CISS6: + case MAJOR_CISS7: + case MAJOR_CISS8: case MAJOR_DOC: - case MAJOR_SMART2+0: - case MAJOR_SMART2+1: - case MAJOR_SMART2+2: - case MAJOR_SMART2+3: - case MAJOR_SMART2+4: - case MAJOR_SMART2+5: - case MAJOR_SMART2+6: - case MAJOR_SMART2+7: - case MAJOR_CISS+0: - case MAJOR_CISS+1: - case MAJOR_CISS+2: - case MAJOR_CISS+3: - case MAJOR_CISS+4: - case MAJOR_CISS+5: - case MAJOR_CISS+6: - case MAJOR_CISS+7: + case MAJOR_HPT370: + case MAJOR_EXPR: + case MAJOR_EXPR2: + case MAJOR_EXPR3: + case MAJOR_EXPR4: + case MAJOR_EXPR5: + case MAJOR_EXPR6: + case MAJOR_EXPR7: + case MAJOR_EXPR8: + case MAJOR_EXPR9: + case MAJOR_EXPR10: + case MAJOR_EXPR11: + case MAJOR_EXPR12: case MAJOR_I2O: - case MAJOR_I2O+1: - case MAJOR_I2O+2: - case MAJOR_I2O+3: - case MAJOR_I2O+4: - case MAJOR_I2O+5: - case MAJOR_I2O+6: - case MAJOR_I2O+7: - return MINOR(device) >> 4 ? 0 : !last_dev(MAJOR_HD,64); - - case MAJOR_DAC960: - case MAJOR_DAC960+1: - case MAJOR_DAC960+2: - case MAJOR_DAC960+3: - case MAJOR_DAC960+4: - case MAJOR_DAC960+5: - case MAJOR_DAC960+6: - case MAJOR_DAC960+7: - case MAJOR_IBM_iSER: - return MINOR(device) >> 3 ? 0 : !last_dev(MAJOR_HD,64); + case MAJOR_I2O2: + case MAJOR_I2O3: + case MAJOR_I2O4: + case MAJOR_I2O5: + case MAJOR_I2O6: + case MAJOR_I2O7: + case MAJOR_I2O8: + case MAJOR_NFTL: + case MAJOR_PP: + case MAJOR_PPCD: + case MAJOR_PPFD: + case MAJOR_SMART: + case MAJOR_SMART2: + case MAJOR_SMART3: + case MAJOR_SMART4: + case MAJOR_SMART5: + case MAJOR_SMART6: + case MAJOR_SMART7: + case MAJOR_SMART8: + return MINOR(device) >> 4 ? 0 : !last_dev(MAJOR_IDE,64); + + case MAJOR_DAC: + case MAJOR_DAC2: + case MAJOR_DAC3: + case MAJOR_DAC4: + case MAJOR_DAC5: + case MAJOR_DAC6: + case MAJOR_DAC7: + case MAJOR_DAC8: + case MAJOR_DAC9: + case MAJOR_DAC10: + case MAJOR_DAC11: + case MAJOR_DAC12: + case MAJOR_DAC13: + case MAJOR_DAC14: + case MAJOR_DAC15: + case MAJOR_DAC16: + case MAJOR_IBM_ISER: + case MAJOR_MMC: + return MINOR(device) >> 3 ? 0 : !last_dev(MAJOR_IDE,64); default: return 1; /* user knows what (s)he's doing ... I hope */ @@ -1102,6 +1174,7 @@ void geo_get(GEOMETRY *geo,int device,int user_device,int all) md_array_info_t md_array_info; md_disk_info_t md_disk_info; int raid_limit; + raid_limit = 0; sprintf(mdxxx, DEV_DISK_DIR "/md%d", MINOR(device)); if ((md_fd=open(mdxxx,O_NOACCESS)) < 0) @@ -1195,7 +1268,7 @@ int pass; for (walk = disktab; walk; walk = walk->next) if (walk->device == (device & D_MASK(device))) break; #if BETA_TEST - if (verbose>=5) printf("walk=%08lx\n", (long)walk); + if (verbose>=5) printf("walk=%0*" PRIxPTR "\n", PTR_WIDTH, (intptr_t)walk); #endif #if 1 @@ -1480,7 +1553,7 @@ int geo_comp_addr(GEOMETRY *geo,int offset,SECTOR_ADDR *addr) break; if (!dm_target) die("device-mapper: Sector outside mapped device? (%d: %u/%"PRIu64")", - geo->base_dev, sector, (uint64_t)(dm_table->target ? + (int) geo->base_dev, sector, (uint64_t)(dm_table->target ? (dm_table->target->start+dm_table->target->length) : 0)); dev = dm_target->device;