Fsck_ufs was using an int rather than a ufs2_daddr_t to store the
alternate superblock location when given in the -b option. When int is 32-bits, block numbers larger than 2^32 would get truncated. This commit changes the storage fpr the alternate superblock location to a ufs2_daddr_t. Submitted by: Dmitry Sivachenko <trtrmitya@gmail.com>
This commit is contained in:
parent
11f2a7cd67
commit
6a5972db72
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=304438
@ -305,7 +305,7 @@ extern u_int real_dev_bsize; /* actual disk sector size, not overridden */
|
|||||||
extern char nflag; /* assume a no response */
|
extern char nflag; /* assume a no response */
|
||||||
extern char yflag; /* assume a yes response */
|
extern char yflag; /* assume a yes response */
|
||||||
extern int bkgrdflag; /* use a snapshot to run on an active system */
|
extern int bkgrdflag; /* use a snapshot to run on an active system */
|
||||||
extern int bflag; /* location of alternate super block */
|
extern ufs2_daddr_t bflag; /* location of alternate super block */
|
||||||
extern int debug; /* output debugging info */
|
extern int debug; /* output debugging info */
|
||||||
extern int Eflag; /* delete empty data blocks */
|
extern int Eflag; /* delete empty data blocks */
|
||||||
extern int Zflag; /* zero empty data blocks */
|
extern int Zflag; /* zero empty data blocks */
|
||||||
|
@ -77,7 +77,7 @@ u_int real_dev_bsize; /* actual disk sector size, not overridden */
|
|||||||
char nflag; /* assume a no response */
|
char nflag; /* assume a no response */
|
||||||
char yflag; /* assume a yes response */
|
char yflag; /* assume a yes response */
|
||||||
int bkgrdflag; /* use a snapshot to run on an active system */
|
int bkgrdflag; /* use a snapshot to run on an active system */
|
||||||
int bflag; /* location of alternate super block */
|
ufs2_daddr_t bflag; /* location of alternate super block */
|
||||||
int debug; /* output debugging info */
|
int debug; /* output debugging info */
|
||||||
int Eflag; /* delete empty data blocks */
|
int Eflag; /* delete empty data blocks */
|
||||||
int Zflag; /* zero empty data blocks */
|
int Zflag; /* zero empty data blocks */
|
||||||
|
@ -57,6 +57,7 @@ __FBSDID("$FreeBSD$");
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fstab.h>
|
#include <fstab.h>
|
||||||
#include <grp.h>
|
#include <grp.h>
|
||||||
|
#include <inttypes.h>
|
||||||
#include <mntopts.h>
|
#include <mntopts.h>
|
||||||
#include <paths.h>
|
#include <paths.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
@ -68,7 +69,7 @@ __FBSDID("$FreeBSD$");
|
|||||||
int restarts;
|
int restarts;
|
||||||
|
|
||||||
static void usage(void) __dead2;
|
static void usage(void) __dead2;
|
||||||
static int argtoi(int flag, const char *req, const char *str, int base);
|
static intmax_t argtoimax(int flag, const char *req, const char *str, int base);
|
||||||
static int checkfilesys(char *filesys);
|
static int checkfilesys(char *filesys);
|
||||||
static int chkdoreload(struct statfs *mntp);
|
static int chkdoreload(struct statfs *mntp);
|
||||||
static struct statfs *getmntpt(const char *);
|
static struct statfs *getmntpt(const char *);
|
||||||
@ -88,8 +89,8 @@ main(int argc, char *argv[])
|
|||||||
switch (ch) {
|
switch (ch) {
|
||||||
case 'b':
|
case 'b':
|
||||||
skipclean = 0;
|
skipclean = 0;
|
||||||
bflag = argtoi('b', "number", optarg, 10);
|
bflag = argtoimax('b', "number", optarg, 10);
|
||||||
printf("Alternate super block location: %d\n", bflag);
|
printf("Alternate super block location: %jd\n", bflag);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'B':
|
case 'B':
|
||||||
@ -98,7 +99,8 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
case 'c':
|
case 'c':
|
||||||
skipclean = 0;
|
skipclean = 0;
|
||||||
cvtlevel = argtoi('c', "conversion level", optarg, 10);
|
cvtlevel = argtoimax('c', "conversion level", optarg,
|
||||||
|
10);
|
||||||
if (cvtlevel < 3)
|
if (cvtlevel < 3)
|
||||||
errx(EEXIT, "cannot do level %d conversion",
|
errx(EEXIT, "cannot do level %d conversion",
|
||||||
cvtlevel);
|
cvtlevel);
|
||||||
@ -121,7 +123,7 @@ main(int argc, char *argv[])
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'm':
|
case 'm':
|
||||||
lfmode = argtoi('m', "mode", optarg, 8);
|
lfmode = argtoimax('m', "mode", optarg, 8);
|
||||||
if (lfmode &~ 07777)
|
if (lfmode &~ 07777)
|
||||||
errx(EEXIT, "bad mode to -m: %o", lfmode);
|
errx(EEXIT, "bad mode to -m: %o", lfmode);
|
||||||
printf("** lost+found creation mode %o\n", lfmode);
|
printf("** lost+found creation mode %o\n", lfmode);
|
||||||
@ -203,13 +205,13 @@ main(int argc, char *argv[])
|
|||||||
exit(ret);
|
exit(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static intmax_t
|
||||||
argtoi(int flag, const char *req, const char *str, int base)
|
argtoimax(int flag, const char *req, const char *str, int base)
|
||||||
{
|
{
|
||||||
char *cp;
|
char *cp;
|
||||||
int ret;
|
intmax_t ret;
|
||||||
|
|
||||||
ret = (int)strtol(str, &cp, base);
|
ret = strtoimax(str, &cp, base);
|
||||||
if (cp == str || *cp)
|
if (cp == str || *cp)
|
||||||
errx(EEXIT, "-%c flag requires a %s", flag, req);
|
errx(EEXIT, "-%c flag requires a %s", flag, req);
|
||||||
return (ret);
|
return (ret);
|
||||||
|
@ -196,7 +196,7 @@ setup(char *dev)
|
|||||||
bflag = 0;
|
bflag = 0;
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
pwarn("USING ALTERNATE SUPERBLOCK AT %d\n", bflag);
|
pwarn("USING ALTERNATE SUPERBLOCK AT %jd\n", bflag);
|
||||||
bflag = 0;
|
bflag = 0;
|
||||||
}
|
}
|
||||||
if (skipclean && ckclean && sblock.fs_clean) {
|
if (skipclean && ckclean && sblock.fs_clean) {
|
||||||
@ -329,7 +329,7 @@ readsb(int listerr)
|
|||||||
}
|
}
|
||||||
if (sblock.fs_magic != FS_UFS1_MAGIC &&
|
if (sblock.fs_magic != FS_UFS1_MAGIC &&
|
||||||
sblock.fs_magic != FS_UFS2_MAGIC) {
|
sblock.fs_magic != FS_UFS2_MAGIC) {
|
||||||
fprintf(stderr, "%d is not a file system superblock\n",
|
fprintf(stderr, "%jd is not a file system superblock\n",
|
||||||
bflag);
|
bflag);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user