This document describes the cause, symptom, detection, and correction of illegal hard links in AIX Version 3.2.
Hard links can be made with both the ln and link commands, but only the link command allows the creation of illegal hard links. The link command can only be run by root. One use of the link command is to repair file systems. For example, it can be used to restore a missing "." or ".." entry. Its ability to do this is what gives it the ability to create illegal hard links.
Certain illegal hard links between directories can cause the find command to report, on all files and directories it finds after the illegal hard link, the following:
find: 0652-019 The status on <file_name> is not validNote that there may be other causes of this error, such as a missing "." or ".." entry.
One method for finding the first illegal hard link is to run ls -f1 in the directory where the error first occurs to see the entries in the order that the find command sees them. The directory entry before the first entry that gets the find 0652-019 error should be the one that has the illegal hard link somewhere in its tree.
The preceding method only finds the first illegal hard link. There may be others, and the following script will find them all.
The technique of the script is to traverse the directory structure of all local file systems (not including NFS mounted file systems and AFS), comparing the i-node number of each directory's parent to the i-node number of its ".." directory. The i-node numbers will be different for an illegal hard link that produces the 0652-019 error. Note that the "." and ".." directories qualify as this type of hard link--they are a special case that is not illegal and is not checked by the shell script.
hard.links / >/tmp/hard.links.out
Look in the output file for <>. If illegal hard links are found, a message is printed surrounded by a border of <>s. Also, the shell script checks to see that the "." and ".." directories exist for every directory and prints a message surrounded by a border of <>s if either of these entries is missing.
If the ".." entry is missing, the illegal hard link test cannot be done, so after restoring the ".." entry, run the shell script again on the directory that had the missing ".." entry.
Please note that page headers and footers may appear in the following code. They should be removed before the code is used.
#!/bin/ksh Dir=${1:?Give the name of the top of the directory tree to check} typeset -i NumDirsTotal=0 ProcessDir() { typeset Dir typeset -i NumSubDirs=0 Dir="$1$2" for SubDir in $(ls -lA "$Dir" | grep '^d' | rev | cut -f1 -d' ' | rev) do FileSystem=$(df $Dir/$SubDir | tail -1 | awk '{ print $1 }') RemoteHost=${FileSystem##*:} RemoteFileSystem=${FileSystem%%:*} if [[ $RemoteHost != $RemoteFileSystem ]] then # remotely mounted file system echo "$Dir/$SubDir (skipping remote file system > $FileSystem)" elif [[ $FileSystem = "AFS" ]] then # AFS file system echo "$Dir/$SubDir (skipping AFS file system)" else if [[ ! -d $Dir/$SubDir/. ]] then echo "<><><><><><><><><><><><><><><><><><><><><><><>" echo "<> <>" echo '<> The "." directory is missing from the <>' echo '<> directory listed above. <>' echo "<> <>" echo "<><><><><><><><><><><><><><><><><><><><><><><>" fi if [[ ! -d $Dir/$SubDir/.. ]] then echo "<><><><><><><><><><><><><><><><><><><><><><><><>" echo "<> <>" echo '<> The ".." directory is missing from the <>' echo '<> directory listed above. <>' echo "<> <>" echo "<><><><><><><><><><><><><><><><><><><><><><><><>" else ParentInode=$(ls -id "$Dir" | awk '{ print $1 }') [[ "$Dir" = "/" ]] && Dir="" DotDotInode=$(ls -id "$Dir/$SubDir/.." | awk '{ print $1 }') echo "$Dir/$SubDir (i-nodes) P:$ParentInode "..":$DotDotInode" if [[ $ParentInode -ne $DotDotInode ]] then echo "<><><><><><><><><><><><><><><><><><><><><><><><>" echo "<> <>" echo "<> Probable illegal directory-to-directory <>" echo "<> hard link by the directory listed above. <>" echo "<> Remove with unlink. <>" echo "<> <>" echo "<><><><><><><><><><><><><><><><><><><><><><><><>" fi fi ProcessDir "$Dir" "/$SubDir" fi (( NumSubDirs = $NumSubDirs + 1 )) done # echo "-- Number of directories in $Dir/: $NumSubDirs" (( NumDirsTotal = $NumDirsTotal + $NumSubDirs )) } ProcessDir "" "$Dir" # echo "-- Number of directories total: $NumDirsTotal" exit 0
Once you have identified an illegal hard link, you can fix it by unlinking it with the unlink command and, if the link is needed, create a symbolic link with the ln -s command.
If a "." or ".." entry is missing, you can restore it with the link command.
Also, a cp -pr of a directory (or file system) seems to repair illegal hard links (by making a copy instead of a hard link) and missing "." and ".." entries.
[ Doc Ref: 90605203814680 Publish Date: Aug. 09, 1999 4FAX Ref: 1499 ]