Blame view

fs/ntfs/index.h 5.47 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
  /*
   * index.h - Defines for NTFS kernel index handling.  Part of the Linux-NTFS
   *	     project.
   *
   * Copyright (c) 2004 Anton Altaparmakov
   *
   * This program/include file is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License as published
   * by the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   *
   * This program/include file is distributed in the hope that it will be
   * useful, but WITHOUT ANY WARRANTY; without even the implied warranty
   * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program (in the main directory of the Linux-NTFS
   * distribution in the file COPYING); if not, write to the Free Software
   * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   */
  
  #ifndef _LINUX_NTFS_INDEX_H
  #define _LINUX_NTFS_INDEX_H
  
  #include <linux/fs.h>
  
  #include "types.h"
  #include "layout.h"
  #include "inode.h"
  #include "attrib.h"
  #include "mft.h"
  #include "aops.h"
  
  /**
   * @idx_ni:	index inode containing the @entry described by this context
   * @entry:	index entry (points into @ir or @ia)
   * @data:	index entry data (points into @entry)
   * @data_len:	length in bytes of @data
c49c31115   Richard Knutsson   [PATCH] fs/ntfs: ...
40
   * @is_in_root:	'true' if @entry is in @ir and 'false' if it is in @ia
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
41
42
43
   * @ir:		index root if @is_in_root and NULL otherwise
   * @actx:	attribute search context if @is_in_root and NULL otherwise
   * @base_ni:	base inode if @is_in_root and NULL otherwise
c49c31115   Richard Knutsson   [PATCH] fs/ntfs: ...
44
45
   * @ia:		index block if @is_in_root is 'false' and NULL otherwise
   * @page:	page if @is_in_root is 'false' and NULL otherwise
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
46
47
48
49
50
51
52
   *
   * @idx_ni is the index inode this context belongs to.
   *
   * @entry is the index entry described by this context.  @data and @data_len
   * are the index entry data and its length in bytes, respectively.  @data
   * simply points into @entry.  This is probably what the user is interested in.
   *
c49c31115   Richard Knutsson   [PATCH] fs/ntfs: ...
53
   * If @is_in_root is 'true', @entry is in the index root attribute @ir described
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
55
56
   * by the attribute search context @actx and the base inode @base_ni.  @ia and
   * @page are NULL in this case.
   *
c49c31115   Richard Knutsson   [PATCH] fs/ntfs: ...
57
   * If @is_in_root is 'false', @entry is in the index allocation attribute and @ia
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
   * and @page point to the index allocation block and the mapped, locked page it
   * is in, respectively.  @ir, @actx and @base_ni are NULL in this case.
   *
   * To obtain a context call ntfs_index_ctx_get().
   *
   * We use this context to allow ntfs_index_lookup() to return the found index
   * @entry and its @data without having to allocate a buffer and copy the @entry
   * and/or its @data into it.
   *
   * When finished with the @entry and its @data, call ntfs_index_ctx_put() to
   * free the context and other associated resources.
   *
   * If the index entry was modified, call flush_dcache_index_entry_page()
   * immediately after the modification and either ntfs_index_entry_mark_dirty()
   * or ntfs_index_entry_write() before the call to ntfs_index_ctx_put() to
   * ensure that the changes are written to disk.
   */
  typedef struct {
  	ntfs_inode *idx_ni;
  	INDEX_ENTRY *entry;
  	void *data;
  	u16 data_len;
c49c31115   Richard Knutsson   [PATCH] fs/ntfs: ...
80
  	bool is_in_root;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
  	INDEX_ROOT *ir;
  	ntfs_attr_search_ctx *actx;
  	ntfs_inode *base_ni;
  	INDEX_ALLOCATION *ia;
  	struct page *page;
  } ntfs_index_context;
  
  extern ntfs_index_context *ntfs_index_ctx_get(ntfs_inode *idx_ni);
  extern void ntfs_index_ctx_put(ntfs_index_context *ictx);
  
  extern int ntfs_index_lookup(const void *key, const int key_len,
  		ntfs_index_context *ictx);
  
  #ifdef NTFS_RW
  
  /**
   * ntfs_index_entry_flush_dcache_page - flush_dcache_page() for index entries
   * @ictx:	ntfs index context describing the index entry
   *
   * Call flush_dcache_page() for the page in which an index entry resides.
   *
   * This must be called every time an index entry is modified, just after the
   * modification.
   *
   * If the index entry is in the index root attribute, simply flush the page
   * containing the mft record containing the index root attribute.
   *
   * If the index entry is in an index block belonging to the index allocation
   * attribute, simply flush the page cache page containing the index block.
   */
  static inline void ntfs_index_entry_flush_dcache_page(ntfs_index_context *ictx)
  {
  	if (ictx->is_in_root)
  		flush_dcache_mft_record_page(ictx->actx->ntfs_ino);
  	else
  		flush_dcache_page(ictx->page);
  }
  
  /**
   * ntfs_index_entry_mark_dirty - mark an index entry dirty
   * @ictx:	ntfs index context describing the index entry
   *
   * Mark the index entry described by the index entry context @ictx dirty.
   *
   * If the index entry is in the index root attribute, simply mark the mft
   * record containing the index root attribute dirty.  This ensures the mft
   * record, and hence the index root attribute, will be written out to disk
   * later.
   *
   * If the index entry is in an index block belonging to the index allocation
   * attribute, mark the buffers belonging to the index record as well as the
   * page cache page the index block is in dirty.  This automatically marks the
   * VFS inode of the ntfs index inode to which the index entry belongs dirty,
   * too (I_DIRTY_PAGES) and this in turn ensures the page buffers, and hence the
   * dirty index block, will be written out to disk later.
   */
  static inline void ntfs_index_entry_mark_dirty(ntfs_index_context *ictx)
  {
  	if (ictx->is_in_root)
  		mark_mft_record_dirty(ictx->actx->ntfs_ino);
  	else
  		mark_ntfs_record_dirty(ictx->page,
  				(u8*)ictx->ia - (u8*)page_address(ictx->page));
  }
  
  #endif /* NTFS_RW */
  
  #endif /* _LINUX_NTFS_INDEX_H */