Blame view

fs/inode.c 42.9 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
   * (C) 1997 Linus Torvalds
4b4563dc8   Christoph Hellwig   fs: cosmetic inod...
3
   * (C) 1999 Andrea Arcangeli <andrea@suse.de> (dynamic inode allocation)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5
6
7
8
  #include <linux/fs.h>
  #include <linux/mm.h>
  #include <linux/dcache.h>
  #include <linux/init.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
9
10
11
12
13
  #include <linux/slab.h>
  #include <linux/writeback.h>
  #include <linux/module.h>
  #include <linux/backing-dev.h>
  #include <linux/wait.h>
88e0fbc45   Nick Piggin   fs: turn iprune_m...
14
  #include <linux/rwsem.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
15
16
17
18
19
20
  #include <linux/hash.h>
  #include <linux/swap.h>
  #include <linux/security.h>
  #include <linux/pagemap.h>
  #include <linux/cdev.h>
  #include <linux/bootmem.h>
3be25f49b   Eric Paris   fsnotify: add mar...
21
  #include <linux/fsnotify.h>
fc33a7bb9   Christoph Hellwig   [PATCH] per-mount...
22
  #include <linux/mount.h>
efaee1920   Arjan van de Ven   async: make the f...
23
  #include <linux/async.h>
f19d4a8fa   Al Viro   add caching of AC...
24
  #include <linux/posix_acl.h>
9ce6e0be0   Heiko Carstens   fs: add missing p...
25
  #include <linux/prefetch.h>
a178d2027   Eric Paris   IMA: move read co...
26
  #include <linux/ima.h>
e795b7179   Serge E. Hallyn   userns: userns: c...
27
  #include <linux/cred.h>
4b4563dc8   Christoph Hellwig   fs: cosmetic inod...
28
  #include <linux/buffer_head.h> /* for inode_has_buffers */
a66979aba   Dave Chinner   fs: move i_wb_lis...
29
  #include "internal.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
31
  
  /*
4b4563dc8   Christoph Hellwig   fs: cosmetic inod...
32
   * Inode locking rules:
250df6ed2   Dave Chinner   fs: protect inode...
33
34
35
   *
   * inode->i_lock protects:
   *   inode->i_state, inode->i_hash, __iget()
09cc9fc7a   Dave Chinner   inode: move to pe...
36
   * inode->i_sb->s_inode_lru_lock protects:
98b745c64   Dave Chinner   inode: Make unuse...
37
   *   inode->i_sb->s_inode_lru, inode->i_lru
55fa6091d   Dave Chinner   fs: move i_sb_lis...
38
39
   * inode_sb_list_lock protects:
   *   sb->s_inodes, inode->i_sb_list
f758eeabe   Christoph Hellwig   writeback: split ...
40
   * bdi->wb.list_lock protects:
a66979aba   Dave Chinner   fs: move i_wb_lis...
41
   *   bdi->wb.b_{dirty,io,more_io}, inode->i_wb_list
67a23c494   Dave Chinner   fs: rename inode_...
42
43
   * inode_hash_lock protects:
   *   inode_hashtable, inode->i_hash
250df6ed2   Dave Chinner   fs: protect inode...
44
45
   *
   * Lock ordering:
55fa6091d   Dave Chinner   fs: move i_sb_lis...
46
47
48
   *
   * inode_sb_list_lock
   *   inode->i_lock
09cc9fc7a   Dave Chinner   inode: move to pe...
49
   *     inode->i_sb->s_inode_lru_lock
a66979aba   Dave Chinner   fs: move i_wb_lis...
50
   *
f758eeabe   Christoph Hellwig   writeback: split ...
51
   * bdi->wb.list_lock
a66979aba   Dave Chinner   fs: move i_wb_lis...
52
   *   inode->i_lock
67a23c494   Dave Chinner   fs: rename inode_...
53
54
55
56
57
58
59
   *
   * inode_hash_lock
   *   inode_sb_list_lock
   *   inode->i_lock
   *
   * iunique_lock
   *   inode_hash_lock
250df6ed2   Dave Chinner   fs: protect inode...
60
   */
fa3536cc1   Eric Dumazet   [PATCH] Use __rea...
61
62
  static unsigned int i_hash_mask __read_mostly;
  static unsigned int i_hash_shift __read_mostly;
