Commit | Line | Data |
---|---|---|
805e021f CE |
1 | /* |
2 | * Copyright 2000, International Business Machines Corporation and others. | |
3 | * All Rights Reserved. | |
4 | * | |
5 | * This software has been released under the terms of the IBM Public | |
6 | * License. For details, see the LICENSE file in the top-level source | |
7 | * directory or online at http://www.openafs.org/dl/license10.html | |
8 | */ | |
9 | ||
10 | /* | |
11 | This utility is used to increase the ref count on inodes moved to | |
12 | lost+found by the non-AFS fsck. The program needs to be run once | |
13 | for every volume located on the partition that was fsck'ed. | |
14 | Procedure: | |
15 | cc -o fixit fixit.c | |
16 | cd /vicepx | |
17 | chmod 600 * | |
18 | foreach volid ( cat <list-of-vol-ids> ) | |
19 | fixit lost+found $volid | |
20 | echo $volid | |
21 | end | |
22 | umount <dev> | |
23 | /etc/vfsck <dev> <<<< AFS Version! | |
24 | ||
25 | Non-AFS fsck causes inodes to be moved to lost+found, with names like | |
26 | #<inode-no>. The volumes associated with these inodes will still be | |
27 | available, until the #<inode-no> file is removed. This program simply | |
28 | ups the ref count on the #<inode-no> files, so they're not returned | |
29 | to the free list when the files are removed from lost+found | |
30 | */ | |
31 | ||
32 | #include <afsconfig.h> | |
33 | #include <afs/param.h> | |
34 | ||
35 | #include <roken.h> | |
36 | ||
37 | #ifdef AFS_HPUX_ENV | |
38 | #include <sys/mknod.h> | |
39 | #endif | |
40 | ||
41 | #include <afs/afs_args.h> | |
42 | #include <afs/afs.h> | |
43 | #include <afs/afssyscalls.h> | |
44 | ||
45 | #include "AFS_component_version_number.c" | |
46 | ||
47 | main(argc, argv) | |
48 | int argc; | |
49 | char **argv; | |
50 | { | |
51 | DIR *tdir; | |
52 | struct stat ts; | |
53 | afs_int32 dev, code; | |
54 | struct dirent *tde; | |
55 | ||
56 | int volid; | |
57 | ||
58 | if (geteuid() != 0) { | |
59 | printf("must be run as root; sorry\n"); | |
60 | exit(1); | |
61 | } | |
62 | code = stat(argv[1], &ts); | |
63 | if (code) { | |
64 | printf("can't stat %s\n", argv[1]); | |
65 | exit(1); | |
66 | } | |
67 | dev = ts.st_dev; | |
68 | tdir = opendir(argv[1]); | |
69 | if (!tdir) { | |
70 | printf("cant open %s\n", argv[1]); | |
71 | exit(1); | |
72 | } | |
73 | volid = atoi(argv[2]); | |
74 | for (tde = readdir(tdir); tde; tde = readdir(tdir)) { | |
75 | if (tde->d_name[0] == '#') { | |
76 | printf("Inode %d\n", tde->d_ino); | |
77 | code = IINC(dev, tde->d_ino, volid); | |
78 | if (code == -1) { | |
79 | perror("iinc"); | |
80 | printf("errno = %d\n", errno); | |
81 | /* Remove this -- we don't want to exit, because we have to look | |
82 | * at each inode -- an error here means only that the iinc failed for | |
83 | * the current volume | |
84 | * exit(1); | |
85 | */ | |
86 | } else | |
87 | printf("inode %d restored for volume %d\n", tde->d_ino, | |
88 | volid); | |
89 | } | |
90 | } | |
91 | exit(0); | |
92 | } |