Patch from vodz:

I wrote:
>>I think, fdisk have special ext2lseek special for:
>>disk can have size > 4Gb, but all any partitions have < 4Gb and lseek64
>>not require.
>>May be best create new configure option for set DOLFS for fdisk applet
>>if global DOLFS unset?
>


Erik Andersen wrote:
>Agreed.  Using an extra configure option when ! DOLFS
>would be a good idea.


Ok. Patch attached.
This commit is contained in:
Eric Andersen
2003-08-06 09:07:37 +00:00
parent 0a57a79e38
commit d3652bf334
2 changed files with 96 additions and 10 deletions

View File

@ -74,6 +74,16 @@ config CONFIG_FDISK
can be used to list and edit the set of partitions or BSD style can be used to list and edit the set of partitions or BSD style
'disk slices' that are defined on a hard drive. 'disk slices' that are defined on a hard drive.
if !CONFIG_LFS
config FDISK_SUPPORT_LARGE_DISKS
bool " support over 4Gb disks"
default y
depends on CONFIG_FDISK
help
Previous set detected unsupport large file, but you can support
large disks after enable this option
endif
config CONFIG_FEATURE_FDISK_WRITABLE config CONFIG_FEATURE_FDISK_WRITABLE
bool " Write support" bool " Write support"
default y default y

View File

