1 /*        $NetBSD: ntfs_inode.h,v 1.10 2024/12/05 21:24:38 andvar Exp $         */
2 
3 /*-
4  * Copyright (c) 1998, 1999 Semen Ustimenko
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  *
28  *        Id: ntfs_inode.h,v 1.4 1999/05/12 09:43:00 semenu Exp
29  */
30 
31 #ifndef _NTFS_NTFS_INODE_H_
32 #define _NTFS_NTFS_INODE_H_
33 #include <miscfs/genfs/genfs_node.h>
34 
35 /* These flags are kept in i_flag. */
36 #define   IN_ACCESS 0x0001    /* Access time update request. */
37 #define   IN_CHANGE 0x0002    /* Inode change time update request. */
38 #define   IN_EXLOCK 0x0004    /* File has exclusive lock. */
39 #define   IN_LOCKED 0x0008    /* Inode lock. */
40 #define   IN_LWAIT  0x0010    /* Process waiting on file lock. */
41 #define   IN_MODIFIED         0x0020    /* Inode has been modified. */
42 #define   IN_RENAME 0x0040    /* Inode is being renamed. */
43 #define   IN_SHLOCK 0x0080    /* File has shared lock. */
44 #define   IN_UPDATE 0x0100    /* Modification time update request. */
45 #define   IN_WANTED 0x0200    /* Inode is wanted by a process. */
46 #define   IN_RECURSE          0x0400    /* Recursion expected */
47 
48 #define   IN_HASHED 0x0800    /* Inode is on hash list */
49 #define   IN_LOADED 0x8000    /* ntvattrs loaded */
50 #define   IN_PRELOADED        0x4000    /* loaded from directory entry */
51 
52 struct ntnode {
53           struct vnode   *i_devvp;      /* vnode of blk dev we live on */
54           dev_t           i_dev;                  /* Device associated with the inode. */
55 
56           LIST_ENTRY(ntnode)  i_hash;
57           struct ntfsmount       *i_mp;
58           ino_t           i_number;
59           u_int32_t       i_flag;
60 
61           /* locking */
62           kcondvar_t          i_lock;
63           kmutex_t  i_interlock;
64           int                 i_usecount;
65           int                 i_busy;
66 
67           LIST_HEAD(,ntvattr) i_valist;
68 
69           long                i_nlink;  /* MFR */
70           ino_t               i_mainrec;          /* MFR */
71           u_int32_t i_frflag; /* MFR */
72 };
73 
74 #define NTKEY_SIZE(attrlen) (sizeof(struct ntkey) + (attrlen))
75 struct ntkey {
76           ino_t               k_ino;              /* Inode number of ntnode. */
77           u_int32_t k_attrtype;         /* Attribute type. */
78           char                k_attrname[1];      /* Attribute name (variable length). */
79 } __packed;
80 
81 struct fnode {
82           struct genfs_node f_gnode;
83 
84           LIST_ENTRY(fnode) f_fnlist;
85           struct vnode   *f_vp;                   /* Associated vnode */
86           struct ntnode  *f_ip;                   /* Associated ntnode */
87 
88           ntfs_times_t        f_times;  /* $NAME/dirinfo */
89           ino_t               f_pnumber;          /* $NAME/dirinfo */
90           u_int32_t       f_fflag;      /* $NAME/dirinfo */
91           u_int64_t f_size;             /* defattr/dirinfo: */
92           u_int64_t f_allocated;        /* defattr/dirinfo */
93 
94           struct ntkey   *f_key;
95           struct ntkey        f_smallkey;
96 #define f_ino f_key->k_ino
97 #define f_attrtype f_key->k_attrtype
98 #define f_attrname f_key->k_attrname
99 
100           /* for ntreaddir */
101           u_int32_t       f_lastdattr;
102           u_int32_t       f_lastdblnum;
103           u_int32_t       f_lastdoff;
104           u_int32_t       f_lastdnum;
105           void *        f_dirblbuf;
106           u_int32_t       f_dirblsz;
107 };
108 
109 /* This overlays the fid structure (see <sys/mount.h>) */
110 struct ntfid {
111           u_int16_t ntfid_len;          /* Length of structure. */
112           u_int16_t ntfid_pad;          /* Force 32-bit alignment. */
113           ino_t     ntfid_ino;          /* File number (ino). */
114           u_int8_t  ntfid_attr;         /* Attribute identifier */
115 #ifdef notyet
116           int32_t   ntfid_gen;          /* Generation number. */
117 #endif
118 };
119 #endif /* _NTFS_NTFS_INODE_H_ */
120