2 * Copyright (c) 1980, 1986 The Regents of the University of California.
5 * Redistribution and use in source and binary forms are permitted
6 * provided that the above copyright notice and this paragraph are
7 * duplicated in all such forms and that any documentation,
8 * advertising materials, and other materials related to such
9 * distribution and use acknowledge that the software was developed
10 * by the University of California, Berkeley. The name of the
11 * University may not be used to endorse or promote products derived
12 * from this software without specific prior written permission.
13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18 #include <afsconfig.h>
19 #include <afs/param.h>
22 /* We need the old directory type headers (included below), so don't include
23 * the normal dirent.h, or it will conflict. */
25 # include <sys/inode.h>
26 # define LONGFILENAMES 1
27 # include <sys/sysmacros.h>
29 # include <sys/signal.h>
31 # ifdef HAVE_USR_OLD_USR_INCLUDE_NDIR_H
32 # include </usr/old/usr/include/ndir.h>
42 #define VICE /* allow us to put our changes in at will */
44 #include <sys/vnode.h>
45 #include <sys/mount.h>
46 #include <ufs/inode.h>
54 #else /* AFS_OSF_ENV */
55 #ifdef AFS_VFSINCL_ENV
56 #include <sys/vnode.h>
58 #include <sys/fs/ufs_inode.h>
59 #include <sys/fs/ufs_fs.h>
61 #include <sys/fs/ufs_fsdir.h>
63 #include <sys/fs/ufs_mount.h>
65 #include <ufs/inode.h>
67 #include <ufs/fsdir.h>
69 #else /* AFS_VFSINCL_ENV */
70 #include <sys/inode.h>
75 #endif /* AFS_VFSINCL_ENV */
76 #endif /* AFS_OSF_ENV */
80 #if defined(AFS_SUN_ENV) || defined(AFS_OSF_ENV)
86 long diskreads, totalreads; /* Disk cache statistics */
87 #if !defined(AFS_HPUX101_ENV)
90 #if defined(AFS_SUN_ENV)
97 #include <sys/mntent.h>
98 #include <sys/mnttab.h>
100 #include <sys/vfstab.h>
108 switch (dp->di_mode & IFMT) {
130 printf("bad file type 0%o\n", dp->di_mode);
145 pfatal("INTERNAL ERROR: GOT TO reply()");
146 persevere = !strcmp(question, "CONTINUE");
148 if (!persevere && (nflag || fswritefd < 0)) {
149 printf("%s? no\n\n", question);
150 #if defined(AFS_SUN_ENV)
151 iscorrupt = 1; /* known to be corrupt */
155 if (yflag || (persevere && nflag)) {
156 printf("%s? yes\n\n", question);
160 printf("%s? [yn] ", question);
161 (void)fflush(stdout);
163 while (c != '\n' && getc(stdin) != '\n')
166 } while (c != 'y' && c != 'Y' && c != 'n' && c != 'N');
168 if (c == 'y' || c == 'Y')
173 #if defined(AFS_SUN_ENV)
174 iscorrupt = 1; /* known to be corrupt */
180 * Malloc buffers and set up cache.
188 bufp = malloc((unsigned int)sblock.fs_bsize);
190 errexit("cannot allocate buffer pool\n");
191 cgblk.b_un.b_buf = bufp;
193 bufhead.b_next = bufhead.b_prev = &bufhead;
194 bufcnt = MAXBUFSPACE / sblock.fs_bsize;
195 if (bufcnt < MINBUFS)
197 for (i = 0; i < bufcnt; i++) {
198 bp = (struct bufarea *)malloc(sizeof(struct bufarea));
199 bufp = malloc((unsigned int)sblock.fs_bsize);
200 if (bp == NULL || bufp == NULL) {
203 errexit("cannot allocate buffer pool\n");
205 bp->b_un.b_buf = bufp;
206 bp->b_prev = &bufhead;
207 bp->b_next = bufhead.b_next;
208 bufhead.b_next->b_prev = bp;
212 bufhead.b_size = i; /* save number of buffers */
219 * Manage a cache of directory blocks.
222 getdatablk(blkno, size)
228 for (bp = bufhead.b_next; bp != &bufhead; bp = bp->b_next)
229 if (bp->b_bno == fsbtodb(&sblock, blkno))
231 for (bp = bufhead.b_prev; bp != &bufhead; bp = bp->b_prev)
232 if ((bp->b_flags & B_INUSE) == 0)
235 errexit("deadlocked buffer pool\n");
236 getblk(bp, blkno, size);
240 bp->b_prev->b_next = bp->b_next;
241 bp->b_next->b_prev = bp->b_prev;
242 bp->b_prev = &bufhead;
243 bp->b_next = bufhead.b_next;
244 bufhead.b_next->b_prev = bp;
246 bp->b_flags |= B_INUSE;
251 getblk(bp, blk, size)
258 dblk = fsbtodb(&sblock, blk);
259 if (bp->b_bno == dblk)
261 flush(fswritefd, bp);
263 bp->b_errs = bread(fsreadfd, bp->b_un.b_buf, dblk, size);
279 if (bp->b_errs != 0) {
280 pfatal("WRITING %sZERO'ED BLOCK %d TO DISK\n",
281 (bp->b_errs == bp->b_size / dev_bsize) ? "" : "PARTIALLY ",
286 bwrite(fd, bp->b_un.b_buf, bp->b_bno, (long)bp->b_size);
289 #if defined(AFS_HPUX101_ENV)
290 #if defined(AFS_HPUX110_ENV)
291 /* jpm: Need a fix here */
293 #else /* AFS_HPUX110_ENV */
295 (fswritefd, (char *)sblock.fs_csp[0],
296 fsbtodb(&sblock, sblock.fs_csaddr), fragroundup(&sblock,
297 sblock.fs_cssize)) ==
299 #endif /* else AFS_HPUX110_ENV */
302 ("\nUnable to write to cylinder group summary area (fs_csaddr)\n");
303 printf("\tDisk write error at block %u\n",
304 fsbtodb(&sblock, sblock.fs_csaddr));
307 #if defined(AFS_SUN5_ENV)
308 sip = (caddr_t) sblock.fs_u.fs_csp;
309 for (i = 0, j = 0; i < sblock.fs_cssize; i += sblock.fs_bsize, j++) {
311 sblock.fs_cssize - i <
312 sblock.fs_bsize ? sblock.fs_cssize - i : sblock.fs_bsize;
313 bwrite(fswritefd, sip,
314 fsbtodb(&sblock, sblock.fs_csaddr + j * sblock.fs_frag), size);
318 for (i = 0, j = 0; i < sblock.fs_cssize; i += sblock.fs_bsize, j++) {
319 bwrite(fswritefd, (char *)sblock.fs_csp[j],
320 fsbtodb(&sblock, sblock.fs_csaddr + j * sblock.fs_frag),
321 sblock.fs_cssize - i <
322 sblock.fs_bsize ? sblock.fs_cssize - i : sblock.fs_bsize);
324 #endif /* AFS_SUN5_ENV */
325 #endif /* AFS_HPUX101_ENV */
335 pfatal("CANNOT %s: BLK %ld", mesg, blk);
336 if (reply("CONTINUE") == 0)
337 errexit("Program terminated\n");
342 struct bufarea *bp, *nbp;
345 flush(fswritefd, &sblk);
347 if (havesb && sblk.b_bno != SBOFF / dev_bsize && !preen
348 && reply("UPDATE STANDARD SUPERBLOCK")) {
349 sblk.b_bno = SBOFF / dev_bsize;
350 #else /* AFS_NEWCG_ENV */
351 if (havesb && sblk.b_bno != SBLOCK && !preen
352 && reply("UPDATE STANDARD SUPERBLOCK")) {
354 #endif /* AFS_NEWCG_ENV */
356 flush(fswritefd, &sblk);
358 flush(fswritefd, &cgblk);
359 if (cgblk.b_un.b_buf) {
360 free(cgblk.b_un.b_buf);
361 cgblk.b_un.b_buf = NULL;
363 for (bp = bufhead.b_prev; bp != &bufhead; bp = nbp) {
365 flush(fswritefd, bp);
367 free(bp->b_un.b_buf);
373 if (bufhead.b_size != cnt)
374 errexit("Panic: lost %d buffers\n", bufhead.b_size - cnt);
376 printf("cache missed %d of %d (%d%%)\n", diskreads, totalreads,
377 diskreads * 100 / totalreads);
378 (void)close(fsreadfd);
379 (void)close(fswritefd);
382 #if !defined(AFS_HPUX101_ENV)
383 bread(fd, buf, blk, size)
396 offset_t offset = (offset_t) blk << DEV_BSHIFT;
401 /* To fix a stripping related bug?? */
402 if (lseek(fd, blk * dev_bsize, 0) == -1)
405 if (llseek(fd, offset, 0) < 0)
407 if (lseek(fd, blk * dev_bsize, 0) < 0)
410 rwerror("SEEK", blk);
411 else if (read(fd, buf, (int)size) == size)
413 rwerror("READ", blk);
415 /* To fix a stripping related bug?? */
416 if (lseek(fd, blk * dev_bsize, 0) == -1)
419 if (llseek(fd, offset, 0) < 0)
421 if (lseek(fd, blk * dev_bsize, 0) < 0)
424 rwerror("SEEK", blk);
426 memset(buf, 0, (int)size);
427 printf("THE FOLLOWING DISK SECTORS COULD NOT BE READ:");
429 for (cp = buf, i = 0; i < btodb(size); i++, cp += DEV_BSIZE) {
430 addr = (offset_t) (blk + i) << DEV_BSHIFT;
431 if (llseek(fd, addr, SEEK_CUR) < 0 || read(fd, cp, (int)secsize) < 0) {
432 printf(" %d", blk + i);
434 for (cp = buf, i = 0; i < size; i += secsize, cp += secsize) {
435 if (read(fd, cp, (int)secsize) < 0) {
436 lseek(fd, blk * dev_bsize + i + secsize, 0);
437 if (secsize != dev_bsize && dev_bsize != 1)
438 printf(" %d (%d),", (blk * dev_bsize + i) / secsize,
439 blk + i / dev_bsize);
441 printf(" %d,", blk + i / dev_bsize);
450 bwrite(fd, buf, blk, size)
463 offset_t offset = (offset_t) blk << DEV_BSHIFT;
468 sprintf(msg, "WARNING: Attempt to write illegal blkno %d on %s\n",
479 /* To fix a stripping related bug?? */
480 if (lseek(fd, blk * dev_bsize, 0) == -1)
483 if (llseek(fd, offset, 0) < 0)
485 if (lseek(fd, blk * dev_bsize, 0) < 0)
488 rwerror("SEEK", blk);
489 else if (write(fd, buf, (int)size) == size) {
493 rwerror("WRITE", blk);
495 /* To fix a stripping related bug?? */
496 if (lseek(fd, blk * dev_bsize, 0) == -1)
499 if (llseek(fd, offset, 0) < 0)
501 if (lseek(fd, blk * dev_bsize, 0) < 0)
504 rwerror("SEEK", blk);
505 printf("THE FOLLOWING SECTORS COULD NOT BE WRITTEN:");
507 for (cp = buf, i = 0; i < btodb(size); i++, cp += DEV_BSIZE) {
509 addr = (offset_t) (blk + i) << DEV_BSHIFT;
510 if (llseek(fd, addr, SEEK_CUR) < 0
511 || (n = write(fd, cp, DEV_BSIZE)) < 0) {
512 printf(" %d", blk + i);
519 for (cp = buf, i = 0; i < size; i += dev_bsize, cp += dev_bsize)
520 if (write(fd, cp, (int)dev_bsize) < 0) {
521 lseek(fd, blk * dev_bsize + i + dev_bsize, 0);
522 printf(" %d,", blk + i / dev_bsize);
528 #endif /* AFS_HPUX101_ENV */
530 * allocate a data block with the specified number of fragments
537 if (frags <= 0 || frags > sblock.fs_frag)
539 for (i = 0; i < maxfsblock - sblock.fs_frag; i += sblock.fs_frag) {
540 for (j = 0; j <= sblock.fs_frag - frags; j++) {
543 for (k = 1; k < frags; k++)
544 if (testbmap(i + j + k))
550 for (k = 0; k < frags; k++)
560 * Free a previously allocated block
562 freeblk(blkno, frags)
566 struct inodesc idesc;
568 idesc.id_blkno = blkno;
569 idesc.id_numfrags = frags;
576 getpathname(namebuf, curdir, ino)
582 struct inodesc idesc;
583 extern int findname();
585 if (statemap[ino] != DSTATE && statemap[ino] != DFOUND) {
586 strcpy(namebuf, "?");
589 memset(&idesc, 0, sizeof(struct inodesc));
590 idesc.id_type = DATA;
591 cp = &namebuf[BUFSIZ - 1];
594 idesc.id_parent = curdir;
597 while (ino != ROOTINO) {
598 idesc.id_number = ino;
599 idesc.id_func = findino;
600 idesc.id_name = "..";
602 idesc.id_fix = NOFIX;
604 if ((ckinode(ginode(ino), &idesc) & FOUND) == 0)
607 idesc.id_number = idesc.id_parent;
608 idesc.id_parent = ino;
609 idesc.id_func = findname;
610 idesc.id_name = namebuf;
612 idesc.id_fix = NOFIX;
614 if ((ckinode(ginode(idesc.id_number), &idesc) & FOUND) == 0)
616 len = strlen(namebuf);
618 if (cp < &namebuf[MAXNAMLEN])
620 memcpy(cp, namebuf, len);
622 ino = idesc.id_number;
624 if (ino != ROOTINO) {
625 strcpy(namebuf, "?");
628 memcpy(namebuf, cp, &namebuf[BUFSIZ] - cp);
643 * When preening, allow a single quit to signal
644 * a special exit after filesystem checks complete
645 * so that reboot sequence may be interrupted.
650 extern returntosingle;
652 printf("returning to single-user after filesystem check\n");
654 (void)signal(SIGQUIT, SIG_DFL);
658 * Ignore a single quit signal; wait and flush just in case.
659 * Used by child processes in preen.
666 (void)signal(SIGQUIT, SIG_IGN);
667 (void)signal(SIGQUIT, SIG_DFL);
671 * determine whether an inode should be fixed.
674 struct inodesc *idesc;
678 switch (idesc->id_fix) {
681 if (idesc->id_type == DATA)
682 direrror(idesc->id_number, msg);
686 printf(" (SALVAGED)\n");
690 if (reply("SALVAGE") == 0) {
691 idesc->id_fix = NOFIX;
704 errexit("UNKNOWN INODESC FIX MODE %d\n", idesc->id_fix);
710 errexit(s1, s2, s3, s4)
714 printf(s1, s2, s3, s4);
723 * An unexpected inconsistency occured.
724 * Die if preening, otherwise just print message and continue.
727 pfatal(s, a1, a2, a3)
732 printf("%s: ", devname);
733 printf(s, a1, a2, a3);
735 printf("%s: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.\n", devname);
742 printf(s, a1, a2, a3);
746 * Pwarn just prints a message when not preening,
747 * or a warning (preceded by filename) when preening.
750 pwarn(s, a1, a2, a3, a4, a5, a6)
752 long a1, a2, a3, a4, a5, a6;
755 printf("%s: ", devname);
756 printf(s, a1, a2, a3, a4, a5, a6);
760 * Pwarn just prints a message when not preening,
761 * or a warning (preceded by filename) when preening.
764 pinfo(s, a1, a2, a3, a4, a5, a6)
766 long a1, a2, a3, a4, a5, a6;
769 printf("%s: ", devname);
770 printf(s, a1, a2, a3, a4, a5, a6);
775 * Stub for routines from kernel.
781 pfatal("INTERNAL INCONSISTENCY:");
786 #if defined(AFS_SUN_ENV) && !defined(AFS_SUN3_ENV)
793 if ((iscorrupt == 0) && (isdirty == 0))
795 if ((sblock.fs_clean != FSSTABLE) && (sblock.fs_clean != FSCLEAN))
798 if (FSOKAY != (sblock.fs_state + sblock.fs_time))
800 if (FSOKAY != (fs_get_state(&sblock) + sblock.fs_time))
804 sprintf(s, "WARNING: inconsistencies detected on `%s' filesystem %s",
805 sblock.fs_clean == FSSTABLE ? "stable" : "clean", devname);
811 struct bufarea cleanbuf;
814 unsigned int fsclean;
815 #if defined(AFS_SUN5_ENV)
820 /* set fsclean to its appropriate value */
821 fsclean = sblock.fs_clean;
823 if (FSOKAY != (sblock.fs_state + sblock.fs_time))
825 if (FSOKAY != (fs_get_state(&sblock) + sblock.fs_time))
829 /* if necessary, update fs_clean and fs_state */
846 /* if fs_clean and fs_state are ok, do nothing */
847 if ((sblock.fs_clean == fsclean) &&
849 (FSOKAY == (sblock.fs_state + sblock.fs_time)))
851 (FSOKAY == (fs_get_state(&sblock) + sblock.fs_time)))
854 sblock.fs_clean = fsclean;
856 sblock.fs_state = sblock.fs_time;
858 fs_set_state(&sblock, sblock.fs_time);
860 /* if superblock can't be written, return */
863 /* read private copy of superblock, update clean flag, and write it */
866 #if defined(AFS_SUN5_ENV)
867 sblkoff = (OFF_T) (bno) << DEV_BSHIFT;
868 if (llseek(fsreadfd, sblkoff, 0) == -1)
871 if (lseek(fsreadfd, (off_t) dbtob(bno), 0) == -1)
874 if ((cleanbuf.b_un.b_buf = malloc(size)) == NULL)
875 errexit("out of memory");
876 if (read(fsreadfd, cleanbuf.b_un.b_buf, (int)size) != size)
878 cleanbuf.b_un.b_fs->fs_clean = sblock.fs_clean;
880 cleanbuf.b_un.b_fs->fs_state = sblock.fs_state;
882 fs_set_state(cleanbuf.b_un.b_fs, fs_get_state(&sblock));
884 cleanbuf.b_un.b_fs->fs_time = sblock.fs_time;
885 #if defined(AFS_SUN5_ENV)
886 if (llseek(fswritefd, sblkoff, 0) == -1)
889 if (lseek(fswritefd, (off_t) dbtob(bno), 0) == -1)
892 if (write(fswritefd, cleanbuf.b_un.b_buf, (int)size) != size)
901 if (FSOKAY != (sblock.fs_state + sblock.fs_time))
903 if (FSOKAY != (fs_get_state(&sblock) + sblock.fs_time))
908 switch (sblock.fs_clean) {
922 pwarn("is %s.\n", s);
924 printf("** %s is %s.\n", devname, s);
935 static char *tmpopts;
937 if (vfs->vfs_mntopts == NULL)
940 tmpopts = (char *)calloc(256, sizeof(char));
944 strncpy(tmpopts, vfs->vfs_mntopts, (sizeof(tmpopts) - 1));
947 for (; *f; f = mntopt(&opts)) {
948 if (strncmp(opt, f, strlen(opt)) == 0)
949 return (f - tmpopts + vfs->vfs_mntopts);
959 struct vfstab vfsbuf;
961 char *blkname, *unrawname();
963 vfstab = fopen(VFSTAB, "r");
964 if (vfstab == NULL) {
965 printf("can't open %s\n", VFSTAB);
968 blkname = unrawname(name);
969 if ((getvfsspec(vfstab, &vfsbuf, blkname) == 0)
970 && (vfsbuf.vfs_fstype != NULL)
971 && (strcmp(vfsbuf.vfs_fstype, MNTTYPE_UFS) == 0)
972 && (hasvfsopt(&vfsbuf, MNTOPT_RO))) {
985 struct stat device_stat, mount_stat;
986 char *blkname, *unrawname();
988 mnttab = fopen(MNTTAB, "r");
989 if (mnttab == NULL) {
990 printf("can't open %s\n", MNTTAB);
993 blkname = unrawname(name);
994 while ((getmntent(mnttab, &mnt)) == NULL) {
995 if (strcmp(mnt.mnt_fstype, MNTTYPE_UFS) != 0) {
998 if (strcmp(blkname, mnt.mnt_special) == 0) {
999 stat(mnt.mnt_mountp, &mount_stat);
1000 stat(mnt.mnt_special, &device_stat);
1001 if (device_stat.st_rdev == mount_stat.st_dev) {
1002 if (hasmntopt(&mnt, MNTOPT_RO) != 0)
1003 found = 2; /* mounted as RO */
1005 found = 1; /* mounted as R/W */
1016 #if defined(AFS_HPUX101_ENV)
1019 #include <sys/stat.h>
1020 #include <sys/fcntl.h>
1024 bread(fd, buf, blk, size)
1033 switch (seek_options) {
1034 case BLKSEEK_ENABLED:
1038 case BLKSEEK_NOT_ENABLED: /* File */
1039 #if defined(AFS_HPUX102_ENV)
1040 lseek_offset = dbtoo(blk);
1042 lseek_offset = dbtob(blk);
1047 rwerror("BLKSEEK", blk);
1049 if (lseek(fd, (off_t) lseek_offset, 0) == (off_t) - 1)
1050 rwerror("SEEK", blk);
1051 else if (read(fd, buf, (int)size) == size)
1053 rwerror("READ", blk);
1057 bwrite(fd, buf, blk, size)
1068 switch (seek_options) {
1069 case BLKSEEK_ENABLED:
1073 case BLKSEEK_NOT_ENABLED: /* File */
1074 #if defined(AFS_HPUX102_ENV)
1075 lseek_offset = dbtoo(blk);
1077 lseek_offset = dbtob(blk);
1082 rwerror("BLKSEEK", blk);
1084 if (lseek(fd, (off_t) lseek_offset, 0) == (off_t) - 1)
1085 rwerror("SEEK", blk);
1086 else if (write(fd, buf, (int)size) == size) {
1090 rwerror("WRITE", blk);
1095 setup_block_seek(fd)
1096 int fd; /* File descriptor */
1098 int flags = 0; /* Flags to/from fcntl() */
1100 return setup_block_seek_2(fd, &flags);
1103 #define set_fserror printf
1106 setup_block_seek_2(fd, cntl_flags)
1107 int fd; /* Input. File descriptor */
1108 int *cntl_flags; /* Returned. Flags from fcntl() */
1110 int flags = 0; /* Flags to/from fcntl() */
1111 off_t lstatus; /* Status from lseek() */
1112 struct stat statarea;
1113 char dummy[MAXBSIZE];
1119 if ((flags = fcntl(fd, F_GETFL)) == -1) {
1120 set_fserror("Cannot get file control flags.");
1121 return (BLKSEEK_PROCESSING_ERROR);
1125 * Check if fd is a non-device file
1128 if (fstat(fd, &statarea) == -1) {
1129 set_fserror("Cannot get status information on file descriptor.");
1130 return (BLKSEEK_PROCESSING_ERROR);
1132 if (((statarea.st_mode & S_IFMT) != S_IFCHR)
1133 && ((statarea.st_mode & S_IFMT) != S_IFBLK)) {
1134 /* Not a device file -- BLKSEEK only works on device files */
1135 *cntl_flags = flags; /* O_BLKSEEK bit never set */
1136 return (BLKSEEK_NOT_ENABLED);
1140 * Set the fd to O_BLKSEEK
1142 if (fcntl(fd, F_SETFL, flags | O_BLKSEEK) == -1) {
1143 set_fserror("Cannot set file control flags.");
1144 return (BLKSEEK_PROCESSING_ERROR);
1146 if (flags & O_WRONLY) {
1147 /* Set lseek to location 0 before returning */
1148 if (lseek(fd, (off_t) 0, SEEK_SET) == (off_t) - 1) {
1149 set_fserror("Cannot lseek the device.");
1150 return (BLKSEEK_PROCESSING_ERROR);
1154 ("File is write only. Cannot Verify O_BLKSEEK mode set.");
1155 *cntl_flags = flags | O_BLKSEEK;
1156 return (BLKSEEK_FILE_WRITEONLY);
1160 * Verify that kernel knows how to do O_BLKSEEK
1162 if (lseek(fd, (off_t) 0, SEEK_SET) == (off_t) - 1) {
1163 set_fserror("Cannot lseek the device.");
1164 return (BLKSEEK_PROCESSING_ERROR);
1166 if (read(fd, &dummy[0], BBSIZE) != BBSIZE) { /* BBSIZE = 8192 */
1167 set_fserror("Cannot read from the device");
1168 return (BLKSEEK_PROCESSING_ERROR);
1171 if ((lstatus = lseek(fd, (off_t) 0, SEEK_CUR)) == (off_t) - 1) {
1172 set_fserror("Cannot lseek the device.");
1173 return (BLKSEEK_PROCESSING_ERROR);
1177 * Set lseek to location 0
1179 if (lseek(fd, (off_t) 0, SEEK_SET) == (off_t) - 1) {
1180 set_fserror("Cannot lseek the device.");
1181 return (BLKSEEK_PROCESSING_ERROR);
1184 if (lstatus == (off_t) (BBSIZE / DEV_BSIZE)) {
1185 *cntl_flags = flags | O_BLKSEEK;
1186 return (BLKSEEK_ENABLED); /* Successfully enabled O_BLKSEEK */
1188 *cntl_flags = flags & (~O_BLKSEEK); /* Turn off O_BLKSEEK bit */
1189 return (BLKSEEK_NOT_ENABLED); /* O_BLKSEEK not enabled */
1192 setup_all_block_seek()
1195 seek_options = setup_block_seek(fsreadfd);
1196 switch (seek_options) {
1197 case BLKSEEK_ENABLED:
1198 case BLKSEEK_NOT_ENABLED:
1201 errexit("setup_block_seek on fsreadfd");
1204 if (fswritefd == -1)
1206 switch (opt = setup_block_seek(fswritefd)) {
1207 case BLKSEEK_FILE_WRITEONLY: /* WO block or char device. */
1208 case BLKSEEK_NOT_ENABLED: /* regular file. */
1209 if (seek_options != opt)
1211 ("seek_options on fsreadfd (%d) and fswritefd (%d) do not match",
1215 errexit("setup_block_seek on fswritefd");
1220 printf("read option = %d write option = %d\n", seek_options, opt);
1225 #endif /* AFS_HPUX101_ENV */