Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bb3cf335 authored by Anton Altaparmakov's avatar Anton Altaparmakov
Browse files

NTFS: Update attribute definition handling.

parent b0d2374d
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -110,6 +110,7 @@ ToDo/Notes:
	  only emit a warning when the checksum is incorrect rather than
	  only emit a warning when the checksum is incorrect rather than
	  refusing the mount.  Thanks to Bernd Casimir for pointing this
	  refusing the mount.  Thanks to Bernd Casimir for pointing this
	  problem out.
	  problem out.
	- Update attribute definition handling.


2.1.22 - Many bug and race fixes and error handling improvements.
2.1.22 - Many bug and race fixes and error handling improvements.


+7 −14
Original line number Original line Diff line number Diff line
@@ -1138,28 +1138,21 @@ int ntfs_attr_size_bounds_check(const ntfs_volume *vol, const ATTR_TYPE type,
 * Check whether the attribute of @type on the ntfs volume @vol is allowed to
 * Check whether the attribute of @type on the ntfs volume @vol is allowed to
 * be non-resident.  This information is obtained from $AttrDef system file.
 * be non-resident.  This information is obtained from $AttrDef system file.
 *
 *
 * Return 0 if the attribute is allowed to be non-resident, -EPERM if not, or
 * Return 0 if the attribute is allowed to be non-resident, -EPERM if not, and
 * -ENOENT if the attribute is not listed in $AttrDef.
 * -ENOENT if the attribute is not listed in $AttrDef.
 */
 */
int ntfs_attr_can_be_non_resident(const ntfs_volume *vol, const ATTR_TYPE type)
int ntfs_attr_can_be_non_resident(const ntfs_volume *vol, const ATTR_TYPE type)
{
{
	ATTR_DEF *ad;
	ATTR_DEF *ad;


	/*
	 * $DATA and $EA are always allowed to be non-resident even if $AttrDef
	 * does not specify this in the flags of the $DATA attribute definition
	 * record.
	 */
	if (type == AT_DATA || type == AT_EA)
		return 0;
	/* Find the attribute definition record in $AttrDef. */
	/* Find the attribute definition record in $AttrDef. */
	ad = ntfs_attr_find_in_attrdef(vol, type);
	ad = ntfs_attr_find_in_attrdef(vol, type);
	if (unlikely(!ad))
	if (unlikely(!ad))
		return -ENOENT;
		return -ENOENT;
	/* Check the flags and return the result. */
	/* Check the flags and return the result. */
	if (ad->flags & CAN_BE_NON_RESIDENT)
	if (ad->flags & ATTR_DEF_RESIDENT)
		return 0;
		return -EPERM;
		return -EPERM;
	return 0;
}
}


/**
/**
@@ -1182,9 +1175,9 @@ int ntfs_attr_can_be_non_resident(const ntfs_volume *vol, const ATTR_TYPE type)
 */
 */
int ntfs_attr_can_be_resident(const ntfs_volume *vol, const ATTR_TYPE type)
int ntfs_attr_can_be_resident(const ntfs_volume *vol, const ATTR_TYPE type)
{
{
	if (type != AT_INDEX_ALLOCATION && type != AT_EA)
	if (type == AT_INDEX_ALLOCATION || type == AT_EA)
		return 0;
		return -EPERM;
		return -EPERM;
	return 0;
}
}


/**
/**
+30 −12
Original line number Original line Diff line number Diff line
@@ -547,26 +547,44 @@ enum {
	COLLATION_NTOFS_ULONG		= const_cpu_to_le32(0x10),
	COLLATION_NTOFS_ULONG		= const_cpu_to_le32(0x10),
	COLLATION_NTOFS_SID		= const_cpu_to_le32(0x11),
	COLLATION_NTOFS_SID		= const_cpu_to_le32(0x11),
	COLLATION_NTOFS_SECURITY_HASH	= const_cpu_to_le32(0x12),
	COLLATION_NTOFS_SECURITY_HASH	= const_cpu_to_le32(0x12),
	COLLATION_NTOFS_ULONGS		= const_cpu_to_le32(0x13)
	COLLATION_NTOFS_ULONGS		= const_cpu_to_le32(0x13),
};
};


typedef le32 COLLATION_RULE;
typedef le32 COLLATION_RULE;


/*
/*
 * The flags (32-bit) describing attribute properties in the attribute
 * The flags (32-bit) describing attribute properties in the attribute
 * definition structure.  FIXME: This information is from Regis's information
 * definition structure.  FIXME: This information is based on Regis's
 * and, according to him, it is not certain and probably incomplete.
 * information and, according to him, it is not certain and probably
 * The INDEXABLE flag is fairly certainly correct as only the file name
 * incomplete.  The INDEXABLE flag is fairly certainly correct as only the file
 * attribute has this flag set and this is the only attribute indexed in NT4.
 * name attribute has this flag set and this is the only attribute indexed in
 * NT4.
 */
 */
enum {
enum {
	INDEXABLE	    = const_cpu_to_le32(0x02), /* Attribute can be
	ATTR_DEF_INDEXABLE	= const_cpu_to_le32(0x02), /* Attribute can be
					indexed. */
					indexed. */
	NEED_TO_REGENERATE  = const_cpu_to_le32(0x40), /* Need to regenerate
	ATTR_DEF_MULTIPLE	= const_cpu_to_le32(0x04), /* Attribute type
							  during regeneration
					can be present multiple times in the
							  phase. */
					mft records of an inode. */
	CAN_BE_NON_RESIDENT = const_cpu_to_le32(0x80), /* Attribute can be
	ATTR_DEF_NOT_ZERO	= const_cpu_to_le32(0x08), /* Attribute value
							  non-resident. */
					must contain at least one non-zero
					byte. */
	ATTR_DEF_INDEXED_UNIQUE	= const_cpu_to_le32(0x10), /* Attribute must be
					indexed and the attribute value must be
					unique for the attribute type in all of
					the mft records of an inode. */
	ATTR_DEF_NAMED_UNIQUE	= const_cpu_to_le32(0x20), /* Attribute must be
					named and the name must be unique for
					the attribute type in all of the mft
					records of an inode. */
	ATTR_DEF_RESIDENT	= const_cpu_to_le32(0x40), /* Attribute must be
					resident. */
	ATTR_DEF_ALWAYS_LOG	= const_cpu_to_le32(0x80), /* Always log
					modifications to this attribute,
					regardless of whether it is resident or
					non-resident.  Without this, only log
					modifications if the attribute is
					resident. */
};
};


typedef le32 ATTR_DEF_FLAGS;
typedef le32 ATTR_DEF_FLAGS;
+2 −1
Original line number Original line Diff line number Diff line
@@ -2,7 +2,7 @@
 * ntfs.h - Defines for NTFS Linux kernel driver. Part of the Linux-NTFS
 * ntfs.h - Defines for NTFS Linux kernel driver. Part of the Linux-NTFS
 *	    project.
 *	    project.
 *
 *
 * Copyright (c) 2001-2004 Anton Altaparmakov
 * Copyright (c) 2001-2005 Anton Altaparmakov
 * Copyright (C) 2002 Richard Russon
 * Copyright (C) 2002 Richard Russon
 *
 *
 * This program/include file is free software; you can redistribute it and/or
 * This program/include file is free software; you can redistribute it and/or
@@ -41,6 +41,7 @@ typedef enum {
	NTFS_BLOCK_SIZE_BITS	= 9,
	NTFS_BLOCK_SIZE_BITS	= 9,
	NTFS_SB_MAGIC		= 0x5346544e,	/* 'NTFS' */
	NTFS_SB_MAGIC		= 0x5346544e,	/* 'NTFS' */
	NTFS_MAX_NAME_LEN	= 255,
	NTFS_MAX_NAME_LEN	= 255,
	NTFS_MAX_ATTR_NAME_LEN	= 255,
} NTFS_CONSTANTS;
} NTFS_CONSTANTS;


/* Global variables. */
/* Global variables. */