2 * Copyright 2000, International Business Machines Corporation and others.
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
10 /* Verify that the size of the XFS inode is large enough to hold the XFS
11 * attribute for AFS inode parameters. Check all the mounted /vicep partitions.
13 #include <afsconfig.h>
14 #include <afs/param.h>
18 #ifdef AFS_SGI_XFS_IOPS_ENV
20 #include <afs/afsint.h>
22 #include "partition.h"
23 #include <afs/xfsattrs.h>
25 char *prog
= "xfs_size_check";
27 /* Verify that the on disk XFS inodes on the partition are large enough to
28 * hold the AFS attribute. Returns -1 if the attribute can't be set or is
29 * too small to fit in the inode. Returns 0 if the attribute does fit in
32 #define VERIFY_ERROR -1
36 VerifyXFSInodeSize(char *part
)
39 int length
= SIZEOF_XFS_ATTR_T
;
41 int code
= VERIFY_ERROR
;
44 if (attr_set(part
, AFS_XFS_ATTR
, &junk
, length
, ATTR_ROOT
) < 0) {
46 printf("Must be root to run %s\n", prog
);
52 if ((fd
= open(part
, O_RDONLY
, 0)) < 0)
55 if (fcntl(fd
, F_FSGETXATTRA
, &fsx
) < 0)
58 if (fsx
.fsx_nextents
== 0)
66 (void)attr_remove(part
, AFS_XFS_ATTR
, ATTR_ROOT
);
71 #define ALLOC_STEP 256
74 char partName
[NAME_SIZE
];
75 char devName
[NAME_SIZE
];
77 partInfo
*partList
= NULL
;
85 struct mntent
*mntent
;
92 if ((mfd
= setmntent(MOUNTED
, "r")) == NULL
) {
93 printf("Problems in getting mount entries(setmntent): %s\n",
97 while (mntent
= getmntent(mfd
)) {
98 char *part
= mntent
->mnt_dir
;
100 if (!hasmntopt(mntent
, MNTOPT_RW
))
103 if (strncmp(part
, VICE_PARTITION_PREFIX
, VICE_PREFIX_SIZE
)) {
104 continue; /* Non /vicepx; ignore */
106 if (stat(part
, &status
) == -1) {
107 printf("Couldn't find file system %s; ignored\n", part
);
110 if (!strcmp("xfs", status
.st_fstype
)) {
111 code
= VerifyXFSInodeSize(part
);
116 printf("%s: Can't check XFS inode size: %s\n",
120 if (nAvail
<= nParts
) {
121 nAvail
+= ALLOC_STEP
;
122 if (nAvail
== ALLOC_STEP
)
123 partList
= malloc(nAvail
* sizeof(partInfo
));
125 partList
= realloc(partList
,
126 nAvail
* sizeof(partInfo
));
129 ("Failed to %salloc %d bytes for partition list.\n",
130 (nAvail
== ALLOC_STEP
) ? "m" : "re",
131 nAvail
* sizeof(partInfo
));
135 (void)strcpy(partList
[nParts
].partName
, part
);
136 (void)strcpy(partList
[nParts
].devName
, mntent
->mnt_fsname
);
140 printf("Unknown return code %d from VerifyXFSInodeSize.\n",
150 main(int ac
, char **av
)
156 printf("Must be root to run %s.\n", prog
);
160 code
= CheckPartitions();
162 printf("Need to remake the following partitions:\n");
163 for (i
= 0; i
< nParts
; i
++) {
164 printf("%s: mkfs -t xfs -i size=512 -l size=4000b %s\n",
165 partList
[i
].partName
, partList
[i
].devName
);
172 #else /* AFS_SGI_XFS_IOPS_ENV */
175 printf("%s only runs on XFS platforms.\n, prog");
178 #endif /* AFS_SGI_XFS_IOPS_ENV */