aboutsummaryrefslogtreecommitdiffstats
path: root/extlinux/main.c
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2010-06-26 21:22:48 -0700
committerH. Peter Anvin <hpa@zytor.com>2010-06-26 21:22:48 -0700
commit92e6edabf7661a9fa9a7e7985d4fc37bf3cda649 (patch)
treed5bdc1256f6a454d0ffcea8ce8069032350ada03 /extlinux/main.c
parent03791432c7207da9eb6c898bf15f003ab92ff10e (diff)
downloadsyslinux-92e6edabf7661a9fa9a7e7985d4fc37bf3cda649.tar.gz
syslinux-92e6edabf7661a9fa9a7e7985d4fc37bf3cda649.tar.xz
syslinux-92e6edabf7661a9fa9a7e7985d4fc37bf3cda649.zip
extlinux: set bsHidden for loop devices
If we are on a loop device, set bsHidden based on the loopback device offset. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Diffstat (limited to 'extlinux/main.c')
-rw-r--r--extlinux/main.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/extlinux/main.c b/extlinux/main.c
index 884a0254..68e6457e 100644
--- a/extlinux/main.c
+++ b/extlinux/main.c
@@ -57,11 +57,6 @@ typedef uint64_t u64;
# define dprintf(...) ((void)0)
#endif
-#if defined(__linux__) && !defined(BLKGETSIZE64)
-/* This takes a u64, but the size field says size_t. Someone screwed big. */
-# define BLKGETSIZE64 _IOR(0x12,114,size_t)
-#endif
-
#ifndef EXT2_SUPER_OFFSET
#define EXT2_SUPER_OFFSET 1024
#endif
@@ -125,6 +120,8 @@ static const struct geometry_table standard_geometries[] = {
int get_geometry(int devfd, uint64_t totalbytes, struct hd_geometry *geo)
{
struct floppy_struct fd_str;
+ struct loop_info li;
+ struct loop_info64 li64;
const struct geometry_table *gp;
memset(geo, 0, sizeof *geo);
@@ -162,6 +159,12 @@ int get_geometry(int devfd, uint64_t totalbytes, struct hd_geometry *geo)
" (on hard disks, this is usually harmless.)\n",
geo->heads, geo->sectors);
+ /* If this is a loopback device, try to set the start */
+ if (!ioctl(devfd, LOOP_GET_STATUS64, &li64))
+ geo->start = li64.lo_offset >> SECTOR_SHIFT;
+ else if (!ioctl(devfd, LOOP_GET_STATUS, &li))
+ geo->start = (unsigned int)li.lo_offset >> SECTOR_SHIFT;
+
return 1;
}