67a23c494   Dave Chinner   fs: rename inode_...
63
64
  static struct hlist_head *inode_hashtable __read_mostly;
  static __cacheline_aligned_in_smp DEFINE_SPINLOCK(inode_hash_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
65

55fa6091d   Dave Chinner   fs: move i_sb_lis...
66
  __cacheline_aligned_in_smp DEFINE_SPINLOCK(inode_sb_list_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
67
  /*
7dcda1c96   Jens Axboe   fs: export empty_...
68
69
70
71
72
73
74
75
   * Empty aops. Can be used for the cases where the user does not
   * define any of the address_space operations.
   */
  const struct address_space_operations empty_aops = {
  };
  EXPORT_SYMBOL(empty_aops);
  
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
76
77
78
   * Statistics gathering..
   */
  struct inodes_stat_t inodes_stat;
3e880fb5e   Nick Piggin   fs: use fast coun...
79
  static DEFINE_PER_CPU(unsigned int, nr_inodes);
fcb94f72d   Dave Chinner   inode: convert in...
80
  static DEFINE_PER_CPU(unsigned int, nr_unused);
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
81

6b3304b53   Manish Katiyar   Make checkpatch.p...
82
  static struct kmem_cache *inode_cachep __read_mostly;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
83

3e880fb5e   Nick Piggin   fs: use fast coun...
84
  static int get_nr_inodes(void)
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
85
  {
3e880fb5e   Nick Piggin   fs: use fast coun...
86
87
88
89
90
  	int i;
  	int sum = 0;
  	for_each_possible_cpu(i)
  		sum += per_cpu(nr_inodes, i);
  	return sum < 0 ? 0 : sum;
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
91
92
93
94
  }
  
  static inline int get_nr_inodes_unused(void)
  {
fcb94f72d   Dave Chinner   inode: convert in...
95
96
97
98
99
  	int i;
  	int sum = 0;
  	for_each_possible_cpu(i)
  		sum += per_cpu(nr_unused, i);
  	return sum < 0 ? 0 : sum;
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
100
101
102
103
  }
  
  int get_nr_dirty_inodes(void)
  {
3e880fb5e   Nick Piggin   fs: use fast coun...
104
  	/* not actually dirty inodes, but a wild approximation */
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
105
106
  	int nr_dirty = get_nr_inodes() - get_nr_inodes_unused();
  	return nr_dirty > 0 ? nr_dirty : 0;
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
107
108
109
110
111
112
113
114
115
116
  }
  
  /*
   * Handle nr_inode sysctl
   */
  #ifdef CONFIG_SYSCTL
  int proc_nr_inodes(ctl_table *table, int write,
  		   void __user *buffer, size_t *lenp, loff_t *ppos)
  {
  	inodes_stat.nr_inodes = get_nr_inodes();
fcb94f72d   Dave Chinner   inode: convert in...
117
  	inodes_stat.nr_unused = get_nr_inodes_unused();
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
118
119
120
  	return proc_dointvec(table, write, buffer, lenp, ppos);
  }
  #endif
2cb1599f9   David Chinner   Inode: Allow exte...
121
122
  /**
   * inode_init_always - perform inode structure intialisation
0bc02f3fa   Randy Dunlap   fs/inode: fix ker...
123
124
   * @sb: superblock inode belongs to
   * @inode: inode to initialise
2cb1599f9   David Chinner   Inode: Allow exte...
125
126
127
128
   *
   * These are initializations that need to be done on every inode
   * allocation as the fields are not initialised by slab allocation.
   */
54e346215   Christoph Hellwig   vfs: fix inode_in...
129
  int inode_init_always(struct super_block *sb, struct inode *inode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
130
  {
6e1d5dcc2   Alexey Dobriyan   const: mark remai...
131
  	static const struct inode_operations empty_iops;
99ac48f54   Arjan van de Ven   [PATCH] mark f_op...
132
  	static const struct file_operations empty_fops;
6b3304b53   Manish Katiyar   Make checkpatch.p...
133
  	struct address_space *const mapping = &inode->i_data;
2cb1599f9   David Chinner   Inode: Allow exte...
134
135
136
137
138
139
140
  
  	inode->i_sb = sb;
  	inode->i_blkbits = sb->s_blocksize_bits;
  	inode->i_flags = 0;
  	atomic_set(&inode->i_count, 1);
  	inode->i_op = &empty_iops;
  	inode->i_fop = &empty_fops;
a78ef704a   Miklos Szeredi   vfs: protect i_nlink
141
  	inode->__i_nlink = 1;
3ddcd0569   Linus Torvalds   vfs: optimize ino...
142
  	inode->i_opflags = 0;
56ff5efad   Al Viro   zero i_uid/i_gid ...
143
144
  	inode->i_uid = 0;
  	inode->i_gid = 0;
2cb1599f9   David Chinner   Inode: Allow exte...
145
146
147
148
149
  	atomic_set(&inode->i_writecount, 0);
  	inode->i_size = 0;
  	inode->i_blocks = 0;
  	inode->i_bytes = 0;
  	inode->i_generation = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
150
  #ifdef CONFIG_QUOTA
2cb1599f9   David Chinner   Inode: Allow exte...
151
  	memset(&inode->i_dquot, 0, sizeof(inode->i_dquot));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
152
  #endif
2cb1599f9   David Chinner   Inode: Allow exte...
153
154
155
156
157
  	inode->i_pipe = NULL;
  	inode->i_bdev = NULL;
  	inode->i_cdev = NULL;
  	inode->i_rdev = 0;
  	inode->dirtied_when = 0;
6146f0d5e   Mimi Zohar   integrity: IMA hooks
158
159
  
  	if (security_inode_alloc(inode))
54e346215   Christoph Hellwig   vfs: fix inode_in...
160
  		goto out;
2cb1599f9   David Chinner   Inode: Allow exte...
161
162
163
164
165
  	spin_lock_init(&inode->i_lock);
  	lockdep_set_class(&inode->i_lock, &sb->s_type->i_lock_key);
  
  	mutex_init(&inode->i_mutex);
  	lockdep_set_class(&inode->i_mutex, &sb->s_type->i_mutex_key);
bd5fe6c5e   Christoph Hellwig   fs: kill i_alloc_sem
166
  	atomic_set(&inode->i_dio_count, 0);
2cb1599f9   David Chinner   Inode: Allow exte...
167
168
169
170
  
  	mapping->a_ops = &empty_aops;
  	mapping->host = inode;
  	mapping->flags = 0;
3c1d43787   Hugh Dickins   mm: remove GFP_HI...
171
  	mapping_set_gfp_mask(mapping, GFP_HIGHUSER_MOVABLE);
2cb1599f9   David Chinner   Inode: Allow exte...
172
173
174
175
176
177
178
179
180
181
182
  	mapping->assoc_mapping = NULL;
  	mapping->backing_dev_info = &default_backing_dev_info;
  	mapping->writeback_index = 0;
  
  	/*
  	 * If the block_device provides a backing_dev_info for client
  	 * inodes then use that.  Otherwise the inode share the bdev's
  	 * backing_dev_info.
  	 */
  	if (sb->s_bdev) {
  		struct backing_dev_info *bdi;
2c96ce9f2   Jens Axboe   fs: remove bdev->...
183
  		bdi = sb->s_bdev->bd_inode->i_mapping->backing_dev_info;
2cb1599f9   David Chinner   Inode: Allow exte...
184
185
186
187
  		mapping->backing_dev_info = bdi;
  	}
  	inode->i_private = NULL;
  	inode->i_mapping = mapping;
f19d4a8fa   Al Viro   add caching of AC...
188
189
190
  #ifdef CONFIG_FS_POSIX_ACL
  	inode->i_acl = inode->i_default_acl = ACL_NOT_CACHED;
  #endif
2cb1599f9   David Chinner   Inode: Allow exte...
191

3be25f49b   Eric Paris   fsnotify: add mar...
192
193
194
  #ifdef CONFIG_FSNOTIFY
  	inode->i_fsnotify_mask = 0;
  #endif
3e880fb5e   Nick Piggin   fs: use fast coun...
195
  	this_cpu_inc(nr_inodes);
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
196

54e346215   Christoph Hellwig   vfs: fix inode_in...
197
  	return 0;
54e346215   Christoph Hellwig   vfs: fix inode_in...
198
199
  out:
  	return -ENOMEM;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
200
  }
2cb1599f9   David Chinner   Inode: Allow exte...
201
202
203
204
205
206
207
208
209
210
  EXPORT_SYMBOL(inode_init_always);
  
  static struct inode *alloc_inode(struct super_block *sb)
  {
  	struct inode *inode;
  
  	if (sb->s_op->alloc_inode)
  		inode = sb->s_op->alloc_inode(sb);
  	else
  		inode = kmem_cache_alloc(inode_cachep, GFP_KERNEL);
54e346215   Christoph Hellwig   vfs: fix inode_in...
211
212
213
214
215
216
217
218
219
220
221
222
  	if (!inode)
  		return NULL;
  
  	if (unlikely(inode_init_always(sb, inode))) {
  		if (inode->i_sb->s_op->destroy_inode)
  			inode->i_sb->s_op->destroy_inode(inode);
  		else
  			kmem_cache_free(inode_cachep, inode);
  		return NULL;
  	}
  
  	return inode;
2cb1599f9   David Chinner   Inode: Allow exte...
223
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
224

ff0c7d15f   Nick Piggin   fs: avoid inode R...
225
226
227
228
229
  void free_inode_nonrcu(struct inode *inode)
  {
  	kmem_cache_free(inode_cachep, inode);
  }
  EXPORT_SYMBOL(free_inode_nonrcu);
2e00c97e2   Christoph Hellwig   vfs: add __destro...
230
  void __destroy_inode(struct inode *inode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
231
  {
b7542f8c7   Eric Sesterhenn   BUG_ON() Conversi...
232
  	BUG_ON(inode_has_buffers(inode));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
233
  	security_inode_free(inode);
3be25f49b   Eric Paris   fsnotify: add mar...
234
  	fsnotify_inode_delete(inode);
f19d4a8fa   Al Viro   add caching of AC...
235
236
237
238
239
240
  #ifdef CONFIG_FS_POSIX_ACL
  	if (inode->i_acl && inode->i_acl != ACL_NOT_CACHED)
  		posix_acl_release(inode->i_acl);
  	if (inode->i_default_acl && inode->i_default_acl != ACL_NOT_CACHED)
  		posix_acl_release(inode->i_default_acl);
  #endif
3e880fb5e   Nick Piggin   fs: use fast coun...
241
  	this_cpu_dec(nr_inodes);
2e00c97e2   Christoph Hellwig   vfs: add __destro...
242
243
  }
  EXPORT_SYMBOL(__destroy_inode);
fa0d7e3de   Nick Piggin   fs: icache RCU fr...
244
245
246
247
248
249
  static void i_callback(struct rcu_head *head)
  {
  	struct inode *inode = container_of(head, struct inode, i_rcu);
  	INIT_LIST_HEAD(&inode->i_dentry);
  	kmem_cache_free(inode_cachep, inode);
  }
56b0dacfa   Christoph Hellwig   fs: mark destroy_...
250
  static void destroy_inode(struct inode *inode)
2e00c97e2   Christoph Hellwig   vfs: add __destro...
251
  {
7ccf19a80   Nick Piggin   fs: inode split I...
252
  	BUG_ON(!list_empty(&inode->i_lru));
2e00c97e2   Christoph Hellwig   vfs: add __destro...
253
  	__destroy_inode(inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
254
255
256
  	if (inode->i_sb->s_op->destroy_inode)
  		inode->i_sb->s_op->destroy_inode(inode);
  	else
fa0d7e3de   Nick Piggin   fs: icache RCU fr...
257
  		call_rcu(&inode->i_rcu, i_callback);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
258
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
259

2aa15890f   Miklos Szeredi   mm: prevent concu...
260
261
262
263
264
  void address_space_init_once(struct address_space *mapping)
  {
  	memset(mapping, 0, sizeof(*mapping));
  	INIT_RADIX_TREE(&mapping->page_tree, GFP_ATOMIC);
  	spin_lock_init(&mapping->tree_lock);
3d48ae45e   Peter Zijlstra   mm: Convert i_mma...
265
  	mutex_init(&mapping->i_mmap_mutex);
2aa15890f   Miklos Szeredi   mm: prevent concu...
266
267
268
269
  	INIT_LIST_HEAD(&mapping->private_list);
  	spin_lock_init(&mapping->private_lock);
  	INIT_RAW_PRIO_TREE_ROOT(&mapping->i_mmap);
  	INIT_LIST_HEAD(&mapping->i_mmap_nonlinear);
2aa15890f   Miklos Szeredi   mm: prevent concu...
270
271
  }
  EXPORT_SYMBOL(address_space_init_once);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
272
273
274
275
276
277
278
279
280
281
282
  /*
   * These are initializations that only need to be done
   * once, because the fields are idempotent across use
   * of the inode, so let the slab aware of that.
   */
  void inode_init_once(struct inode *inode)
  {
  	memset(inode, 0, sizeof(*inode));
  	INIT_HLIST_NODE(&inode->i_hash);
  	INIT_LIST_HEAD(&inode->i_dentry);
  	INIT_LIST_HEAD(&inode->i_devices);
7ccf19a80   Nick Piggin   fs: inode split I...
283
284
  	INIT_LIST_HEAD(&inode->i_wb_list);
  	INIT_LIST_HEAD(&inode->i_lru);
2aa15890f   Miklos Szeredi   mm: prevent concu...
285
  	address_space_init_once(&inode->i_data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
286
  	i_size_ordered_init(inode);
3be25f49b   Eric Paris   fsnotify: add mar...
287
  #ifdef CONFIG_FSNOTIFY
e61ce8673   Eric Paris   fsnotify: rename ...
288
  	INIT_HLIST_HEAD(&inode->i_fsnotify_marks);
3be25f49b   Eric Paris   fsnotify: add mar...
289
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
290
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
291
  EXPORT_SYMBOL(inode_init_once);
51cc50685   Alexey Dobriyan   SL*B: drop kmem c...
292
  static void init_once(void *foo)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
293
  {
6b3304b53   Manish Katiyar   Make checkpatch.p...
294
  	struct inode *inode = (struct inode *) foo;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
295

a35afb830   Christoph Lameter   Remove SLAB_CTOR_...
296
  	inode_init_once(inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
297
298
299
  }
  
  /*
250df6ed2   Dave Chinner   fs: protect inode...
300
   * inode->i_lock must be held
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
301
   */
6b3304b53   Manish Katiyar   Make checkpatch.p...
302
  void __iget(struct inode *inode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
303
  {
9e38d86ff   Nick Piggin   fs: Implement laz...
304
305
  	atomic_inc(&inode->i_count);
  }
2e147f1ef   Richard Kennedy   fs: inode.c use a...
306

7de9c6ee3   Al Viro   new helper: ihold()
307
308
309
310
311
312
313
314
  /*
   * get additional reference to inode; caller must already hold one.
   */
  void ihold(struct inode *inode)
  {
  	WARN_ON(atomic_inc_return(&inode->i_count) < 2);
  }
  EXPORT_SYMBOL(ihold);
9e38d86ff   Nick Piggin   fs: Implement laz...
315
316
  static void inode_lru_list_add(struct inode *inode)
  {
09cc9fc7a   Dave Chinner   inode: move to pe...
317
  	spin_lock(&inode->i_sb->s_inode_lru_lock);
7ccf19a80   Nick Piggin   fs: inode split I...
318
  	if (list_empty(&inode->i_lru)) {
98b745c64   Dave Chinner   inode: Make unuse...
319
320
  		list_add(&inode->i_lru, &inode->i_sb->s_inode_lru);
  		inode->i_sb->s_nr_inodes_unused++;
fcb94f72d   Dave Chinner   inode: convert in...
321
  		this_cpu_inc(nr_unused);
9e38d86ff   Nick Piggin   fs: Implement laz...
322
  	}
09cc9fc7a   Dave Chinner   inode: move to pe...
323
  	spin_unlock(&inode->i_sb->s_inode_lru_lock);
9e38d86ff   Nick Piggin   fs: Implement laz...
324
  }
2e147f1ef   Richard Kennedy   fs: inode.c use a...
325

9e38d86ff   Nick Piggin   fs: Implement laz...
326
327
  static void inode_lru_list_del(struct inode *inode)
  {
09cc9fc7a   Dave Chinner   inode: move to pe...
328
  	spin_lock(&inode->i_sb->s_inode_lru_lock);
7ccf19a80   Nick Piggin   fs: inode split I...
329
330
  	if (!list_empty(&inode->i_lru)) {
  		list_del_init(&inode->i_lru);
98b745c64   Dave Chinner   inode: Make unuse...
331
  		inode->i_sb->s_nr_inodes_unused--;
fcb94f72d   Dave Chinner   inode: convert in...
332
  		this_cpu_dec(nr_unused);
9e38d86ff   Nick Piggin   fs: Implement laz...
333
  	}
09cc9fc7a   Dave Chinner   inode: move to pe...
334
  	spin_unlock(&inode->i_sb->s_inode_lru_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
335
  }
646ec4615   Christoph Hellwig   fs: remove inode_...
336
337
338
339
340
341
  /**
   * inode_sb_list_add - add inode to the superblock list of inodes
   * @inode: inode to add
   */
  void inode_sb_list_add(struct inode *inode)
  {
55fa6091d   Dave Chinner   fs: move i_sb_lis...
342
343
344
  	spin_lock(&inode_sb_list_lock);
  	list_add(&inode->i_sb_list, &inode->i_sb->s_inodes);
  	spin_unlock(&inode_sb_list_lock);
646ec4615   Christoph Hellwig   fs: remove inode_...
345
346
  }
  EXPORT_SYMBOL_GPL(inode_sb_list_add);
55fa6091d   Dave Chinner   fs: move i_sb_lis...
347
  static inline void inode_sb_list_del(struct inode *inode)
646ec4615   Christoph Hellwig   fs: remove inode_...
348
  {
a209dfc7b   Eric Dumazet   vfs: dont chain p...
349
350
351
352
353
  	if (!list_empty(&inode->i_sb_list)) {
  		spin_lock(&inode_sb_list_lock);
  		list_del_init(&inode->i_sb_list);
  		spin_unlock(&inode_sb_list_lock);
  	}
646ec4615   Christoph Hellwig   fs: remove inode_...
354
  }
4c51acbc6   Dave Chinner   fs: Factor inode ...
355
356
357
358
359
360
  static unsigned long hash(struct super_block *sb, unsigned long hashval)
  {
  	unsigned long tmp;
  
  	tmp = (hashval * (unsigned long)sb) ^ (GOLDEN_RATIO_PRIME + hashval) /
  			L1_CACHE_BYTES;
4b4563dc8   Christoph Hellwig   fs: cosmetic inod...
361
362
  	tmp = tmp ^ ((tmp ^ GOLDEN_RATIO_PRIME) >> i_hash_shift);
  	return tmp & i_hash_mask;
4c51acbc6   Dave Chinner   fs: Factor inode ...
363
364
365
366
367
368
369
370
371
372
373
374
  }
  
  /**
   *	__insert_inode_hash - hash an inode
   *	@inode: unhashed inode
   *	@hashval: unsigned long value used to locate this object in the
   *		inode_hashtable.
   *
   *	Add an inode to the inode hash for this superblock.
   */
  void __insert_inode_hash(struct inode *inode, unsigned long hashval)
  {
646ec4615   Christoph Hellwig   fs: remove inode_...
375
  	struct hlist_head *b = inode_hashtable + hash(inode->i_sb, hashval);
67a23c494   Dave Chinner   fs: rename inode_...
376
  	spin_lock(&inode_hash_lock);
250df6ed2   Dave Chinner   fs: protect inode...
377
  	spin_lock(&inode->i_lock);
646ec4615   Christoph Hellwig   fs: remove inode_...
378
  	hlist_add_head(&inode->i_hash, b);
250df6ed2   Dave Chinner   fs: protect inode...
379
  	spin_unlock(&inode->i_lock);
67a23c494   Dave Chinner   fs: rename inode_...
380
  	spin_unlock(&inode_hash_lock);
4c51acbc6   Dave Chinner   fs: Factor inode ...
381
382
383
384
  }
  EXPORT_SYMBOL(__insert_inode_hash);
  
  /**
f2ee7abf4   Eric Dumazet   vfs: avoid taking...
385
   *	__remove_inode_hash - remove an inode from the hash
4c51acbc6   Dave Chinner   fs: Factor inode ...
386
387
388
389
   *	@inode: inode to unhash
   *
   *	Remove an inode from the superblock.
   */
f2ee7abf4   Eric Dumazet   vfs: avoid taking...
390
  void __remove_inode_hash(struct inode *inode)
4c51acbc6   Dave Chinner   fs: Factor inode ...
391
  {
67a23c494   Dave Chinner   fs: rename inode_...
392
  	spin_lock(&inode_hash_lock);
250df6ed2   Dave Chinner   fs: protect inode...
393
  	spin_lock(&inode->i_lock);
4c51acbc6   Dave Chinner   fs: Factor inode ...
394
  	hlist_del_init(&inode->i_hash);
250df6ed2   Dave Chinner   fs: protect inode...
395
  	spin_unlock(&inode->i_lock);
67a23c494   Dave Chinner   fs: rename inode_...
396
  	spin_unlock(&inode_hash_lock);
4c51acbc6   Dave Chinner   fs: Factor inode ...
397
  }
f2ee7abf4   Eric Dumazet   vfs: avoid taking...
398
  EXPORT_SYMBOL(__remove_inode_hash);
4c51acbc6   Dave Chinner   fs: Factor inode ...
399

b0683aa63   Al Viro   new helper: end_w...
400
401
402
  void end_writeback(struct inode *inode)
  {
  	might_sleep();
08142579b   Jan Kara   mm: fix assertion...
403
404
405
406
407
408
  	/*
  	 * We have to cycle tree_lock here because reclaim can be still in the
  	 * process of removing the last page (in __delete_from_page_cache())
  	 * and we must not free mapping under it.
  	 */
  	spin_lock_irq(&inode->i_data.tree_lock);
b0683aa63   Al Viro   new helper: end_w...
409
  	BUG_ON(inode->i_data.nrpages);
08142579b   Jan Kara   mm: fix assertion...
410
  	spin_unlock_irq(&inode->i_data.tree_lock);
b0683aa63   Al Viro   new helper: end_w...
411
412
413
414
  	BUG_ON(!list_empty(&inode->i_data.private_list));
  	BUG_ON(!(inode->i_state & I_FREEING));
  	BUG_ON(inode->i_state & I_CLEAR);
  	inode_sync_wait(inode);
fa0d7e3de   Nick Piggin   fs: icache RCU fr...
415
  	/* don't need i_lock here, no concurrent mods to i_state */
b0683aa63   Al Viro   new helper: end_w...
416
417
418
  	inode->i_state = I_FREEING | I_CLEAR;
  }
  EXPORT_SYMBOL(end_writeback);
b2b2af8e6   Dave Chinner   fs: factor inode ...
419
420
421
422
423
424
425
426
427
428
429
430
431
  /*
   * Free the inode passed in, removing it from the lists it is still connected
   * to. We remove any pages still attached to the inode and wait for any IO that
   * is still in progress before finally destroying the inode.
   *
   * An inode must already be marked I_FREEING so that we avoid the inode being
   * moved back onto lists if we race with other code that manipulates the lists
   * (e.g. writeback_single_inode). The caller is responsible for setting this.
   *
   * An inode must already be removed from the LRU list before being evicted from
   * the cache. This should occur atomically with setting the I_FREEING state
   * flag, so no inodes here should ever be on the LRU when being evicted.
   */
644da5960   Al Viro   fs/inode.c:evict(...
432
  static void evict(struct inode *inode)
b4272d4c8   Al Viro   unify fs/inode.c ...
433
434
  {
  	const struct super_operations *op = inode->i_sb->s_op;
b2b2af8e6   Dave Chinner   fs: factor inode ...
435
436
  	BUG_ON(!(inode->i_state & I_FREEING));
  	BUG_ON(!list_empty(&inode->i_lru));
b12362bdb   Eric Dumazet   vfs: conditionall...
437
438
  	if (!list_empty(&inode->i_wb_list))
  		inode_wb_list_del(inode);
55fa6091d   Dave Chinner   fs: move i_sb_lis...
439
  	inode_sb_list_del(inode);
be7ce4161   Al Viro   New method - evic...
440
441
  	if (op->evict_inode) {
  		op->evict_inode(inode);
b4272d4c8   Al Viro   unify fs/inode.c ...
442
443
444
  	} else {
  		if (inode->i_data.nrpages)
  			truncate_inode_pages(&inode->i_data, 0);
30140837f   Al Viro   fs/inode.c:clear_...
445
  		end_writeback(inode);
b4272d4c8   Al Viro   unify fs/inode.c ...
446
  	}
661074e91   Al Viro   Take ->i_bdev/->i...
447
448
449
450
  	if (S_ISBLK(inode->i_mode) && inode->i_bdev)
  		bd_forget(inode);
  	if (S_ISCHR(inode->i_mode) && inode->i_cdev)
  		cd_forget(inode);
b2b2af8e6   Dave Chinner   fs: factor inode ...
451
452
453
454
455
456
457
458
459
  
  	remove_inode_hash(inode);
  
  	spin_lock(&inode->i_lock);
  	wake_up_bit(&inode->i_state, __I_NEW);
  	BUG_ON(inode->i_state != (I_FREEING | I_CLEAR));
  	spin_unlock(&inode->i_lock);
  
  	destroy_inode(inode);
b4272d4c8   Al Viro   unify fs/inode.c ...
460
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
461
462
463
464
465
466
467
468
469
  /*
   * dispose_list - dispose of the contents of a local list
   * @head: the head of the list to free
   *
   * Dispose-list gets a local list with local inodes in it, so it doesn't
   * need to worry about list corruption and SMP locks.
   */
  static void dispose_list(struct list_head *head)
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
470
471
  	while (!list_empty(head)) {
  		struct inode *inode;
7ccf19a80   Nick Piggin   fs: inode split I...
472
473
  		inode = list_first_entry(head, struct inode, i_lru);
  		list_del_init(&inode->i_lru);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
474

644da5960   Al Viro   fs/inode.c:evict(...
475
  		evict(inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
476
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
477
  }
a03187867   Christoph Hellwig   fs: fold invalida...
478
  /**
63997e98a   Al Viro   split invalidate_...
479
480
481
482
483
484
485
   * evict_inodes	- evict all evictable inodes for a superblock
   * @sb:		superblock to operate on
   *
   * Make sure that no inodes with zero refcount are retained.  This is
   * called by superblock shutdown after having MS_ACTIVE flag removed,
   * so any inode reaching zero refcount during or after that call will
   * be immediately evicted.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
486
   */
63997e98a   Al Viro   split invalidate_...
487
  void evict_inodes(struct super_block *sb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
488
  {
63997e98a   Al Viro   split invalidate_...
489
490
  	struct inode *inode, *next;
  	LIST_HEAD(dispose);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
491

55fa6091d   Dave Chinner   fs: move i_sb_lis...
492
  	spin_lock(&inode_sb_list_lock);
63997e98a   Al Viro   split invalidate_...
493
494
  	list_for_each_entry_safe(inode, next, &sb->s_inodes, i_sb_list) {
  		if (atomic_read(&inode->i_count))
aabb8fdb4   Nick Piggin   fs: avoid I_NEW i...
495
  			continue;
250df6ed2   Dave Chinner   fs: protect inode...
496
497
498
499
  
  		spin_lock(&inode->i_lock);
  		if (inode->i_state & (I_NEW | I_FREEING | I_WILL_FREE)) {
  			spin_unlock(&inode->i_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
500
  			continue;
250df6ed2   Dave Chinner   fs: protect inode...
501
  		}
63997e98a   Al Viro   split invalidate_...
502
503
  
  		inode->i_state |= I_FREEING;
02afc410f   Dave Chinner   fs: Lock the inod...
504
  		inode_lru_list_del(inode);
250df6ed2   Dave Chinner   fs: protect inode...
505
  		spin_unlock(&inode->i_lock);
02afc410f   Dave Chinner   fs: Lock the inod...
506
  		list_add(&inode->i_lru, &dispose);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
507
  	}
55fa6091d   Dave Chinner   fs: move i_sb_lis...
508
  	spin_unlock(&inode_sb_list_lock);
63997e98a   Al Viro   split invalidate_...
509
510
  
  	dispose_list(&dispose);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
511
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
512
  /**
a03187867   Christoph Hellwig   fs: fold invalida...
513
514
   * invalidate_inodes	- attempt to free all inodes on a superblock
   * @sb:		superblock to operate on
93b270f76   NeilBrown   Fix over-zealous ...
515
   * @kill_dirty: flag to guide handling of dirty inodes
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
516
   *
a03187867   Christoph Hellwig   fs: fold invalida...
517
518
   * Attempts to free all inodes for a given superblock.  If there were any
   * busy inodes return a non-zero value, else zero.
93b270f76   NeilBrown   Fix over-zealous ...
519
520
   * If @kill_dirty is set, discard dirty inodes too, otherwise treat
   * them as busy.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
521
   */
93b270f76   NeilBrown   Fix over-zealous ...
522
  int invalidate_inodes(struct super_block *sb, bool kill_dirty)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
523
  {
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
524
  	int busy = 0;
a03187867   Christoph Hellwig   fs: fold invalida...
525
526
  	struct inode *inode, *next;
  	LIST_HEAD(dispose);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
527

55fa6091d   Dave Chinner   fs: move i_sb_lis...
528
  	spin_lock(&inode_sb_list_lock);
a03187867   Christoph Hellwig   fs: fold invalida...
529
  	list_for_each_entry_safe(inode, next, &sb->s_inodes, i_sb_list) {
250df6ed2   Dave Chinner   fs: protect inode...
530
531
532
  		spin_lock(&inode->i_lock);
  		if (inode->i_state & (I_NEW | I_FREEING | I_WILL_FREE)) {
  			spin_unlock(&inode->i_lock);
aabb8fdb4   Nick Piggin   fs: avoid I_NEW i...
533
  			continue;
250df6ed2   Dave Chinner   fs: protect inode...
534
  		}
93b270f76   NeilBrown   Fix over-zealous ...
535
  		if (inode->i_state & I_DIRTY && !kill_dirty) {
250df6ed2   Dave Chinner   fs: protect inode...
536
  			spin_unlock(&inode->i_lock);
93b270f76   NeilBrown   Fix over-zealous ...
537
538
539
  			busy = 1;
  			continue;
  		}
99a389192   Christoph Hellwig   fs: fix buffer in...
540
  		if (atomic_read(&inode->i_count)) {
250df6ed2   Dave Chinner   fs: protect inode...
541
  			spin_unlock(&inode->i_lock);
99a389192   Christoph Hellwig   fs: fix buffer in...
542
  			busy = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
543
544
  			continue;
  		}
99a389192   Christoph Hellwig   fs: fix buffer in...
545

99a389192   Christoph Hellwig   fs: fix buffer in...
546
  		inode->i_state |= I_FREEING;
02afc410f   Dave Chinner   fs: Lock the inod...
547
  		inode_lru_list_del(inode);
250df6ed2   Dave Chinner   fs: protect inode...
548
  		spin_unlock(&inode->i_lock);
02afc410f   Dave Chinner   fs: Lock the inod...
549
  		list_add(&inode->i_lru, &dispose);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
550
  	}
55fa6091d   Dave Chinner   fs: move i_sb_lis...
551
  	spin_unlock(&inode_sb_list_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
552

a03187867   Christoph Hellwig   fs: fold invalida...
553
  	dispose_list(&dispose);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
554
555
556
  
  	return busy;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
557
558
559
  
  static int can_unuse(struct inode *inode)
  {
9e38d86ff   Nick Piggin   fs: Implement laz...
560
  	if (inode->i_state & ~I_REFERENCED)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
561
562
563
564
565
566
567
568
569
570
571
  		return 0;
  	if (inode_has_buffers(inode))
  		return 0;
  	if (atomic_read(&inode->i_count))
  		return 0;
  	if (inode->i_data.nrpages)
  		return 0;
  	return 1;
  }
  
  /*
b0d40c92a   Dave Chinner   superblock: intro...
572
573
574
575
   * Walk the superblock inode LRU for freeable inodes and attempt to free them.
   * This is called from the superblock shrinker function with a number of inodes
   * to trim from the LRU. Inodes to be freed are moved to a temporary list and
   * then are freed outside inode_lock by dispose_list().
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
576
577
   *
   * Any inodes which are pinned purely because of attached pagecache have their
9e38d86ff   Nick Piggin   fs: Implement laz...
578
579
   * pagecache removed.  If the inode has metadata buffers attached to
   * mapping->private_list then try to remove them.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
580
   *
9e38d86ff   Nick Piggin   fs: Implement laz...
581
582
583
584
585
586
587
   * If the inode has the I_REFERENCED flag set, then it means that it has been
   * used recently - the flag is set in iput_final(). When we encounter such an
   * inode, clear the flag and move it to the back of the LRU so it gets another
   * pass through the LRU before it gets reclaimed. This is necessary because of
   * the fact we are doing lazy LRU updates to minimise lock contention so the
   * LRU does not have strict ordering. Hence we don't want to reclaim inodes
   * with this flag set because they are the inodes that are out of order.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
588
   */
b0d40c92a   Dave Chinner   superblock: intro...
589
  void prune_icache_sb(struct super_block *sb, int nr_to_scan)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
590
591
  {
  	LIST_HEAD(freeable);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
592
593
  	int nr_scanned;
  	unsigned long reap = 0;
09cc9fc7a   Dave Chinner   inode: move to pe...
594
  	spin_lock(&sb->s_inode_lru_lock);
b0d40c92a   Dave Chinner   superblock: intro...
595
  	for (nr_scanned = nr_to_scan; nr_scanned >= 0; nr_scanned--) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
596
  		struct inode *inode;
98b745c64   Dave Chinner   inode: Make unuse...
597
  		if (list_empty(&sb->s_inode_lru))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
598
  			break;
98b745c64   Dave Chinner   inode: Make unuse...
599
  		inode = list_entry(sb->s_inode_lru.prev, struct inode, i_lru);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
600

9e38d86ff   Nick Piggin   fs: Implement laz...
601
  		/*
09cc9fc7a   Dave Chinner   inode: move to pe...
602
  		 * we are inverting the sb->s_inode_lru_lock/inode->i_lock here,
02afc410f   Dave Chinner   fs: Lock the inod...
603
604
605
606
  		 * so use a trylock. If we fail to get the lock, just move the
  		 * inode to the back of the list so we don't spin on it.
  		 */
  		if (!spin_trylock(&inode->i_lock)) {
62a3ddef6   Christoph Hellwig   vfs: fix spinning...
607
  			list_move_tail(&inode->i_lru, &sb->s_inode_lru);
02afc410f   Dave Chinner   fs: Lock the inod...
608
609
610
611
  			continue;
  		}
  
  		/*
9e38d86ff   Nick Piggin   fs: Implement laz...
612
613
614
615
616
  		 * Referenced or dirty inodes are still in use. Give them
  		 * another pass through the LRU as we canot reclaim them now.
  		 */
  		if (atomic_read(&inode->i_count) ||
  		    (inode->i_state & ~I_REFERENCED)) {
7ccf19a80   Nick Piggin   fs: inode split I...
617
  			list_del_init(&inode->i_lru);
f283c86af   Dave Chinner   fs: remove inode_...
618
  			spin_unlock(&inode->i_lock);
98b745c64   Dave Chinner   inode: Make unuse...
619
  			sb->s_nr_inodes_unused--;
fcb94f72d   Dave Chinner   inode: convert in...
620
  			this_cpu_dec(nr_unused);
9e38d86ff   Nick Piggin   fs: Implement laz...
621
622
623
624
625
  			continue;
  		}
  
  		/* recently referenced inodes get one more pass */
  		if (inode->i_state & I_REFERENCED) {
9e38d86ff   Nick Piggin   fs: Implement laz...
626
  			inode->i_state &= ~I_REFERENCED;
98b745c64   Dave Chinner   inode: Make unuse...
627
  			list_move(&inode->i_lru, &sb->s_inode_lru);
f283c86af   Dave Chinner   fs: remove inode_...
628
  			spin_unlock(&inode->i_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
629
630
631
632
  			continue;
  		}
  		if (inode_has_buffers(inode) || inode->i_data.nrpages) {
  			__iget(inode);
250df6ed2   Dave Chinner   fs: protect inode...
633
  			spin_unlock(&inode->i_lock);
09cc9fc7a   Dave Chinner   inode: move to pe...
634
  			spin_unlock(&sb->s_inode_lru_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
635
  			if (remove_inode_buffers(inode))
fc0ecff69   Andrew Morton   [PATCH] remove in...
636
637
  				reap += invalidate_mapping_pages(&inode->i_data,
  								0, -1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
638
  			iput(inode);
09cc9fc7a   Dave Chinner   inode: move to pe...
639
  			spin_lock(&sb->s_inode_lru_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
640

98b745c64   Dave Chinner   inode: Make unuse...
641
  			if (inode != list_entry(sb->s_inode_lru.next,
7ccf19a80   Nick Piggin   fs: inode split I...
642
  						struct inode, i_lru))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
643
  				continue;	/* wrong inode or list_empty */
02afc410f   Dave Chinner   fs: Lock the inod...
644
645
646
  			/* avoid lock inversions with trylock */
  			if (!spin_trylock(&inode->i_lock))
  				continue;
250df6ed2   Dave Chinner   fs: protect inode...
647
648
  			if (!can_unuse(inode)) {
  				spin_unlock(&inode->i_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
649
  				continue;
250df6ed2   Dave Chinner   fs: protect inode...
650
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
651
  		}
7ef0d7377   Nick Piggin   fs: new inode i_s...
652
  		WARN_ON(inode->i_state & I_NEW);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
653
  		inode->i_state |= I_FREEING;
250df6ed2   Dave Chinner   fs: protect inode...
654
  		spin_unlock(&inode->i_lock);
7ccf19a80   Nick Piggin   fs: inode split I...
655

7ccf19a80   Nick Piggin   fs: inode split I...
656
  		list_move(&inode->i_lru, &freeable);
98b745c64   Dave Chinner   inode: Make unuse...
657
  		sb->s_nr_inodes_unused--;
fcb94f72d   Dave Chinner   inode: convert in...
658
  		this_cpu_dec(nr_unused);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
659
  	}
f8891e5e1   Christoph Lameter   [PATCH] Light wei...
660
661
662
663
  	if (current_is_kswapd())
  		__count_vm_events(KSWAPD_INODESTEAL, reap);
  	else
  		__count_vm_events(PGINODESTEAL, reap);
09cc9fc7a   Dave Chinner   inode: move to pe...
664
  	spin_unlock(&sb->s_inode_lru_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
665
666
  
  	dispose_list(&freeable);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
667
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
668
669
670
  static void __wait_on_freeing_inode(struct inode *inode);
  /*
   * Called with the inode lock held.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
671
   */
6b3304b53   Manish Katiyar   Make checkpatch.p...
672
673
674
675
  static struct inode *find_inode(struct super_block *sb,
  				struct hlist_head *head,
  				int (*test)(struct inode *, void *),
  				void *data)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
676
677
  {
  	struct hlist_node *node;
6b3304b53   Manish Katiyar   Make checkpatch.p...
678
  	struct inode *inode = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
679
680
  
  repeat:
c5c8be3ce   Matthias Kaehlcke   fs/inode.c: use h...
681
  	hlist_for_each_entry(inode, node, head, i_hash) {
67a23c494   Dave Chinner   fs: rename inode_...
682
683
684
  		spin_lock(&inode->i_lock);
  		if (inode->i_sb != sb) {
  			spin_unlock(&inode->i_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
685
  			continue;
67a23c494   Dave Chinner   fs: rename inode_...
686
687
688
  		}
  		if (!test(inode, data)) {
  			spin_unlock(&inode->i_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
689
  			continue;
67a23c494   Dave Chinner   fs: rename inode_...
690
  		}
a4ffdde6e   Al Viro   simplify checks f...
691
  		if (inode->i_state & (I_FREEING|I_WILL_FREE)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
692
693
694
  			__wait_on_freeing_inode(inode);
  			goto repeat;
  		}
f7899bd54   Christoph Hellwig   fs: move i_count ...
695
  		__iget(inode);
250df6ed2   Dave Chinner   fs: protect inode...
696
  		spin_unlock(&inode->i_lock);
f7899bd54   Christoph Hellwig   fs: move i_count ...
697
  		return inode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
698
  	}
f7899bd54   Christoph Hellwig   fs: move i_count ...
699
  	return NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
700
701
702
703
704
705
  }
  
  /*
   * find_inode_fast is the fast path version of find_inode, see the comment at
   * iget_locked for details.
   */
6b3304b53   Manish Katiyar   Make checkpatch.p...
706
707
  static struct inode *find_inode_fast(struct super_block *sb,
  				struct hlist_head *head, unsigned long ino)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
708
709
  {
  	struct hlist_node *node;
6b3304b53   Manish Katiyar   Make checkpatch.p...
710
  	struct inode *inode = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
711
712
  
  repeat:
c5c8be3ce   Matthias Kaehlcke   fs/inode.c: use h...
713
  	hlist_for_each_entry(inode, node, head, i_hash) {
67a23c494   Dave Chinner   fs: rename inode_...
714
715
716
  		spin_lock(&inode->i_lock);
  		if (inode->i_ino != ino) {
  			spin_unlock(&inode->i_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
717
  			continue;
67a23c494   Dave Chinner   fs: rename inode_...
718
719
720
  		}
  		if (inode->i_sb != sb) {
  			spin_unlock(&inode->i_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
721
  			continue;
67a23c494   Dave Chinner   fs: rename inode_...
722
  		}
a4ffdde6e   Al Viro   simplify checks f...
723
  		if (inode->i_state & (I_FREEING|I_WILL_FREE)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
724
725
726
  			__wait_on_freeing_inode(inode);
  			goto repeat;
  		}
f7899bd54   Christoph Hellwig   fs: move i_count ...
727
  		__iget(inode);
250df6ed2   Dave Chinner   fs: protect inode...
728
  		spin_unlock(&inode->i_lock);
f7899bd54   Christoph Hellwig   fs: move i_count ...
729
  		return inode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
730
  	}
f7899bd54   Christoph Hellwig   fs: move i_count ...
731
  	return NULL;
8290c35f8   David Chinner   Inode: Allow exte...
732
  }
f991bd2e1   Eric Dumazet   fs: introduce a p...
733
734
735
736
  /*
   * Each cpu owns a range of LAST_INO_BATCH numbers.
   * 'shared_last_ino' is dirtied only once out of LAST_INO_BATCH allocations,
   * to renew the exhausted range.
8290c35f8   David Chinner   Inode: Allow exte...
737
   *
f991bd2e1   Eric Dumazet   fs: introduce a p...
738
739
740
741
742
743
744
745
746
   * This does not significantly increase overflow rate because every CPU can
   * consume at most LAST_INO_BATCH-1 unused inode numbers. So there is
   * NR_CPUS*(LAST_INO_BATCH-1) wastage. At 4096 and 1024, this is ~0.1% of the
   * 2^32 range, and is a worst-case. Even a 50% wastage would only increase
   * overflow rate by 2x, which does not seem too significant.
   *
   * On a 32bit, non LFS stat() call, glibc will generate an EOVERFLOW
   * error if st_ino won't fit in target struct field. Use 32bit counter
   * here to attempt to avoid that.
8290c35f8   David Chinner   Inode: Allow exte...
747
   */
f991bd2e1   Eric Dumazet   fs: introduce a p...
748
749
  #define LAST_INO_BATCH 1024
  static DEFINE_PER_CPU(unsigned int, last_ino);
85fe4025c   Christoph Hellwig   fs: do not assign...
750
  unsigned int get_next_ino(void)
8290c35f8   David Chinner   Inode: Allow exte...
751
  {
f991bd2e1   Eric Dumazet   fs: introduce a p...
752
753
  	unsigned int *p = &get_cpu_var(last_ino);
  	unsigned int res = *p;
8290c35f8   David Chinner   Inode: Allow exte...
754

f991bd2e1   Eric Dumazet   fs: introduce a p...
755
756
757
758
759
760
761
762
763
764
765
766
  #ifdef CONFIG_SMP
  	if (unlikely((res & (LAST_INO_BATCH-1)) == 0)) {
  		static atomic_t shared_last_ino;
  		int next = atomic_add_return(LAST_INO_BATCH, &shared_last_ino);
  
  		res = next - LAST_INO_BATCH;
  	}
  #endif
  
  	*p = ++res;
  	put_cpu_var(last_ino);
  	return res;
8290c35f8   David Chinner   Inode: Allow exte...
767
  }
85fe4025c   Christoph Hellwig   fs: do not assign...
768
  EXPORT_SYMBOL(get_next_ino);
8290c35f8   David Chinner   Inode: Allow exte...
769

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
770
  /**
a209dfc7b   Eric Dumazet   vfs: dont chain p...
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
   *	new_inode_pseudo 	- obtain an inode
   *	@sb: superblock
   *
   *	Allocates a new inode for given superblock.
   *	Inode wont be chained in superblock s_inodes list
   *	This means :
   *	- fs can't be unmount
   *	- quotas, fsnotify, writeback can't work
   */
  struct inode *new_inode_pseudo(struct super_block *sb)
  {
  	struct inode *inode = alloc_inode(sb);
  
  	if (inode) {
  		spin_lock(&inode->i_lock);
  		inode->i_state = 0;
  		spin_unlock(&inode->i_lock);
  		INIT_LIST_HEAD(&inode->i_sb_list);
  	}
  	return inode;
  }
  
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
794
795
796
   *	new_inode 	- obtain an inode
   *	@sb: superblock
   *
769848c03   Mel Gorman   Add __GFP_MOVABLE...
797
   *	Allocates a new inode for given superblock. The default gfp_mask
3c1d43787   Hugh Dickins   mm: remove GFP_HI...
798
   *	for allocations related to inode->i_mapping is GFP_HIGHUSER_MOVABLE.
769848c03   Mel Gorman   Add __GFP_MOVABLE...
799
800
801
802
803
   *	If HIGHMEM pages are unsuitable or it is known that pages allocated
   *	for the page cache are not reclaimable or migratable,
   *	mapping_set_gfp_mask() must be called with suitable flags on the
   *	newly created inode's mapping
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
804
805
806
   */
  struct inode *new_inode(struct super_block *sb)
  {
6b3304b53   Manish Katiyar   Make checkpatch.p...
807
  	struct inode *inode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
808

55fa6091d   Dave Chinner   fs: move i_sb_lis...
809
  	spin_lock_prefetch(&inode_sb_list_lock);
6b3304b53   Manish Katiyar   Make checkpatch.p...
810

a209dfc7b   Eric Dumazet   vfs: dont chain p...
811
812
  	inode = new_inode_pseudo(sb);
  	if (inode)
55fa6091d   Dave Chinner   fs: move i_sb_lis...
813
  		inode_sb_list_add(inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
814
815
  	return inode;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
816
  EXPORT_SYMBOL(new_inode);
14358e6dd   Peter Zijlstra   lockdep: annotate...
817
  #ifdef CONFIG_DEBUG_LOCK_ALLOC
e096d0c7e   Josh Boyer   lockdep: Add help...
818
819
  void lockdep_annotate_inode_mutex_key(struct inode *inode)
  {
a3314a0ed   Namhyung Kim   lockdep: fixup ch...
820
  	if (S_ISDIR(inode->i_mode)) {
1e89a5e15   Peter Zijlstra   lockdep: fixup th...
821
  		struct file_system_type *type = inode->i_sb->s_type;
9a7aa12f3   Jan Kara   vfs: Set special ...
822
823
824
825
826
827
828
829
830
831
832
  		/* Set new key only if filesystem hasn't already changed it */
  		if (!lockdep_match_class(&inode->i_mutex,
  		    &type->i_mutex_key)) {
  			/*
  			 * ensure nobody is actually holding i_mutex
  			 */
  			mutex_destroy(&inode->i_mutex);
  			mutex_init(&inode->i_mutex);
  			lockdep_set_class(&inode->i_mutex,
  					  &type->i_mutex_dir_key);
  		}
1e89a5e15   Peter Zijlstra   lockdep: fixup th...
833
  	}
e096d0c7e   Josh Boyer   lockdep: Add help...
834
835
  }
  EXPORT_SYMBOL(lockdep_annotate_inode_mutex_key);
14358e6dd   Peter Zijlstra   lockdep: annotate...
836
  #endif
e096d0c7e   Josh Boyer   lockdep: Add help...
837
838
839
840
841
842
843
844
845
846
847
  
  /**
   * unlock_new_inode - clear the I_NEW state and wake up any waiters
   * @inode:	new inode to unlock
   *
   * Called when the inode is fully initialised to clear the new state of the
   * inode and wake up anyone waiting for the inode to finish initialisation.
   */
  void unlock_new_inode(struct inode *inode)
  {
  	lockdep_annotate_inode_mutex_key(inode);
250df6ed2   Dave Chinner   fs: protect inode...
848
  	spin_lock(&inode->i_lock);
eaff8079d   Christoph Hellwig   kill I_LOCK
849
850
  	WARN_ON(!(inode->i_state & I_NEW));
  	inode->i_state &= ~I_NEW;
250df6ed2   Dave Chinner   fs: protect inode...
851
852
  	wake_up_bit(&inode->i_state, __I_NEW);
  	spin_unlock(&inode->i_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
853
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
854
  EXPORT_SYMBOL(unlock_new_inode);
0b2d0724e   Christoph Hellwig   fs: simplify iget...
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
  /**
   * iget5_locked - obtain an inode from a mounted file system
   * @sb:		super block of file system
   * @hashval:	hash value (usually inode number) to get
   * @test:	callback used for comparisons between inodes
   * @set:	callback used to initialize a new struct inode
   * @data:	opaque data pointer to pass to @test and @set
   *
   * Search for the inode specified by @hashval and @data in the inode cache,
   * and if present it is return it with an increased reference count. This is
   * a generalized version of iget_locked() for file systems where the inode
   * number is not sufficient for unique identification of an inode.
   *
   * If the inode is not in cache, allocate a new inode and return it locked,
   * hashed, and with the I_NEW flag set. The file system gets to fill it in
   * before unlocking it via unlock_new_inode().
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
871
   *
0b2d0724e   Christoph Hellwig   fs: simplify iget...
872
873
   * Note both @test and @set are called with the inode_hash_lock held, so can't
   * sleep.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
874
   */
0b2d0724e   Christoph Hellwig   fs: simplify iget...
875
876
877
  struct inode *iget5_locked(struct super_block *sb, unsigned long hashval,
  		int (*test)(struct inode *, void *),
  		int (*set)(struct inode *, void *), void *data)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
878
  {
0b2d0724e   Christoph Hellwig   fs: simplify iget...
879
  	struct hlist_head *head = inode_hashtable + hash(sb, hashval);
6b3304b53   Manish Katiyar   Make checkpatch.p...
880
  	struct inode *inode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
881

0b2d0724e   Christoph Hellwig   fs: simplify iget...
882
883
884
885
886
887
888
889
  	spin_lock(&inode_hash_lock);
  	inode = find_inode(sb, head, test, data);
  	spin_unlock(&inode_hash_lock);
  
  	if (inode) {
  		wait_on_inode(inode);
  		return inode;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
890
891
  	inode = alloc_inode(sb);
  	if (inode) {
6b3304b53   Manish Katiyar   Make checkpatch.p...
892
  		struct inode *old;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
893

67a23c494   Dave Chinner   fs: rename inode_...
894
  		spin_lock(&inode_hash_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
895
896
897
898
899
  		/* We released the lock, so.. */
  		old = find_inode(sb, head, test, data);
  		if (!old) {
  			if (set(inode, data))
  				goto set_failed;
250df6ed2   Dave Chinner   fs: protect inode...
900
901
  			spin_lock(&inode->i_lock);
  			inode->i_state = I_NEW;
646ec4615   Christoph Hellwig   fs: remove inode_...
902
  			hlist_add_head(&inode->i_hash, head);
250df6ed2   Dave Chinner   fs: protect inode...
903
  			spin_unlock(&inode->i_lock);
55fa6091d   Dave Chinner   fs: move i_sb_lis...
904
  			inode_sb_list_add(inode);
67a23c494   Dave Chinner   fs: rename inode_...
905
  			spin_unlock(&inode_hash_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
906
907
908
909
910
911
912
913
914
915
916
917
  
  			/* Return the locked inode with I_NEW set, the
  			 * caller is responsible for filling in the contents
  			 */
  			return inode;
  		}
  
  		/*
  		 * Uhhuh, somebody else created the same inode under
  		 * us. Use the old inode instead of the one we just
  		 * allocated.
  		 */
67a23c494   Dave Chinner   fs: rename inode_...
918
  		spin_unlock(&inode_hash_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
919
920
921
922
923
924
925
  		destroy_inode(inode);
  		inode = old;
  		wait_on_inode(inode);
  	}
  	return inode;
  
  set_failed:
67a23c494   Dave Chinner   fs: rename inode_...
926
  	spin_unlock(&inode_hash_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
927
928
929
  	destroy_inode(inode);
  	return NULL;
  }
0b2d0724e   Christoph Hellwig   fs: simplify iget...
930
  EXPORT_SYMBOL(iget5_locked);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
931

0b2d0724e   Christoph Hellwig   fs: simplify iget...
932
933
934
935
936
937
938
939
940
941
942
943
  /**
   * iget_locked - obtain an inode from a mounted file system
   * @sb:		super block of file system
   * @ino:	inode number to get
   *
   * Search for the inode specified by @ino in the inode cache and if present
   * return it with an increased reference count. This is for file systems
   * where the inode number is sufficient for unique identification of an inode.
   *
   * If the inode is not in cache, allocate a new inode and return it locked,
   * hashed, and with the I_NEW flag set.  The file system gets to fill it in
   * before unlocking it via unlock_new_inode().
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
944
   */
0b2d0724e   Christoph Hellwig   fs: simplify iget...
945
  struct inode *iget_locked(struct super_block *sb, unsigned long ino)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
946
  {
0b2d0724e   Christoph Hellwig   fs: simplify iget...
947
  	struct hlist_head *head = inode_hashtable + hash(sb, ino);
6b3304b53   Manish Katiyar   Make checkpatch.p...
948
  	struct inode *inode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
949

0b2d0724e   Christoph Hellwig   fs: simplify iget...
950
951
952
953
954
955
956
  	spin_lock(&inode_hash_lock);
  	inode = find_inode_fast(sb, head, ino);
  	spin_unlock(&inode_hash_lock);
  	if (inode) {
  		wait_on_inode(inode);
  		return inode;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
957
958
  	inode = alloc_inode(sb);
  	if (inode) {
6b3304b53   Manish Katiyar   Make checkpatch.p...
959
  		struct inode *old;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
960

67a23c494   Dave Chinner   fs: rename inode_...
961
  		spin_lock(&inode_hash_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
962
963
964
965
  		/* We released the lock, so.. */
  		old = find_inode_fast(sb, head, ino);
  		if (!old) {
  			inode->i_ino = ino;
250df6ed2   Dave Chinner   fs: protect inode...
966
967
  			spin_lock(&inode->i_lock);
  			inode->i_state = I_NEW;
646ec4615   Christoph Hellwig   fs: remove inode_...
968
  			hlist_add_head(&inode->i_hash, head);
250df6ed2   Dave Chinner   fs: protect inode...
969
  			spin_unlock(&inode->i_lock);
55fa6091d   Dave Chinner   fs: move i_sb_lis...
970
  			inode_sb_list_add(inode);
67a23c494   Dave Chinner   fs: rename inode_...
971
  			spin_unlock(&inode_hash_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
972
973
974
975
976
977
978
979
980
981
982
983
  
  			/* Return the locked inode with I_NEW set, the
  			 * caller is responsible for filling in the contents
  			 */
  			return inode;
  		}
  
  		/*
  		 * Uhhuh, somebody else created the same inode under
  		 * us. Use the old inode instead of the one we just
  		 * allocated.
  		 */
67a23c494   Dave Chinner   fs: rename inode_...
984
  		spin_unlock(&inode_hash_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
985
986
987
988
989
990
  		destroy_inode(inode);
  		inode = old;
  		wait_on_inode(inode);
  	}
  	return inode;
  }
0b2d0724e   Christoph Hellwig   fs: simplify iget...
991
  EXPORT_SYMBOL(iget_locked);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
992

ad5e195ac   Christoph Hellwig   fs: Stop abusing ...
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
  /*
   * search the inode cache for a matching inode number.
   * If we find one, then the inode number we are trying to
   * allocate is not unique and so we should not use it.
   *
   * Returns 1 if the inode number is unique, 0 if it is not.
   */
  static int test_inode_iunique(struct super_block *sb, unsigned long ino)
  {
  	struct hlist_head *b = inode_hashtable + hash(sb, ino);
  	struct hlist_node *node;
  	struct inode *inode;
67a23c494   Dave Chinner   fs: rename inode_...
1005
  	spin_lock(&inode_hash_lock);
ad5e195ac   Christoph Hellwig   fs: Stop abusing ...
1006
  	hlist_for_each_entry(inode, node, b, i_hash) {
67a23c494   Dave Chinner   fs: rename inode_...
1007
1008
  		if (inode->i_ino == ino && inode->i_sb == sb) {
  			spin_unlock(&inode_hash_lock);
ad5e195ac   Christoph Hellwig   fs: Stop abusing ...
1009
  			return 0;
67a23c494   Dave Chinner   fs: rename inode_...
1010
  		}
ad5e195ac   Christoph Hellwig   fs: Stop abusing ...
1011
  	}
67a23c494   Dave Chinner   fs: rename inode_...
1012
  	spin_unlock(&inode_hash_lock);
ad5e195ac   Christoph Hellwig   fs: Stop abusing ...
1013
1014
1015
  
  	return 1;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
  /**
   *	iunique - get a unique inode number
   *	@sb: superblock
   *	@max_reserved: highest reserved inode number
   *
   *	Obtain an inode number that is unique on the system for a given
   *	superblock. This is used by file systems that have no natural
   *	permanent inode numbering system. An inode number is returned that
   *	is higher than the reserved limit but unique.
   *
   *	BUGS:
   *	With a large number of inodes live on the file system this function
   *	currently becomes quite slow.
   */
  ino_t iunique(struct super_block *sb, ino_t max_reserved)
  {
866b04fcc   Jeff Layton   inode numbering: ...
1032
1033
1034
1035
1036
  	/*
  	 * On a 32bit, non LFS stat() call, glibc will generate an EOVERFLOW
  	 * error if st_ino won't fit in target struct field. Use 32bit counter
  	 * here to attempt to avoid that.
  	 */
ad5e195ac   Christoph Hellwig   fs: Stop abusing ...
1037
  	static DEFINE_SPINLOCK(iunique_lock);
866b04fcc   Jeff Layton   inode numbering: ...
1038
  	static unsigned int counter;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1039
  	ino_t res;
3361c7beb   Jeffrey Layton   make iunique use ...
1040

ad5e195ac   Christoph Hellwig   fs: Stop abusing ...
1041
  	spin_lock(&iunique_lock);
3361c7beb   Jeffrey Layton   make iunique use ...
1042
1043
1044
  	do {
  		if (counter <= max_reserved)
  			counter = max_reserved + 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1045
  		res = counter++;
ad5e195ac   Christoph Hellwig   fs: Stop abusing ...
1046
1047
  	} while (!test_inode_iunique(sb, res));
  	spin_unlock(&iunique_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1048

3361c7beb   Jeffrey Layton   make iunique use ...
1049
1050
  	return res;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1051
1052
1053
1054
  EXPORT_SYMBOL(iunique);
  
  struct inode *igrab(struct inode *inode)
  {
250df6ed2   Dave Chinner   fs: protect inode...
1055
1056
  	spin_lock(&inode->i_lock);
  	if (!(inode->i_state & (I_FREEING|I_WILL_FREE))) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1057
  		__iget(inode);
250df6ed2   Dave Chinner   fs: protect inode...
1058
1059
1060
  		spin_unlock(&inode->i_lock);
  	} else {
  		spin_unlock(&inode->i_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1061
1062
1063
1064
1065
1066
  		/*
  		 * Handle the case where s_op->clear_inode is not been
  		 * called yet, and somebody is calling igrab
  		 * while the inode is getting freed.
  		 */
  		inode = NULL;
250df6ed2   Dave Chinner   fs: protect inode...
1067
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1068
1069
  	return inode;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1070
1071
1072
  EXPORT_SYMBOL(igrab);
  
  /**
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1073
   * ilookup5_nowait - search for an inode in the inode cache
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1074
   * @sb:		super block of file system to search
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1075
   * @hashval:	hash value (usually inode number) to search for
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1076
1077
   * @test:	callback used for comparisons between inodes
   * @data:	opaque data pointer to pass to @test
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1078
   *
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1079
   * Search for the inode specified by @hashval and @data in the inode cache.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1080
1081
1082
   * If the inode is in the cache, the inode is returned with an incremented
   * reference count.
   *
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1083
1084
   * Note: I_NEW is not waited upon so you have to be very careful what you do
   * with the returned inode.  You probably should be using ilookup5() instead.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1085
   *
b6d0ad686   Randy Dunlap   fs: fix inode.c k...
1086
   * Note2: @test is called with the inode_hash_lock held, so can't sleep.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1087
   */
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1088
1089
  struct inode *ilookup5_nowait(struct super_block *sb, unsigned long hashval,
  		int (*test)(struct inode *, void *), void *data)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1090
  {
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1091
  	struct hlist_head *head = inode_hashtable + hash(sb, hashval);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1092
  	struct inode *inode;
67a23c494   Dave Chinner   fs: rename inode_...
1093
  	spin_lock(&inode_hash_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1094
  	inode = find_inode(sb, head, test, data);
67a23c494   Dave Chinner   fs: rename inode_...
1095
  	spin_unlock(&inode_hash_lock);
88bd5121d   Anton Altaparmakov   [PATCH] Fix soft ...
1096

0b2d0724e   Christoph Hellwig   fs: simplify iget...
1097
  	return inode;
88bd5121d   Anton Altaparmakov   [PATCH] Fix soft ...
1098
  }
88bd5121d   Anton Altaparmakov   [PATCH] Fix soft ...
1099
1100
1101
1102
1103
1104
1105
1106
1107
  EXPORT_SYMBOL(ilookup5_nowait);
  
  /**
   * ilookup5 - search for an inode in the inode cache
   * @sb:		super block of file system to search
   * @hashval:	hash value (usually inode number) to search for
   * @test:	callback used for comparisons between inodes
   * @data:	opaque data pointer to pass to @test
   *
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1108
1109
1110
   * Search for the inode specified by @hashval and @data in the inode cache,
   * and if the inode is in the cache, return the inode with an incremented
   * reference count.  Waits on I_NEW before returning the inode.
88bd5121d   Anton Altaparmakov   [PATCH] Fix soft ...
1111
   * returned with an incremented reference count.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1112
   *
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1113
1114
   * This is a generalized version of ilookup() for file systems where the
   * inode number is not sufficient for unique identification of an inode.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1115
   *
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1116
   * Note: @test is called with the inode_hash_lock held, so can't sleep.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1117
1118
1119
1120
   */
  struct inode *ilookup5(struct super_block *sb, unsigned long hashval,
  		int (*test)(struct inode *, void *), void *data)
  {
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1121
  	struct inode *inode = ilookup5_nowait(sb, hashval, test, data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1122

0b2d0724e   Christoph Hellwig   fs: simplify iget...
1123
1124
1125
  	if (inode)
  		wait_on_inode(inode);
  	return inode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1126
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1127
1128
1129
1130
1131
1132
1133
  EXPORT_SYMBOL(ilookup5);
  
  /**
   * ilookup - search for an inode in the inode cache
   * @sb:		super block of file system to search
   * @ino:	inode number to search for
   *
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1134
1135
   * Search for the inode @ino in the inode cache, and if the inode is in the
   * cache, the inode is returned with an incremented reference count.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1136
1137
1138
1139
   */
  struct inode *ilookup(struct super_block *sb, unsigned long ino)
  {
  	struct hlist_head *head = inode_hashtable + hash(sb, ino);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1140
  	struct inode *inode;
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1141
1142
1143
  	spin_lock(&inode_hash_lock);
  	inode = find_inode_fast(sb, head, ino);
  	spin_unlock(&inode_hash_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1144

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1145
  	if (inode)
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1146
1147
  		wait_on_inode(inode);
  	return inode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1148
  }
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1149
  EXPORT_SYMBOL(ilookup);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1150

261bca86e   Al Viro   nfsd/create race ...
1151
1152
1153
1154
1155
  int insert_inode_locked(struct inode *inode)
  {
  	struct super_block *sb = inode->i_sb;
  	ino_t ino = inode->i_ino;
  	struct hlist_head *head = inode_hashtable + hash(sb, ino);
261bca86e   Al Viro   nfsd/create race ...
1156

261bca86e   Al Viro   nfsd/create race ...
1157
  	while (1) {
72a43d63c   Al Viro   ext3/4 with synch...
1158
1159
  		struct hlist_node *node;
  		struct inode *old = NULL;
67a23c494   Dave Chinner   fs: rename inode_...
1160
  		spin_lock(&inode_hash_lock);
72a43d63c   Al Viro   ext3/4 with synch...
1161
1162
1163
1164
1165
  		hlist_for_each_entry(old, node, head, i_hash) {
  			if (old->i_ino != ino)
  				continue;
  			if (old->i_sb != sb)
  				continue;
250df6ed2   Dave Chinner   fs: protect inode...
1166
1167
1168
  			spin_lock(&old->i_lock);
  			if (old->i_state & (I_FREEING|I_WILL_FREE)) {
  				spin_unlock(&old->i_lock);
72a43d63c   Al Viro   ext3/4 with synch...
1169
  				continue;
250df6ed2   Dave Chinner   fs: protect inode...
1170
  			}
72a43d63c   Al Viro   ext3/4 with synch...
1171
1172
1173
  			break;
  		}
  		if (likely(!node)) {
250df6ed2   Dave Chinner   fs: protect inode...
1174
1175
  			spin_lock(&inode->i_lock);
  			inode->i_state |= I_NEW;
261bca86e   Al Viro   nfsd/create race ...
1176
  			hlist_add_head(&inode->i_hash, head);
250df6ed2   Dave Chinner   fs: protect inode...
1177
  			spin_unlock(&inode->i_lock);
67a23c494   Dave Chinner   fs: rename inode_...
1178
  			spin_unlock(&inode_hash_lock);
261bca86e   Al Viro   nfsd/create race ...
1179
1180
1181
  			return 0;
  		}
  		__iget(old);
250df6ed2   Dave Chinner   fs: protect inode...
1182
  		spin_unlock(&old->i_lock);
67a23c494   Dave Chinner   fs: rename inode_...
1183
  		spin_unlock(&inode_hash_lock);
261bca86e   Al Viro   nfsd/create race ...
1184
  		wait_on_inode(old);
1d3382cbf   Al Viro   new helper: inode...
1185
  		if (unlikely(!inode_unhashed(old))) {
261bca86e   Al Viro   nfsd/create race ...
1186
1187
1188
1189
1190
1191
  			iput(old);
  			return -EBUSY;
  		}
  		iput(old);
  	}
  }
261bca86e   Al Viro   nfsd/create race ...
1192
1193
1194
1195
1196
1197
1198
  EXPORT_SYMBOL(insert_inode_locked);
  
  int insert_inode_locked4(struct inode *inode, unsigned long hashval,
  		int (*test)(struct inode *, void *), void *data)
  {
  	struct super_block *sb = inode->i_sb;
  	struct hlist_head *head = inode_hashtable + hash(sb, hashval);
261bca86e   Al Viro   nfsd/create race ...
1199

261bca86e   Al Viro   nfsd/create race ...
1200
  	while (1) {
72a43d63c   Al Viro   ext3/4 with synch...
1201
1202
  		struct hlist_node *node;
  		struct inode *old = NULL;
67a23c494   Dave Chinner   fs: rename inode_...
1203
  		spin_lock(&inode_hash_lock);
72a43d63c   Al Viro   ext3/4 with synch...
1204
1205
1206
1207
1208
  		hlist_for_each_entry(old, node, head, i_hash) {
  			if (old->i_sb != sb)
  				continue;
  			if (!test(old, data))
  				continue;
250df6ed2   Dave Chinner   fs: protect inode...
1209
1210
1211
  			spin_lock(&old->i_lock);
  			if (old->i_state & (I_FREEING|I_WILL_FREE)) {
  				spin_unlock(&old->i_lock);
72a43d63c   Al Viro   ext3/4 with synch...
1212
  				continue;
250df6ed2   Dave Chinner   fs: protect inode...
1213
  			}
72a43d63c   Al Viro   ext3/4 with synch...
1214
1215
1216
  			break;
  		}
  		if (likely(!node)) {
250df6ed2   Dave Chinner   fs: protect inode...
1217
1218
  			spin_lock(&inode->i_lock);
  			inode->i_state |= I_NEW;
261bca86e   Al Viro   nfsd/create race ...
1219
  			hlist_add_head(&inode->i_hash, head);
250df6ed2   Dave Chinner   fs: protect inode...
1220
  			spin_unlock(&inode->i_lock);
67a23c494   Dave Chinner   fs: rename inode_...
1221
  			spin_unlock(&inode_hash_lock);
261bca86e   Al Viro   nfsd/create race ...
1222
1223
1224
  			return 0;
  		}
  		__iget(old);
250df6ed2   Dave Chinner   fs: protect inode...
1225
  		spin_unlock(&old->i_lock);
67a23c494   Dave Chinner   fs: rename inode_...
1226
  		spin_unlock(&inode_hash_lock);
261bca86e   Al Viro   nfsd/create race ...
1227
  		wait_on_inode(old);
1d3382cbf   Al Viro   new helper: inode...
1228
  		if (unlikely(!inode_unhashed(old))) {
261bca86e   Al Viro   nfsd/create race ...
1229
1230
1231
1232
1233
1234
  			iput(old);
  			return -EBUSY;
  		}
  		iput(old);
  	}
  }
261bca86e   Al Viro   nfsd/create race ...
1235
  EXPORT_SYMBOL(insert_inode_locked4);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1236

45321ac54   Al Viro   Make ->drop_inode...
1237
1238
1239
1240
1241
  int generic_delete_inode(struct inode *inode)
  {
  	return 1;
  }
  EXPORT_SYMBOL(generic_delete_inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1242
  /*
45321ac54   Al Viro   Make ->drop_inode...
1243
1244
1245
   * Normal UNIX filesystem behaviour: delete the
   * inode when the usage count drops to zero, and
   * i_nlink is zero.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1246
   */
45321ac54   Al Viro   Make ->drop_inode...
1247
  int generic_drop_inode(struct inode *inode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1248
  {
1d3382cbf   Al Viro   new helper: inode...
1249
  	return !inode->i_nlink || inode_unhashed(inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1250
  }
45321ac54   Al Viro   Make ->drop_inode...
1251
  EXPORT_SYMBOL_GPL(generic_drop_inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1252

45321ac54   Al Viro   Make ->drop_inode...
1253
1254
1255
  /*
   * Called when we're dropping the last reference
   * to an inode.
22fe40421   Jan Kara   vfs: split generi...
1256
   *
45321ac54   Al Viro   Make ->drop_inode...
1257
1258
1259
1260
1261
   * Call the FS "drop_inode()" function, defaulting to
   * the legacy UNIX filesystem behaviour.  If it tells
   * us to evict inode, do so.  Otherwise, retain inode
   * in cache if fs is alive, sync and evict if fs is
   * shutting down.
22fe40421   Jan Kara   vfs: split generi...
1262
   */
45321ac54   Al Viro   Make ->drop_inode...
1263
  static void iput_final(struct inode *inode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1264
1265
  {
  	struct super_block *sb = inode->i_sb;
45321ac54   Al Viro   Make ->drop_inode...
1266
1267
  	const struct super_operations *op = inode->i_sb->s_op;
  	int drop;
250df6ed2   Dave Chinner   fs: protect inode...
1268
  	WARN_ON(inode->i_state & I_NEW);
e7f590970   Al Viro   kill useless chec...
1269
  	if (op->drop_inode)
45321ac54   Al Viro   Make ->drop_inode...
1270
1271
1272
  		drop = op->drop_inode(inode);
  	else
  		drop = generic_drop_inode(inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1273

b2b2af8e6   Dave Chinner   fs: factor inode ...
1274
1275
1276
1277
1278
  	if (!drop && (sb->s_flags & MS_ACTIVE)) {
  		inode->i_state |= I_REFERENCED;
  		if (!(inode->i_state & (I_DIRTY|I_SYNC)))
  			inode_lru_list_add(inode);
  		spin_unlock(&inode->i_lock);
b2b2af8e6   Dave Chinner   fs: factor inode ...
1279
1280
  		return;
  	}
45321ac54   Al Viro   Make ->drop_inode...
1281
  	if (!drop) {
991114c6f   Alexander Viro   [PATCH] fix for p...
1282
  		inode->i_state |= I_WILL_FREE;
250df6ed2   Dave Chinner   fs: protect inode...
1283
  		spin_unlock(&inode->i_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1284
  		write_inode_now(inode, 1);
250df6ed2   Dave Chinner   fs: protect inode...
1285
  		spin_lock(&inode->i_lock);
7ef0d7377   Nick Piggin   fs: new inode i_s...
1286
  		WARN_ON(inode->i_state & I_NEW);
991114c6f   Alexander Viro   [PATCH] fix for p...
1287
  		inode->i_state &= ~I_WILL_FREE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1288
  	}
7ccf19a80   Nick Piggin   fs: inode split I...
1289

991114c6f   Alexander Viro   [PATCH] fix for p...
1290
  	inode->i_state |= I_FREEING;
c4ae0c654   Eric Dumazet   vfs: avoid call t...
1291
1292
  	if (!list_empty(&inode->i_lru))
  		inode_lru_list_del(inode);
b2b2af8e6   Dave Chinner   fs: factor inode ...
1293
  	spin_unlock(&inode->i_lock);
b2b2af8e6   Dave Chinner   fs: factor inode ...
1294

644da5960   Al Viro   fs/inode.c:evict(...
1295
  	evict(inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1296
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1297
  /**
6b3304b53   Manish Katiyar   Make checkpatch.p...
1298
   *	iput	- put an inode
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
   *	@inode: inode to put
   *
   *	Puts an inode, dropping its usage count. If the inode use count hits
   *	zero, the inode is then freed and may also be destroyed.
   *
   *	Consequently, iput() can sleep.
   */
  void iput(struct inode *inode)
  {
  	if (inode) {
a4ffdde6e   Al Viro   simplify checks f...
1309
  		BUG_ON(inode->i_state & I_CLEAR);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1310

f283c86af   Dave Chinner   fs: remove inode_...
1311
  		if (atomic_dec_and_lock(&inode->i_count, &inode->i_lock))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1312
1313
1314
  			iput_final(inode);
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
  EXPORT_SYMBOL(iput);
  
  /**
   *	bmap	- find a block number in a file
   *	@inode: inode of file
   *	@block: block to find
   *
   *	Returns the block number on the device holding the inode that
   *	is the disk block number for the block of the file requested.
   *	That is, asked for block 4 of inode 1 the function will return the
6b3304b53   Manish Katiyar   Make checkpatch.p...
1325
   *	disk block relative to the disk start that holds that block of the
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1326
1327
   *	file.
   */
6b3304b53   Manish Katiyar   Make checkpatch.p...
1328
  sector_t bmap(struct inode *inode, sector_t block)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1329
1330
1331
1332
1333
1334
  {
  	sector_t res = 0;
  	if (inode->i_mapping->a_ops->bmap)
  		res = inode->i_mapping->a_ops->bmap(inode->i_mapping, block);
  	return res;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1335
  EXPORT_SYMBOL(bmap);
11ff6f05f   Matthew Garrett   Allow relatime to...
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
  /*
   * With relative atime, only update atime if the previous atime is
   * earlier than either the ctime or mtime or if at least a day has
   * passed since the last atime update.
   */
  static int relatime_need_update(struct vfsmount *mnt, struct inode *inode,
  			     struct timespec now)
  {
  
  	if (!(mnt->mnt_flags & MNT_RELATIME))
  		return 1;
  	/*
  	 * Is mtime younger than atime? If yes, update atime:
  	 */
  	if (timespec_compare(&inode->i_mtime, &inode->i_atime) >= 0)
  		return 1;
  	/*
  	 * Is ctime younger than atime? If yes, update atime:
  	 */
  	if (timespec_compare(&inode->i_ctime, &inode->i_atime) >= 0)
  		return 1;
  
  	/*
  	 * Is the previous atime value older than a day? If yes,
  	 * update atime:
  	 */
  	if ((long)(now.tv_sec - inode->i_atime.tv_sec) >= 24*60*60)
  		return 1;
  	/*
  	 * Good, we can skip the atime update:
  	 */
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1369
  /**
869243a0f   Christoph Hellwig   [PATCH] remove up...
1370
1371
   *	touch_atime	-	update the access time
   *	@mnt: mount the inode is accessed on
7045f37b1   Martin Waitz   [PATCH] DocBook: ...
1372
   *	@dentry: dentry accessed
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1373
1374
1375
1376
1377
   *
   *	Update the accessed time on an inode and mark it for writeback.
   *	This function automatically handles read only file systems and media,
   *	as well as the "noatime" flag and inode specific "noatime" markers.
   */
869243a0f   Christoph Hellwig   [PATCH] remove up...
1378
  void touch_atime(struct vfsmount *mnt, struct dentry *dentry)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1379
  {
869243a0f   Christoph Hellwig   [PATCH] remove up...
1380
  	struct inode *inode = dentry->d_inode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1381
  	struct timespec now;
cdb70f3f7   Dave Hansen   [PATCH] r/o bind ...
1382
  	if (inode->i_flags & S_NOATIME)
b12536c27   Andi Kleen   vfs: optimization...
1383
  		return;
37756ced1   Eric Dumazet   [PATCH] avoid one...
1384
  	if (IS_NOATIME(inode))
b12536c27   Andi Kleen   vfs: optimization...
1385
  		return;
b22761384   Andrew Morton   [PATCH] touch_ati...
1386
  	if ((inode->i_sb->s_flags & MS_NODIRATIME) && S_ISDIR(inode->i_mode))
b12536c27   Andi Kleen   vfs: optimization...
1387
  		return;
47ae32d6a   Valerie Henson   [PATCH] relative ...
1388

cdb70f3f7   Dave Hansen   [PATCH] r/o bind ...
1389
  	if (mnt->mnt_flags & MNT_NOATIME)
b12536c27   Andi Kleen   vfs: optimization...
1390
  		return;
cdb70f3f7   Dave Hansen   [PATCH] r/o bind ...
1391
  	if ((mnt->mnt_flags & MNT_NODIRATIME) && S_ISDIR(inode->i_mode))
b12536c27   Andi Kleen   vfs: optimization...
1392
  		return;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1393
1394
  
  	now = current_fs_time(inode->i_sb);
11ff6f05f   Matthew Garrett   Allow relatime to...
1395
1396
  
  	if (!relatime_need_update(mnt, inode, now))
b12536c27   Andi Kleen   vfs: optimization...
1397
  		return;
11ff6f05f   Matthew Garrett   Allow relatime to...
1398

47ae32d6a   Valerie Henson   [PATCH] relative ...
1399
  	if (timespec_equal(&inode->i_atime, &now))
b12536c27   Andi Kleen   vfs: optimization...
1400
1401
1402
1403
  		return;
  
  	if (mnt_want_write(mnt))
  		return;
47ae32d6a   Valerie Henson   [PATCH] relative ...
1404
1405
1406
  
  	inode->i_atime = now;
  	mark_inode_dirty_sync(inode);
cdb70f3f7   Dave Hansen   [PATCH] r/o bind ...
1407
  	mnt_drop_write(mnt);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1408
  }
869243a0f   Christoph Hellwig   [PATCH] remove up...
1409
  EXPORT_SYMBOL(touch_atime);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1410
1411
  
  /**
870f48179   Christoph Hellwig   [PATCH] replace i...
1412
1413
   *	file_update_time	-	update mtime and ctime time
   *	@file: file accessed
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1414
   *
870f48179   Christoph Hellwig   [PATCH] replace i...
1415
1416
1417
1418
   *	Update the mtime and ctime members of an inode and mark the inode
   *	for writeback.  Note that this function is meant exclusively for
   *	usage in the file write path of filesystems, and filesystems may
   *	choose to explicitly ignore update via this function with the
2eadfc0ed   Wolfram Sang   trivial: fs/inode...
1419
   *	S_NOCMTIME inode flag, e.g. for network filesystem where these
870f48179   Christoph Hellwig   [PATCH] replace i...
1420
   *	timestamps are handled by the server.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1421
   */
870f48179   Christoph Hellwig   [PATCH] replace i...
1422
  void file_update_time(struct file *file)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1423
  {
0f7fc9e4d   Josef "Jeff" Sipek   [PATCH] VFS: chan...
1424
  	struct inode *inode = file->f_path.dentry->d_inode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1425
  	struct timespec now;
ce06e0b21   Andi Kleen   vfs: optimize tou...
1426
  	enum { S_MTIME = 1, S_CTIME = 2, S_VERSION = 4 } sync_it = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1427

ce06e0b21   Andi Kleen   vfs: optimize tou...
1428
  	/* First try to exhaust all avenues to not sync */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1429
1430
  	if (IS_NOCMTIME(inode))
  		return;
20ddee2c7   Dave Hansen   [PATCH] r/o bind ...
1431

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1432
  	now = current_fs_time(inode->i_sb);
ce06e0b21   Andi Kleen   vfs: optimize tou...
1433
1434
  	if (!timespec_equal(&inode->i_mtime, &now))
  		sync_it = S_MTIME;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1435

ce06e0b21   Andi Kleen   vfs: optimize tou...
1436
1437
  	if (!timespec_equal(&inode->i_ctime, &now))
  		sync_it |= S_CTIME;
870f48179   Christoph Hellwig   [PATCH] replace i...
1438

ce06e0b21   Andi Kleen   vfs: optimize tou...
1439
1440
  	if (IS_I_VERSION(inode))
  		sync_it |= S_VERSION;
7a224228e   Jean Noel Cordenner   vfs: Add 64 bit i...
1441

ce06e0b21   Andi Kleen   vfs: optimize tou...
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
  	if (!sync_it)
  		return;
  
  	/* Finally allowed to write? Takes lock. */
  	if (mnt_want_write_file(file))
  		return;
  
  	/* Only change inode inside the lock region */
  	if (sync_it & S_VERSION)
  		inode_inc_iversion(inode);
  	if (sync_it & S_CTIME)
  		inode->i_ctime = now;
  	if (sync_it & S_MTIME)
  		inode->i_mtime = now;
  	mark_inode_dirty_sync(inode);
20ddee2c7   Dave Hansen   [PATCH] r/o bind ...
1457
  	mnt_drop_write(file->f_path.mnt);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1458
  }
870f48179   Christoph Hellwig   [PATCH] replace i...
1459
  EXPORT_SYMBOL(file_update_time);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1460
1461
1462
1463
1464
1465
1466
1467
1468
  
  int inode_needs_sync(struct inode *inode)
  {
  	if (IS_SYNC(inode))
  		return 1;
  	if (S_ISDIR(inode->i_mode) && IS_DIRSYNC(inode))
  		return 1;
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1469
  EXPORT_SYMBOL(inode_needs_sync);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1470
1471
1472
1473
1474
  int inode_wait(void *word)
  {
  	schedule();
  	return 0;
  }
d44dab8d1   Stephen Rothwell   fs: xfs needs ino...
1475
  EXPORT_SYMBOL(inode_wait);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1476
1477
  
  /*
168a9fd6a   Miklos Szeredi   [PATCH] __wait_on...
1478
1479
1480
1481
1482
1483
   * If we try to find an inode in the inode hash while it is being
   * deleted, we have to wait until the filesystem completes its
   * deletion before reporting that it isn't found.  This function waits
   * until the deletion _might_ have completed.  Callers are responsible
   * to recheck inode state.
   *
eaff8079d   Christoph Hellwig   kill I_LOCK
1484
   * It doesn't matter if I_NEW is not set initially, a call to
250df6ed2   Dave Chinner   fs: protect inode...
1485
1486
   * wake_up_bit(&inode->i_state, __I_NEW) after removing from the hash list
   * will DTRT.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1487
1488
1489
1490
   */
  static void __wait_on_freeing_inode(struct inode *inode)
  {
  	wait_queue_head_t *wq;
eaff8079d   Christoph Hellwig   kill I_LOCK
1491
1492
  	DEFINE_WAIT_BIT(wait, &inode->i_state, __I_NEW);
  	wq = bit_waitqueue(&inode->i_state, __I_NEW);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1493
  	prepare_to_wait(wq, &wait.wait, TASK_UNINTERRUPTIBLE);
250df6ed2   Dave Chinner   fs: protect inode...
1494
  	spin_unlock(&inode->i_lock);
67a23c494   Dave Chinner   fs: rename inode_...
1495
  	spin_unlock(&inode_hash_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1496
1497
  	schedule();
  	finish_wait(wq, &wait.wait);
67a23c494   Dave Chinner   fs: rename inode_...
1498
  	spin_lock(&inode_hash_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1499
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
  static __initdata unsigned long ihash_entries;
  static int __init set_ihash_entries(char *str)
  {
  	if (!str)
  		return 0;
  	ihash_entries = simple_strtoul(str, &str, 0);
  	return 1;
  }
  __setup("ihash_entries=", set_ihash_entries);
  
  /*
   * Initialize the waitqueues and inode hash table.
   */
  void __init inode_init_early(void)
  {
  	int loop;
  
  	/* If hashes are distributed across NUMA nodes, defer
  	 * hash allocation until vmalloc space is available.
  	 */
  	if (hashdist)
  		return;
  
  	inode_hashtable =
  		alloc_large_system_hash("Inode-cache",
  					sizeof(struct hlist_head),
  					ihash_entries,
  					14,
  					HASH_EARLY,
  					&i_hash_shift,
  					&i_hash_mask,
  					0);
  
  	for (loop = 0; loop < (1 << i_hash_shift); loop++)
  		INIT_HLIST_HEAD(&inode_hashtable[loop]);
  }
74bf17cff   Denis Cheng   fs: remove the un...
1536
  void __init inode_init(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1537
1538
1539
1540
  {
  	int loop;
  
  	/* inode slab cache */
b0196009d   Paul Jackson   [PATCH] cpuset me...
1541
1542
1543
1544
1545
  	inode_cachep = kmem_cache_create("inode_cache",
  					 sizeof(struct inode),
  					 0,
  					 (SLAB_RECLAIM_ACCOUNT|SLAB_PANIC|
  					 SLAB_MEM_SPREAD),
20c2df83d   Paul Mundt   mm: Remove slab d...
1546
  					 init_once);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
  
  	/* Hash may have been set up in inode_init_early */
  	if (!hashdist)
  		return;
  
  	inode_hashtable =
  		alloc_large_system_hash("Inode-cache",
  					sizeof(struct hlist_head),
  					ihash_entries,
  					14,
  					0,
  					&i_hash_shift,
  					&i_hash_mask,
  					0);
  
  	for (loop = 0; loop < (1 << i_hash_shift); loop++)
  		INIT_HLIST_HEAD(&inode_hashtable[loop]);
  }
  
  void init_special_inode(struct inode *inode, umode_t mode, dev_t rdev)
  {
  	inode->i_mode = mode;
  	if (S_ISCHR(mode)) {
  		inode->i_fop = &def_chr_fops;
  		inode->i_rdev = rdev;
  	} else if (S_ISBLK(mode)) {
  		inode->i_fop = &def_blk_fops;
  		inode->i_rdev = rdev;
  	} else if (S_ISFIFO(mode))
  		inode->i_fop = &def_fifo_fops;
  	else if (S_ISSOCK(mode))
  		inode->i_fop = &bad_sock_fops;
  	else
af0d9ae81   Manish Katiyar   fs/inode.c: add d...
1580
1581
1582
1583
  		printk(KERN_DEBUG "init_special_inode: bogus i_mode (%o) for"
  				  " inode %s:%lu
  ", mode, inode->i_sb->s_id,
  				  inode->i_ino);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1584
1585
  }
  EXPORT_SYMBOL(init_special_inode);
a1bd120d1   Dmitry Monakhov   vfs: Add inode ui...
1586
1587
  
  /**
eaae668d0   Ben Hutchings   fs/inode: Fix ker...
1588
   * inode_init_owner - Init uid,gid,mode for new inode according to posix standards
a1bd120d1   Dmitry Monakhov   vfs: Add inode ui...
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
   * @inode: New inode
   * @dir: Directory inode
   * @mode: mode of the new inode
   */
  void inode_init_owner(struct inode *inode, const struct inode *dir,
  			mode_t mode)
  {
  	inode->i_uid = current_fsuid();
  	if (dir && dir->i_mode & S_ISGID) {
  		inode->i_gid = dir->i_gid;
  		if (S_ISDIR(mode))
  			mode |= S_ISGID;
  	} else
  		inode->i_gid = current_fsgid();
  	inode->i_mode = mode;
  }
  EXPORT_SYMBOL(inode_init_owner);
e795b7179   Serge E. Hallyn   userns: userns: c...
1606

2e1496707   Serge E. Hallyn   userns: rename is...
1607
1608
1609
1610
1611
1612
  /**
   * inode_owner_or_capable - check current task permissions to inode
   * @inode: inode being checked
   *
   * Return true if current either has CAP_FOWNER to the inode, or
   * owns the file.
e795b7179   Serge E. Hallyn   userns: userns: c...
1613
   */
2e1496707   Serge E. Hallyn   userns: rename is...
1614
  bool inode_owner_or_capable(const struct inode *inode)
e795b7179   Serge E. Hallyn   userns: userns: c...
1615
1616
1617
1618
1619
1620
1621
1622
1623
  {
  	struct user_namespace *ns = inode_userns(inode);
  
  	if (current_user_ns() == ns && current_fsuid() == inode->i_uid)
  		return true;
  	if (ns_capable(ns, CAP_FOWNER))
  		return true;
  	return false;
  }
2e1496707   Serge E. Hallyn   userns: rename is...
1624
  EXPORT_SYMBOL(inode_owner_or_capable);