xref: /openbmc/linux/fs/ntfs/inode.h (revision 9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e)
1a1d312deSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  * inode.h - Defines for inode structures NTFS Linux kernel driver. Part of
41da177e4SLinus Torvalds  *	     the Linux-NTFS project.
51da177e4SLinus Torvalds  *
68331191eSAnton Altaparmakov  * Copyright (c) 2001-2007 Anton Altaparmakov
71da177e4SLinus Torvalds  * Copyright (c) 2002 Richard Russon
81da177e4SLinus Torvalds  */
91da177e4SLinus Torvalds 
101da177e4SLinus Torvalds #ifndef _LINUX_NTFS_INODE_H
111da177e4SLinus Torvalds #define _LINUX_NTFS_INODE_H
121da177e4SLinus Torvalds 
1360063497SArun Sharma #include <linux/atomic.h>
144e5e529aSIngo Molnar 
154e5e529aSIngo Molnar #include <linux/fs.h>
164e5e529aSIngo Molnar #include <linux/list.h>
174e5e529aSIngo Molnar #include <linux/mm.h>
184e5e529aSIngo Molnar #include <linux/mutex.h>
194e5e529aSIngo Molnar #include <linux/seq_file.h>
201da177e4SLinus Torvalds 
211da177e4SLinus Torvalds #include "layout.h"
221da177e4SLinus Torvalds #include "volume.h"
231da177e4SLinus Torvalds #include "types.h"
241da177e4SLinus Torvalds #include "runlist.h"
251da177e4SLinus Torvalds #include "debug.h"
261da177e4SLinus Torvalds 
271da177e4SLinus Torvalds typedef struct _ntfs_inode ntfs_inode;
281da177e4SLinus Torvalds 
291da177e4SLinus Torvalds /*
301da177e4SLinus Torvalds  * The NTFS in-memory inode structure. It is just used as an extension to the
311da177e4SLinus Torvalds  * fields already provided in the VFS inode.
321da177e4SLinus Torvalds  */
331da177e4SLinus Torvalds struct _ntfs_inode {
3436763677SAnton Altaparmakov 	rwlock_t size_lock;	/* Lock serializing access to inode sizes. */
351da177e4SLinus Torvalds 	s64 initialized_size;	/* Copy from the attribute record. */
361da177e4SLinus Torvalds 	s64 allocated_size;	/* Copy from the attribute record. */
371da177e4SLinus Torvalds 	unsigned long state;	/* NTFS specific flags describing this inode.
381da177e4SLinus Torvalds 				   See ntfs_inode_state_bits below. */
391da177e4SLinus Torvalds 	unsigned long mft_no;	/* Number of the mft record / inode. */
401da177e4SLinus Torvalds 	u16 seq_no;		/* Sequence number of the mft record. */
411da177e4SLinus Torvalds 	atomic_t count;		/* Inode reference count for book keeping. */
421da177e4SLinus Torvalds 	ntfs_volume *vol;	/* Pointer to the ntfs volume of this inode. */
431da177e4SLinus Torvalds 	/*
441da177e4SLinus Torvalds 	 * If NInoAttr() is true, the below fields describe the attribute which
451da177e4SLinus Torvalds 	 * this fake inode belongs to. The actual inode of this attribute is
461da177e4SLinus Torvalds 	 * pointed to by base_ntfs_ino and nr_extents is always set to -1 (see
471da177e4SLinus Torvalds 	 * below). For real inodes, we also set the type (AT_DATA for files and
481da177e4SLinus Torvalds 	 * AT_INDEX_ALLOCATION for directories), with the name = NULL and
491da177e4SLinus Torvalds 	 * name_len = 0 for files and name = I30 (global constant) and
501da177e4SLinus Torvalds 	 * name_len = 4 for directories.
511da177e4SLinus Torvalds 	 */
521da177e4SLinus Torvalds 	ATTR_TYPE type;	/* Attribute type of this fake inode. */
531da177e4SLinus Torvalds 	ntfschar *name;		/* Attribute name of this fake inode. */
541da177e4SLinus Torvalds 	u32 name_len;		/* Attribute name length of this fake inode. */
551da177e4SLinus Torvalds 	runlist runlist;	/* If state has the NI_NonResident bit set,
561da177e4SLinus Torvalds 				   the runlist of the unnamed data attribute
571da177e4SLinus Torvalds 				   (if a file) or of the index allocation
581da177e4SLinus Torvalds 				   attribute (directory) or of the attribute
591da177e4SLinus Torvalds 				   described by the fake inode (if NInoAttr()).
601da177e4SLinus Torvalds 				   If runlist.rl is NULL, the runlist has not
611da177e4SLinus Torvalds 				   been read in yet or has been unmapped. If
621da177e4SLinus Torvalds 				   NI_NonResident is clear, the attribute is
631da177e4SLinus Torvalds 				   resident (file and fake inode) or there is
641da177e4SLinus Torvalds 				   no $I30 index allocation attribute
651da177e4SLinus Torvalds 				   (small directory). In the latter case
661da177e4SLinus Torvalds 				   runlist.rl is always NULL.*/
671da177e4SLinus Torvalds 	/*
681da177e4SLinus Torvalds 	 * The following fields are only valid for real inodes and extent
691da177e4SLinus Torvalds 	 * inodes.
701da177e4SLinus Torvalds 	 */
714e5e529aSIngo Molnar 	struct mutex mrec_lock;	/* Lock for serializing access to the
721da177e4SLinus Torvalds 				   mft record belonging to this inode. */
731da177e4SLinus Torvalds 	struct page *page;	/* The page containing the mft record of the
741da177e4SLinus Torvalds 				   inode. This should only be touched by the
751da177e4SLinus Torvalds 				   (un)map_mft_record*() functions. */
761da177e4SLinus Torvalds 	int page_ofs;		/* Offset into the page at which the mft record
771da177e4SLinus Torvalds 				   begins. This should only be touched by the
781da177e4SLinus Torvalds 				   (un)map_mft_record*() functions. */
791da177e4SLinus Torvalds 	/*
801da177e4SLinus Torvalds 	 * Attribute list support (only for use by the attribute lookup
811da177e4SLinus Torvalds 	 * functions). Setup during read_inode for all inodes with attribute
821da177e4SLinus Torvalds 	 * lists. Only valid if NI_AttrList is set in state, and attr_list_rl is
831da177e4SLinus Torvalds 	 * further only valid if NI_AttrListNonResident is set.
841da177e4SLinus Torvalds 	 */
851da177e4SLinus Torvalds 	u32 attr_list_size;	/* Length of attribute list value in bytes. */
861da177e4SLinus Torvalds 	u8 *attr_list;		/* Attribute list value itself. */
871da177e4SLinus Torvalds 	runlist attr_list_rl;	/* Run list for the attribute list value. */
881da177e4SLinus Torvalds 	union {
891da177e4SLinus Torvalds 		struct { /* It is a directory, $MFT, or an index inode. */
901da177e4SLinus Torvalds 			u32 block_size;		/* Size of an index block. */
911da177e4SLinus Torvalds 			u32 vcn_size;		/* Size of a vcn in this
921da177e4SLinus Torvalds 						   index. */
931da177e4SLinus Torvalds 			COLLATION_RULE collation_rule; /* The collation rule
941da177e4SLinus Torvalds 						   for the index. */
951da177e4SLinus Torvalds 			u8 block_size_bits; 	/* Log2 of the above. */
961da177e4SLinus Torvalds 			u8 vcn_size_bits;	/* Log2 of the above. */
971da177e4SLinus Torvalds 		} index;
983bd1f4a1SAnton Altaparmakov 		struct { /* It is a compressed/sparse file/attribute inode. */
991da177e4SLinus Torvalds 			s64 size;		/* Copy of compressed_size from
1001da177e4SLinus Torvalds 						   $DATA. */
1011da177e4SLinus Torvalds 			u32 block_size;		/* Size of a compression block
1021da177e4SLinus Torvalds 						   (cb). */
1031da177e4SLinus Torvalds 			u8 block_size_bits;	/* Log2 of the size of a cb. */
1041da177e4SLinus Torvalds 			u8 block_clusters;	/* Number of clusters per cb. */
1051da177e4SLinus Torvalds 		} compressed;
1061da177e4SLinus Torvalds 	} itype;
1074e5e529aSIngo Molnar 	struct mutex extent_lock;	/* Lock for accessing/modifying the
1081da177e4SLinus Torvalds 					   below . */
1091da177e4SLinus Torvalds 	s32 nr_extents;	/* For a base mft record, the number of attached extent
1101da177e4SLinus Torvalds 			   inodes (0 if none), for extent records and for fake
1111da177e4SLinus Torvalds 			   inodes describing an attribute this is -1. */
1121da177e4SLinus Torvalds 	union {		/* This union is only used if nr_extents != 0. */
1131da177e4SLinus Torvalds 		ntfs_inode **extent_ntfs_inos;	/* For nr_extents > 0, array of
1141da177e4SLinus Torvalds 						   the ntfs inodes of the extent
1151da177e4SLinus Torvalds 						   mft records belonging to
1161da177e4SLinus Torvalds 						   this base inode which have
1171da177e4SLinus Torvalds 						   been loaded. */
1181da177e4SLinus Torvalds 		ntfs_inode *base_ntfs_ino;	/* For nr_extents == -1, the
1191da177e4SLinus Torvalds 						   ntfs inode of the base mft
1201da177e4SLinus Torvalds 						   record. For fake inodes, the
1211da177e4SLinus Torvalds 						   real (base) inode to which
1221da177e4SLinus Torvalds 						   the attribute belongs. */
1231da177e4SLinus Torvalds 	} ext;
1241da177e4SLinus Torvalds };
1251da177e4SLinus Torvalds 
1261da177e4SLinus Torvalds /*
1271da177e4SLinus Torvalds  * Defined bits for the state field in the ntfs_inode structure.
1281da177e4SLinus Torvalds  * (f) = files only, (d) = directories only, (a) = attributes/fake inodes only
1291da177e4SLinus Torvalds  */
1301da177e4SLinus Torvalds typedef enum {
1311da177e4SLinus Torvalds 	NI_Dirty,		/* 1: Mft record needs to be written to disk. */
1321da177e4SLinus Torvalds 	NI_AttrList,		/* 1: Mft record contains an attribute list. */
1331da177e4SLinus Torvalds 	NI_AttrListNonResident,	/* 1: Attribute list is non-resident. Implies
1341da177e4SLinus Torvalds 				      NI_AttrList is set. */
1351da177e4SLinus Torvalds 
1361da177e4SLinus Torvalds 	NI_Attr,		/* 1: Fake inode for attribute i/o.
1371da177e4SLinus Torvalds 				   0: Real inode or extent inode. */
1381da177e4SLinus Torvalds 
1391da177e4SLinus Torvalds 	NI_MstProtected,	/* 1: Attribute is protected by MST fixups.
1401da177e4SLinus Torvalds 				   0: Attribute is not protected by fixups. */
1411da177e4SLinus Torvalds 	NI_NonResident,		/* 1: Unnamed data attr is non-resident (f).
1421da177e4SLinus Torvalds 				   1: Attribute is non-resident (a). */
1431da177e4SLinus Torvalds 	NI_IndexAllocPresent = NI_NonResident,	/* 1: $I30 index alloc attr is
1441da177e4SLinus Torvalds 						   present (d). */
1451da177e4SLinus Torvalds 	NI_Compressed,		/* 1: Unnamed data attr is compressed (f).
1461da177e4SLinus Torvalds 				   1: Create compressed files by default (d).
1471da177e4SLinus Torvalds 				   1: Attribute is compressed (a). */
1481da177e4SLinus Torvalds 	NI_Encrypted,		/* 1: Unnamed data attr is encrypted (f).
1491da177e4SLinus Torvalds 				   1: Create encrypted files by default (d).
1501da177e4SLinus Torvalds 				   1: Attribute is encrypted (a). */
1511da177e4SLinus Torvalds 	NI_Sparse,		/* 1: Unnamed data attr is sparse (f).
1521da177e4SLinus Torvalds 				   1: Create sparse files by default (d).
1531da177e4SLinus Torvalds 				   1: Attribute is sparse (a). */
154c002f425SAnton Altaparmakov 	NI_SparseDisabled,	/* 1: May not create sparse regions. */
1551da177e4SLinus Torvalds 	NI_TruncateFailed,	/* 1: Last ntfs_truncate() call failed. */
1561da177e4SLinus Torvalds } ntfs_inode_state_bits;
1571da177e4SLinus Torvalds 
1581da177e4SLinus Torvalds /*
1591da177e4SLinus Torvalds  * NOTE: We should be adding dirty mft records to a list somewhere and they
1601da177e4SLinus Torvalds  * should be independent of the (ntfs/vfs) inode structure so that an inode can
1611da177e4SLinus Torvalds  * be removed but the record can be left dirty for syncing later.
1621da177e4SLinus Torvalds  */
1631da177e4SLinus Torvalds 
1641da177e4SLinus Torvalds /*
1651da177e4SLinus Torvalds  * Macro tricks to expand the NInoFoo(), NInoSetFoo(), and NInoClearFoo()
1661da177e4SLinus Torvalds  * functions.
1671da177e4SLinus Torvalds  */
1681da177e4SLinus Torvalds #define NINO_FNS(flag)					\
1691da177e4SLinus Torvalds static inline int NIno##flag(ntfs_inode *ni)		\
1701da177e4SLinus Torvalds {							\
1711da177e4SLinus Torvalds 	return test_bit(NI_##flag, &(ni)->state);	\
1721da177e4SLinus Torvalds }							\
1731da177e4SLinus Torvalds static inline void NInoSet##flag(ntfs_inode *ni)	\
1741da177e4SLinus Torvalds {							\
1751da177e4SLinus Torvalds 	set_bit(NI_##flag, &(ni)->state);		\
1761da177e4SLinus Torvalds }							\
1771da177e4SLinus Torvalds static inline void NInoClear##flag(ntfs_inode *ni)	\
1781da177e4SLinus Torvalds {							\
1791da177e4SLinus Torvalds 	clear_bit(NI_##flag, &(ni)->state);		\
1801da177e4SLinus Torvalds }
1811da177e4SLinus Torvalds 
1821da177e4SLinus Torvalds /*
1831da177e4SLinus Torvalds  * As above for NInoTestSetFoo() and NInoTestClearFoo().
1841da177e4SLinus Torvalds  */
1851da177e4SLinus Torvalds #define TAS_NINO_FNS(flag)					\
1861da177e4SLinus Torvalds static inline int NInoTestSet##flag(ntfs_inode *ni)		\
1871da177e4SLinus Torvalds {								\
1881da177e4SLinus Torvalds 	return test_and_set_bit(NI_##flag, &(ni)->state);	\
1891da177e4SLinus Torvalds }								\
1901da177e4SLinus Torvalds static inline int NInoTestClear##flag(ntfs_inode *ni)		\
1911da177e4SLinus Torvalds {								\
1921da177e4SLinus Torvalds 	return test_and_clear_bit(NI_##flag, &(ni)->state);	\
1931da177e4SLinus Torvalds }
1941da177e4SLinus Torvalds 
1951da177e4SLinus Torvalds /* Emit the ntfs inode bitops functions. */
1961da177e4SLinus Torvalds NINO_FNS(Dirty)
1971da177e4SLinus Torvalds TAS_NINO_FNS(Dirty)
1981da177e4SLinus Torvalds NINO_FNS(AttrList)
1991da177e4SLinus Torvalds NINO_FNS(AttrListNonResident)
2001da177e4SLinus Torvalds NINO_FNS(Attr)
2011da177e4SLinus Torvalds NINO_FNS(MstProtected)
2021da177e4SLinus Torvalds NINO_FNS(NonResident)
2031da177e4SLinus Torvalds NINO_FNS(IndexAllocPresent)
2041da177e4SLinus Torvalds NINO_FNS(Compressed)
2051da177e4SLinus Torvalds NINO_FNS(Encrypted)
2061da177e4SLinus Torvalds NINO_FNS(Sparse)
207c002f425SAnton Altaparmakov NINO_FNS(SparseDisabled)
2081da177e4SLinus Torvalds NINO_FNS(TruncateFailed)
2091da177e4SLinus Torvalds 
2101da177e4SLinus Torvalds /*
2111da177e4SLinus Torvalds  * The full structure containing a ntfs_inode and a vfs struct inode. Used for
2121da177e4SLinus Torvalds  * all real and fake inodes but not for extent inodes which lack the vfs struct
2131da177e4SLinus Torvalds  * inode.
2141da177e4SLinus Torvalds  */
2151da177e4SLinus Torvalds typedef struct {
2161da177e4SLinus Torvalds 	ntfs_inode ntfs_inode;
2171da177e4SLinus Torvalds 	struct inode vfs_inode;		/* The vfs inode structure. */
2181da177e4SLinus Torvalds } big_ntfs_inode;
2191da177e4SLinus Torvalds 
2201da177e4SLinus Torvalds /**
2211da177e4SLinus Torvalds  * NTFS_I - return the ntfs inode given a vfs inode
2221da177e4SLinus Torvalds  * @inode:	VFS inode
2231da177e4SLinus Torvalds  *
2241da177e4SLinus Torvalds  * NTFS_I() returns the ntfs inode associated with the VFS @inode.
2251da177e4SLinus Torvalds  */
NTFS_I(struct inode * inode)2261da177e4SLinus Torvalds static inline ntfs_inode *NTFS_I(struct inode *inode)
2271da177e4SLinus Torvalds {
228db6172c4SRasmus Villemoes 	return (ntfs_inode *)container_of(inode, big_ntfs_inode, vfs_inode);
2291da177e4SLinus Torvalds }
2301da177e4SLinus Torvalds 
VFS_I(ntfs_inode * ni)2311da177e4SLinus Torvalds static inline struct inode *VFS_I(ntfs_inode *ni)
2321da177e4SLinus Torvalds {
2331da177e4SLinus Torvalds 	return &((big_ntfs_inode *)ni)->vfs_inode;
2341da177e4SLinus Torvalds }
2351da177e4SLinus Torvalds 
2361da177e4SLinus Torvalds /**
2371da177e4SLinus Torvalds  * ntfs_attr - ntfs in memory attribute structure
2381da177e4SLinus Torvalds  * @mft_no:	mft record number of the base mft record of this attribute
2391da177e4SLinus Torvalds  * @name:	Unicode name of the attribute (NULL if unnamed)
2401da177e4SLinus Torvalds  * @name_len:	length of @name in Unicode characters (0 if unnamed)
2411da177e4SLinus Torvalds  * @type:	attribute type (see layout.h)
2421da177e4SLinus Torvalds  *
2431da177e4SLinus Torvalds  * This structure exists only to provide a small structure for the
2441da177e4SLinus Torvalds  * ntfs_{attr_}iget()/ntfs_test_inode()/ntfs_init_locked_inode() mechanism.
2451da177e4SLinus Torvalds  *
2461da177e4SLinus Torvalds  * NOTE: Elements are ordered by size to make the structure as compact as
2471da177e4SLinus Torvalds  * possible on all architectures.
2481da177e4SLinus Torvalds  */
2491da177e4SLinus Torvalds typedef struct {
2501da177e4SLinus Torvalds 	unsigned long mft_no;
2511da177e4SLinus Torvalds 	ntfschar *name;
2521da177e4SLinus Torvalds 	u32 name_len;
2531da177e4SLinus Torvalds 	ATTR_TYPE type;
2541da177e4SLinus Torvalds } ntfs_attr;
2551da177e4SLinus Torvalds 
2561146f7e2SLuca Stefani extern int ntfs_test_inode(struct inode *vi, void *data);
2571da177e4SLinus Torvalds 
2581da177e4SLinus Torvalds extern struct inode *ntfs_iget(struct super_block *sb, unsigned long mft_no);
2591da177e4SLinus Torvalds extern struct inode *ntfs_attr_iget(struct inode *base_vi, ATTR_TYPE type,
2601da177e4SLinus Torvalds 		ntfschar *name, u32 name_len);
2611da177e4SLinus Torvalds extern struct inode *ntfs_index_iget(struct inode *base_vi, ntfschar *name,
2621da177e4SLinus Torvalds 		u32 name_len);
2631da177e4SLinus Torvalds 
2641da177e4SLinus Torvalds extern struct inode *ntfs_alloc_big_inode(struct super_block *sb);
265a2b757feSAl Viro extern void ntfs_free_big_inode(struct inode *inode);
266b57922d9SAl Viro extern void ntfs_evict_big_inode(struct inode *vi);
2671da177e4SLinus Torvalds 
2681da177e4SLinus Torvalds extern void __ntfs_init_inode(struct super_block *sb, ntfs_inode *ni);
2691da177e4SLinus Torvalds 
ntfs_init_big_inode(struct inode * vi)2701da177e4SLinus Torvalds static inline void ntfs_init_big_inode(struct inode *vi)
2711da177e4SLinus Torvalds {
2721da177e4SLinus Torvalds 	ntfs_inode *ni = NTFS_I(vi);
2731da177e4SLinus Torvalds 
2741da177e4SLinus Torvalds 	ntfs_debug("Entering.");
2751da177e4SLinus Torvalds 	__ntfs_init_inode(vi->i_sb, ni);
2761da177e4SLinus Torvalds 	ni->mft_no = vi->i_ino;
2771da177e4SLinus Torvalds }
2781da177e4SLinus Torvalds 
2791da177e4SLinus Torvalds extern ntfs_inode *ntfs_new_extent_inode(struct super_block *sb,
2801da177e4SLinus Torvalds 		unsigned long mft_no);
2811da177e4SLinus Torvalds extern void ntfs_clear_extent_inode(ntfs_inode *ni);
2821da177e4SLinus Torvalds 
2831da177e4SLinus Torvalds extern int ntfs_read_inode_mount(struct inode *vi);
2841da177e4SLinus Torvalds 
28534c80b1dSAl Viro extern int ntfs_show_options(struct seq_file *sf, struct dentry *root);
2861da177e4SLinus Torvalds 
2871da177e4SLinus Torvalds #ifdef NTFS_RW
2881da177e4SLinus Torvalds 
2891da177e4SLinus Torvalds extern int ntfs_truncate(struct inode *vi);
2901da177e4SLinus Torvalds extern void ntfs_truncate_vfs(struct inode *vi);
2911da177e4SLinus Torvalds 
292*c1632a0fSChristian Brauner extern int ntfs_setattr(struct mnt_idmap *idmap,
293549c7297SChristian Brauner 			struct dentry *dentry, struct iattr *attr);
2941da177e4SLinus Torvalds 
295a9185b41SChristoph Hellwig extern int __ntfs_write_inode(struct inode *vi, int sync);
2961da177e4SLinus Torvalds 
ntfs_commit_inode(struct inode * vi)2971da177e4SLinus Torvalds static inline void ntfs_commit_inode(struct inode *vi)
2981da177e4SLinus Torvalds {
2991da177e4SLinus Torvalds 	if (!is_bad_inode(vi))
300a9185b41SChristoph Hellwig 		__ntfs_write_inode(vi, 1);
3011da177e4SLinus Torvalds 	return;
3021da177e4SLinus Torvalds }
3031da177e4SLinus Torvalds 
3049014da75SMarco Stornelli #else
3059014da75SMarco Stornelli 
ntfs_truncate_vfs(struct inode * vi)3069014da75SMarco Stornelli static inline void ntfs_truncate_vfs(struct inode *vi) {}
3079014da75SMarco Stornelli 
3081da177e4SLinus Torvalds #endif /* NTFS_RW */
3091da177e4SLinus Torvalds 
3101da177e4SLinus Torvalds #endif /* _LINUX_NTFS_INODE_H */
311