Blame view

fs/inode.c 50 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
   */
e59cc473c   Al Viro   trim includes in ...
5
  #include <linux/export.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6
7
  #include <linux/fs.h>
  #include <linux/mm.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
8
  #include <linux/backing-dev.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
9
10
11
  #include <linux/hash.h>
  #include <linux/swap.h>
  #include <linux/security.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
12
13
  #include <linux/cdev.h>
  #include <linux/bootmem.h>
3be25f49b   Eric Paris   fsnotify: add mar...
14
  #include <linux/fsnotify.h>
fc33a7bb9   Christoph Hellwig   [PATCH] per-mount...
15
  #include <linux/mount.h>
f19d4a8fa   Al Viro   add caching of AC...
16
  #include <linux/posix_acl.h>
9ce6e0be0   Heiko Carstens   fs: add missing p...
17
  #include <linux/prefetch.h>
4b4563dc8   Christoph Hellwig   fs: cosmetic inod...
18
  #include <linux/buffer_head.h> /* for inode_has_buffers */
7ada4db88   Miklos Szeredi   vfs: count unlink...
19
  #include <linux/ratelimit.h>
bc3b14cb2   Dave Chinner   inode: convert in...
20
  #include <linux/list_lru.h>
a66979aba   Dave Chinner   fs: move i_wb_lis...
21
  #include "internal.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
22
23
  
  /*
4b4563dc8   Christoph Hellwig   fs: cosmetic inod...
24
   * Inode locking rules:
250df6ed2   Dave Chinner   fs: protect inode...
25
26
27
   *
   * inode->i_lock protects:
   *   inode->i_state, inode->i_hash, __iget()
bc3b14cb2   Dave Chinner   inode: convert in...
28
   * Inode LRU list locks protect:
98b745c64   Dave Chinner   inode: Make unuse...
29
   *   inode->i_sb->s_inode_lru, inode->i_lru
55fa6091d   Dave Chinner   fs: move i_sb_lis...
30
31
   * inode_sb_list_lock protects:
   *   sb->s_inodes, inode->i_sb_list
f758eeabe   Christoph Hellwig   writeback: split ...
32
   * bdi->wb.list_lock protects:
a66979aba   Dave Chinner   fs: move i_wb_lis...
33
   *   bdi->wb.b_{dirty,io,more_io}, inode->i_wb_list
67a23c494   Dave Chinner   fs: rename inode_...
34
35
   * inode_hash_lock protects:
   *   inode_hashtable, inode->i_hash
250df6ed2   Dave Chinner   fs: protect inode...
36
37
   *
   * Lock ordering:
55fa6091d   Dave Chinner   fs: move i_sb_lis...
38
39
40
   *
   * inode_sb_list_lock
   *   inode->i_lock
bc3b14cb2   Dave Chinner   inode: convert in...
41
   *     Inode LRU list locks
a66979aba   Dave Chinner   fs: move i_wb_lis...
42
   *
f758eeabe   Christoph Hellwig   writeback: split ...
43
   * bdi->wb.list_lock
a66979aba   Dave Chinner   fs: move i_wb_lis...
44
   *   inode->i_lock
67a23c494   Dave Chinner   fs: rename inode_...
45
46
47
48
49
50
51
   *
   * inode_hash_lock
   *   inode_sb_list_lock
   *   inode->i_lock
   *
   * iunique_lock
   *   inode_hash_lock
250df6ed2   Dave Chinner   fs: protect inode...
52
   */
fa3536cc1   Eric Dumazet   [PATCH] Use __rea...
53
54
  static unsigned int i_hash_mask __read_mostly;
  static unsigned int i_hash_shift __read_mostly;
67a23c494   Dave Chinner   fs: rename inode_...
55
56
  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
57

55fa6091d   Dave Chinner   fs: move i_sb_lis...
58
  __cacheline_aligned_in_smp DEFINE_SPINLOCK(inode_sb_list_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
59
  /*
7dcda1c96   Jens Axboe   fs: export empty_...
60
61
62
63
64
65
66
67
   * 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
68
69
70
   * Statistics gathering..
   */
  struct inodes_stat_t inodes_stat;
3942c07cc   Glauber Costa   fs: bump inode an...
71
72
  static DEFINE_PER_CPU(unsigned long, nr_inodes);
  static DEFINE_PER_CPU(unsigned long, nr_unused);
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
73

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

3942c07cc   Glauber Costa   fs: bump inode an...
76
  static long get_nr_inodes(void)
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
77
  {
3e880fb5e   Nick Piggin   fs: use fast coun...
78
  	int i;
3942c07cc   Glauber Costa   fs: bump inode an...
79
  	long sum = 0;
3e880fb5e   Nick Piggin   fs: use fast coun...
80
81
82
  	for_each_possible_cpu(i)
  		sum += per_cpu(nr_inodes, i);
  	return sum < 0 ? 0 : sum;
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
83
  }
3942c07cc   Glauber Costa   fs: bump inode an...
84
  static inline long get_nr_inodes_unused(void)
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
85
  {
fcb94f72d   Dave Chinner   inode: convert in...
86
  	int i;
3942c07cc   Glauber Costa   fs: bump inode an...
87
  	long sum = 0;
fcb94f72d   Dave Chinner   inode: convert in...
88
89
90
  	for_each_possible_cpu(i)
  		sum += per_cpu(nr_unused, i);
  	return sum < 0 ? 0 : sum;
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
91
  }
3942c07cc   Glauber Costa   fs: bump inode an...
92
  long get_nr_dirty_inodes(void)
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
93
  {
3e880fb5e   Nick Piggin   fs: use fast coun...
94
  	/* not actually dirty inodes, but a wild approximation */
3942c07cc   Glauber Costa   fs: bump inode an...
95
  	long nr_dirty = get_nr_inodes() - get_nr_inodes_unused();
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
96
  	return nr_dirty > 0 ? nr_dirty : 0;
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
97
98
99
100
101
102
  }
  
  /*
   * Handle nr_inode sysctl
   */
  #ifdef CONFIG_SYSCTL
1f7e0616c   Joe Perches   fs: convert use o...
103
  int proc_nr_inodes(struct ctl_table *table, int write,
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
104
105
106
  		   void __user *buffer, size_t *lenp, loff_t *ppos)
  {
  	inodes_stat.nr_inodes = get_nr_inodes();
fcb94f72d   Dave Chinner   inode: convert in...
107
  	inodes_stat.nr_unused = get_nr_inodes_unused();
3942c07cc   Glauber Costa   fs: bump inode an...
108
  	return proc_doulongvec_minmax(table, write, buffer, lenp, ppos);
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
109
110
  }
  #endif
2cb1599f9   David Chinner   Inode: Allow exte...
111
112
  /**
   * inode_init_always - perform inode structure intialisation
0bc02f3fa   Randy Dunlap   fs/inode: fix ker...
113
114
   * @sb: superblock inode belongs to
   * @inode: inode to initialise
2cb1599f9   David Chinner   Inode: Allow exte...
115
116
117
118
   *
   * 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...
119
  int inode_init_always(struct super_block *sb, struct inode *inode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
120
  {
6e1d5dcc2   Alexey Dobriyan   const: mark remai...
121
  	static const struct inode_operations empty_iops;
99ac48f54   Arjan van de Ven   [PATCH] mark f_op...
122
  	static const struct file_operations empty_fops;
6b3304b53   Manish Katiyar   Make checkpatch.p...
123
  	struct address_space *const mapping = &inode->i_data;
2cb1599f9   David Chinner   Inode: Allow exte...
124
125
126
127
128
129
130
  
  	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
131
  	inode->__i_nlink = 1;
3ddcd0569   Linus Torvalds   vfs: optimize ino...
132
  	inode->i_opflags = 0;
92361636e   Eric W. Biederman   userns: Store uid...
133
134
  	i_uid_write(inode, 0);
  	i_gid_write(inode, 0);
2cb1599f9   David Chinner   Inode: Allow exte...
135
136
137
138
139
  	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
140
  #ifdef CONFIG_QUOTA
2cb1599f9   David Chinner   Inode: Allow exte...
141
  	memset(&inode->i_dquot, 0, sizeof(inode->i_dquot));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
142
  #endif
2cb1599f9   David Chinner   Inode: Allow exte...
143
144
145
146
147
  	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
148
149
  
  	if (security_inode_alloc(inode))
54e346215   Christoph Hellwig   vfs: fix inode_in...
150
  		goto out;
2cb1599f9   David Chinner   Inode: Allow exte...
151
152
153
154
155
  	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
156
  	atomic_set(&inode->i_dio_count, 0);
2cb1599f9   David Chinner   Inode: Allow exte...
157
158
159
160
  
  	mapping->a_ops = &empty_aops;
  	mapping->host = inode;
  	mapping->flags = 0;
4bb5f5d93   David Herrmann   mm: allow drivers...
161
  	atomic_set(&mapping->i_mmap_writable, 0);
3c1d43787   Hugh Dickins   mm: remove GFP_HI...
162
  	mapping_set_gfp_mask(mapping, GFP_HIGHUSER_MOVABLE);
252aa6f5b   Rafael Aquini   mm: redefine addr...
163
  	mapping->private_data = NULL;
2cb1599f9   David Chinner   Inode: Allow exte...
164
165
166
167
168
169
170
171
172
173
  	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->...
174
  		bdi = sb->s_bdev->bd_inode->i_mapping->backing_dev_info;
2cb1599f9   David Chinner   Inode: Allow exte...
175
176
177
178
  		mapping->backing_dev_info = bdi;
  	}
  	inode->i_private = NULL;
  	inode->i_mapping = mapping;
b3d9b7a3c   Al Viro   vfs: switch i_den...
179
  	INIT_HLIST_HEAD(&inode->i_dentry);	/* buggered by rcu freeing */
f19d4a8fa   Al Viro   add caching of AC...
180
181
182
  #ifdef CONFIG_FS_POSIX_ACL
  	inode->i_acl = inode->i_default_acl = ACL_NOT_CACHED;
  #endif
2cb1599f9   David Chinner   Inode: Allow exte...
183

3be25f49b   Eric Paris   fsnotify: add mar...
184
185
186
  #ifdef CONFIG_FSNOTIFY
  	inode->i_fsnotify_mask = 0;
  #endif
3e880fb5e   Nick Piggin   fs: use fast coun...
187
  	this_cpu_inc(nr_inodes);
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
188

54e346215   Christoph Hellwig   vfs: fix inode_in...
189
  	return 0;
54e346215   Christoph Hellwig   vfs: fix inode_in...
190
191
  out:
  	return -ENOMEM;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
192
  }
