xref: /onnv-gate/usr/src/lib/libntfs/common/include/ntfs/inode.h (revision 9663:ace9a2ac3683)
1*9663SMark.Logan@Sun.COM /*
2*9663SMark.Logan@Sun.COM  * inode.h - Defines for NTFS inode handling. Part of the Linux-NTFS project.
3*9663SMark.Logan@Sun.COM  *
4*9663SMark.Logan@Sun.COM  * Copyright (c) 2001,2002 Anton Altaparmakov
5*9663SMark.Logan@Sun.COM  * Copyright (c) 2004-2007 Yura Pakhuchiy
6*9663SMark.Logan@Sun.COM  * Copyright (c) 2004-2005 Richard Russon
7*9663SMark.Logan@Sun.COM  *
8*9663SMark.Logan@Sun.COM  * This program/include file is free software; you can redistribute it and/or
9*9663SMark.Logan@Sun.COM  * modify it under the terms of the GNU General Public License as published
10*9663SMark.Logan@Sun.COM  * by the Free Software Foundation; either version 2 of the License, or
11*9663SMark.Logan@Sun.COM  * (at your option) any later version.
12*9663SMark.Logan@Sun.COM  *
13*9663SMark.Logan@Sun.COM  * This program/include file is distributed in the hope that it will be
14*9663SMark.Logan@Sun.COM  * useful, but WITHOUT ANY WARRANTY; without even the implied warranty
15*9663SMark.Logan@Sun.COM  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16*9663SMark.Logan@Sun.COM  * GNU General Public License for more details.
17*9663SMark.Logan@Sun.COM  *
18*9663SMark.Logan@Sun.COM  * You should have received a copy of the GNU General Public License
19*9663SMark.Logan@Sun.COM  * along with this program (in the main directory of the Linux-NTFS
20*9663SMark.Logan@Sun.COM  * distribution in the file COPYING); if not, write to the Free Software
21*9663SMark.Logan@Sun.COM  * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22*9663SMark.Logan@Sun.COM  */
23*9663SMark.Logan@Sun.COM 
24*9663SMark.Logan@Sun.COM #ifndef _NTFS_INODE_H
25*9663SMark.Logan@Sun.COM #define _NTFS_INODE_H
26*9663SMark.Logan@Sun.COM 
27*9663SMark.Logan@Sun.COM /* Forward declaration */
28*9663SMark.Logan@Sun.COM typedef struct _ntfs_inode ntfs_inode;
29*9663SMark.Logan@Sun.COM 
30*9663SMark.Logan@Sun.COM #include "list.h"
31*9663SMark.Logan@Sun.COM #include "types.h"
32*9663SMark.Logan@Sun.COM #include "layout.h"
33*9663SMark.Logan@Sun.COM #include "support.h"
34*9663SMark.Logan@Sun.COM #include "volume.h"
35*9663SMark.Logan@Sun.COM 
36*9663SMark.Logan@Sun.COM /**
37*9663SMark.Logan@Sun.COM  * enum ntfs_inode_state_bits -
38*9663SMark.Logan@Sun.COM  *
39*9663SMark.Logan@Sun.COM  * Defined bits for the state field in the ntfs_inode structure.
40*9663SMark.Logan@Sun.COM  * (f) = files only, (d) = directories only
41*9663SMark.Logan@Sun.COM  */
42*9663SMark.Logan@Sun.COM typedef enum {
43*9663SMark.Logan@Sun.COM 	NI_Dirty,		/* 1: Mft record needs to be written to disk. */
44*9663SMark.Logan@Sun.COM 
45*9663SMark.Logan@Sun.COM 	/* Below fields only make sense for base inodes. */
46*9663SMark.Logan@Sun.COM 	NI_AttrList,		/* 1: Mft record contains an attribute list. */
47*9663SMark.Logan@Sun.COM 	NI_AttrListDirty,	/* 1: Attribute list needs to be written to the
48*9663SMark.Logan@Sun.COM 				      mft record and then to disk. */
49*9663SMark.Logan@Sun.COM 	NI_FileNameDirty,	/* 1: FILE_NAME attributes need to be updated
50*9663SMark.Logan@Sun.COM 				      in the index. */
51*9663SMark.Logan@Sun.COM } ntfs_inode_state_bits;
52*9663SMark.Logan@Sun.COM 
53*9663SMark.Logan@Sun.COM #define  test_nino_flag(ni, flag)	   test_bit(NI_##flag, (ni)->state)
54*9663SMark.Logan@Sun.COM #define   set_nino_flag(ni, flag)	    set_bit(NI_##flag, (ni)->state)
55*9663SMark.Logan@Sun.COM #define clear_nino_flag(ni, flag)	  clear_bit(NI_##flag, (ni)->state)
56*9663SMark.Logan@Sun.COM 
57*9663SMark.Logan@Sun.COM #define test_and_set_nino_flag(ni, flag)	\
58*9663SMark.Logan@Sun.COM 				   test_and_set_bit(NI_##flag, (ni)->state)
59*9663SMark.Logan@Sun.COM #define test_and_clear_nino_flag(ni, flag)	\
60*9663SMark.Logan@Sun.COM 				 test_and_clear_bit(NI_##flag, (ni)->state)
61*9663SMark.Logan@Sun.COM 
62*9663SMark.Logan@Sun.COM #define NInoDirty(ni)				  test_nino_flag(ni, Dirty)
63*9663SMark.Logan@Sun.COM #define NInoSetDirty(ni)			   set_nino_flag(ni, Dirty)
64*9663SMark.Logan@Sun.COM #define NInoClearDirty(ni)			 clear_nino_flag(ni, Dirty)
65*9663SMark.Logan@Sun.COM #define NInoTestAndSetDirty(ni)		  test_and_set_nino_flag(ni, Dirty)
66*9663SMark.Logan@Sun.COM #define NInoTestAndClearDirty(ni)	test_and_clear_nino_flag(ni, Dirty)
67*9663SMark.Logan@Sun.COM 
68*9663SMark.Logan@Sun.COM #define NInoAttrList(ni)			  test_nino_flag(ni, AttrList)
69*9663SMark.Logan@Sun.COM #define NInoSetAttrList(ni)			   set_nino_flag(ni, AttrList)
70*9663SMark.Logan@Sun.COM #define NInoClearAttrList(ni)			 clear_nino_flag(ni, AttrList)
71*9663SMark.Logan@Sun.COM 
72*9663SMark.Logan@Sun.COM 
73*9663SMark.Logan@Sun.COM #define  test_nino_al_flag(ni, flag)	 test_nino_flag(ni, AttrList##flag)
74*9663SMark.Logan@Sun.COM #define   set_nino_al_flag(ni, flag)	  set_nino_flag(ni, AttrList##flag)
75*9663SMark.Logan@Sun.COM #define clear_nino_al_flag(ni, flag)	clear_nino_flag(ni, AttrList##flag)
76*9663SMark.Logan@Sun.COM 
77*9663SMark.Logan@Sun.COM #define test_and_set_nino_al_flag(ni, flag)	\
78*9663SMark.Logan@Sun.COM 				 test_and_set_nino_flag(ni, AttrList##flag)
79*9663SMark.Logan@Sun.COM #define test_and_clear_nino_al_flag(ni, flag)	\
80*9663SMark.Logan@Sun.COM 			       test_and_clear_nino_flag(ni, AttrList##flag)
81*9663SMark.Logan@Sun.COM 
82*9663SMark.Logan@Sun.COM #define NInoAttrListDirty(ni)			    test_nino_al_flag(ni, Dirty)
83*9663SMark.Logan@Sun.COM #define NInoAttrListSetDirty(ni)		     set_nino_al_flag(ni, Dirty)
84*9663SMark.Logan@Sun.COM #define NInoAttrListClearDirty(ni)		   clear_nino_al_flag(ni, Dirty)
85*9663SMark.Logan@Sun.COM #define NInoAttrListTestAndSetDirty(ni)	    test_and_set_nino_al_flag(ni, Dirty)
86*9663SMark.Logan@Sun.COM #define NInoAttrListTestAndClearDirty(ni) test_and_clear_nino_al_flag(ni, Dirty)
87*9663SMark.Logan@Sun.COM 
88*9663SMark.Logan@Sun.COM #define NInoFileNameDirty(ni)			\
89*9663SMark.Logan@Sun.COM 					  test_nino_flag(ni, FileNameDirty)
90*9663SMark.Logan@Sun.COM #define NInoFileNameSetDirty(ni)		\
91*9663SMark.Logan@Sun.COM 					   set_nino_flag(ni, FileNameDirty)
92*9663SMark.Logan@Sun.COM #define NInoFileNameClearDirty(ni)		\
93*9663SMark.Logan@Sun.COM 					 clear_nino_flag(ni, FileNameDirty)
94*9663SMark.Logan@Sun.COM #define NInoFileNameTestAndSetDirty(ni)		\
95*9663SMark.Logan@Sun.COM 				  test_and_set_nino_flag(ni, FileNameDirty)
96*9663SMark.Logan@Sun.COM #define NInoFileNameTestAndClearDirty(ni)	\
97*9663SMark.Logan@Sun.COM 				test_and_clear_nino_flag(ni, FileNameDirty)
98*9663SMark.Logan@Sun.COM 
99*9663SMark.Logan@Sun.COM /**
100*9663SMark.Logan@Sun.COM  * struct _ntfs_inode - The NTFS in-memory inode structure.
101*9663SMark.Logan@Sun.COM  *
102*9663SMark.Logan@Sun.COM  * It is just used as an extension to the fields already provided in the VFS
103*9663SMark.Logan@Sun.COM  * inode.
104*9663SMark.Logan@Sun.COM  */
105*9663SMark.Logan@Sun.COM struct _ntfs_inode {
106*9663SMark.Logan@Sun.COM 	u64 mft_no;		/* Inode / mft record number. */
107*9663SMark.Logan@Sun.COM 	MFT_RECORD *mrec;	/* The actual mft record of the inode. */
108*9663SMark.Logan@Sun.COM 	ntfs_volume *vol;	/* Pointer to the ntfs volume of this inode. */
109*9663SMark.Logan@Sun.COM 	unsigned long state;	/* NTFS specific flags describing this inode.
110*9663SMark.Logan@Sun.COM 				   See ntfs_inode_state_bits above. */
111*9663SMark.Logan@Sun.COM 	FILE_ATTR_FLAGS flags;	/* Flags describing the file.
112*9663SMark.Logan@Sun.COM 				   (Copy from STANDARD_INFORMATION) */
113*9663SMark.Logan@Sun.COM 	/*
114*9663SMark.Logan@Sun.COM 	 * Attribute list support (for use by the attribute lookup functions).
115*9663SMark.Logan@Sun.COM 	 * Setup during ntfs_open_inode() for all inodes with attribute lists.
116*9663SMark.Logan@Sun.COM 	 * Only valid if NI_AttrList is set in state.
117*9663SMark.Logan@Sun.COM 	 */
118*9663SMark.Logan@Sun.COM 	u32 attr_list_size;	/* Length of attribute list value in bytes. */
119*9663SMark.Logan@Sun.COM 	u8 *attr_list;		/* Attribute list value itself. */
120*9663SMark.Logan@Sun.COM 	/* Below fields are always valid. */
121*9663SMark.Logan@Sun.COM 	s32 nr_extents;		/* For a base mft record, the number of
122*9663SMark.Logan@Sun.COM 				   attached extent inodes (0 if none), for
123*9663SMark.Logan@Sun.COM 				   extent records this is -1. */
124*9663SMark.Logan@Sun.COM 	union {		/* This union is only used if nr_extents != 0. */
125*9663SMark.Logan@Sun.COM 		ntfs_inode **extent_nis;/* For nr_extents > 0, array of the
126*9663SMark.Logan@Sun.COM 					   ntfs inodes of the extent mft
127*9663SMark.Logan@Sun.COM 					   records belonging to this base
128*9663SMark.Logan@Sun.COM 					   inode which have been loaded. */
129*9663SMark.Logan@Sun.COM 		ntfs_inode *base_ni;	/* For nr_extents == -1, the ntfs
130*9663SMark.Logan@Sun.COM 					   inode of the base mft record. */
131*9663SMark.Logan@Sun.COM 	} u;
132*9663SMark.Logan@Sun.COM 
133*9663SMark.Logan@Sun.COM 	/* Below fields are valid only for base inode. */
134*9663SMark.Logan@Sun.COM 
135*9663SMark.Logan@Sun.COM 	/*
136*9663SMark.Logan@Sun.COM 	 * These two fields are used to sync filename index and guaranteed to be
137*9663SMark.Logan@Sun.COM 	 * correct, however value in index itself maybe wrong (windows itself
138*9663SMark.Logan@Sun.COM 	 * do not update them properly).
139*9663SMark.Logan@Sun.COM 	 */
140*9663SMark.Logan@Sun.COM 	s64 data_size;		/* Data size of unnamed DATA attribute. */
141*9663SMark.Logan@Sun.COM 	s64 allocated_size;	/* Allocated size stored in the filename
142*9663SMark.Logan@Sun.COM 				   index. (NOTE: Equal to allocated size of
143*9663SMark.Logan@Sun.COM 				   the unnamed data attribute for normal or
144*9663SMark.Logan@Sun.COM 				   encrypted files and to compressed size
145*9663SMark.Logan@Sun.COM 				   of the unnamed data attribute for sparse or
146*9663SMark.Logan@Sun.COM 				   compressed files.) */
147*9663SMark.Logan@Sun.COM 
148*9663SMark.Logan@Sun.COM 	/*
149*9663SMark.Logan@Sun.COM 	 * These four fields are copy of relevant fields from
150*9663SMark.Logan@Sun.COM 	 * STANDARD_INFORMATION attribute and used to sync it and FILE_NAME
151*9663SMark.Logan@Sun.COM 	 * attribute in the index.
152*9663SMark.Logan@Sun.COM 	 */
153*9663SMark.Logan@Sun.COM 	time_t creation_time;
154*9663SMark.Logan@Sun.COM 	time_t last_data_change_time;
155*9663SMark.Logan@Sun.COM 	time_t last_mft_change_time;
156*9663SMark.Logan@Sun.COM 	time_t last_access_time;
157*9663SMark.Logan@Sun.COM 
158*9663SMark.Logan@Sun.COM 	/* These 2 fields are used to keep track of opened inodes. */
159*9663SMark.Logan@Sun.COM 	struct list_head list_entry;	/* Keep pointers to the next/prev list
160*9663SMark.Logan@Sun.COM 					   entry. */
161*9663SMark.Logan@Sun.COM 	int nr_references;		/* How many times this inode was
162*9663SMark.Logan@Sun.COM 					   opened.  We really close inode only
163*9663SMark.Logan@Sun.COM 					   when this reaches zero. */
164*9663SMark.Logan@Sun.COM 
165*9663SMark.Logan@Sun.COM 	struct list_head attr_cache;	/* List of opened attributes. */
166*9663SMark.Logan@Sun.COM };
167*9663SMark.Logan@Sun.COM 
168*9663SMark.Logan@Sun.COM extern void __ntfs_inode_add_to_cache(ntfs_inode *ni);
169*9663SMark.Logan@Sun.COM 
170*9663SMark.Logan@Sun.COM extern ntfs_inode *ntfs_inode_allocate(ntfs_volume *vol);
171*9663SMark.Logan@Sun.COM 
172*9663SMark.Logan@Sun.COM extern ntfs_inode *ntfs_inode_open(ntfs_volume *vol, const MFT_REF mref);
173*9663SMark.Logan@Sun.COM 
174*9663SMark.Logan@Sun.COM extern int ntfs_inode_close(ntfs_inode *ni);
175*9663SMark.Logan@Sun.COM 
176*9663SMark.Logan@Sun.COM extern ntfs_inode *ntfs_extent_inode_open(ntfs_inode *base_ni,
177*9663SMark.Logan@Sun.COM 		const leMFT_REF mref);
178*9663SMark.Logan@Sun.COM 
179*9663SMark.Logan@Sun.COM extern int ntfs_inode_attach_all_extents(ntfs_inode *ni);
180*9663SMark.Logan@Sun.COM 
181*9663SMark.Logan@Sun.COM /**
182*9663SMark.Logan@Sun.COM  * ntfs_inode_mark_dirty - set the inode (and its base inode if it exists) dirty
183*9663SMark.Logan@Sun.COM  * @ni:		ntfs inode to set dirty
184*9663SMark.Logan@Sun.COM  *
185*9663SMark.Logan@Sun.COM  * Set the inode @ni dirty so it is written out later (at the latest at
186*9663SMark.Logan@Sun.COM  * ntfs_inode_close() time). If @ni is an extent inode, set the base inode
187*9663SMark.Logan@Sun.COM  * dirty, too.
188*9663SMark.Logan@Sun.COM  *
189*9663SMark.Logan@Sun.COM  * This function cannot fail.
190*9663SMark.Logan@Sun.COM  */
ntfs_inode_mark_dirty(ntfs_inode * ni)191*9663SMark.Logan@Sun.COM static __inline__ void ntfs_inode_mark_dirty(ntfs_inode *ni)
192*9663SMark.Logan@Sun.COM {
193*9663SMark.Logan@Sun.COM 	NInoSetDirty(ni);
194*9663SMark.Logan@Sun.COM 	if (ni->nr_extents == -1)
195*9663SMark.Logan@Sun.COM 		NInoSetDirty(ni->u.base_ni);
196*9663SMark.Logan@Sun.COM }
197*9663SMark.Logan@Sun.COM 
198*9663SMark.Logan@Sun.COM typedef enum {
199*9663SMark.Logan@Sun.COM 	NTFS_UPDATE_ATIME = 1 << 0,
200*9663SMark.Logan@Sun.COM 	NTFS_UPDATE_MTIME = 1 << 1,
201*9663SMark.Logan@Sun.COM 	NTFS_UPDATE_CTIME = 1 << 2,
202*9663SMark.Logan@Sun.COM } ntfs_time_update_flags;
203*9663SMark.Logan@Sun.COM 
204*9663SMark.Logan@Sun.COM extern void ntfs_inode_update_times(ntfs_inode *ni,
205*9663SMark.Logan@Sun.COM 		ntfs_time_update_flags mask);
206*9663SMark.Logan@Sun.COM 
207*9663SMark.Logan@Sun.COM extern int ntfs_inode_sync(ntfs_inode *ni);
208*9663SMark.Logan@Sun.COM 
209*9663SMark.Logan@Sun.COM extern int ntfs_inode_add_attrlist(ntfs_inode *ni);
210*9663SMark.Logan@Sun.COM 
211*9663SMark.Logan@Sun.COM extern int ntfs_inode_free_space(ntfs_inode *ni, int size);
212*9663SMark.Logan@Sun.COM 
213*9663SMark.Logan@Sun.COM extern int ntfs_inode_badclus_bad(u64 mft_no, ATTR_RECORD *a);
214*9663SMark.Logan@Sun.COM 
215*9663SMark.Logan@Sun.COM #endif /* defined _NTFS_INODE_H */
216