@ -88,12 +88,14 @@
#define cround(n) (display_in_cyl_units ? ((n)/units_per_sector)+1 : (n)) #define cround(n) (display_in_cyl_units ? ((n)/units_per_sector)+1 : (n))
#define scround(x) (((x)+units_per_sector-1)/units_per_sector) #define scround(x) (((x)+units_per_sector-1)/units_per_sector)
#if defined(__GNUC__) || defined(HAS_LONG_LONG)
typedef long long ext2_loff_t; #if defined(CONFIG_LFS) || defined(FDISK_SUPPORT_LARGE_DISKS) || defined(__alpha__) || defined(__ia64__) || defined(__s390x__)
typedef long long fdisk_loff_t;
#else #else
typedef long ext2_loff_t; typedef long fdisk_loff_t;
#endif #endif
/* including <linux/hdreg.h> also fails */ /* including <linux/hdreg.h> also fails */
struct hd_geometry { struct hd_geometry {
unsigned char heads; unsigned char heads;
@ -840,6 +842,80 @@ typedef struct {
#define SUN_SSWAP32(x) (sun_other_endian ? __swap32(x) \ #define SUN_SSWAP32(x) (sun_other_endian ? __swap32(x) \
: (uint32_t)(x)) : (uint32_t)(x))
#if defined(FDISK_SUPPORT_LARGE_DISKS)
/*
* llseek.c -- stub calling the llseek system call
*
* Copyright (C) 1994 Remy Card. This file may be redistributed
* under the terms of the GNU Public License.
*/
#include <syscall.h>
#if defined(__alpha__) || defined(__ia64__) || defined(__s390x__)
#define my_llseek lseek
#else
static int _llseek (unsigned int, unsigned long,
unsigned long, fdisk_loff_t *, unsigned int);
static _syscall5(int,_llseek,unsigned int,f_d,unsigned long,offset_high,
unsigned long, offset_low,fdisk_loff_t *,result,
unsigned int, origin)
static fdisk_loff_t my_llseek (unsigned int f_d, fdisk_loff_t offset,
unsigned int origin)
{
fdisk_loff_t result;
int retval;
retval = _llseek (f_d, ((unsigned long long) offset) >> 32,
((unsigned long long) offset) & 0xffffffff,
&result, origin);
return (retval == -1 ? (fdisk_loff_t) retval : result);
}
#endif /* __alpha__ */
static fdisk_loff_t fdisk_llseek (unsigned int f_d, fdisk_loff_t offset,
unsigned int origin)
{
fdisk_loff_t result;
static int do_compat = 0;
if (!do_compat) {
result = my_llseek (f_d, offset, origin);
if (!(result == -1 && errno == ENOSYS))
return result;
/*
* Just in case this code runs on top of an old kernel
* which does not support the llseek system call
*/
do_compat = 1;
/*
* Now try ordinary lseek.
*/
}
if ((sizeof(off_t) >= sizeof(fdisk_loff_t)) ||
(offset < ((fdisk_loff_t) 1 << ((sizeof(off_t)*8) -1))))
return lseek(f_d, (off_t) offset, origin);
errno = EINVAL;
return -1;
}
#else
# define fdisk_llseek lseek
#endif /* FDISK_SUPPORT_LARGE_DISKS */
#ifdef CONFIG_FEATURE_OSF_LABEL #ifdef CONFIG_FEATURE_OSF_LABEL
/* /*
Changes: Changes:
@ -1365,7 +1441,7 @@ xbsd_write_bootstrap (void)
sector = get_start_sect(xbsd_part); sector = get_start_sect(xbsd_part);
#endif #endif
if (lseek (fd, (ext2_loff_t) sector * SECTOR_SIZE, SEEK_SET) == -1) if (fdisk_llseek (fd, (fdisk_loff_t) sector * SECTOR_SIZE, SEEK_SET) == -1)
fdisk_fatal (unable_to_seek); fdisk_fatal (unable_to_seek);
if (BSD_BBSIZE != write (fd, disklabelbuffer, BSD_BBSIZE)) if (BSD_BBSIZE != write (fd, disklabelbuffer, BSD_BBSIZE))
fdisk_fatal (unable_to_write); fdisk_fatal (unable_to_write);
@ -1533,7 +1609,7 @@ xbsd_readlabel (struct partition *p, struct xbsd_disklabel *d)
sector = 0; sector = 0;
#endif #endif
if (lseek (fd, (ext2_loff_t) sector * SECTOR_SIZE, SEEK_SET) == -1) if (fdisk_llseek (fd, (fdisk_loff_t) sector * SECTOR_SIZE, SEEK_SET) == -1)
fdisk_fatal (unable_to_seek); fdisk_fatal (unable_to_seek);
if (BSD_BBSIZE != read (fd, disklabelbuffer, BSD_BBSIZE)) if (BSD_BBSIZE != read (fd, disklabelbuffer, BSD_BBSIZE))
fdisk_fatal (unable_to_read); fdisk_fatal (unable_to_read);
@ -1579,12 +1655,12 @@ xbsd_writelabel (struct partition *p, struct xbsd_disklabel *d)
#if defined (__alpha__) && BSD_LABELSECTOR == 0 #if defined (__alpha__) && BSD_LABELSECTOR == 0
alpha_bootblock_checksum (disklabelbuffer); alpha_bootblock_checksum (disklabelbuffer);
if (lseek (fd, (ext2_loff_t) 0, SEEK_SET) == -1) if (fdisk_llseek (fd, (fdisk_loff_t) 0, SEEK_SET) == -1)
fdisk_fatal (unable_to_seek); fdisk_fatal (unable_to_seek);
if (BSD_BBSIZE != write (fd, disklabelbuffer, BSD_BBSIZE)) if (BSD_BBSIZE != write (fd, disklabelbuffer, BSD_BBSIZE))
fdisk_fatal (unable_to_write); fdisk_fatal (unable_to_write);
#else #else
if (lseek (fd, (ext2_loff_t) sector * SECTOR_SIZE + BSD_LABELOFFSET, if (fdisk_llseek (fd, (fdisk_loff_t) sector * SECTOR_SIZE + BSD_LABELOFFSET,
SEEK_SET) == -1) SEEK_SET) == -1)
fdisk_fatal (unable_to_seek); fdisk_fatal (unable_to_seek);
if (sizeof (struct xbsd_disklabel) != write (fd, d, sizeof (struct xbsd_disklabel))) if (sizeof (struct xbsd_disklabel) != write (fd, d, sizeof (struct xbsd_disklabel)))
@ -2007,7 +2083,7 @@ sgi_write_table(void) {
*/ */
sgiinfo *info = fill_sgiinfo(); sgiinfo *info = fill_sgiinfo();
int infostartblock = SGI_SSWAP32(sgilabel->directory[0].vol_file_start); int infostartblock = SGI_SSWAP32(sgilabel->directory[0].vol_file_start);
if (lseek(fd, (long long)infostartblock* if (fdisk_llseek(fd, (long long)infostartblock*
SECTOR_SIZE, SEEK_SET) < 0) SECTOR_SIZE, SEEK_SET) < 0)
fdisk_fatal(unable_to_seek); fdisk_fatal(unable_to_seek);
if (write(fd, info, SECTOR_SIZE) != SECTOR_SIZE) if (write(fd, info, SECTOR_SIZE) != SECTOR_SIZE)
@ -3390,8 +3466,8 @@ static void fdisk_fatal(enum failure why) {
static void static void
seek_sector(uint secno) { seek_sector(uint secno) {
ext2_loff_t offset = (ext2_loff_t) secno * sector_size; fdisk_loff_t offset = (fdisk_loff_t) secno * sector_size;
if (lseek(fd, offset, SEEK_SET) == (ext2_loff_t) -1) if (fdisk_llseek(fd, offset, SEEK_SET) == (fdisk_loff_t) -1)
fdisk_fatal(unable_to_seek); fdisk_fatal(unable_to_seek);
} }