2cb1599f9   David Chinner   Inode: Allow exte...
193
194
195
196
197
198
199
200
201
202
  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...
203
204
205
206
207
208
209
210
211
212
213
214
  	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...
215
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
216

ff0c7d15f   Nick Piggin   fs: avoid inode R...
217
218
219
220
221
  void free_inode_nonrcu(struct inode *inode)
  {
  	kmem_cache_free(inode_cachep, inode);
  }
  EXPORT_SYMBOL(free_inode_nonrcu);
2e00c97e2   Christoph Hellwig   vfs: add __destro...
222
  void __destroy_inode(struct inode *inode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
223
  {
b7542f8c7   Eric Sesterhenn   BUG_ON() Conversi...
224
  	BUG_ON(inode_has_buffers(inode));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
225
  	security_inode_free(inode);
3be25f49b   Eric Paris   fsnotify: add mar...
226
  	fsnotify_inode_delete(inode);
7ada4db88   Miklos Szeredi   vfs: count unlink...
227
228
229
230
  	if (!inode->i_nlink) {
  		WARN_ON(atomic_long_read(&inode->i_sb->s_remove_count) == 0);
  		atomic_long_dec(&inode->i_sb->s_remove_count);
  	}
f19d4a8fa   Al Viro   add caching of AC...
231
232
233
234
235
236
  #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...
237
  	this_cpu_dec(nr_inodes);
2e00c97e2   Christoph Hellwig   vfs: add __destro...
238
239
  }
  EXPORT_SYMBOL(__destroy_inode);
fa0d7e3de   Nick Piggin   fs: icache RCU fr...
240
241
242
  static void i_callback(struct rcu_head *head)
  {
  	struct inode *inode = container_of(head, struct inode, i_rcu);
fa0d7e3de   Nick Piggin   fs: icache RCU fr...
243
244
  	kmem_cache_free(inode_cachep, inode);
  }
56b0dacfa   Christoph Hellwig   fs: mark destroy_...
245
  static void destroy_inode(struct inode *inode)
2e00c97e2   Christoph Hellwig   vfs: add __destro...
246
  {
7ccf19a80   Nick Piggin   fs: inode split I...
247
  	BUG_ON(!list_empty(&inode->i_lru));
2e00c97e2   Christoph Hellwig   vfs: add __destro...
248
  	__destroy_inode(inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
249
250
251
  	if (inode->i_sb->s_op->destroy_inode)
  		inode->i_sb->s_op->destroy_inode(inode);
  	else
fa0d7e3de   Nick Piggin   fs: icache RCU fr...
252
  		call_rcu(&inode->i_rcu, i_callback);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
253
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
254

7ada4db88   Miklos Szeredi   vfs: count unlink...
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
  /**
   * drop_nlink - directly drop an inode's link count
   * @inode: inode
   *
   * This is a low-level filesystem helper to replace any
   * direct filesystem manipulation of i_nlink.  In cases
   * where we are attempting to track writes to the
   * filesystem, a decrement to zero means an imminent
   * write when the file is truncated and actually unlinked
   * on the filesystem.
   */
  void drop_nlink(struct inode *inode)
  {
  	WARN_ON(inode->i_nlink == 0);
  	inode->__i_nlink--;
  	if (!inode->i_nlink)
  		atomic_long_inc(&inode->i_sb->s_remove_count);
  }
  EXPORT_SYMBOL(drop_nlink);
  
  /**
   * clear_nlink - directly zero an inode's link count
   * @inode: inode
   *
   * This is a low-level filesystem helper to replace any
   * direct filesystem manipulation of i_nlink.  See
   * drop_nlink() for why we care about i_nlink hitting zero.
   */
  void clear_nlink(struct inode *inode)
  {
  	if (inode->i_nlink) {
  		inode->__i_nlink = 0;
  		atomic_long_inc(&inode->i_sb->s_remove_count);
  	}
  }
  EXPORT_SYMBOL(clear_nlink);
  
  /**
   * set_nlink - directly set an inode's link count
   * @inode: inode
   * @nlink: new nlink (should be non-zero)
   *
   * This is a low-level filesystem helper to replace any
   * direct filesystem manipulation of i_nlink.
   */
  void set_nlink(struct inode *inode, unsigned int nlink)
  {
  	if (!nlink) {
7ada4db88   Miklos Szeredi   vfs: count unlink...
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
  		clear_nlink(inode);
  	} else {
  		/* Yes, some filesystems do change nlink from zero to one */
  		if (inode->i_nlink == 0)
  			atomic_long_dec(&inode->i_sb->s_remove_count);
  
  		inode->__i_nlink = nlink;
  	}
  }
  EXPORT_SYMBOL(set_nlink);
  
  /**
   * inc_nlink - directly increment an inode's link count
   * @inode: inode
   *
   * This is a low-level filesystem helper to replace any
   * direct filesystem manipulation of i_nlink.  Currently,
   * it is only here for parity with dec_nlink().
   */
  void inc_nlink(struct inode *inode)
  {
f4e0c30c1   Al Viro   allow the temp fi...
324
325
  	if (unlikely(inode->i_nlink == 0)) {
  		WARN_ON(!(inode->i_state & I_LINKABLE));
7ada4db88   Miklos Szeredi   vfs: count unlink...
326
  		atomic_long_dec(&inode->i_sb->s_remove_count);
f4e0c30c1   Al Viro   allow the temp fi...
327
  	}
7ada4db88   Miklos Szeredi   vfs: count unlink...
328
329
330
331
  
  	inode->__i_nlink++;
  }
  EXPORT_SYMBOL(inc_nlink);
2aa15890f   Miklos Szeredi   mm: prevent concu...
332
333
334
335
336
  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...
337
  	mutex_init(&mapping->i_mmap_mutex);
2aa15890f   Miklos Szeredi   mm: prevent concu...
338
339
  	INIT_LIST_HEAD(&mapping->private_list);
  	spin_lock_init(&mapping->private_lock);
6b2dbba8b   Michel Lespinasse   mm: replace vma p...
340
  	mapping->i_mmap = RB_ROOT;
2aa15890f   Miklos Szeredi   mm: prevent concu...
341
  	INIT_LIST_HEAD(&mapping->i_mmap_nonlinear);
2aa15890f   Miklos Szeredi   mm: prevent concu...
342
343
  }
  EXPORT_SYMBOL(address_space_init_once);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
344
345
346
347
348
349
350
351
352
  /*
   * 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);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
353
  	INIT_LIST_HEAD(&inode->i_devices);
7ccf19a80   Nick Piggin   fs: inode split I...
354
355
  	INIT_LIST_HEAD(&inode->i_wb_list);
  	INIT_LIST_HEAD(&inode->i_lru);
2aa15890f   Miklos Szeredi   mm: prevent concu...
356
  	address_space_init_once(&inode->i_data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
357
  	i_size_ordered_init(inode);
3be25f49b   Eric Paris   fsnotify: add mar...
358
  #ifdef CONFIG_FSNOTIFY
e61ce8673   Eric Paris   fsnotify: rename ...
359
  	INIT_HLIST_HEAD(&inode->i_fsnotify_marks);
3be25f49b   Eric Paris   fsnotify: add mar...
360
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
361
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
362
  EXPORT_SYMBOL(inode_init_once);
51cc50685   Alexey Dobriyan   SL*B: drop kmem c...
363
  static void init_once(void *foo)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
364
  {
6b3304b53   Manish Katiyar   Make checkpatch.p...
365
  	struct inode *inode = (struct inode *) foo;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
366

a35afb830   Christoph Lameter   Remove SLAB_CTOR_...
367
  	inode_init_once(inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
368
369
370
  }
  
  /*
250df6ed2   Dave Chinner   fs: protect inode...
371
   * inode->i_lock must be held
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
372
   */
6b3304b53   Manish Katiyar   Make checkpatch.p...
373
  void __iget(struct inode *inode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
374
  {
9e38d86ff   Nick Piggin   fs: Implement laz...
375
376
  	atomic_inc(&inode->i_count);
  }
2e147f1ef   Richard Kennedy   fs: inode.c use a...
377

7de9c6ee3   Al Viro   new helper: ihold()
378
379
380
381
382
383
384
385
  /*
   * 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...
386
387
  static void inode_lru_list_add(struct inode *inode)
  {
bc3b14cb2   Dave Chinner   inode: convert in...
388
  	if (list_lru_add(&inode->i_sb->s_inode_lru, &inode->i_lru))
fcb94f72d   Dave Chinner   inode: convert in...
389
  		this_cpu_inc(nr_unused);
9e38d86ff   Nick Piggin   fs: Implement laz...
390
  }
2e147f1ef   Richard Kennedy   fs: inode.c use a...
391

4eff96dd5   Jan Kara   writeback: put un...
392
393
394
395
396
397
398
399
400
401
402
  /*
   * Add inode to LRU if needed (inode is unused and clean).
   *
   * Needs inode->i_lock held.
   */
  void inode_add_lru(struct inode *inode)
  {
  	if (!(inode->i_state & (I_DIRTY | I_SYNC | I_FREEING | I_WILL_FREE)) &&
  	    !atomic_read(&inode->i_count) && inode->i_sb->s_flags & MS_ACTIVE)
  		inode_lru_list_add(inode);
  }
9e38d86ff   Nick Piggin   fs: Implement laz...
403
404
  static void inode_lru_list_del(struct inode *inode)
  {
bc3b14cb2   Dave Chinner   inode: convert in...
405
406
  
  	if (list_lru_del(&inode->i_sb->s_inode_lru, &inode->i_lru))
fcb94f72d   Dave Chinner   inode: convert in...
407
  		this_cpu_dec(nr_unused);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
408
  }
646ec4615   Christoph Hellwig   fs: remove inode_...
409
410
411
412
413
414
  /**
   * 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...
415
416
417
  	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_...
418
419
  }
  EXPORT_SYMBOL_GPL(inode_sb_list_add);
55fa6091d   Dave Chinner   fs: move i_sb_lis...
420
  static inline void inode_sb_list_del(struct inode *inode)
646ec4615   Christoph Hellwig   fs: remove inode_...
421
  {
a209dfc7b   Eric Dumazet   vfs: dont chain p...
422
423
424
425
426
  	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_...
427
  }
4c51acbc6   Dave Chinner   fs: Factor inode ...
428
429
430
431
432
433
  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...
434
435
  	tmp = tmp ^ ((tmp ^ GOLDEN_RATIO_PRIME) >> i_hash_shift);
  	return tmp & i_hash_mask;
4c51acbc6   Dave Chinner   fs: Factor inode ...
436
437
438
439
440
441
442
443
444
445
446
447
  }
  
  /**
   *	__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_...
448
  	struct hlist_head *b = inode_hashtable + hash(inode->i_sb, hashval);
67a23c494   Dave Chinner   fs: rename inode_...
449
  	spin_lock(&inode_hash_lock);
250df6ed2   Dave Chinner   fs: protect inode...
450
  	spin_lock(&inode->i_lock);
646ec4615   Christoph Hellwig   fs: remove inode_...
451
  	hlist_add_head(&inode->i_hash, b);
250df6ed2   Dave Chinner   fs: protect inode...
452
  	spin_unlock(&inode->i_lock);
67a23c494   Dave Chinner   fs: rename inode_...
453
  	spin_unlock(&inode_hash_lock);
4c51acbc6   Dave Chinner   fs: Factor inode ...
454
455
456
457
  }
  EXPORT_SYMBOL(__insert_inode_hash);
  
  /**
f2ee7abf4   Eric Dumazet   vfs: avoid taking...
458
   *	__remove_inode_hash - remove an inode from the hash
4c51acbc6   Dave Chinner   fs: Factor inode ...
459
460
461
462
   *	@inode: inode to unhash
   *
   *	Remove an inode from the superblock.
   */
f2ee7abf4   Eric Dumazet   vfs: avoid taking...
463
  void __remove_inode_hash(struct inode *inode)
4c51acbc6   Dave Chinner   fs: Factor inode ...
464
  {
67a23c494   Dave Chinner   fs: rename inode_...
465
  	spin_lock(&inode_hash_lock);
250df6ed2   Dave Chinner   fs: protect inode...
466
  	spin_lock(&inode->i_lock);
4c51acbc6   Dave Chinner   fs: Factor inode ...
467
  	hlist_del_init(&inode->i_hash);
250df6ed2   Dave Chinner   fs: protect inode...
468
  	spin_unlock(&inode->i_lock);
67a23c494   Dave Chinner   fs: rename inode_...
469
  	spin_unlock(&inode_hash_lock);
4c51acbc6   Dave Chinner   fs: Factor inode ...
470
  }
f2ee7abf4   Eric Dumazet   vfs: avoid taking...
471
  EXPORT_SYMBOL(__remove_inode_hash);
4c51acbc6   Dave Chinner   fs: Factor inode ...
472

dbd5768f8   Jan Kara   vfs: Rename end_w...
473
  void clear_inode(struct inode *inode)
b0683aa63   Al Viro   new helper: end_w...
474
475
  {
  	might_sleep();
08142579b   Jan Kara   mm: fix assertion...
476
477
478
479
480
481
  	/*
  	 * 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...
482
  	BUG_ON(inode->i_data.nrpages);
91b0abe36   Johannes Weiner   mm + fs: store sh...
483
  	BUG_ON(inode->i_data.nrshadows);
08142579b   Jan Kara   mm: fix assertion...
484
  	spin_unlock_irq(&inode->i_data.tree_lock);
b0683aa63   Al Viro   new helper: end_w...
485
486
487
  	BUG_ON(!list_empty(&inode->i_data.private_list));
  	BUG_ON(!(inode->i_state & I_FREEING));
  	BUG_ON(inode->i_state & I_CLEAR);
fa0d7e3de   Nick Piggin   fs: icache RCU fr...
488
  	/* don't need i_lock here, no concurrent mods to i_state */
b0683aa63   Al Viro   new helper: end_w...
489
490
  	inode->i_state = I_FREEING | I_CLEAR;
  }
dbd5768f8   Jan Kara   vfs: Rename end_w...
491
  EXPORT_SYMBOL(clear_inode);
b0683aa63   Al Viro   new helper: end_w...
492

b2b2af8e6   Dave Chinner   fs: factor inode ...
493
494
495
496
497
498
499
500
501
502
503
504
505
  /*
   * 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(...
506
  static void evict(struct inode *inode)
b4272d4c8   Al Viro   unify fs/inode.c ...
507
508
  {
  	const struct super_operations *op = inode->i_sb->s_op;
b2b2af8e6   Dave Chinner   fs: factor inode ...
509
510
  	BUG_ON(!(inode->i_state & I_FREEING));
  	BUG_ON(!list_empty(&inode->i_lru));
b12362bdb   Eric Dumazet   vfs: conditionall...
511
512
  	if (!list_empty(&inode->i_wb_list))
  		inode_wb_list_del(inode);
55fa6091d   Dave Chinner   fs: move i_sb_lis...
513
  	inode_sb_list_del(inode);
169ebd901   Jan Kara   writeback: Avoid ...
514
515
516
517
518
519
520
  	/*
  	 * Wait for flusher thread to be done with the inode so that filesystem
  	 * does not start destroying it while writeback is still running. Since
  	 * the inode has I_FREEING set, flusher thread won't start new work on
  	 * the inode.  We just have to wait for running writeback to finish.
  	 */
  	inode_wait_for_writeback(inode);
7994e6f72   Jan Kara   vfs: Move waiting...
521

be7ce4161   Al Viro   New method - evic...
522
523
  	if (op->evict_inode) {
  		op->evict_inode(inode);
b4272d4c8   Al Viro   unify fs/inode.c ...
524
  	} else {
91b0abe36   Johannes Weiner   mm + fs: store sh...
525
  		truncate_inode_pages_final(&inode->i_data);
dbd5768f8   Jan Kara   vfs: Rename end_w...
526
  		clear_inode(inode);
b4272d4c8   Al Viro   unify fs/inode.c ...
527
  	}
661074e91   Al Viro   Take ->i_bdev/->i...
528
529
530
531
  	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 ...
532
533
534
535
536
537
538
539
540
  
  	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 ...
541
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
542
543
544
545
546
547
548
549
550
  /*
   * 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
551
552
  	while (!list_empty(head)) {
  		struct inode *inode;
7ccf19a80   Nick Piggin   fs: inode split I...
553
554
  		inode = list_first_entry(head, struct inode, i_lru);
  		list_del_init(&inode->i_lru);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
555

644da5960   Al Viro   fs/inode.c:evict(...
556
  		evict(inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
557
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
558
  }
a03187867   Christoph Hellwig   fs: fold invalida...
559
  /**
63997e98a   Al Viro   split invalidate_...
560
561
562
563
564
565
566
   * 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
567
   */
63997e98a   Al Viro   split invalidate_...
568
  void evict_inodes(struct super_block *sb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
569
  {
63997e98a   Al Viro   split invalidate_...
570
571
  	struct inode *inode, *next;
  	LIST_HEAD(dispose);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
572

55fa6091d   Dave Chinner   fs: move i_sb_lis...
573
  	spin_lock(&inode_sb_list_lock);
63997e98a   Al Viro   split invalidate_...
574
575
  	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...
576
  			continue;
250df6ed2   Dave Chinner   fs: protect inode...
577
578
579
580
  
  		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
581
  			continue;
250df6ed2   Dave Chinner   fs: protect inode...
582
  		}
63997e98a   Al Viro   split invalidate_...
583
584
  
  		inode->i_state |= I_FREEING;
02afc410f   Dave Chinner   fs: Lock the inod...
585
  		inode_lru_list_del(inode);
250df6ed2   Dave Chinner   fs: protect inode...
586
  		spin_unlock(&inode->i_lock);
02afc410f   Dave Chinner   fs: Lock the inod...
587
  		list_add(&inode->i_lru, &dispose);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
588
  	}
55fa6091d   Dave Chinner   fs: move i_sb_lis...
589
  	spin_unlock(&inode_sb_list_lock);
63997e98a   Al Viro   split invalidate_...
590
591
  
  	dispose_list(&dispose);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
592
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
593
  /**
a03187867   Christoph Hellwig   fs: fold invalida...
594
595
   * invalidate_inodes	- attempt to free all inodes on a superblock
   * @sb:		superblock to operate on
93b270f76   NeilBrown   Fix over-zealous ...
596
   * @kill_dirty: flag to guide handling of dirty inodes
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
597
   *
a03187867   Christoph Hellwig   fs: fold invalida...
598
599
   * 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 ...
600
601
   * If @kill_dirty is set, discard dirty inodes too, otherwise treat
   * them as busy.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
602
   */
93b270f76   NeilBrown   Fix over-zealous ...
603
  int invalidate_inodes(struct super_block *sb, bool kill_dirty)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
604
  {
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
605
  	int busy = 0;
a03187867   Christoph Hellwig   fs: fold invalida...
606
607
  	struct inode *inode, *next;
  	LIST_HEAD(dispose);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
608

55fa6091d   Dave Chinner   fs: move i_sb_lis...
609
  	spin_lock(&inode_sb_list_lock);
a03187867   Christoph Hellwig   fs: fold invalida...
610
  	list_for_each_entry_safe(inode, next, &sb->s_inodes, i_sb_list) {
250df6ed2   Dave Chinner   fs: protect inode...
611
612
613
  		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...
614
  			continue;
250df6ed2   Dave Chinner   fs: protect inode...
615
  		}
93b270f76   NeilBrown   Fix over-zealous ...
616
  		if (inode->i_state & I_DIRTY && !kill_dirty) {
250df6ed2   Dave Chinner   fs: protect inode...
617
  			spin_unlock(&inode->i_lock);
93b270f76   NeilBrown   Fix over-zealous ...
618
619
620
  			busy = 1;
  			continue;
  		}
99a389192   Christoph Hellwig   fs: fix buffer in...
621
  		if (atomic_read(&inode->i_count)) {
250df6ed2   Dave Chinner   fs: protect inode...
622
  			spin_unlock(&inode->i_lock);
99a389192   Christoph Hellwig   fs: fix buffer in...
623
  			busy = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
624
625
  			continue;
  		}
99a389192   Christoph Hellwig   fs: fix buffer in...
626

99a389192   Christoph Hellwig   fs: fix buffer in...
627
  		inode->i_state |= I_FREEING;
02afc410f   Dave Chinner   fs: Lock the inod...
628
  		inode_lru_list_del(inode);
250df6ed2   Dave Chinner   fs: protect inode...
629
  		spin_unlock(&inode->i_lock);
02afc410f   Dave Chinner   fs: Lock the inod...
630
  		list_add(&inode->i_lru, &dispose);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
631
  	}
55fa6091d   Dave Chinner   fs: move i_sb_lis...
632
  	spin_unlock(&inode_sb_list_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
633

a03187867   Christoph Hellwig   fs: fold invalida...
634
  	dispose_list(&dispose);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
635
636
637
  
  	return busy;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
638

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
639
  /*
bc3b14cb2   Dave Chinner   inode: convert in...
640
   * Isolate the inode from the LRU in preparation for freeing it.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
641
642
   *
   * Any inodes which are pinned purely because of attached pagecache have their
9e38d86ff   Nick Piggin   fs: Implement laz...
643
644
   * 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
645
   *
9e38d86ff   Nick Piggin   fs: Implement laz...
646
647
648
649
650
651
652
   * 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
653
   */
bc3b14cb2   Dave Chinner   inode: convert in...
654
655
  static enum lru_status
  inode_lru_isolate(struct list_head *item, spinlock_t *lru_lock, void *arg)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
656
  {
bc3b14cb2   Dave Chinner   inode: convert in...
657
658
  	struct list_head *freeable = arg;
  	struct inode	*inode = container_of(item, struct inode, i_lru);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
659

bc3b14cb2   Dave Chinner   inode: convert in...
660
661
662
663
664
665
  	/*
  	 * we are inverting the lru lock/inode->i_lock here, so use a trylock.
  	 * If we fail to get the lock, just skip it.
  	 */
  	if (!spin_trylock(&inode->i_lock))
  		return LRU_SKIP;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
666

bc3b14cb2   Dave Chinner   inode: convert in...
667
668
669
670
671
672
673
674
675
676
677
  	/*
  	 * 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)) {
  		list_del_init(&inode->i_lru);
  		spin_unlock(&inode->i_lock);
  		this_cpu_dec(nr_unused);
  		return LRU_REMOVED;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
678

bc3b14cb2   Dave Chinner   inode: convert in...
679
680
681
682
683
684
  	/* recently referenced inodes get one more pass */
  	if (inode->i_state & I_REFERENCED) {
  		inode->i_state &= ~I_REFERENCED;
  		spin_unlock(&inode->i_lock);
  		return LRU_ROTATE;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
685

bc3b14cb2   Dave Chinner   inode: convert in...
686
687
688
689
690
691
692
693
694
695
696
697
698
  	if (inode_has_buffers(inode) || inode->i_data.nrpages) {
  		__iget(inode);
  		spin_unlock(&inode->i_lock);
  		spin_unlock(lru_lock);
  		if (remove_inode_buffers(inode)) {
  			unsigned long reap;
  			reap = invalidate_mapping_pages(&inode->i_data, 0, -1);
  			if (current_is_kswapd())
  				__count_vm_events(KSWAPD_INODESTEAL, reap);
  			else
  				__count_vm_events(PGINODESTEAL, reap);
  			if (current->reclaim_state)
  				current->reclaim_state->reclaimed_slab += reap;
02afc410f   Dave Chinner   fs: Lock the inod...
699
  		}
bc3b14cb2   Dave Chinner   inode: convert in...
700
701
702
703
  		iput(inode);
  		spin_lock(lru_lock);
  		return LRU_RETRY;
  	}
02afc410f   Dave Chinner   fs: Lock the inod...
704

bc3b14cb2   Dave Chinner   inode: convert in...
705
706
  	WARN_ON(inode->i_state & I_NEW);
  	inode->i_state |= I_FREEING;
d38fa6986   Glauber Costa   inode: move inode...
707
  	list_move(&inode->i_lru, freeable);
bc3b14cb2   Dave Chinner   inode: convert in...
708
  	spin_unlock(&inode->i_lock);
9e38d86ff   Nick Piggin   fs: Implement laz...
709

bc3b14cb2   Dave Chinner   inode: convert in...
710
711
712
  	this_cpu_dec(nr_unused);
  	return LRU_REMOVED;
  }
7ccf19a80   Nick Piggin   fs: inode split I...
713

bc3b14cb2   Dave Chinner   inode: convert in...
714
715
716
717
718
719
  /*
   * 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().
   */
9b17c6238   Dave Chinner   fs: convert inode...
720
721
  long prune_icache_sb(struct super_block *sb, unsigned long nr_to_scan,
  		     int nid)
bc3b14cb2   Dave Chinner   inode: convert in...
722
723
724
  {
  	LIST_HEAD(freeable);
  	long freed;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
725

9b17c6238   Dave Chinner   fs: convert inode...
726
727
  	freed = list_lru_walk_node(&sb->s_inode_lru, nid, inode_lru_isolate,
  				       &freeable, &nr_to_scan);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
728
  	dispose_list(&freeable);
0a234c6dc   Dave Chinner   shrinker: convert...
729
  	return freed;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
730
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
731
732
733
  static void __wait_on_freeing_inode(struct inode *inode);
  /*
   * Called with the inode lock held.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
734
   */
6b3304b53   Manish Katiyar   Make checkpatch.p...
735
736
737
738
  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
739
  {
6b3304b53   Manish Katiyar   Make checkpatch.p...
740
  	struct inode *inode = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
741
742
  
  repeat:
b67bfe0d4   Sasha Levin   hlist: drop the n...
743
  	hlist_for_each_entry(inode, head, i_hash) {
5a3cd9928   Al Viro   iget/iget5: don't...
744
  		if (inode->i_sb != sb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
745
  			continue;
5a3cd9928   Al Viro   iget/iget5: don't...
746
  		if (!test(inode, data))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
747
  			continue;
5a3cd9928   Al Viro   iget/iget5: don't...
748
  		spin_lock(&inode->i_lock);
a4ffdde6e   Al Viro   simplify checks f...
749
  		if (inode->i_state & (I_FREEING|I_WILL_FREE)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
750
751
752
  			__wait_on_freeing_inode(inode);
  			goto repeat;
  		}
f7899bd54   Christoph Hellwig   fs: move i_count ...
753
  		__iget(inode);
250df6ed2   Dave Chinner   fs: protect inode...
754
  		spin_unlock(&inode->i_lock);
f7899bd54   Christoph Hellwig   fs: move i_count ...
755
  		return inode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
756
  	}
f7899bd54   Christoph Hellwig   fs: move i_count ...
757
  	return NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
758
759
760
761
762
763
  }
  
  /*
   * 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...
764
765
  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
766
  {
6b3304b53   Manish Katiyar   Make checkpatch.p...
767
  	struct inode *inode = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
768
769
  
  repeat:
b67bfe0d4   Sasha Levin   hlist: drop the n...
770
  	hlist_for_each_entry(inode, head, i_hash) {
5a3cd9928   Al Viro   iget/iget5: don't...
771
  		if (inode->i_ino != ino)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
772
  			continue;
5a3cd9928   Al Viro   iget/iget5: don't...
773
  		if (inode->i_sb != sb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
774
  			continue;
5a3cd9928   Al Viro   iget/iget5: don't...
775
  		spin_lock(&inode->i_lock);
a4ffdde6e   Al Viro   simplify checks f...
776
  		if (inode->i_state & (I_FREEING|I_WILL_FREE)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
777
778
779
  			__wait_on_freeing_inode(inode);
  			goto repeat;
  		}
f7899bd54   Christoph Hellwig   fs: move i_count ...
780
  		__iget(inode);
250df6ed2   Dave Chinner   fs: protect inode...
781
  		spin_unlock(&inode->i_lock);
f7899bd54   Christoph Hellwig   fs: move i_count ...
782
  		return inode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
783
  	}
f7899bd54   Christoph Hellwig   fs: move i_count ...
784
  	return NULL;
8290c35f8   David Chinner   Inode: Allow exte...
785
  }
f991bd2e1   Eric Dumazet   fs: introduce a p...
786
787
788
789
  /*
   * 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...
790
   *
f991bd2e1   Eric Dumazet   fs: introduce a p...
791
792
793
794
795
796
797
798
799
   * 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...
800
   */
f991bd2e1   Eric Dumazet   fs: introduce a p...
801
802
  #define LAST_INO_BATCH 1024
  static DEFINE_PER_CPU(unsigned int, last_ino);
85fe4025c   Christoph Hellwig   fs: do not assign...
803
  unsigned int get_next_ino(void)
8290c35f8   David Chinner   Inode: Allow exte...
804
  {
f991bd2e1   Eric Dumazet   fs: introduce a p...
805
806
  	unsigned int *p = &get_cpu_var(last_ino);
  	unsigned int res = *p;
8290c35f8   David Chinner   Inode: Allow exte...
807

f991bd2e1   Eric Dumazet   fs: introduce a p...
808
809
810
811
812
813
814
815
816
817
818
819
  #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...
820
  }
85fe4025c   Christoph Hellwig   fs: do not assign...
821
  EXPORT_SYMBOL(get_next_ino);
8290c35f8   David Chinner   Inode: Allow exte...
822

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
823
  /**
a209dfc7b   Eric Dumazet   vfs: dont chain p...
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
   *	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
847
848
849
   *	new_inode 	- obtain an inode
   *	@sb: superblock
   *
769848c03   Mel Gorman   Add __GFP_MOVABLE...
850
   *	Allocates a new inode for given superblock. The default gfp_mask
3c1d43787   Hugh Dickins   mm: remove GFP_HI...
851
   *	for allocations related to inode->i_mapping is GFP_HIGHUSER_MOVABLE.
769848c03   Mel Gorman   Add __GFP_MOVABLE...
852
853
854
855
856
   *	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
857
858
859
   */
  struct inode *new_inode(struct super_block *sb)
  {
6b3304b53   Manish Katiyar   Make checkpatch.p...
860
  	struct inode *inode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
861

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

a209dfc7b   Eric Dumazet   vfs: dont chain p...
864
865
  	inode = new_inode_pseudo(sb);
  	if (inode)
55fa6091d   Dave Chinner   fs: move i_sb_lis...
866
  		inode_sb_list_add(inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
867
868
  	return inode;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
869
  EXPORT_SYMBOL(new_inode);
14358e6dd   Peter Zijlstra   lockdep: annotate...
870
  #ifdef CONFIG_DEBUG_LOCK_ALLOC
e096d0c7e   Josh Boyer   lockdep: Add help...
871
872
  void lockdep_annotate_inode_mutex_key(struct inode *inode)
  {
a3314a0ed   Namhyung Kim   lockdep: fixup ch...
873
  	if (S_ISDIR(inode->i_mode)) {
1e89a5e15   Peter Zijlstra   lockdep: fixup th...
874
  		struct file_system_type *type = inode->i_sb->s_type;
9a7aa12f3   Jan Kara   vfs: Set special ...
875
  		/* Set new key only if filesystem hasn't already changed it */
978d6d8c4   Tyler Hicks   vfs: Correctly se...
876
  		if (lockdep_match_class(&inode->i_mutex, &type->i_mutex_key)) {
9a7aa12f3   Jan Kara   vfs: Set special ...
877
878
879
880
881
882
883
884
  			/*
  			 * 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...
885
  	}
e096d0c7e   Josh Boyer   lockdep: Add help...
886
887
  }
  EXPORT_SYMBOL(lockdep_annotate_inode_mutex_key);
14358e6dd   Peter Zijlstra   lockdep: annotate...
888
  #endif
e096d0c7e   Josh Boyer   lockdep: Add help...
889
890
891
892
893
894
895
896
897
898
899
  
  /**
   * 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...
900
  	spin_lock(&inode->i_lock);
eaff8079d   Christoph Hellwig   kill I_LOCK
901
902
  	WARN_ON(!(inode->i_state & I_NEW));
  	inode->i_state &= ~I_NEW;
310fa7a36   Al Viro   restore smp_mb() ...
903
  	smp_mb();
250df6ed2   Dave Chinner   fs: protect inode...
904
905
  	wake_up_bit(&inode->i_state, __I_NEW);
  	spin_unlock(&inode->i_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
906
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
907
  EXPORT_SYMBOL(unlock_new_inode);
0b2d0724e   Christoph Hellwig   fs: simplify iget...
908
  /**
375e289ea   J. Bruce Fields   vfs: pull ext4's ...
909
   * lock_two_nondirectories - take two i_mutexes on non-directory objects
4fd699ae3   J. Bruce Fields   vfs: lock_two_non...
910
911
912
913
   *
   * Lock any non-NULL argument that is not a directory.
   * Zero, one or two objects may be locked by this function.
   *
375e289ea   J. Bruce Fields   vfs: pull ext4's ...
914
915
916
917
918
   * @inode1: first inode to lock
   * @inode2: second inode to lock
   */
  void lock_two_nondirectories(struct inode *inode1, struct inode *inode2)
  {
4fd699ae3   J. Bruce Fields   vfs: lock_two_non...
919
920
921
922
  	if (inode1 > inode2)
  		swap(inode1, inode2);
  
  	if (inode1 && !S_ISDIR(inode1->i_mode))
275555163   J. Bruce Fields   vfs: don't use PA...
923
  		mutex_lock(&inode1->i_mutex);
4fd699ae3   J. Bruce Fields   vfs: lock_two_non...
924
  	if (inode2 && !S_ISDIR(inode2->i_mode) && inode2 != inode1)
40bd22c9f   J. Bruce Fields   vfs: rename I_MUT...
925
  		mutex_lock_nested(&inode2->i_mutex, I_MUTEX_NONDIR2);
375e289ea   J. Bruce Fields   vfs: pull ext4's ...
926
927
928
929
930
931
932
933
934
935
  }
  EXPORT_SYMBOL(lock_two_nondirectories);
  
  /**
   * unlock_two_nondirectories - release locks from lock_two_nondirectories()
   * @inode1: first inode to unlock
   * @inode2: second inode to unlock
   */
  void unlock_two_nondirectories(struct inode *inode1, struct inode *inode2)
  {
4fd699ae3   J. Bruce Fields   vfs: lock_two_non...
936
937
938
  	if (inode1 && !S_ISDIR(inode1->i_mode))
  		mutex_unlock(&inode1->i_mutex);
  	if (inode2 && !S_ISDIR(inode2->i_mode) && inode2 != inode1)
375e289ea   J. Bruce Fields   vfs: pull ext4's ...
939
940
941
942
943
  		mutex_unlock(&inode2->i_mutex);
  }
  EXPORT_SYMBOL(unlock_two_nondirectories);
  
  /**
0b2d0724e   Christoph Hellwig   fs: simplify iget...
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
   * 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
959
   *
0b2d0724e   Christoph Hellwig   fs: simplify iget...
960
961
   * 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
962
   */
0b2d0724e   Christoph Hellwig   fs: simplify iget...
963
964
965
  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
966
  {
0b2d0724e   Christoph Hellwig   fs: simplify iget...
967
  	struct hlist_head *head = inode_hashtable + hash(sb, hashval);
6b3304b53   Manish Katiyar   Make checkpatch.p...
968
  	struct inode *inode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
969

0b2d0724e   Christoph Hellwig   fs: simplify iget...
970
971
972
973
974
975
976
977
  	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
978
979
  	inode = alloc_inode(sb);
  	if (inode) {
6b3304b53   Manish Katiyar   Make checkpatch.p...
980
  		struct inode *old;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
981

67a23c494   Dave Chinner   fs: rename inode_...
982
  		spin_lock(&inode_hash_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
983
984
985
986
987
  		/* 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...
988
989
  			spin_lock(&inode->i_lock);
  			inode->i_state = I_NEW;
646ec4615   Christoph Hellwig   fs: remove inode_...
990
  			hlist_add_head(&inode->i_hash, head);
250df6ed2   Dave Chinner   fs: protect inode...
991
  			spin_unlock(&inode->i_lock);
55fa6091d   Dave Chinner   fs: move i_sb_lis...
992
  			inode_sb_list_add(inode);
67a23c494   Dave Chinner   fs: rename inode_...
993
  			spin_unlock(&inode_hash_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
  
  			/* 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_...
1006
  		spin_unlock(&inode_hash_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1007
1008
1009
1010
1011
1012
1013
  		destroy_inode(inode);
  		inode = old;
  		wait_on_inode(inode);
  	}
  	return inode;
  
  set_failed:
67a23c494   Dave Chinner   fs: rename inode_...
1014
  	spin_unlock(&inode_hash_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1015
1016
1017
  	destroy_inode(inode);
  	return NULL;
  }
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1018
  EXPORT_SYMBOL(iget5_locked);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1019

0b2d0724e   Christoph Hellwig   fs: simplify iget...
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
  /**
   * 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
1032
   */
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1033
  struct inode *iget_locked(struct super_block *sb, unsigned long ino)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1034
  {
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1035
  	struct hlist_head *head = inode_hashtable + hash(sb, ino);
6b3304b53   Manish Katiyar   Make checkpatch.p...
1036
  	struct inode *inode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1037

0b2d0724e   Christoph Hellwig   fs: simplify iget...
1038
1039
1040
1041
1042
1043
1044
  	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
1045
1046
  	inode = alloc_inode(sb);
  	if (inode) {
6b3304b53   Manish Katiyar   Make checkpatch.p...
1047
  		struct inode *old;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1048

67a23c494   Dave Chinner   fs: rename inode_...
1049
  		spin_lock(&inode_hash_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1050
1051
1052
1053
  		/* We released the lock, so.. */
  		old = find_inode_fast(sb, head, ino);
  		if (!old) {
  			inode->i_ino = ino;
250df6ed2   Dave Chinner   fs: protect inode...
1054
1055
  			spin_lock(&inode->i_lock);
  			inode->i_state = I_NEW;
646ec4615   Christoph Hellwig   fs: remove inode_...
1056
  			hlist_add_head(&inode->i_hash, head);
250df6ed2   Dave Chinner   fs: protect inode...
1057
  			spin_unlock(&inode->i_lock);
55fa6091d   Dave Chinner   fs: move i_sb_lis...
1058
  			inode_sb_list_add(inode);
67a23c494   Dave Chinner   fs: rename inode_...
1059
  			spin_unlock(&inode_hash_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
  
  			/* 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_...
1072
  		spin_unlock(&inode_hash_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1073
1074
1075
1076
1077
1078
  		destroy_inode(inode);
  		inode = old;
  		wait_on_inode(inode);
  	}
  	return inode;
  }
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1079
  EXPORT_SYMBOL(iget_locked);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1080

ad5e195ac   Christoph Hellwig   fs: Stop abusing ...
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
  /*
   * 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);
ad5e195ac   Christoph Hellwig   fs: Stop abusing ...
1091
  	struct inode *inode;
67a23c494   Dave Chinner   fs: rename inode_...
1092
  	spin_lock(&inode_hash_lock);
b67bfe0d4   Sasha Levin   hlist: drop the n...
1093
  	hlist_for_each_entry(inode, b, i_hash) {
67a23c494   Dave Chinner   fs: rename inode_...
1094
1095
  		if (inode->i_ino == ino && inode->i_sb == sb) {
  			spin_unlock(&inode_hash_lock);
ad5e195ac   Christoph Hellwig   fs: Stop abusing ...
1096
  			return 0;
67a23c494   Dave Chinner   fs: rename inode_...
1097
  		}
ad5e195ac   Christoph Hellwig   fs: Stop abusing ...
1098
  	}
67a23c494   Dave Chinner   fs: rename inode_...
1099
  	spin_unlock(&inode_hash_lock);
ad5e195ac   Christoph Hellwig   fs: Stop abusing ...
1100
1101
1102
  
  	return 1;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
  /**
   *	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: ...
1119
1120
1121
1122
1123
  	/*
  	 * 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 ...
1124
  	static DEFINE_SPINLOCK(iunique_lock);
866b04fcc   Jeff Layton   inode numbering: ...
1125
  	static unsigned int counter;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1126
  	ino_t res;
3361c7beb   Jeffrey Layton   make iunique use ...
1127

ad5e195ac   Christoph Hellwig   fs: Stop abusing ...
1128
  	spin_lock(&iunique_lock);
3361c7beb   Jeffrey Layton   make iunique use ...
1129
1130
1131
  	do {
  		if (counter <= max_reserved)
  			counter = max_reserved + 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1132
  		res = counter++;
ad5e195ac   Christoph Hellwig   fs: Stop abusing ...
1133
1134
  	} while (!test_inode_iunique(sb, res));
  	spin_unlock(&iunique_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1135

3361c7beb   Jeffrey Layton   make iunique use ...
1136
1137
  	return res;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1138
1139
1140
1141
  EXPORT_SYMBOL(iunique);
  
  struct inode *igrab(struct inode *inode)
  {
250df6ed2   Dave Chinner   fs: protect inode...
1142
1143
  	spin_lock(&inode->i_lock);
  	if (!(inode->i_state & (I_FREEING|I_WILL_FREE))) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1144
  		__iget(inode);
250df6ed2   Dave Chinner   fs: protect inode...
1145
1146
1147
  		spin_unlock(&inode->i_lock);
  	} else {
  		spin_unlock(&inode->i_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1148
1149
1150
1151
1152
1153
  		/*
  		 * 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...
1154
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1155
1156
  	return inode;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1157
1158
1159
  EXPORT_SYMBOL(igrab);
  
  /**
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1160
   * ilookup5_nowait - search for an inode in the inode cache
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1161
   * @sb:		super block of file system to search
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1162
   * @hashval:	hash value (usually inode number) to search for
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1163
1164
   * @test:	callback used for comparisons between inodes
   * @data:	opaque data pointer to pass to @test
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1165
   *
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1166
   * Search for the inode specified by @hashval and @data in the inode cache.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1167
1168
1169
   * If the inode is in the cache, the inode is returned with an incremented
   * reference count.
   *
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1170
1171
   * 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
1172
   *
b6d0ad686   Randy Dunlap   fs: fix inode.c k...
1173
   * Note2: @test is called with the inode_hash_lock held, so can't sleep.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1174
   */
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1175
1176
  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
1177
  {
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1178
  	struct hlist_head *head = inode_hashtable + hash(sb, hashval);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1179
  	struct inode *inode;
67a23c494   Dave Chinner   fs: rename inode_...
1180
  	spin_lock(&inode_hash_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1181
  	inode = find_inode(sb, head, test, data);
67a23c494   Dave Chinner   fs: rename inode_...
1182
  	spin_unlock(&inode_hash_lock);
88bd5121d   Anton Altaparmakov   [PATCH] Fix soft ...
1183

0b2d0724e   Christoph Hellwig   fs: simplify iget...
1184
  	return inode;
88bd5121d   Anton Altaparmakov   [PATCH] Fix soft ...
1185
  }
88bd5121d   Anton Altaparmakov   [PATCH] Fix soft ...
1186
1187
1188
1189
1190
1191
1192
1193
1194
  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...
1195
1196
1197
   * 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 ...
1198
   * returned with an incremented reference count.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1199
   *
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1200
1201
   * 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
1202
   *
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1203
   * Note: @test is called with the inode_hash_lock held, so can't sleep.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1204
1205
1206
1207
   */
  struct inode *ilookup5(struct super_block *sb, unsigned long hashval,
  		int (*test)(struct inode *, void *), void *data)
  {
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1208
  	struct inode *inode = ilookup5_nowait(sb, hashval, test, data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1209

0b2d0724e   Christoph Hellwig   fs: simplify iget...
1210
1211
1212
  	if (inode)
  		wait_on_inode(inode);
  	return inode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1213
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1214
1215
1216
1217
1218
1219
1220
  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...
1221
1222
   * 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
1223
1224
1225
1226
   */
  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
1227
  	struct inode *inode;
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1228
1229
1230
  	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
1231

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1232
  	if (inode)
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1233
1234
  		wait_on_inode(inode);
  	return inode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1235
  }
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1236
  EXPORT_SYMBOL(ilookup);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1237

261bca86e   Al Viro   nfsd/create race ...
1238
1239
1240
1241
1242
  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 ...
1243

261bca86e   Al Viro   nfsd/create race ...
1244
  	while (1) {
72a43d63c   Al Viro   ext3/4 with synch...
1245
  		struct inode *old = NULL;
67a23c494   Dave Chinner   fs: rename inode_...
1246
  		spin_lock(&inode_hash_lock);
b67bfe0d4   Sasha Levin   hlist: drop the n...
1247
  		hlist_for_each_entry(old, head, i_hash) {
72a43d63c   Al Viro   ext3/4 with synch...
1248
1249
1250
1251
  			if (old->i_ino != ino)
  				continue;
  			if (old->i_sb != sb)
  				continue;
250df6ed2   Dave Chinner   fs: protect inode...
1252
1253
1254
  			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...
1255
  				continue;
250df6ed2   Dave Chinner   fs: protect inode...
1256
  			}
72a43d63c   Al Viro   ext3/4 with synch...
1257
1258
  			break;
  		}
b67bfe0d4   Sasha Levin   hlist: drop the n...
1259
  		if (likely(!old)) {
250df6ed2   Dave Chinner   fs: protect inode...
1260
1261
  			spin_lock(&inode->i_lock);
  			inode->i_state |= I_NEW;
261bca86e   Al Viro   nfsd/create race ...
1262
  			hlist_add_head(&inode->i_hash, head);
250df6ed2   Dave Chinner   fs: protect inode...
1263
  			spin_unlock(&inode->i_lock);
67a23c494   Dave Chinner   fs: rename inode_...
1264
  			spin_unlock(&inode_hash_lock);
261bca86e   Al Viro   nfsd/create race ...
1265
1266
1267
  			return 0;
  		}
  		__iget(old);
250df6ed2   Dave Chinner   fs: protect inode...
1268
  		spin_unlock(&old->i_lock);
67a23c494   Dave Chinner   fs: rename inode_...
1269
  		spin_unlock(&inode_hash_lock);
261bca86e   Al Viro   nfsd/create race ...
1270
  		wait_on_inode(old);
1d3382cbf   Al Viro   new helper: inode...
1271
  		if (unlikely(!inode_unhashed(old))) {
261bca86e   Al Viro   nfsd/create race ...
1272
1273
1274
1275
1276
1277
  			iput(old);
  			return -EBUSY;
  		}
  		iput(old);
  	}
  }
261bca86e   Al Viro   nfsd/create race ...
1278
1279
1280
1281
1282
1283
1284
  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 ...
1285

261bca86e   Al Viro   nfsd/create race ...
1286
  	while (1) {
72a43d63c   Al Viro   ext3/4 with synch...
1287
  		struct inode *old = NULL;
67a23c494   Dave Chinner   fs: rename inode_...
1288
  		spin_lock(&inode_hash_lock);
b67bfe0d4   Sasha Levin   hlist: drop the n...
1289
  		hlist_for_each_entry(old, head, i_hash) {
72a43d63c   Al Viro   ext3/4 with synch...
1290
1291
1292
1293
  			if (old->i_sb != sb)
  				continue;
  			if (!test(old, data))
  				continue;
250df6ed2   Dave Chinner   fs: protect inode...
1294
1295
1296
  			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...
1297
  				continue;
250df6ed2   Dave Chinner   fs: protect inode...
1298
  			}
72a43d63c   Al Viro   ext3/4 with synch...
1299
1300
  			break;
  		}
b67bfe0d4   Sasha Levin   hlist: drop the n...
1301
  		if (likely(!old)) {
250df6ed2   Dave Chinner   fs: protect inode...
1302
1303
  			spin_lock(&inode->i_lock);
  			inode->i_state |= I_NEW;
261bca86e   Al Viro   nfsd/create race ...
1304
  			hlist_add_head(&inode->i_hash, head);
250df6ed2   Dave Chinner   fs: protect inode...
1305
  			spin_unlock(&inode->i_lock);
67a23c494   Dave Chinner   fs: rename inode_...
1306
  			spin_unlock(&inode_hash_lock);
261bca86e   Al Viro   nfsd/create race ...
1307
1308
1309
  			return 0;
  		}
  		__iget(old);
250df6ed2   Dave Chinner   fs: protect inode...
1310
  		spin_unlock(&old->i_lock);
67a23c494   Dave Chinner   fs: rename inode_...
1311
  		spin_unlock(&inode_hash_lock);
261bca86e   Al Viro   nfsd/create race ...
1312
  		wait_on_inode(old);
1d3382cbf   Al Viro   new helper: inode...
1313
  		if (unlikely(!inode_unhashed(old))) {
261bca86e   Al Viro   nfsd/create race ...
1314
1315
1316
1317
1318
1319
  			iput(old);
  			return -EBUSY;
  		}
  		iput(old);
  	}
  }
261bca86e   Al Viro   nfsd/create race ...
1320
  EXPORT_SYMBOL(insert_inode_locked4);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1321

45321ac54   Al Viro   Make ->drop_inode...
1322
1323
1324
1325
1326
  int generic_delete_inode(struct inode *inode)
  {
  	return 1;
  }
  EXPORT_SYMBOL(generic_delete_inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1327
  /*
45321ac54   Al Viro   Make ->drop_inode...
1328
1329
   * Called when we're dropping the last reference
   * to an inode.
22fe40421   Jan Kara   vfs: split generi...
1330
   *
45321ac54   Al Viro   Make ->drop_inode...
1331
1332
1333
1334
1335
   * 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...
1336
   */
45321ac54   Al Viro   Make ->drop_inode...
1337
  static void iput_final(struct inode *inode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1338
1339
  {
  	struct super_block *sb = inode->i_sb;
45321ac54   Al Viro   Make ->drop_inode...
1340
1341
  	const struct super_operations *op = inode->i_sb->s_op;
  	int drop;
250df6ed2   Dave Chinner   fs: protect inode...
1342
  	WARN_ON(inode->i_state & I_NEW);
e7f590970   Al Viro   kill useless chec...
1343
  	if (op->drop_inode)
45321ac54   Al Viro   Make ->drop_inode...
1344
1345
1346
  		drop = op->drop_inode(inode);
  	else
  		drop = generic_drop_inode(inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1347

b2b2af8e6   Dave Chinner   fs: factor inode ...
1348
1349
  	if (!drop && (sb->s_flags & MS_ACTIVE)) {
  		inode->i_state |= I_REFERENCED;
4eff96dd5   Jan Kara   writeback: put un...
1350
  		inode_add_lru(inode);
b2b2af8e6   Dave Chinner   fs: factor inode ...
1351
  		spin_unlock(&inode->i_lock);
b2b2af8e6   Dave Chinner   fs: factor inode ...
1352
1353
  		return;
  	}
45321ac54   Al Viro   Make ->drop_inode...
1354
  	if (!drop) {
991114c6f   Alexander Viro   [PATCH] fix for p...
1355
  		inode->i_state |= I_WILL_FREE;
250df6ed2   Dave Chinner   fs: protect inode...
1356
  		spin_unlock(&inode->i_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1357
  		write_inode_now(inode, 1);
250df6ed2   Dave Chinner   fs: protect inode...
1358
  		spin_lock(&inode->i_lock);
7ef0d7377   Nick Piggin   fs: new inode i_s...
1359
  		WARN_ON(inode->i_state & I_NEW);
991114c6f   Alexander Viro   [PATCH] fix for p...
1360
  		inode->i_state &= ~I_WILL_FREE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1361
  	}
7ccf19a80   Nick Piggin   fs: inode split I...
1362

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

644da5960   Al Viro   fs/inode.c:evict(...
1368
  	evict(inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1369
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1370
  /**
6b3304b53   Manish Katiyar   Make checkpatch.p...
1371
   *	iput	- put an inode
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
   *	@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...
1382
  		BUG_ON(inode->i_state & I_CLEAR);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1383

f283c86af   Dave Chinner   fs: remove inode_...
1384
  		if (atomic_dec_and_lock(&inode->i_count, &inode->i_lock))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1385
1386
1387
  			iput_final(inode);
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
  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...
1398
   *	disk block relative to the disk start that holds that block of the
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1399
1400
   *	file.
   */
6b3304b53   Manish Katiyar   Make checkpatch.p...
1401
  sector_t bmap(struct inode *inode, sector_t block)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1402
1403
1404
1405
1406
1407
  {
  	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
1408
  EXPORT_SYMBOL(bmap);
11ff6f05f   Matthew Garrett   Allow relatime to...
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
  /*
   * 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;
  }
c3b2da314   Josef Bacik   fs: introduce ino...
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
  /*
   * This does the actual work of updating an inodes time or version.  Must have
   * had called mnt_want_write() before calling this.
   */
  static int update_time(struct inode *inode, struct timespec *time, int flags)
  {
  	if (inode->i_op->update_time)
  		return inode->i_op->update_time(inode, time, flags);
  
  	if (flags & S_ATIME)
  		inode->i_atime = *time;
  	if (flags & S_VERSION)
  		inode_inc_iversion(inode);
  	if (flags & S_CTIME)
  		inode->i_ctime = *time;
  	if (flags & S_MTIME)
  		inode->i_mtime = *time;
  	mark_inode_dirty_sync(inode);
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1462
  /**
869243a0f   Christoph Hellwig   [PATCH] remove up...
1463
   *	touch_atime	-	update the access time
185553b22   Randy Dunlap   fs: fix inode.c k...
1464
   *	@path: the &struct path to update
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1465
1466
1467
1468
1469
   *
   *	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.
   */
badcf2b7b   Al Viro   constify touch_at...
1470
  void touch_atime(const struct path *path)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1471
  {
68ac1234f   Al Viro   switch touch_atim...
1472
1473
  	struct vfsmount *mnt = path->mnt;
  	struct inode *inode = path->dentry->d_inode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1474
  	struct timespec now;
cdb70f3f7   Dave Hansen   [PATCH] r/o bind ...
1475
  	if (inode->i_flags & S_NOATIME)
b12536c27   Andi Kleen   vfs: optimization...
1476
  		return;
37756ced1   Eric Dumazet   [PATCH] avoid one...
1477
  	if (IS_NOATIME(inode))
b12536c27   Andi Kleen   vfs: optimization...
1478
  		return;
b22761384   Andrew Morton   [PATCH] touch_ati...
1479
  	if ((inode->i_sb->s_flags & MS_NODIRATIME) && S_ISDIR(inode->i_mode))
b12536c27   Andi Kleen   vfs: optimization...
1480
  		return;
47ae32d6a   Valerie Henson   [PATCH] relative ...
1481

cdb70f3f7   Dave Hansen   [PATCH] r/o bind ...
1482
  	if (mnt->mnt_flags & MNT_NOATIME)
b12536c27   Andi Kleen   vfs: optimization...
1483
  		return;
cdb70f3f7   Dave Hansen   [PATCH] r/o bind ...
1484
  	if ((mnt->mnt_flags & MNT_NODIRATIME) && S_ISDIR(inode->i_mode))
b12536c27   Andi Kleen   vfs: optimization...
1485
  		return;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1486
1487
  
  	now = current_fs_time(inode->i_sb);
11ff6f05f   Matthew Garrett   Allow relatime to...
1488
1489
  
  	if (!relatime_need_update(mnt, inode, now))
b12536c27   Andi Kleen   vfs: optimization...
1490
  		return;
11ff6f05f   Matthew Garrett   Allow relatime to...
1491

47ae32d6a   Valerie Henson   [PATCH] relative ...
1492
  	if (timespec_equal(&inode->i_atime, &now))
b12536c27   Andi Kleen   vfs: optimization...
1493
  		return;
5d37e9e6d   Jan Kara   fs: Skip atime up...
1494
  	if (!sb_start_write_trylock(inode->i_sb))
b12536c27   Andi Kleen   vfs: optimization...
1495
  		return;
47ae32d6a   Valerie Henson   [PATCH] relative ...
1496

5d37e9e6d   Jan Kara   fs: Skip atime up...
1497
1498
  	if (__mnt_want_write(mnt))
  		goto skip_update;
c3b2da314   Josef Bacik   fs: introduce ino...
1499
1500
1501
1502
1503
1504
  	/*
  	 * File systems can error out when updating inodes if they need to
  	 * allocate new space to modify an inode (such is the case for
  	 * Btrfs), but since we touch atime while walking down the path we
  	 * really don't care if we failed to update the atime of the file,
  	 * so just ignore the return value.
2bc556528   Alexander Block   Btrfs: don't upda...
1505
1506
  	 * We may also fail on filesystems that have the ability to make parts
  	 * of the fs read only, e.g. subvolumes in Btrfs.
c3b2da314   Josef Bacik   fs: introduce ino...
1507
1508
  	 */
  	update_time(inode, &now, S_ATIME);
5d37e9e6d   Jan Kara   fs: Skip atime up...
1509
1510
1511
  	__mnt_drop_write(mnt);
  skip_update:
  	sb_end_write(inode->i_sb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1512
  }
869243a0f   Christoph Hellwig   [PATCH] remove up...
1513
  EXPORT_SYMBOL(touch_atime);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1514

3ed37648e   Cong Wang   fs: move file_rem...
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
  /*
   * The logic we want is
   *
   *	if suid or (sgid and xgrp)
   *		remove privs
   */
  int should_remove_suid(struct dentry *dentry)
  {
  	umode_t mode = dentry->d_inode->i_mode;
  	int kill = 0;
  
  	/* suid always must be killed */
  	if (unlikely(mode & S_ISUID))
  		kill = ATTR_KILL_SUID;
  
  	/*
  	 * sgid without any exec bits is just a mandatory locking mark; leave
  	 * it alone.  If some exec bits are set, it's a real sgid; kill it.
  	 */
  	if (unlikely((mode & S_ISGID) && (mode & S_IXGRP)))
  		kill |= ATTR_KILL_SGID;
  
  	if (unlikely(kill && !capable(CAP_FSETID) && S_ISREG(mode)))
  		return kill;
  
  	return 0;
  }
  EXPORT_SYMBOL(should_remove_suid);
  
  static int __remove_suid(struct dentry *dentry, int kill)
  {
  	struct iattr newattrs;
  
  	newattrs.ia_valid = ATTR_FORCE | kill;
27ac0ffea   J. Bruce Fields   locks: break dele...
1549
1550
1551
1552
1553
  	/*
  	 * Note we call this on write, so notify_change will not
  	 * encounter any conflicting delegations:
  	 */
  	return notify_change(dentry, &newattrs, NULL);
3ed37648e   Cong Wang   fs: move file_rem...
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
1580
1581
1582
  }
  
  int file_remove_suid(struct file *file)
  {
  	struct dentry *dentry = file->f_path.dentry;
  	struct inode *inode = dentry->d_inode;
  	int killsuid;
  	int killpriv;
  	int error = 0;
  
  	/* Fast path for nothing security related */
  	if (IS_NOSEC(inode))
  		return 0;
  
  	killsuid = should_remove_suid(dentry);
  	killpriv = security_inode_need_killpriv(dentry);
  
  	if (killpriv < 0)
  		return killpriv;
  	if (killpriv)
  		error = security_inode_killpriv(dentry);
  	if (!error && killsuid)
  		error = __remove_suid(dentry, killsuid);
  	if (!error && (inode->i_sb->s_flags & MS_NOSEC))
  		inode->i_flags |= S_NOSEC;
  
  	return error;
  }
  EXPORT_SYMBOL(file_remove_suid);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1583
  /**
870f48179   Christoph Hellwig   [PATCH] replace i...
1584
1585
   *	file_update_time	-	update mtime and ctime time
   *	@file: file accessed
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1586
   *
870f48179   Christoph Hellwig   [PATCH] replace i...
1587
1588
1589
1590
   *	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...
1591
   *	S_NOCMTIME inode flag, e.g. for network filesystem where these
c3b2da314   Josef Bacik   fs: introduce ino...
1592
1593
   *	timestamps are handled by the server.  This can return an error for
   *	file systems who need to allocate space in order to update an inode.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1594
   */
c3b2da314   Josef Bacik   fs: introduce ino...
1595
  int file_update_time(struct file *file)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1596
  {
496ad9aa8   Al Viro   new helper: file_...
1597
  	struct inode *inode = file_inode(file);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1598
  	struct timespec now;
c3b2da314   Josef Bacik   fs: introduce ino...
1599
1600
  	int sync_it = 0;
  	int ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1601

ce06e0b21   Andi Kleen   vfs: optimize tou...
1602
  	/* First try to exhaust all avenues to not sync */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1603
  	if (IS_NOCMTIME(inode))
c3b2da314   Josef Bacik   fs: introduce ino...
1604
  		return 0;
20ddee2c7   Dave Hansen   [PATCH] r/o bind ...
1605

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

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

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

ce06e0b21   Andi Kleen   vfs: optimize tou...
1616
  	if (!sync_it)
c3b2da314   Josef Bacik   fs: introduce ino...
1617
  		return 0;
ce06e0b21   Andi Kleen   vfs: optimize tou...
1618
1619
  
  	/* Finally allowed to write? Takes lock. */
eb04c2828   Jan Kara   fs: Add freezing ...
1620
  	if (__mnt_want_write_file(file))
c3b2da314   Josef Bacik   fs: introduce ino...
1621
  		return 0;
ce06e0b21   Andi Kleen   vfs: optimize tou...
1622

c3b2da314   Josef Bacik   fs: introduce ino...
1623
  	ret = update_time(inode, &now, sync_it);
eb04c2828   Jan Kara   fs: Add freezing ...
1624
  	__mnt_drop_write_file(file);
c3b2da314   Josef Bacik   fs: introduce ino...
1625
1626
  
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1627
  }
870f48179   Christoph Hellwig   [PATCH] replace i...
1628
  EXPORT_SYMBOL(file_update_time);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1629
1630
1631
1632
1633
1634
1635
1636
1637
  
  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
1638
  EXPORT_SYMBOL(inode_needs_sync);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1639
  /*
168a9fd6a   Miklos Szeredi   [PATCH] __wait_on...
1640
1641
1642
1643
1644
1645
   * 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
1646
   * It doesn't matter if I_NEW is not set initially, a call to
250df6ed2   Dave Chinner   fs: protect inode...
1647
1648
   * wake_up_bit(&inode->i_state, __I_NEW) after removing from the hash list
   * will DTRT.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1649
1650
1651
1652
   */
  static void __wait_on_freeing_inode(struct inode *inode)
  {
  	wait_queue_head_t *wq;
eaff8079d   Christoph Hellwig   kill I_LOCK
1653
1654
  	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
1655
  	prepare_to_wait(wq, &wait.wait, TASK_UNINTERRUPTIBLE);
250df6ed2   Dave Chinner   fs: protect inode...
1656
  	spin_unlock(&inode->i_lock);
67a23c494   Dave Chinner   fs: rename inode_...
1657
  	spin_unlock(&inode_hash_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1658
1659
  	schedule();
  	finish_wait(wq, &wait.wait);
67a23c494   Dave Chinner   fs: rename inode_...
1660
  	spin_lock(&inode_hash_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1661
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
  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)
  {
074b85175   Dimitri Sivanich   vfs: fix panic in...
1677
  	unsigned int loop;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
  
  	/* 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,
31fe62b95   Tim Bird   mm: add a low lim...
1693
  					0,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1694
  					0);
074b85175   Dimitri Sivanich   vfs: fix panic in...
1695
  	for (loop = 0; loop < (1U << i_hash_shift); loop++)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1696
1697
  		INIT_HLIST_HEAD(&inode_hashtable[loop]);
  }
74bf17cff   Denis Cheng   fs: remove the un...
1698
  void __init inode_init(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1699
  {
074b85175   Dimitri Sivanich   vfs: fix panic in...
1700
  	unsigned int loop;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1701
1702
  
  	/* inode slab cache */
b0196009d   Paul Jackson   [PATCH] cpuset me...
1703
1704
1705
1706
1707
  	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...
1708
  					 init_once);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
  
  	/* 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,
31fe62b95   Tim Bird   mm: add a low lim...
1722
  					0,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1723
  					0);
074b85175   Dimitri Sivanich   vfs: fix panic in...
1724
  	for (loop = 0; loop < (1U << i_hash_shift); loop++)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
  		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))
599a0ac14   Al Viro   pipe: fold file_o...
1738
  		inode->i_fop = &pipefifo_fops;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1739
1740
1741
  	else if (S_ISSOCK(mode))
  		inode->i_fop = &bad_sock_fops;
  	else
af0d9ae81   Manish Katiyar   fs/inode.c: add d...
1742
1743
1744
1745
  		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
1746
1747
  }
  EXPORT_SYMBOL(init_special_inode);
a1bd120d1   Dmitry Monakhov   vfs: Add inode ui...
1748
1749
  
  /**
eaae668d0   Ben Hutchings   fs/inode: Fix ker...
1750
   * inode_init_owner - Init uid,gid,mode for new inode according to posix standards
a1bd120d1   Dmitry Monakhov   vfs: Add inode ui...
1751
1752
1753
1754
1755
   * @inode: New inode
   * @dir: Directory inode
   * @mode: mode of the new inode
   */
  void inode_init_owner(struct inode *inode, const struct inode *dir,
62bb10917   Al Viro   switch inode_init...
1756
  			umode_t mode)
a1bd120d1   Dmitry Monakhov   vfs: Add inode ui...
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
  {
  	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...
1768

2e1496707   Serge E. Hallyn   userns: rename is...
1769
1770
1771
1772
  /**
   * inode_owner_or_capable - check current task permissions to inode
   * @inode: inode being checked
   *
23adbe12e   Andy Lutomirski   fs,userns: Change...
1773
1774
   * Return true if current either has CAP_FOWNER in a namespace with the
   * inode owner uid mapped, or owns the file.
e795b7179   Serge E. Hallyn   userns: userns: c...
1775
   */
2e1496707   Serge E. Hallyn   userns: rename is...
1776
  bool inode_owner_or_capable(const struct inode *inode)
e795b7179   Serge E. Hallyn   userns: userns: c...
1777
  {
23adbe12e   Andy Lutomirski   fs,userns: Change...
1778
  	struct user_namespace *ns;
92361636e   Eric W. Biederman   userns: Store uid...
1779
  	if (uid_eq(current_fsuid(), inode->i_uid))
e795b7179   Serge E. Hallyn   userns: userns: c...
1780
  		return true;
23adbe12e   Andy Lutomirski   fs,userns: Change...
1781
1782
1783
  
  	ns = current_user_ns();
  	if (ns_capable(ns, CAP_FOWNER) && kuid_has_mapping(ns, inode->i_uid))
e795b7179   Serge E. Hallyn   userns: userns: c...
1784
1785
1786
  		return true;
  	return false;
  }
2e1496707   Serge E. Hallyn   userns: rename is...
1787
  EXPORT_SYMBOL(inode_owner_or_capable);
1d59d61f6   Trond Myklebust   NFS: Ensure that ...
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
  
  /*
   * Direct i/o helper functions
   */
  static void __inode_dio_wait(struct inode *inode)
  {
  	wait_queue_head_t *wq = bit_waitqueue(&inode->i_state, __I_DIO_WAKEUP);
  	DEFINE_WAIT_BIT(q, &inode->i_state, __I_DIO_WAKEUP);
  
  	do {
  		prepare_to_wait(wq, &q.wait, TASK_UNINTERRUPTIBLE);
  		if (atomic_read(&inode->i_dio_count))
  			schedule();
  	} while (atomic_read(&inode->i_dio_count));
  	finish_wait(wq, &q.wait);
  }
  
  /**
   * inode_dio_wait - wait for outstanding DIO requests to finish
   * @inode: inode to wait for
   *
   * Waits for all pending direct I/O requests to finish so that we can
   * proceed with a truncate or equivalent operation.
   *
   * Must be called under a lock that serializes taking new references
   * to i_dio_count, usually by inode->i_mutex.
   */
  void inode_dio_wait(struct inode *inode)
  {
  	if (atomic_read(&inode->i_dio_count))
  		__inode_dio_wait(inode);
  }
  EXPORT_SYMBOL(inode_dio_wait);
  
  /*
   * inode_dio_done - signal finish of a direct I/O requests
   * @inode: inode the direct I/O happens on
   *
   * This is called once we've finished processing a direct I/O request,
   * and is used to wake up callers waiting for direct I/O to be quiesced.
   */
  void inode_dio_done(struct inode *inode)
  {
  	if (atomic_dec_and_test(&inode->i_dio_count))
  		wake_up_bit(&inode->i_state, __I_DIO_WAKEUP);
  }
  EXPORT_SYMBOL(inode_dio_done);
5f16f3225   Theodore Ts'o   ext4: atomically ...
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
  
  /*
   * inode_set_flags - atomically set some inode flags
   *
   * Note: the caller should be holding i_mutex, or else be sure that
   * they have exclusive access to the inode structure (i.e., while the
   * inode is being instantiated).  The reason for the cmpxchg() loop
   * --- which wouldn't be necessary if all code paths which modify
   * i_flags actually followed this rule, is that there is at least one
   * code path which doesn't today --- for example,
   * __generic_file_aio_write() calls file_remove_suid() without holding
   * i_mutex --- so we use cmpxchg() out of an abundance of caution.
   *
   * In the long run, i_mutex is overkill, and we should probably look
   * at using the i_lock spinlock to protect i_flags, and then make sure
   * it is so documented in include/linux/fs.h and that all code follows
   * the locking convention!!
   */
  void inode_set_flags(struct inode *inode, unsigned int flags,
  		     unsigned int mask)
  {
  	unsigned int old_flags, new_flags;
  
  	WARN_ON_ONCE(flags & ~mask);
  	do {
  		old_flags = ACCESS_ONCE(inode->i_flags);
  		new_flags = (old_flags & ~mask) | flags;
  	} while (unlikely(cmpxchg(&inode->i_flags, old_flags,
  				  new_flags) != old_flags));
  }
  EXPORT_SYMBOL(inode_set_flags);