Auto merged

2003/09/28 14:57:05+01:00 flatcap.org!ntfs
add a helper to determine if an inode represents metadata

(Logical change 1.189)
edge.strict_endians
flatcap.org!ntfs 2003-10-06 18:52:00 +00:00
parent f0c141023b
commit ecb1673d0e
1 changed files with 61 additions and 0 deletions

View File

@ -673,6 +673,67 @@ int utils_mftrec_in_use (ntfs_volume *vol, MFT_REF mref)
}
/**
* __metadata
*/
static int __metadata (ntfs_volume *vol, u64 num)
{
if (num == FILE_root)
return 0;
if (num <= FILE_UpCase)
return 1;
if (!vol)
return -1;
if ((vol->major_ver == 3) && (num == FILE_Extend))
return 1;
return 0;
}
/**
* utils_is_metadata - Determine if an inode represents a metadata file
* @inode: An ntfs inode to be tested
*
* A handful of files in the volume contain filesystem data - metadata.
* They can be identified by their inode number (offset in MFT/$DATA) or by
* their parent.
*
* Return: 1 inode is a metadata file
* 0 inode is not a metadata file
* -1 Error occurred
*/
int utils_is_metadata (ntfs_inode *inode)
{
ntfs_volume *vol;
ATTR_RECORD *rec;
FILE_NAME_ATTR *attr;
u64 num;
if (!inode)
return -1;
vol = inode->vol;
if (!vol)
return -1;
num = inode->mft_no;
if (__metadata (vol, num) == 1)
return 1;
rec = find_first_attribute (AT_FILE_NAME, inode->mrec);
if (!rec)
return -1;
/* We know this will always be resident. */
attr = (FILE_NAME_ATTR *) ((char *) rec + le16_to_cpu (rec->value_offset));
num = MREF (attr->parent_directory);
if (__metadata (vol, num) == 1)
return 1;
return 0;
}
#if 0
hamming weight
inline unsigned int hweight32(unsigned int w)