Hi all,
here's a diff to fsck to accept pass numbers greater than 2 so that one
can avoid slaughtering IO-limited deviced. This is useful for people who
have stacked softraids, all backed by the same disk, as might be found
on a laptop with encrypted home:
/dev/wd0a / ... 1
/dev/wd0d /usr ... 2
/dev/wd0e /var ... 2
# /dev/wd0f is a RAID crypto slice used to create sd0
/dev/sd0a /home ... 3
Obviously, wd0a is checked first, then wd0d and wd0e; serially because
they are on the same device. Only after those two have finished dragging
the heads all over the place proceed to check sd0a. Or:
/dev/wd0a / ... 1
/dev/wd1a /usr ... 2
/dev/wd2a /var ... 2
/dev/wd3a /tmp ... 2
# /dev/sd0a is a raid of wd[0123]d
/dev/sd0a /home ... 3
Again, avoid a truckload of head moves on the component disks while
trying to check the raid volume.
diff -ur ./preen.c /usr/src/sbin/fsck/preen.c
--- ./preen.c Tue Oct 19 11:32:34 2010
+++ /usr/src/sbin/fsck/preen.c Fri Nov 12 19:02:20 2010
@@ -79,7 +79,7 @@
struct fstab *fs;
struct diskentry *d, *nextdisk;
struct partentry *p;
- int ret, retcode, passno, sumstatus, status;
+ int ret, retcode, passno, sumstatus, status, maxp;
void *auxarg;
char *name;
pid_t pid;
@@ -88,8 +88,9 @@
TAILQ_INIT(&diskh);
sumstatus = 0;
+ maxp = 2;
- for (passno = 1; passno <= 2; passno++) {
+ for (passno = 1; passno <= maxp; passno++) {
if (setfsent() == 0) {
warnx("Can't open checklist file: %s", _PATH_FSTAB);
return (8);
@@ -101,6 +102,7 @@
name = blockcheck(fs->fs_spec);
if (flags & CHECK_DEBUG)
printf("pass %d, name %s\n", passno, name);
+ maxp = (fs->fs_passno > maxp) ? fs->fs_passno : maxp;
if ((flags & CHECK_PREEN) == 0 ||
(passno == 1 && fs->fs_passno == 1)) {
@@ -115,15 +117,16 @@
if (sumstatus)
return (sumstatus);
- } else if (passno == 2 && fs->fs_passno > 1) {
+ } else {
if (name == NULL) {
(void) fprintf(stderr,
"BAD DISK NAME %s\n", fs->fs_spec);
sumstatus |= 8;
continue;
}
- addpart(fs->fs_vfstype, name, fs->fs_file,
- auxarg);
+ if (passno == fs->fs_passno)
+ addpart(fs->fs_vfstype, name,
+ fs->fs_file, auxarg);
}
}
if ((flags & CHECK_PREEN) == 0)
--
GDB has a 'break' feature; why doesn't it have 'fix' too?