Blame view

fs/inode.c 63.2 KB
457c89965   Thomas Gleixner   treewide: Add SPD...
1
  // SPDX-License-Identifier: GPL-2.0-only
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3
   * (C) 1997 Linus Torvalds
4b4563dc8   Christoph Hellwig   fs: cosmetic inod...
4
   * (C) 1999 Andrea Arcangeli <andrea@suse.de> (dynamic inode allocation)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5
   */
e59cc473c   Al Viro   trim includes in ...
6
  #include <linux/export.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7
8
  #include <linux/fs.h>
  #include <linux/mm.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
9
  #include <linux/backing-dev.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
10
11
12
  #include <linux/hash.h>
  #include <linux/swap.h>
  #include <linux/security.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
13
  #include <linux/cdev.h>
57c8a661d   Mike Rapoport   mm: remove includ...
14
  #include <linux/memblock.h>
6e1918cfb   Daniel Rosenberg   fscrypt: don't al...
15
  #include <linux/fscrypt.h>
3be25f49b   Eric Paris   fsnotify: add mar...
16
  #include <linux/fsnotify.h>
fc33a7bb9   Christoph Hellwig   [PATCH] per-mount...
17
  #include <linux/mount.h>
f19d4a8fa   Al Viro   add caching of AC...
18
  #include <linux/posix_acl.h>
9ce6e0be0   Heiko Carstens   fs: add missing p...
19
  #include <linux/prefetch.h>
4b4563dc8   Christoph Hellwig   fs: cosmetic inod...
20
  #include <linux/buffer_head.h> /* for inode_has_buffers */
7ada4db88   Miklos Szeredi   vfs: count unlink...
21
  #include <linux/ratelimit.h>
bc3b14cb2   Dave Chinner   inode: convert in...
22
  #include <linux/list_lru.h>
ae5e165d8   Jeff Layton   fs: new API for h...
23
  #include <linux/iversion.h>
0ae45f63d   Theodore Ts'o   vfs: add support ...
24
  #include <trace/events/writeback.h>
a66979aba   Dave Chinner   fs: move i_wb_lis...
25
  #include "internal.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
26
27
  
  /*
4b4563dc8   Christoph Hellwig   fs: cosmetic inod...
28
   * Inode locking rules:
250df6ed2   Dave Chinner   fs: protect inode...
29
30
31
   *
   * inode->i_lock protects:
   *   inode->i_state, inode->i_hash, __iget()
bc3b14cb2   Dave Chinner   inode: convert in...
32
   * Inode LRU list locks protect:
98b745c64   Dave Chinner   inode: Make unuse...
33
   *   inode->i_sb->s_inode_lru, inode->i_lru
74278da9f   Dave Chinner   inode: convert in...
34
35
   * inode->i_sb->s_inode_list_lock protects:
   *   inode->i_sb->s_inodes, inode->i_sb_list
f758eeabe   Christoph Hellwig   writeback: split ...
36
   * bdi->wb.list_lock protects:
c7f540849   Dave Chinner   inode: rename i_w...
37
   *   bdi->wb.b_{dirty,io,more_io,dirty_time}, inode->i_io_list
67a23c494   Dave Chinner   fs: rename inode_...
38
39
   * inode_hash_lock protects:
   *   inode_hashtable, inode->i_hash
250df6ed2   Dave Chinner   fs: protect inode...
40
41
   *
   * Lock ordering:
55fa6091d   Dave Chinner   fs: move i_sb_lis...
42
   *
74278da9f   Dave Chinner   inode: convert in...
43
   * inode->i_sb->s_inode_list_lock
55fa6091d   Dave Chinner   fs: move i_sb_lis...
44
   *   inode->i_lock
bc3b14cb2   Dave Chinner   inode: convert in...
45
   *     Inode LRU list locks
a66979aba   Dave Chinner   fs: move i_wb_lis...
46
   *
f758eeabe   Christoph Hellwig   writeback: split ...
47
   * bdi->wb.list_lock
a66979aba   Dave Chinner   fs: move i_wb_lis...
48
   *   inode->i_lock
67a23c494   Dave Chinner   fs: rename inode_...
49
50
   *
   * inode_hash_lock
74278da9f   Dave Chinner   inode: convert in...
51
   *   inode->i_sb->s_inode_list_lock
67a23c494   Dave Chinner   fs: rename inode_...
52
53
54
55
   *   inode->i_lock
   *
   * iunique_lock
   *   inode_hash_lock
250df6ed2   Dave Chinner   fs: protect inode...
56
   */
fa3536cc1   Eric Dumazet   [PATCH] Use __rea...
57
58
  static unsigned int i_hash_mask __read_mostly;
  static unsigned int i_hash_shift __read_mostly;
67a23c494   Dave Chinner   fs: rename inode_...
59
60
  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
61

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

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

3942c07cc   Glauber Costa   fs: bump inode an...
79
  static long get_nr_inodes(void)
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
80
  {
3e880fb5e   Nick Piggin   fs: use fast coun...
81
  	int i;
3942c07cc   Glauber Costa   fs: bump inode an...
82
  	long sum = 0;
3e880fb5e   Nick Piggin   fs: use fast coun...
83
84
85
  	for_each_possible_cpu(i)
  		sum += per_cpu(nr_inodes, i);
  	return sum < 0 ? 0 : sum;
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
86
  }
3942c07cc   Glauber Costa   fs: bump inode an...
87
  static inline long get_nr_inodes_unused(void)
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
88
  {
fcb94f72d   Dave Chinner   inode: convert in...
89
  	int i;
3942c07cc   Glauber Costa   fs: bump inode an...
90
  	long sum = 0;
fcb94f72d   Dave Chinner   inode: convert in...
91
92
93
  	for_each_possible_cpu(i)
  		sum += per_cpu(nr_unused, i);
  	return sum < 0 ? 0 : sum;
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
94
  }
3942c07cc   Glauber Costa   fs: bump inode an...
95
  long get_nr_dirty_inodes(void)
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
96
  {
3e880fb5e   Nick Piggin   fs: use fast coun...
97
  	/* not actually dirty inodes, but a wild approximation */
3942c07cc   Glauber Costa   fs: bump inode an...
98
  	long nr_dirty = get_nr_inodes() - get_nr_inodes_unused();
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
99
  	return nr_dirty > 0 ? nr_dirty : 0;
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
100
101
102
103
104
105
  }
  
  /*
   * Handle nr_inode sysctl
   */
  #ifdef CONFIG_SYSCTL
1f7e0616c   Joe Perches   fs: convert use o...
106
  int proc_nr_inodes(struct ctl_table *table, int write,
32927393d   Christoph Hellwig   sysctl: pass kern...
107
  		   void *buffer, size_t *lenp, loff_t *ppos)
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
108
109
  {
  	inodes_stat.nr_inodes = get_nr_inodes();
fcb94f72d   Dave Chinner   inode: convert in...
110
  	inodes_stat.nr_unused = get_nr_inodes_unused();
3942c07cc   Glauber Costa   fs: bump inode an...
111
  	return proc_doulongvec_minmax(table, write, buffer, lenp, ppos);
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
112
113
  }
  #endif
bd9b51e79   Al Viro   make default ->i_...
114
115
116
117
  static int no_open(struct inode *inode, struct file *file)
  {
  	return -ENXIO;
  }
2cb1599f9   David Chinner   Inode: Allow exte...
118
  /**
6e7c2b4dd   Masahiro Yamada   scripts/spelling....
119
   * inode_init_always - perform inode structure initialisation
0bc02f3fa   Randy Dunlap   fs/inode: fix ker...
120
121
   * @sb: superblock inode belongs to
   * @inode: inode to initialise
2cb1599f9   David Chinner   Inode: Allow exte...
122
123
124
125
   *
   * 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...
126
  int inode_init_always(struct super_block *sb, struct inode *inode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
127
  {
6e1d5dcc2   Alexey Dobriyan   const: mark remai...
128
  	static const struct inode_operations empty_iops;
bd9b51e79   Al Viro   make default ->i_...
129
  	static const struct file_operations no_open_fops = {.open = no_open};
6b3304b53   Manish Katiyar   Make checkpatch.p...
130
  	struct address_space *const mapping = &inode->i_data;
2cb1599f9   David Chinner   Inode: Allow exte...
131
132
133
134
  
  	inode->i_sb = sb;
  	inode->i_blkbits = sb->s_blocksize_bits;
  	inode->i_flags = 0;
8019ad13e   Peter Zijlstra   futex: Fix inode ...
135
  	atomic64_set(&inode->i_sequence, 0);
2cb1599f9   David Chinner   Inode: Allow exte...
136
137
  	atomic_set(&inode->i_count, 1);
  	inode->i_op = &empty_iops;
bd9b51e79   Al Viro   make default ->i_...
138
  	inode->i_fop = &no_open_fops;
a78ef704a   Miklos Szeredi   vfs: protect i_nlink
139
  	inode->__i_nlink = 1;
3ddcd0569   Linus Torvalds   vfs: optimize ino...
140
  	inode->i_opflags = 0;
d0a5b995a   Andreas Gruenbacher   vfs: Add IOP_XATT...
141
142
  	if (sb->s_xattr)
  		inode->i_opflags |= IOP_XATTR;
92361636e   Eric W. Biederman   userns: Store uid...
143
144
  	i_uid_write(inode, 0);
  	i_gid_write(inode, 0);
2cb1599f9   David Chinner   Inode: Allow exte...
145
146
  	atomic_set(&inode->i_writecount, 0);
  	inode->i_size = 0;
c75b1d942   Jens Axboe   fs: add fcntl() i...
147
  	inode->i_write_hint = WRITE_LIFE_NOT_SET;
2cb1599f9   David Chinner   Inode: Allow exte...
148
149
150
  	inode->i_blocks = 0;
  	inode->i_bytes = 0;
  	inode->i_generation = 0;
2cb1599f9   David Chinner   Inode: Allow exte...
151
152
153
  	inode->i_pipe = NULL;
  	inode->i_bdev = NULL;
  	inode->i_cdev = NULL;
61ba64fc0   Al Viro   libfs: simple_fol...
154
  	inode->i_link = NULL;
84e710da2   Al Viro   parallel lookups ...
155
  	inode->i_dir_seq = 0;
2cb1599f9   David Chinner   Inode: Allow exte...
156
157
  	inode->i_rdev = 0;
  	inode->dirtied_when = 0;
6146f0d5e   Mimi Zohar   integrity: IMA hooks
158

3d65ae463   Tahsin Erdogan   writeback: initia...
159
160
161
162
163
  #ifdef CONFIG_CGROUP_WRITEBACK
  	inode->i_wb_frn_winner = 0;
  	inode->i_wb_frn_avg_time = 0;
  	inode->i_wb_frn_history = 0;
  #endif
6146f0d5e   Mimi Zohar   integrity: IMA hooks
164
  	if (security_inode_alloc(inode))
54e346215   Christoph Hellwig   vfs: fix inode_in...
165
  		goto out;
2cb1599f9   David Chinner   Inode: Allow exte...
166
167
  	spin_lock_init(&inode->i_lock);
  	lockdep_set_class(&inode->i_lock, &sb->s_type->i_lock_key);
9902af79c   Al Viro   parallel lookups:...
168
169
  	init_rwsem(&inode->i_rwsem);
  	lockdep_set_class(&inode->i_rwsem, &sb->s_type->i_mutex_key);
2cb1599f9   David Chinner   Inode: Allow exte...
170

bd5fe6c5e   Christoph Hellwig   fs: kill i_alloc_sem
171
  	atomic_set(&inode->i_dio_count, 0);
2cb1599f9   David Chinner   Inode: Allow exte...
172
173
174
175
  
  	mapping->a_ops = &empty_aops;
  	mapping->host = inode;
  	mapping->flags = 0;
01c702670   Matthew Wilcox (Oracle)   fs: add a filesys...
176
177
  	if (sb->s_type->fs_flags & FS_THP_SUPPORT)
  		__set_bit(AS_THP_SUPPORT, &mapping->flags);
829bc787c   Darrick J. Wong   fs: clear writeba...
178
  	mapping->wb_err = 0;
4bb5f5d93   David Herrmann   mm: allow drivers...
179
  	atomic_set(&mapping->i_mmap_writable, 0);
09d91cda0   Song Liu   mm,thp: avoid wri...
180
181
182
  #ifdef CONFIG_READ_ONLY_THP_FOR_FS
  	atomic_set(&mapping->nr_thps, 0);
  #endif
3c1d43787   Hugh Dickins   mm: remove GFP_HI...
183
  	mapping_set_gfp_mask(mapping, GFP_HIGHUSER_MOVABLE);
252aa6f5b   Rafael Aquini   mm: redefine addr...
184
  	mapping->private_data = NULL;
2cb1599f9   David Chinner   Inode: Allow exte...
185
  	mapping->writeback_index = 0;
2cb1599f9   David Chinner   Inode: Allow exte...
186
187
  	inode->i_private = NULL;
  	inode->i_mapping = mapping;
b3d9b7a3c   Al Viro   vfs: switch i_den...
188
  	INIT_HLIST_HEAD(&inode->i_dentry);	/* buggered by rcu freeing */
f19d4a8fa   Al Viro   add caching of AC...
189
190
191
  #ifdef CONFIG_FS_POSIX_ACL
  	inode->i_acl = inode->i_default_acl = ACL_NOT_CACHED;
  #endif
2cb1599f9   David Chinner   Inode: Allow exte...
192

3be25f49b   Eric Paris   fsnotify: add mar...
193
194
195
  #ifdef CONFIG_FSNOTIFY
  	inode->i_fsnotify_mask = 0;
  #endif
4a075e39c   Jeff Layton   locks: add a new ...
196
  	inode->i_flctx = NULL;
3e880fb5e   Nick Piggin   fs: use fast coun...
197
  	this_cpu_inc(nr_inodes);
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
198

54e346215   Christoph Hellwig   vfs: fix inode_in...
199
  	return 0;
54e346215   Christoph Hellwig   vfs: fix inode_in...
200
201
  out:
  	return -ENOMEM;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
202
  }
2cb1599f9   David Chinner   Inode: Allow exte...
203
  EXPORT_SYMBOL(inode_init_always);
fdb0da89f   Al Viro   new inode method:...
204
205
206
207
208
209
210
211
212
213
214
215
216
217
  void free_inode_nonrcu(struct inode *inode)
  {
  	kmem_cache_free(inode_cachep, inode);
  }
  EXPORT_SYMBOL(free_inode_nonrcu);
  
  static void i_callback(struct rcu_head *head)
  {
  	struct inode *inode = container_of(head, struct inode, i_rcu);
  	if (inode->free_inode)
  		inode->free_inode(inode);
  	else
  		free_inode_nonrcu(inode);
  }
2cb1599f9   David Chinner   Inode: Allow exte...
218
219
  static struct inode *alloc_inode(struct super_block *sb)
  {
fdb0da89f   Al Viro   new inode method:...
220
  	const struct super_operations *ops = sb->s_op;
2cb1599f9   David Chinner   Inode: Allow exte...
221
  	struct inode *inode;
fdb0da89f   Al Viro   new inode method:...
222
223
  	if (ops->alloc_inode)
  		inode = ops->alloc_inode(sb);
2cb1599f9   David Chinner   Inode: Allow exte...
224
225
  	else
  		inode = kmem_cache_alloc(inode_cachep, GFP_KERNEL);
54e346215   Christoph Hellwig   vfs: fix inode_in...
226
227
228
229
  	if (!inode)
  		return NULL;
  
  	if (unlikely(inode_init_always(sb, inode))) {
fdb0da89f   Al Viro   new inode method:...
230
231
232
233
234
235
236
  		if (ops->destroy_inode) {
  			ops->destroy_inode(inode);
  			if (!ops->free_inode)
  				return NULL;
  		}
  		inode->free_inode = ops->free_inode;
  		i_callback(&inode->i_rcu);
54e346215   Christoph Hellwig   vfs: fix inode_in...
237
238
239
240
  		return NULL;
  	}
  
  	return inode;
2cb1599f9   David Chinner   Inode: Allow exte...
241
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
242

2e00c97e2   Christoph Hellwig   vfs: add __destro...
243
  void __destroy_inode(struct inode *inode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
244
  {
b7542f8c7   Eric Sesterhenn   BUG_ON() Conversi...
245
  	BUG_ON(inode_has_buffers(inode));
52ebea749   Tejun Heo   writeback: make b...
246
  	inode_detach_wb(inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
247
  	security_inode_free(inode);
3be25f49b   Eric Paris   fsnotify: add mar...
248
  	fsnotify_inode_delete(inode);
f27a0fe08   Jeff Layton   locks: pass inode...
249
  	locks_free_lock_context(inode);
7ada4db88   Miklos Szeredi   vfs: count unlink...
250
251
252
253
  	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...
254
  #ifdef CONFIG_FS_POSIX_ACL
b8a7a3a66   Andreas Gruenbacher   posix_acl: Inode ...
255
  	if (inode->i_acl && !is_uncached_acl(inode->i_acl))
f19d4a8fa   Al Viro   add caching of AC...
256
  		posix_acl_release(inode->i_acl);
b8a7a3a66   Andreas Gruenbacher   posix_acl: Inode ...
257
  	if (inode->i_default_acl && !is_uncached_acl(inode->i_default_acl))
f19d4a8fa   Al Viro   add caching of AC...
258
259
  		posix_acl_release(inode->i_default_acl);
  #endif
3e880fb5e   Nick Piggin   fs: use fast coun...
260
  	this_cpu_dec(nr_inodes);
2e00c97e2   Christoph Hellwig   vfs: add __destro...
261
262
  }
  EXPORT_SYMBOL(__destroy_inode);
56b0dacfa   Christoph Hellwig   fs: mark destroy_...
263
  static void destroy_inode(struct inode *inode)
2e00c97e2   Christoph Hellwig   vfs: add __destro...
264
  {
fdb0da89f   Al Viro   new inode method:...
265
  	const struct super_operations *ops = inode->i_sb->s_op;
7ccf19a80   Nick Piggin   fs: inode split I...
266
  	BUG_ON(!list_empty(&inode->i_lru));
2e00c97e2   Christoph Hellwig   vfs: add __destro...
267
  	__destroy_inode(inode);
fdb0da89f   Al Viro   new inode method:...
268
269
270
271
272
273
274
  	if (ops->destroy_inode) {
  		ops->destroy_inode(inode);
  		if (!ops->free_inode)
  			return;
  	}
  	inode->free_inode = ops->free_inode;
  	call_rcu(&inode->i_rcu, i_callback);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
275
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
276

7ada4db88   Miklos Szeredi   vfs: count unlink...
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
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
  /**
   * 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...
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
  		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...
346
347
  	if (unlikely(inode->i_nlink == 0)) {
  		WARN_ON(!(inode->i_state & I_LINKABLE));
7ada4db88   Miklos Szeredi   vfs: count unlink...
348
  		atomic_long_dec(&inode->i_sb->s_remove_count);
f4e0c30c1   Al Viro   allow the temp fi...
349
  	}
7ada4db88   Miklos Szeredi   vfs: count unlink...
350
351
352
353
  
  	inode->__i_nlink++;
  }
  EXPORT_SYMBOL(inc_nlink);
ae23395d8   Dave Chinner   inode: don't mems...
354
  static void __address_space_init_once(struct address_space *mapping)
2aa15890f   Miklos Szeredi   mm: prevent concu...
355
  {
7b785645e   Johannes Weiner   mm: fix page cach...
356
  	xa_init_flags(&mapping->i_pages, XA_FLAGS_LOCK_IRQ | XA_FLAGS_ACCOUNT);
c8c06efa8   Davidlohr Bueso   mm: convert i_mma...
357
  	init_rwsem(&mapping->i_mmap_rwsem);
2aa15890f   Miklos Szeredi   mm: prevent concu...
358
359
  	INIT_LIST_HEAD(&mapping->private_list);
  	spin_lock_init(&mapping->private_lock);
f808c13fd   Davidlohr Bueso   lib/interval_tree...
360
  	mapping->i_mmap = RB_ROOT_CACHED;
2aa15890f   Miklos Szeredi   mm: prevent concu...
361
  }
ae23395d8   Dave Chinner   inode: don't mems...
362
363
364
365
366
367
  
  void address_space_init_once(struct address_space *mapping)
  {
  	memset(mapping, 0, sizeof(*mapping));
  	__address_space_init_once(mapping);
  }
2aa15890f   Miklos Szeredi   mm: prevent concu...
368
  EXPORT_SYMBOL(address_space_init_once);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
369
370
371
372
373
374
375
376
377
  /*
   * 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
378
  	INIT_LIST_HEAD(&inode->i_devices);
c7f540849   Dave Chinner   inode: rename i_w...
379
  	INIT_LIST_HEAD(&inode->i_io_list);
6c60d2b57   Dave Chinner   fs/fs-writeback.c...
380
  	INIT_LIST_HEAD(&inode->i_wb_list);
7ccf19a80   Nick Piggin   fs: inode split I...
381
  	INIT_LIST_HEAD(&inode->i_lru);
ae23395d8   Dave Chinner   inode: don't mems...
382
  	__address_space_init_once(&inode->i_data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
383
384
  	i_size_ordered_init(inode);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
385
  EXPORT_SYMBOL(inode_init_once);
51cc50685   Alexey Dobriyan   SL*B: drop kmem c...
386
  static void init_once(void *foo)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
387
  {
6b3304b53   Manish Katiyar   Make checkpatch.p...
388
  	struct inode *inode = (struct inode *) foo;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
389

a35afb830   Christoph Lameter   Remove SLAB_CTOR_...
390
  	inode_init_once(inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
391
392
393
  }
  
  /*
250df6ed2   Dave Chinner   fs: protect inode...
394
   * inode->i_lock must be held
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
395
   */
6b3304b53   Manish Katiyar   Make checkpatch.p...
396
  void __iget(struct inode *inode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
397
  {
9e38d86ff   Nick Piggin   fs: Implement laz...
398
399
  	atomic_inc(&inode->i_count);
  }
2e147f1ef   Richard Kennedy   fs: inode.c use a...
400

7de9c6ee3   Al Viro   new helper: ihold()
401
402
403
404
405
406
407
408
  /*
   * 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...
409
410
  static void inode_lru_list_add(struct inode *inode)
  {
bc3b14cb2   Dave Chinner   inode: convert in...
411
  	if (list_lru_add(&inode->i_sb->s_inode_lru, &inode->i_lru))
fcb94f72d   Dave Chinner   inode: convert in...
412
  		this_cpu_inc(nr_unused);
563f40019   Josef Bacik   fs: don't set *RE...
413
414
  	else
  		inode->i_state |= I_REFERENCED;
9e38d86ff   Nick Piggin   fs: Implement laz...
415
  }
2e147f1ef   Richard Kennedy   fs: inode.c use a...
416

4eff96dd5   Jan Kara   writeback: put un...
417
418
419
420
421
422
423
  /*
   * Add inode to LRU if needed (inode is unused and clean).
   *
   * Needs inode->i_lock held.
   */
  void inode_add_lru(struct inode *inode)
  {
0ae45f63d   Theodore Ts'o   vfs: add support ...
424
425
  	if (!(inode->i_state & (I_DIRTY_ALL | I_SYNC |
  				I_FREEING | I_WILL_FREE)) &&
1751e8a6c   Linus Torvalds   Rename superblock...
426
  	    !atomic_read(&inode->i_count) && inode->i_sb->s_flags & SB_ACTIVE)
4eff96dd5   Jan Kara   writeback: put un...
427
428
  		inode_lru_list_add(inode);
  }
9e38d86ff   Nick Piggin   fs: Implement laz...
429
430
  static void inode_lru_list_del(struct inode *inode)
  {
bc3b14cb2   Dave Chinner   inode: convert in...
431
432
  
  	if (list_lru_del(&inode->i_sb->s_inode_lru, &inode->i_lru))
fcb94f72d   Dave Chinner   inode: convert in...
433
  		this_cpu_dec(nr_unused);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
434
  }
646ec4615   Christoph Hellwig   fs: remove inode_...
435
436
437
438
439
440
  /**
   * inode_sb_list_add - add inode to the superblock list of inodes
   * @inode: inode to add
   */
  void inode_sb_list_add(struct inode *inode)
  {
74278da9f   Dave Chinner   inode: convert in...
441
  	spin_lock(&inode->i_sb->s_inode_list_lock);
55fa6091d   Dave Chinner   fs: move i_sb_lis...
442
  	list_add(&inode->i_sb_list, &inode->i_sb->s_inodes);
74278da9f   Dave Chinner   inode: convert in...
443
  	spin_unlock(&inode->i_sb->s_inode_list_lock);
646ec4615   Christoph Hellwig   fs: remove inode_...
444
445
  }
  EXPORT_SYMBOL_GPL(inode_sb_list_add);
55fa6091d   Dave Chinner   fs: move i_sb_lis...
446
  static inline void inode_sb_list_del(struct inode *inode)
646ec4615   Christoph Hellwig   fs: remove inode_...
447
  {
a209dfc7b   Eric Dumazet   vfs: dont chain p...
448
  	if (!list_empty(&inode->i_sb_list)) {
74278da9f   Dave Chinner   inode: convert in...
449
  		spin_lock(&inode->i_sb->s_inode_list_lock);
a209dfc7b   Eric Dumazet   vfs: dont chain p...
450
  		list_del_init(&inode->i_sb_list);
74278da9f   Dave Chinner   inode: convert in...
451
  		spin_unlock(&inode->i_sb->s_inode_list_lock);
a209dfc7b   Eric Dumazet   vfs: dont chain p...
452
  	}
646ec4615   Christoph Hellwig   fs: remove inode_...
453
  }
4c51acbc6   Dave Chinner   fs: Factor inode ...
454
455
456
457
458
459
  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...
460
461
  	tmp = tmp ^ ((tmp ^ GOLDEN_RATIO_PRIME) >> i_hash_shift);
  	return tmp & i_hash_mask;
4c51acbc6   Dave Chinner   fs: Factor inode ...
462
463
464
465
466
467
468
469
470
471
472
473
  }
  
  /**
   *	__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_...
474
  	struct hlist_head *b = inode_hashtable + hash(inode->i_sb, hashval);
67a23c494   Dave Chinner   fs: rename inode_...
475
  	spin_lock(&inode_hash_lock);
250df6ed2   Dave Chinner   fs: protect inode...
476
  	spin_lock(&inode->i_lock);
3f19b2ab9   David Howells   vfs, afs, ext4: M...
477
  	hlist_add_head_rcu(&inode->i_hash, b);
250df6ed2   Dave Chinner   fs: protect inode...
478
  	spin_unlock(&inode->i_lock);
67a23c494   Dave Chinner   fs: rename inode_...
479
  	spin_unlock(&inode_hash_lock);
4c51acbc6   Dave Chinner   fs: Factor inode ...
480
481
482
483
  }
  EXPORT_SYMBOL(__insert_inode_hash);
  
  /**
f2ee7abf4   Eric Dumazet   vfs: avoid taking...
484
   *	__remove_inode_hash - remove an inode from the hash
4c51acbc6   Dave Chinner   fs: Factor inode ...
485
486
487
488
   *	@inode: inode to unhash
   *
   *	Remove an inode from the superblock.
   */
f2ee7abf4   Eric Dumazet   vfs: avoid taking...
489
  void __remove_inode_hash(struct inode *inode)
4c51acbc6   Dave Chinner   fs: Factor inode ...
490
  {
67a23c494   Dave Chinner   fs: rename inode_...
491
  	spin_lock(&inode_hash_lock);
250df6ed2   Dave Chinner   fs: protect inode...
492
  	spin_lock(&inode->i_lock);
3f19b2ab9   David Howells   vfs, afs, ext4: M...
493
  	hlist_del_init_rcu(&inode->i_hash);
250df6ed2   Dave Chinner   fs: protect inode...
494
  	spin_unlock(&inode->i_lock);
67a23c494   Dave Chinner   fs: rename inode_...
495
  	spin_unlock(&inode_hash_lock);
4c51acbc6   Dave Chinner   fs: Factor inode ...
496
  }
f2ee7abf4   Eric Dumazet   vfs: avoid taking...
497
  EXPORT_SYMBOL(__remove_inode_hash);
4c51acbc6   Dave Chinner   fs: Factor inode ...
498

dbd5768f8   Jan Kara   vfs: Rename end_w...
499
  void clear_inode(struct inode *inode)
b0683aa63   Al Viro   new helper: end_w...
500
  {
08142579b   Jan Kara   mm: fix assertion...
501
  	/*
b93b01631   Matthew Wilcox   page cache: use x...
502
  	 * We have to cycle the i_pages lock here because reclaim can be in the
08142579b   Jan Kara   mm: fix assertion...
503
  	 * process of removing the last page (in __delete_from_page_cache())
b93b01631   Matthew Wilcox   page cache: use x...
504
  	 * and we must not free the mapping under it.
08142579b   Jan Kara   mm: fix assertion...
505
  	 */
b93b01631   Matthew Wilcox   page cache: use x...
506
  	xa_lock_irq(&inode->i_data.i_pages);
b0683aa63   Al Viro   new helper: end_w...
507
  	BUG_ON(inode->i_data.nrpages);
f9fe48bec   Ross Zwisler   dax: support dirt...
508
  	BUG_ON(inode->i_data.nrexceptional);
b93b01631   Matthew Wilcox   page cache: use x...
509
  	xa_unlock_irq(&inode->i_data.i_pages);
b0683aa63   Al Viro   new helper: end_w...
510
511
512
  	BUG_ON(!list_empty(&inode->i_data.private_list));
  	BUG_ON(!(inode->i_state & I_FREEING));
  	BUG_ON(inode->i_state & I_CLEAR);
6c60d2b57   Dave Chinner   fs/fs-writeback.c...
513
  	BUG_ON(!list_empty(&inode->i_wb_list));
fa0d7e3de   Nick Piggin   fs: icache RCU fr...
514
  	/* don't need i_lock here, no concurrent mods to i_state */
b0683aa63   Al Viro   new helper: end_w...
515
516
  	inode->i_state = I_FREEING | I_CLEAR;
  }
dbd5768f8   Jan Kara   vfs: Rename end_w...
517
  EXPORT_SYMBOL(clear_inode);
b0683aa63   Al Viro   new helper: end_w...
518

b2b2af8e6   Dave Chinner   fs: factor inode ...
519
520
521
522
523
524
525
526
527
528
529
530
531
  /*
   * 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(...
532
  static void evict(struct inode *inode)
b4272d4c8   Al Viro   unify fs/inode.c ...
533
534
  {
  	const struct super_operations *op = inode->i_sb->s_op;
b2b2af8e6   Dave Chinner   fs: factor inode ...
535
536
  	BUG_ON(!(inode->i_state & I_FREEING));
  	BUG_ON(!list_empty(&inode->i_lru));
c7f540849   Dave Chinner   inode: rename i_w...
537
538
  	if (!list_empty(&inode->i_io_list))
  		inode_io_list_del(inode);
b12362bdb   Eric Dumazet   vfs: conditionall...
539

55fa6091d   Dave Chinner   fs: move i_sb_lis...
540
  	inode_sb_list_del(inode);
169ebd901   Jan Kara   writeback: Avoid ...
541
542
543
544
545
546
547
  	/*
  	 * 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...
548

be7ce4161   Al Viro   New method - evic...
549
550
  	if (op->evict_inode) {
  		op->evict_inode(inode);
b4272d4c8   Al Viro   unify fs/inode.c ...
551
  	} else {
91b0abe36   Johannes Weiner   mm + fs: store sh...
552
  		truncate_inode_pages_final(&inode->i_data);
dbd5768f8   Jan Kara   vfs: Rename end_w...
553
  		clear_inode(inode);
b4272d4c8   Al Viro   unify fs/inode.c ...
554
  	}
661074e91   Al Viro   Take ->i_bdev/->i...
555
556
557
558
  	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 ...
559
560
561
562
563
564
565
566
567
  
  	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 ...
568
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
569
570
571
572
573
574
575
576
577
  /*
   * 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
578
579
  	while (!list_empty(head)) {
  		struct inode *inode;
7ccf19a80   Nick Piggin   fs: inode split I...
580
581
  		inode = list_first_entry(head, struct inode, i_lru);
  		list_del_init(&inode->i_lru);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
582

644da5960   Al Viro   fs/inode.c:evict(...
583
  		evict(inode);
ac05fbb40   Josef Bacik   inode: don't soft...
584
  		cond_resched();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
585
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
586
  }
a03187867   Christoph Hellwig   fs: fold invalida...
587
  /**
63997e98a   Al Viro   split invalidate_...
588
589
590
591
   * 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
1751e8a6c   Linus Torvalds   Rename superblock...
592
   * called by superblock shutdown after having SB_ACTIVE flag removed,
63997e98a   Al Viro   split invalidate_...
593
594
   * so any inode reaching zero refcount during or after that call will
   * be immediately evicted.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
595
   */
63997e98a   Al Viro   split invalidate_...
596
  void evict_inodes(struct super_block *sb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
597
  {
63997e98a   Al Viro   split invalidate_...
598
599
  	struct inode *inode, *next;
  	LIST_HEAD(dispose);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
600

ac05fbb40   Josef Bacik   inode: don't soft...
601
  again:
74278da9f   Dave Chinner   inode: convert in...
602
  	spin_lock(&sb->s_inode_list_lock);
63997e98a   Al Viro   split invalidate_...
603
604
  	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...
605
  			continue;
250df6ed2   Dave Chinner   fs: protect inode...
606
607
608
609
  
  		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
610
  			continue;
250df6ed2   Dave Chinner   fs: protect inode...
611
  		}
63997e98a   Al Viro   split invalidate_...
612
613
  
  		inode->i_state |= I_FREEING;
02afc410f   Dave Chinner   fs: Lock the inod...
614
  		inode_lru_list_del(inode);
250df6ed2   Dave Chinner   fs: protect inode...
615
  		spin_unlock(&inode->i_lock);
02afc410f   Dave Chinner   fs: Lock the inod...
616
  		list_add(&inode->i_lru, &dispose);
ac05fbb40   Josef Bacik   inode: don't soft...
617
618
619
620
621
622
623
624
625
626
627
628
  
  		/*
  		 * We can have a ton of inodes to evict at unmount time given
  		 * enough memory, check to see if we need to go to sleep for a
  		 * bit so we don't livelock.
  		 */
  		if (need_resched()) {
  			spin_unlock(&sb->s_inode_list_lock);
  			cond_resched();
  			dispose_list(&dispose);
  			goto again;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
629
  	}
74278da9f   Dave Chinner   inode: convert in...
630
  	spin_unlock(&sb->s_inode_list_lock);
63997e98a   Al Viro   split invalidate_...
631
632
  
  	dispose_list(&dispose);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
633
  }
799ea9e9c   Darrick J. Wong   xfs: evict all in...
634
  EXPORT_SYMBOL_GPL(evict_inodes);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
635

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
636
  /**
a03187867   Christoph Hellwig   fs: fold invalida...
637
638
   * invalidate_inodes	- attempt to free all inodes on a superblock
   * @sb:		superblock to operate on
93b270f76   NeilBrown   Fix over-zealous ...
639
   * @kill_dirty: flag to guide handling of dirty inodes
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
640
   *
a03187867   Christoph Hellwig   fs: fold invalida...
641
642
   * 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 ...
643
644
   * If @kill_dirty is set, discard dirty inodes too, otherwise treat
   * them as busy.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
645
   */
93b270f76   NeilBrown   Fix over-zealous ...
646
  int invalidate_inodes(struct super_block *sb, bool kill_dirty)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
647
  {
cffbc8aa3   Dave Chinner   fs: Convert nr_in...
648
  	int busy = 0;
a03187867   Christoph Hellwig   fs: fold invalida...
649
650
  	struct inode *inode, *next;
  	LIST_HEAD(dispose);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
651

04646aebd   Eric Sandeen   fs: avoid softloc...
652
  again:
74278da9f   Dave Chinner   inode: convert in...
653
  	spin_lock(&sb->s_inode_list_lock);
a03187867   Christoph Hellwig   fs: fold invalida...
654
  	list_for_each_entry_safe(inode, next, &sb->s_inodes, i_sb_list) {
250df6ed2   Dave Chinner   fs: protect inode...
655
656
657
  		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...
658
  			continue;
250df6ed2   Dave Chinner   fs: protect inode...
659
  		}
0ae45f63d   Theodore Ts'o   vfs: add support ...
660
  		if (inode->i_state & I_DIRTY_ALL && !kill_dirty) {
250df6ed2   Dave Chinner   fs: protect inode...
661
  			spin_unlock(&inode->i_lock);
93b270f76   NeilBrown   Fix over-zealous ...
662
663
664
  			busy = 1;
  			continue;
  		}
99a389192   Christoph Hellwig   fs: fix buffer in...
665
  		if (atomic_read(&inode->i_count)) {
250df6ed2   Dave Chinner   fs: protect inode...
666
  			spin_unlock(&inode->i_lock);
99a389192   Christoph Hellwig   fs: fix buffer in...
667
  			busy = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
668
669
  			continue;
  		}
99a389192   Christoph Hellwig   fs: fix buffer in...
670

99a389192   Christoph Hellwig   fs: fix buffer in...
671
  		inode->i_state |= I_FREEING;
02afc410f   Dave Chinner   fs: Lock the inod...
672
  		inode_lru_list_del(inode);
250df6ed2   Dave Chinner   fs: protect inode...
673
  		spin_unlock(&inode->i_lock);
02afc410f   Dave Chinner   fs: Lock the inod...
674
  		list_add(&inode->i_lru, &dispose);
04646aebd   Eric Sandeen   fs: avoid softloc...
675
676
677
678
679
680
  		if (need_resched()) {
  			spin_unlock(&sb->s_inode_list_lock);
  			cond_resched();
  			dispose_list(&dispose);
  			goto again;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
681
  	}
74278da9f   Dave Chinner   inode: convert in...
682
  	spin_unlock(&sb->s_inode_list_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
683

a03187867   Christoph Hellwig   fs: fold invalida...
684
  	dispose_list(&dispose);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
685
686
687
  
  	return busy;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
688

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
689
  /*
bc3b14cb2   Dave Chinner   inode: convert in...
690
   * Isolate the inode from the LRU in preparation for freeing it.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
691
692
   *
   * Any inodes which are pinned purely because of attached pagecache have their
9e38d86ff   Nick Piggin   fs: Implement laz...
693
694
   * 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
695
   *
9e38d86ff   Nick Piggin   fs: Implement laz...
696
697
698
699
700
701
702
   * 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
703
   */
3f97b1632   Vladimir Davydov   list_lru: add hel...
704
705
  static enum lru_status inode_lru_isolate(struct list_head *item,
  		struct list_lru_one *lru, spinlock_t *lru_lock, void *arg)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
706
  {
bc3b14cb2   Dave Chinner   inode: convert in...
707
708
  	struct list_head *freeable = arg;
  	struct inode	*inode = container_of(item, struct inode, i_lru);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
709

bc3b14cb2   Dave Chinner   inode: convert in...
710
711
712
713
714
715
  	/*
  	 * 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
716

bc3b14cb2   Dave Chinner   inode: convert in...
717
718
719
720
721
722
  	/*
  	 * 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)) {
3f97b1632   Vladimir Davydov   list_lru: add hel...
723
  		list_lru_isolate(lru, &inode->i_lru);
bc3b14cb2   Dave Chinner   inode: convert in...
724
725
726
727
  		spin_unlock(&inode->i_lock);
  		this_cpu_dec(nr_unused);
  		return LRU_REMOVED;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
728

69056ee6a   Dave Chinner   Revert "mm: don't...
729
730
  	/* recently referenced inodes get one more pass */
  	if (inode->i_state & I_REFERENCED) {
bc3b14cb2   Dave Chinner   inode: convert in...
731
732
733
734
  		inode->i_state &= ~I_REFERENCED;
  		spin_unlock(&inode->i_lock);
  		return LRU_ROTATE;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
735

bc3b14cb2   Dave Chinner   inode: convert in...
736
737
738
739
740
741
742
743
744
745
746
747
748
  	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...
749
  		}
bc3b14cb2   Dave Chinner   inode: convert in...
750
751
752
753
  		iput(inode);
  		spin_lock(lru_lock);
  		return LRU_RETRY;
  	}
02afc410f   Dave Chinner   fs: Lock the inod...
754

bc3b14cb2   Dave Chinner   inode: convert in...
755
756
  	WARN_ON(inode->i_state & I_NEW);
  	inode->i_state |= I_FREEING;
3f97b1632   Vladimir Davydov   list_lru: add hel...
757
  	list_lru_isolate_move(lru, &inode->i_lru, freeable);
bc3b14cb2   Dave Chinner   inode: convert in...
758
  	spin_unlock(&inode->i_lock);
9e38d86ff   Nick Piggin   fs: Implement laz...
759

bc3b14cb2   Dave Chinner   inode: convert in...
760
761
762
  	this_cpu_dec(nr_unused);
  	return LRU_REMOVED;
  }
7ccf19a80   Nick Piggin   fs: inode split I...
763

bc3b14cb2   Dave Chinner   inode: convert in...
764
765
766
767
768
769
  /*
   * 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().
   */
503c358cf   Vladimir Davydov   list_lru: introdu...
770
  long prune_icache_sb(struct super_block *sb, struct shrink_control *sc)
bc3b14cb2   Dave Chinner   inode: convert in...
771
772
773
  {
  	LIST_HEAD(freeable);
  	long freed;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
774

503c358cf   Vladimir Davydov   list_lru: introdu...
775
776
  	freed = list_lru_shrink_walk(&sb->s_inode_lru, sc,
  				     inode_lru_isolate, &freeable);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
777
  	dispose_list(&freeable);
0a234c6dc   Dave Chinner   shrinker: convert...
778
  	return freed;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
779
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
780
781
782
  static void __wait_on_freeing_inode(struct inode *inode);
  /*
   * Called with the inode lock held.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
783
   */
6b3304b53   Manish Katiyar   Make checkpatch.p...
784
785
786
787
  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
788
  {
6b3304b53   Manish Katiyar   Make checkpatch.p...
789
  	struct inode *inode = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
790
791
  
  repeat:
b67bfe0d4   Sasha Levin   hlist: drop the n...
792
  	hlist_for_each_entry(inode, head, i_hash) {
5a3cd9928   Al Viro   iget/iget5: don't...
793
  		if (inode->i_sb != sb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
794
  			continue;
5a3cd9928   Al Viro   iget/iget5: don't...
795
  		if (!test(inode, data))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
796
  			continue;
5a3cd9928   Al Viro   iget/iget5: don't...
797
  		spin_lock(&inode->i_lock);
a4ffdde6e   Al Viro   simplify checks f...
798
  		if (inode->i_state & (I_FREEING|I_WILL_FREE)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
799
800
801
  			__wait_on_freeing_inode(inode);
  			goto repeat;
  		}
c2b6d621c   Al Viro   new primitive: di...
802
803
804
805
  		if (unlikely(inode->i_state & I_CREATING)) {
  			spin_unlock(&inode->i_lock);
  			return ERR_PTR(-ESTALE);
  		}
f7899bd54   Christoph Hellwig   fs: move i_count ...
806
  		__iget(inode);
250df6ed2   Dave Chinner   fs: protect inode...
807
  		spin_unlock(&inode->i_lock);
f7899bd54   Christoph Hellwig   fs: move i_count ...
808
  		return inode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
809
  	}
f7899bd54   Christoph Hellwig   fs: move i_count ...
810
  	return NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
811
812
813
814
815
816
  }
  
  /*
   * 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...
817
818
  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
819
  {
6b3304b53   Manish Katiyar   Make checkpatch.p...
820
  	struct inode *inode = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
821
822
  
  repeat:
b67bfe0d4   Sasha Levin   hlist: drop the n...
823
  	hlist_for_each_entry(inode, head, i_hash) {
5a3cd9928   Al Viro   iget/iget5: don't...
824
  		if (inode->i_ino != ino)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
825
  			continue;
5a3cd9928   Al Viro   iget/iget5: don't...
826
  		if (inode->i_sb != sb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
827
  			continue;
5a3cd9928   Al Viro   iget/iget5: don't...
828
  		spin_lock(&inode->i_lock);
a4ffdde6e   Al Viro   simplify checks f...
829
  		if (inode->i_state & (I_FREEING|I_WILL_FREE)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
830
831
832
  			__wait_on_freeing_inode(inode);
  			goto repeat;
  		}
c2b6d621c   Al Viro   new primitive: di...
833
834
835
836
  		if (unlikely(inode->i_state & I_CREATING)) {
  			spin_unlock(&inode->i_lock);
  			return ERR_PTR(-ESTALE);
  		}
f7899bd54   Christoph Hellwig   fs: move i_count ...
837
  		__iget(inode);
250df6ed2   Dave Chinner   fs: protect inode...
838
  		spin_unlock(&inode->i_lock);
f7899bd54   Christoph Hellwig   fs: move i_count ...
839
  		return inode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
840
  	}
f7899bd54   Christoph Hellwig   fs: move i_count ...
841
  	return NULL;
8290c35f8   David Chinner   Inode: Allow exte...
842
  }
f991bd2e1   Eric Dumazet   fs: introduce a p...
843
844
845
846
  /*
   * 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...
847
   *
f991bd2e1   Eric Dumazet   fs: introduce a p...
848
849
850
851
852
853
854
855
856
   * 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...
857
   */
f991bd2e1   Eric Dumazet   fs: introduce a p...
858
859
  #define LAST_INO_BATCH 1024
  static DEFINE_PER_CPU(unsigned int, last_ino);
85fe4025c   Christoph Hellwig   fs: do not assign...
860
  unsigned int get_next_ino(void)
8290c35f8   David Chinner   Inode: Allow exte...
861
  {
f991bd2e1   Eric Dumazet   fs: introduce a p...
862
863
  	unsigned int *p = &get_cpu_var(last_ino);
  	unsigned int res = *p;
8290c35f8   David Chinner   Inode: Allow exte...
864

f991bd2e1   Eric Dumazet   fs: introduce a p...
865
866
867
868
869
870
871
872
  #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
2adc376c5   Carlos Maiolino   vfs: avoid creati...
873
874
875
876
877
  	res++;
  	/* get_next_ino should not provide a 0 inode number */
  	if (unlikely(!res))
  		res++;
  	*p = res;
f991bd2e1   Eric Dumazet   fs: introduce a p...
878
879
  	put_cpu_var(last_ino);
  	return res;
8290c35f8   David Chinner   Inode: Allow exte...
880
  }
85fe4025c   Christoph Hellwig   fs: do not assign...
881
  EXPORT_SYMBOL(get_next_ino);
8290c35f8   David Chinner   Inode: Allow exte...
882

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
883
  /**
a209dfc7b   Eric Dumazet   vfs: dont chain p...
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
   *	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
907
908
909
   *	new_inode 	- obtain an inode
   *	@sb: superblock
   *
769848c03   Mel Gorman   Add __GFP_MOVABLE...
910
   *	Allocates a new inode for given superblock. The default gfp_mask
3c1d43787   Hugh Dickins   mm: remove GFP_HI...
911
   *	for allocations related to inode->i_mapping is GFP_HIGHUSER_MOVABLE.
769848c03   Mel Gorman   Add __GFP_MOVABLE...
912
913
914
915
916
   *	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
917
918
919
   */
  struct inode *new_inode(struct super_block *sb)
  {
6b3304b53   Manish Katiyar   Make checkpatch.p...
920
  	struct inode *inode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
921

74278da9f   Dave Chinner   inode: convert in...
922
  	spin_lock_prefetch(&sb->s_inode_list_lock);
6b3304b53   Manish Katiyar   Make checkpatch.p...
923

a209dfc7b   Eric Dumazet   vfs: dont chain p...
924
925
  	inode = new_inode_pseudo(sb);
  	if (inode)
55fa6091d   Dave Chinner   fs: move i_sb_lis...
926
  		inode_sb_list_add(inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
927
928
  	return inode;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
929
  EXPORT_SYMBOL(new_inode);
14358e6dd   Peter Zijlstra   lockdep: annotate...
930
  #ifdef CONFIG_DEBUG_LOCK_ALLOC
e096d0c7e   Josh Boyer   lockdep: Add help...
931
932
  void lockdep_annotate_inode_mutex_key(struct inode *inode)
  {
a3314a0ed   Namhyung Kim   lockdep: fixup ch...
933
  	if (S_ISDIR(inode->i_mode)) {
1e89a5e15   Peter Zijlstra   lockdep: fixup th...
934
  		struct file_system_type *type = inode->i_sb->s_type;
9a7aa12f3   Jan Kara   vfs: Set special ...
935
  		/* Set new key only if filesystem hasn't already changed it */
9902af79c   Al Viro   parallel lookups:...
936
  		if (lockdep_match_class(&inode->i_rwsem, &type->i_mutex_key)) {
9a7aa12f3   Jan Kara   vfs: Set special ...
937
938
939
  			/*
  			 * ensure nobody is actually holding i_mutex
  			 */
9902af79c   Al Viro   parallel lookups:...
940
941
942
  			// mutex_destroy(&inode->i_mutex);
  			init_rwsem(&inode->i_rwsem);
  			lockdep_set_class(&inode->i_rwsem,
9a7aa12f3   Jan Kara   vfs: Set special ...
943
944
  					  &type->i_mutex_dir_key);
  		}
1e89a5e15   Peter Zijlstra   lockdep: fixup th...
945
  	}
e096d0c7e   Josh Boyer   lockdep: Add help...
946
947
  }
  EXPORT_SYMBOL(lockdep_annotate_inode_mutex_key);
14358e6dd   Peter Zijlstra   lockdep: annotate...
948
  #endif
e096d0c7e   Josh Boyer   lockdep: Add help...
949
950
951
952
953
954
955
956
957
958
959
  
  /**
   * 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...
960
  	spin_lock(&inode->i_lock);
eaff8079d   Christoph Hellwig   kill I_LOCK
961
  	WARN_ON(!(inode->i_state & I_NEW));
c2b6d621c   Al Viro   new primitive: di...
962
  	inode->i_state &= ~I_NEW & ~I_CREATING;
310fa7a36   Al Viro   restore smp_mb() ...
963
  	smp_mb();
250df6ed2   Dave Chinner   fs: protect inode...
964
965
  	wake_up_bit(&inode->i_state, __I_NEW);
  	spin_unlock(&inode->i_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
966
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
967
  EXPORT_SYMBOL(unlock_new_inode);
c2b6d621c   Al Viro   new primitive: di...
968
969
970
971
972
973
974
975
976
977
978
979
  void discard_new_inode(struct inode *inode)
  {
  	lockdep_annotate_inode_mutex_key(inode);
  	spin_lock(&inode->i_lock);
  	WARN_ON(!(inode->i_state & I_NEW));
  	inode->i_state &= ~I_NEW;
  	smp_mb();
  	wake_up_bit(&inode->i_state, __I_NEW);
  	spin_unlock(&inode->i_lock);
  	iput(inode);
  }
  EXPORT_SYMBOL(discard_new_inode);
0b2d0724e   Christoph Hellwig   fs: simplify iget...
980
  /**
375e289ea   J. Bruce Fields   vfs: pull ext4's ...
981
   * lock_two_nondirectories - take two i_mutexes on non-directory objects
4fd699ae3   J. Bruce Fields   vfs: lock_two_non...
982
983
984
985
   *
   * 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 ...
986
987
988
989
990
   * @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...
991
992
993
994
  	if (inode1 > inode2)
  		swap(inode1, inode2);
  
  	if (inode1 && !S_ISDIR(inode1->i_mode))
5955102c9   Al Viro   wrappers for ->i_...
995
  		inode_lock(inode1);
4fd699ae3   J. Bruce Fields   vfs: lock_two_non...
996
  	if (inode2 && !S_ISDIR(inode2->i_mode) && inode2 != inode1)
5955102c9   Al Viro   wrappers for ->i_...
997
  		inode_lock_nested(inode2, I_MUTEX_NONDIR2);
375e289ea   J. Bruce Fields   vfs: pull ext4's ...
998
999
1000
1001
1002
1003
1004
1005
1006
1007
  }
  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...
1008
  	if (inode1 && !S_ISDIR(inode1->i_mode))
5955102c9   Al Viro   wrappers for ->i_...
1009
  		inode_unlock(inode1);
4fd699ae3   J. Bruce Fields   vfs: lock_two_non...
1010
  	if (inode2 && !S_ISDIR(inode2->i_mode) && inode2 != inode1)
5955102c9   Al Viro   wrappers for ->i_...
1011
  		inode_unlock(inode2);
375e289ea   J. Bruce Fields   vfs: pull ext4's ...
1012
1013
1014
1015
  }
  EXPORT_SYMBOL(unlock_two_nondirectories);
  
  /**
80ea09a00   Miklos Szeredi   vfs: factor out i...
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
   * inode_insert5 - obtain an inode from a mounted file system
   * @inode:	pre-allocated inode to use for insert to cache
   * @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 variant of iget5_locked() for callers that don't want to fail on memory
   * allocation of inode.
   *
   * If the inode is not in cache, insert the pre-allocated inode to cache 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().
   *
   * Note both @test and @set are called with the inode_hash_lock held, so can't
   * sleep.
   */
  struct inode *inode_insert5(struct inode *inode, unsigned long hashval,
  			    int (*test)(struct inode *, void *),
  			    int (*set)(struct inode *, void *), void *data)
  {
  	struct hlist_head *head = inode_hashtable + hash(inode->i_sb, hashval);
  	struct inode *old;
e950564b9   Miklos Szeredi   vfs: don't evict ...
1041
  	bool creating = inode->i_state & I_CREATING;
80ea09a00   Miklos Szeredi   vfs: factor out i...
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
  
  again:
  	spin_lock(&inode_hash_lock);
  	old = find_inode(inode->i_sb, head, test, data);
  	if (unlikely(old)) {
  		/*
  		 * Uhhuh, somebody else created the same inode under us.
  		 * Use the old inode instead of the preallocated one.
  		 */
  		spin_unlock(&inode_hash_lock);
c2b6d621c   Al Viro   new primitive: di...
1052
1053
  		if (IS_ERR(old))
  			return NULL;
80ea09a00   Miklos Szeredi   vfs: factor out i...
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
  		wait_on_inode(old);
  		if (unlikely(inode_unhashed(old))) {
  			iput(old);
  			goto again;
  		}
  		return old;
  	}
  
  	if (set && unlikely(set(inode, data))) {
  		inode = NULL;
  		goto unlock;
  	}
  
  	/*
  	 * Return the locked inode with I_NEW set, the
  	 * caller is responsible for filling in the contents
  	 */
  	spin_lock(&inode->i_lock);
  	inode->i_state |= I_NEW;
3f19b2ab9   David Howells   vfs, afs, ext4: M...
1073
  	hlist_add_head_rcu(&inode->i_hash, head);
80ea09a00   Miklos Szeredi   vfs: factor out i...
1074
  	spin_unlock(&inode->i_lock);
e950564b9   Miklos Szeredi   vfs: don't evict ...
1075
1076
  	if (!creating)
  		inode_sb_list_add(inode);
80ea09a00   Miklos Szeredi   vfs: factor out i...
1077
1078
1079
1080
1081
1082
1083
1084
  unlock:
  	spin_unlock(&inode_hash_lock);
  
  	return inode;
  }
  EXPORT_SYMBOL(inode_insert5);
  
  /**
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
   * 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
1100
   *
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1101
1102
   * 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
1103
   */
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1104
1105
1106
  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
1107
  {
80ea09a00   Miklos Szeredi   vfs: factor out i...
1108
  	struct inode *inode = ilookup5(sb, hashval, test, data);
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1109

80ea09a00   Miklos Szeredi   vfs: factor out i...
1110
  	if (!inode) {
e950564b9   Miklos Szeredi   vfs: don't evict ...
1111
  		struct inode *new = alloc_inode(sb);
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1112

80ea09a00   Miklos Szeredi   vfs: factor out i...
1113
  		if (new) {
e950564b9   Miklos Szeredi   vfs: don't evict ...
1114
  			new->i_state = 0;
80ea09a00   Miklos Szeredi   vfs: factor out i...
1115
1116
  			inode = inode_insert5(new, hashval, test, set, data);
  			if (unlikely(inode != new))
e950564b9   Miklos Szeredi   vfs: don't evict ...
1117
  				destroy_inode(new);
2864f3014   Al Viro   iget_locked et.al...
1118
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1119
1120
  	}
  	return inode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1121
  }
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1122
  EXPORT_SYMBOL(iget5_locked);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1123

0b2d0724e   Christoph Hellwig   fs: simplify iget...
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
  /**
   * 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
1136
   */
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1137
  struct inode *iget_locked(struct super_block *sb, unsigned long ino)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1138
  {
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1139
  	struct hlist_head *head = inode_hashtable + hash(sb, ino);
6b3304b53   Manish Katiyar   Make checkpatch.p...
1140
  	struct inode *inode;
2864f3014   Al Viro   iget_locked et.al...
1141
  again:
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1142
1143
1144
1145
  	spin_lock(&inode_hash_lock);
  	inode = find_inode_fast(sb, head, ino);
  	spin_unlock(&inode_hash_lock);
  	if (inode) {
c2b6d621c   Al Viro   new primitive: di...
1146
1147
  		if (IS_ERR(inode))
  			return NULL;
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1148
  		wait_on_inode(inode);
2864f3014   Al Viro   iget_locked et.al...
1149
1150
1151
1152
  		if (unlikely(inode_unhashed(inode))) {
  			iput(inode);
  			goto again;
  		}
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1153
1154
  		return inode;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1155
1156
  	inode = alloc_inode(sb);
  	if (inode) {
6b3304b53   Manish Katiyar   Make checkpatch.p...
1157
  		struct inode *old;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1158

67a23c494   Dave Chinner   fs: rename inode_...
1159
  		spin_lock(&inode_hash_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1160
1161
1162
1163
  		/* We released the lock, so.. */
  		old = find_inode_fast(sb, head, ino);
  		if (!old) {
  			inode->i_ino = ino;
250df6ed2   Dave Chinner   fs: protect inode...
1164
1165
  			spin_lock(&inode->i_lock);
  			inode->i_state = I_NEW;
3f19b2ab9   David Howells   vfs, afs, ext4: M...
1166
  			hlist_add_head_rcu(&inode->i_hash, head);
250df6ed2   Dave Chinner   fs: protect inode...
1167
  			spin_unlock(&inode->i_lock);
55fa6091d   Dave Chinner   fs: move i_sb_lis...
1168
  			inode_sb_list_add(inode);
67a23c494   Dave Chinner   fs: rename inode_...
1169
  			spin_unlock(&inode_hash_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
  
  			/* 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_...
1182
  		spin_unlock(&inode_hash_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1183
  		destroy_inode(inode);
c2b6d621c   Al Viro   new primitive: di...
1184
1185
  		if (IS_ERR(old))
  			return NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1186
1187
  		inode = old;
  		wait_on_inode(inode);
2864f3014   Al Viro   iget_locked et.al...
1188
1189
1190
1191
  		if (unlikely(inode_unhashed(inode))) {
  			iput(inode);
  			goto again;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1192
1193
1194
  	}
  	return inode;
  }
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1195
  EXPORT_SYMBOL(iget_locked);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1196

ad5e195ac   Christoph Hellwig   fs: Stop abusing ...
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
  /*
   * 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 ...
1207
  	struct inode *inode;
3f19b2ab9   David Howells   vfs, afs, ext4: M...
1208
1209
  	hlist_for_each_entry_rcu(inode, b, i_hash) {
  		if (inode->i_ino == ino && inode->i_sb == sb)
ad5e195ac   Christoph Hellwig   fs: Stop abusing ...
1210
1211
  			return 0;
  	}
ad5e195ac   Christoph Hellwig   fs: Stop abusing ...
1212
1213
  	return 1;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
  /**
   *	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: ...
1230
1231
1232
1233
1234
  	/*
  	 * 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 ...
1235
  	static DEFINE_SPINLOCK(iunique_lock);
866b04fcc   Jeff Layton   inode numbering: ...
1236
  	static unsigned int counter;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1237
  	ino_t res;
3361c7beb   Jeffrey Layton   make iunique use ...
1238

3f19b2ab9   David Howells   vfs, afs, ext4: M...
1239
  	rcu_read_lock();
ad5e195ac   Christoph Hellwig   fs: Stop abusing ...
1240
  	spin_lock(&iunique_lock);
3361c7beb   Jeffrey Layton   make iunique use ...
1241
1242
1243
  	do {
  		if (counter <= max_reserved)
  			counter = max_reserved + 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1244
  		res = counter++;
ad5e195ac   Christoph Hellwig   fs: Stop abusing ...
1245
1246
  	} while (!test_inode_iunique(sb, res));
  	spin_unlock(&iunique_lock);
3f19b2ab9   David Howells   vfs, afs, ext4: M...
1247
  	rcu_read_unlock();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1248

3361c7beb   Jeffrey Layton   make iunique use ...
1249
1250
  	return res;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1251
1252
1253
1254
  EXPORT_SYMBOL(iunique);
  
  struct inode *igrab(struct inode *inode)
  {
250df6ed2   Dave Chinner   fs: protect inode...
1255
1256
  	spin_lock(&inode->i_lock);
  	if (!(inode->i_state & (I_FREEING|I_WILL_FREE))) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1257
  		__iget(inode);
250df6ed2   Dave Chinner   fs: protect inode...
1258
1259
1260
  		spin_unlock(&inode->i_lock);
  	} else {
  		spin_unlock(&inode->i_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1261
1262
1263
1264
1265
1266
  		/*
  		 * 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...
1267
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1268
1269
  	return inode;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1270
1271
1272
  EXPORT_SYMBOL(igrab);
  
  /**
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1273
   * ilookup5_nowait - search for an inode in the inode cache
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1274
   * @sb:		super block of file system to search
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1275
   * @hashval:	hash value (usually inode number) to search for
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1276
1277
   * @test:	callback used for comparisons between inodes
   * @data:	opaque data pointer to pass to @test
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1278
   *
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1279
   * Search for the inode specified by @hashval and @data in the inode cache.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1280
1281
1282
   * If the inode is in the cache, the inode is returned with an incremented
   * reference count.
   *
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1283
1284
   * 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
1285
   *
b6d0ad686   Randy Dunlap   fs: fix inode.c k...
1286
   * Note2: @test is called with the inode_hash_lock held, so can't sleep.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1287
   */
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1288
1289
  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
1290
  {
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1291
  	struct hlist_head *head = inode_hashtable + hash(sb, hashval);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1292
  	struct inode *inode;
67a23c494   Dave Chinner   fs: rename inode_...
1293
  	spin_lock(&inode_hash_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1294
  	inode = find_inode(sb, head, test, data);
67a23c494   Dave Chinner   fs: rename inode_...
1295
  	spin_unlock(&inode_hash_lock);
88bd5121d   Anton Altaparmakov   [PATCH] Fix soft ...
1296

c2b6d621c   Al Viro   new primitive: di...
1297
  	return IS_ERR(inode) ? NULL : inode;
88bd5121d   Anton Altaparmakov   [PATCH] Fix soft ...
1298
  }
88bd5121d   Anton Altaparmakov   [PATCH] Fix soft ...
1299
1300
1301
1302
1303
1304
1305
1306
1307
  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...
1308
1309
1310
   * 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 ...
1311
   * returned with an incremented reference count.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1312
   *
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1313
1314
   * 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
1315
   *
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1316
   * Note: @test is called with the inode_hash_lock held, so can't sleep.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1317
1318
1319
1320
   */
  struct inode *ilookup5(struct super_block *sb, unsigned long hashval,
  		int (*test)(struct inode *, void *), void *data)
  {
2864f3014   Al Viro   iget_locked et.al...
1321
1322
1323
1324
  	struct inode *inode;
  again:
  	inode = ilookup5_nowait(sb, hashval, test, data);
  	if (inode) {
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1325
  		wait_on_inode(inode);
2864f3014   Al Viro   iget_locked et.al...
1326
1327
1328
1329
1330
  		if (unlikely(inode_unhashed(inode))) {
  			iput(inode);
  			goto again;
  		}
  	}
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1331
  	return inode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1332
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1333
1334
1335
1336
1337
1338
1339
  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...
1340
1341
   * 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
1342
1343
1344
1345
   */
  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
1346
  	struct inode *inode;
2864f3014   Al Viro   iget_locked et.al...
1347
  again:
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1348
1349
1350
  	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
1351

2864f3014   Al Viro   iget_locked et.al...
1352
  	if (inode) {
c2b6d621c   Al Viro   new primitive: di...
1353
1354
  		if (IS_ERR(inode))
  			return NULL;
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1355
  		wait_on_inode(inode);
2864f3014   Al Viro   iget_locked et.al...
1356
1357
1358
1359
1360
  		if (unlikely(inode_unhashed(inode))) {
  			iput(inode);
  			goto again;
  		}
  	}
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1361
  	return inode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1362
  }
0b2d0724e   Christoph Hellwig   fs: simplify iget...
1363
  EXPORT_SYMBOL(ilookup);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1364

fe032c422   Theodore Ts'o   vfs: add find_ino...
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
  /**
   * find_inode_nowait - find an inode in the inode cache
   * @sb:		super block of file system to search
   * @hashval:	hash value (usually inode number) to search for
   * @match:	callback used for comparisons between inodes
   * @data:	opaque data pointer to pass to @match
   *
   * Search for the inode specified by @hashval and @data in the inode
   * cache, where the helper function @match will return 0 if the inode
   * does not match, 1 if the inode does match, and -1 if the search
   * should be stopped.  The @match function must be responsible for
   * taking the i_lock spin_lock and checking i_state for an inode being
   * freed or being initialized, and incrementing the reference count
   * before returning 1.  It also must not sleep, since it is called with
   * the inode_hash_lock spinlock held.
   *
   * This is a even more generalized version of ilookup5() when the
   * function must never block --- find_inode() can block in
   * __wait_on_freeing_inode() --- or when the caller can not increment
   * the reference count because the resulting iput() might cause an
   * inode eviction.  The tradeoff is that the @match funtion must be
   * very carefully implemented.
   */
  struct inode *find_inode_nowait(struct super_block *sb,
  				unsigned long hashval,
  				int (*match)(struct inode *, unsigned long,
  					     void *),
  				void *data)
  {
  	struct hlist_head *head = inode_hashtable + hash(sb, hashval);
  	struct inode *inode, *ret_inode = NULL;
  	int mval;
  
  	spin_lock(&inode_hash_lock);
  	hlist_for_each_entry(inode, head, i_hash) {
  		if (inode->i_sb != sb)
  			continue;
  		mval = match(inode, hashval, data);
  		if (mval == 0)
  			continue;
  		if (mval == 1)
  			ret_inode = inode;
  		goto out;
  	}
  out:
  	spin_unlock(&inode_hash_lock);
  	return ret_inode;
  }
  EXPORT_SYMBOL(find_inode_nowait);
3f19b2ab9   David Howells   vfs, afs, ext4: M...
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
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
  /**
   * find_inode_rcu - find an inode in the inode cache
   * @sb:		Super block of file system to search
   * @hashval:	Key to hash
   * @test:	Function to test match on an inode
   * @data:	Data for test function
   *
   * Search for the inode specified by @hashval and @data in the inode cache,
   * where the helper function @test will return 0 if the inode does not match
   * and 1 if it does.  The @test function must be responsible for taking the
   * i_lock spin_lock and checking i_state for an inode being freed or being
   * initialized.
   *
   * If successful, this will return the inode for which the @test function
   * returned 1 and NULL otherwise.
   *
   * The @test function is not permitted to take a ref on any inode presented.
   * It is also not permitted to sleep.
   *
   * The caller must hold the RCU read lock.
   */
  struct inode *find_inode_rcu(struct super_block *sb, unsigned long hashval,
  			     int (*test)(struct inode *, void *), void *data)
  {
  	struct hlist_head *head = inode_hashtable + hash(sb, hashval);
  	struct inode *inode;
  
  	RCU_LOCKDEP_WARN(!rcu_read_lock_held(),
  			 "suspicious find_inode_rcu() usage");
  
  	hlist_for_each_entry_rcu(inode, head, i_hash) {
  		if (inode->i_sb == sb &&
  		    !(READ_ONCE(inode->i_state) & (I_FREEING | I_WILL_FREE)) &&
  		    test(inode, data))
  			return inode;
  	}
  	return NULL;
  }
  EXPORT_SYMBOL(find_inode_rcu);
  
  /**
   * find_inode_by_rcu - Find an inode in the inode cache
   * @sb:		Super block of file system to search
   * @ino:	The inode number to match
   *
   * Search for the inode specified by @hashval and @data in the inode cache,
   * where the helper function @test will return 0 if the inode does not match
   * and 1 if it does.  The @test function must be responsible for taking the
   * i_lock spin_lock and checking i_state for an inode being freed or being
   * initialized.
   *
   * If successful, this will return the inode for which the @test function
   * returned 1 and NULL otherwise.
   *
   * The @test function is not permitted to take a ref on any inode presented.
   * It is also not permitted to sleep.
   *
   * The caller must hold the RCU read lock.
   */
  struct inode *find_inode_by_ino_rcu(struct super_block *sb,
  				    unsigned long ino)
  {
  	struct hlist_head *head = inode_hashtable + hash(sb, ino);
  	struct inode *inode;
  
  	RCU_LOCKDEP_WARN(!rcu_read_lock_held(),
  			 "suspicious find_inode_by_ino_rcu() usage");
  
  	hlist_for_each_entry_rcu(inode, head, i_hash) {
  		if (inode->i_ino == ino &&
  		    inode->i_sb == sb &&
  		    !(READ_ONCE(inode->i_state) & (I_FREEING | I_WILL_FREE)))
  		    return inode;
  	}
  	return NULL;
  }
  EXPORT_SYMBOL(find_inode_by_ino_rcu);
261bca86e   Al Viro   nfsd/create race ...
1491
1492
1493
1494
1495
  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 ...
1496

261bca86e   Al Viro   nfsd/create race ...
1497
  	while (1) {
72a43d63c   Al Viro   ext3/4 with synch...
1498
  		struct inode *old = NULL;
67a23c494   Dave Chinner   fs: rename inode_...
1499
  		spin_lock(&inode_hash_lock);
b67bfe0d4   Sasha Levin   hlist: drop the n...
1500
  		hlist_for_each_entry(old, head, i_hash) {
72a43d63c   Al Viro   ext3/4 with synch...
1501
1502
1503
1504
  			if (old->i_ino != ino)
  				continue;
  			if (old->i_sb != sb)
  				continue;
250df6ed2   Dave Chinner   fs: protect inode...
1505
1506
1507
  			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...
1508
  				continue;
250df6ed2   Dave Chinner   fs: protect inode...
1509
  			}
72a43d63c   Al Viro   ext3/4 with synch...
1510
1511
  			break;
  		}
b67bfe0d4   Sasha Levin   hlist: drop the n...
1512
  		if (likely(!old)) {
250df6ed2   Dave Chinner   fs: protect inode...
1513
  			spin_lock(&inode->i_lock);
c2b6d621c   Al Viro   new primitive: di...
1514
  			inode->i_state |= I_NEW | I_CREATING;
3f19b2ab9   David Howells   vfs, afs, ext4: M...
1515
  			hlist_add_head_rcu(&inode->i_hash, head);
250df6ed2   Dave Chinner   fs: protect inode...
1516
  			spin_unlock(&inode->i_lock);
67a23c494   Dave Chinner   fs: rename inode_...
1517
  			spin_unlock(&inode_hash_lock);
261bca86e   Al Viro   nfsd/create race ...
1518
1519
  			return 0;
  		}
c2b6d621c   Al Viro   new primitive: di...
1520
1521
1522
1523
1524
  		if (unlikely(old->i_state & I_CREATING)) {
  			spin_unlock(&old->i_lock);
  			spin_unlock(&inode_hash_lock);
  			return -EBUSY;
  		}
261bca86e   Al Viro   nfsd/create race ...
1525
  		__iget(old);
250df6ed2   Dave Chinner   fs: protect inode...
1526
  		spin_unlock(&old->i_lock);
67a23c494   Dave Chinner   fs: rename inode_...
1527
  		spin_unlock(&inode_hash_lock);
261bca86e   Al Viro   nfsd/create race ...
1528
  		wait_on_inode(old);
1d3382cbf   Al Viro   new helper: inode...
1529
  		if (unlikely(!inode_unhashed(old))) {
261bca86e   Al Viro   nfsd/create race ...
1530
1531
1532
1533
1534
1535
  			iput(old);
  			return -EBUSY;
  		}
  		iput(old);
  	}
  }
261bca86e   Al Viro   nfsd/create race ...
1536
1537
1538
1539
1540
  EXPORT_SYMBOL(insert_inode_locked);
  
  int insert_inode_locked4(struct inode *inode, unsigned long hashval,
  		int (*test)(struct inode *, void *), void *data)
  {
c2b6d621c   Al Viro   new primitive: di...
1541
1542
1543
1544
  	struct inode *old;
  
  	inode->i_state |= I_CREATING;
  	old = inode_insert5(inode, hashval, test, NULL, data);
261bca86e   Al Viro   nfsd/create race ...
1545

80ea09a00   Miklos Szeredi   vfs: factor out i...
1546
  	if (old != inode) {
261bca86e   Al Viro   nfsd/create race ...
1547
  		iput(old);
80ea09a00   Miklos Szeredi   vfs: factor out i...
1548
  		return -EBUSY;
261bca86e   Al Viro   nfsd/create race ...
1549
  	}
80ea09a00   Miklos Szeredi   vfs: factor out i...
1550
  	return 0;
261bca86e   Al Viro   nfsd/create race ...
1551
  }
261bca86e   Al Viro   nfsd/create race ...
1552
  EXPORT_SYMBOL(insert_inode_locked4);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1553

45321ac54   Al Viro   Make ->drop_inode...
1554
1555
1556
1557
1558
  int generic_delete_inode(struct inode *inode)
  {
  	return 1;
  }
  EXPORT_SYMBOL(generic_delete_inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1559
  /*
45321ac54   Al Viro   Make ->drop_inode...
1560
1561
   * Called when we're dropping the last reference
   * to an inode.
22fe40421   Jan Kara   vfs: split generi...
1562
   *
45321ac54   Al Viro   Make ->drop_inode...
1563
1564
1565
1566
1567
   * 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...
1568
   */
45321ac54   Al Viro   Make ->drop_inode...
1569
  static void iput_final(struct inode *inode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1570
1571
  {
  	struct super_block *sb = inode->i_sb;
45321ac54   Al Viro   Make ->drop_inode...
1572
  	const struct super_operations *op = inode->i_sb->s_op;
3f19b2ab9   David Howells   vfs, afs, ext4: M...
1573
  	unsigned long state;
45321ac54   Al Viro   Make ->drop_inode...
1574
  	int drop;
250df6ed2   Dave Chinner   fs: protect inode...
1575
  	WARN_ON(inode->i_state & I_NEW);
e7f590970   Al Viro   kill useless chec...
1576
  	if (op->drop_inode)
45321ac54   Al Viro   Make ->drop_inode...
1577
1578
1579
  		drop = op->drop_inode(inode);
  	else
  		drop = generic_drop_inode(inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1580

9f5ab03f7   Hao Li   fs: Handle I_DONT...
1581
1582
1583
  	if (!drop &&
  	    !(inode->i_state & I_DONTCACHE) &&
  	    (sb->s_flags & SB_ACTIVE)) {
4eff96dd5   Jan Kara   writeback: put un...
1584
  		inode_add_lru(inode);
b2b2af8e6   Dave Chinner   fs: factor inode ...
1585
  		spin_unlock(&inode->i_lock);
b2b2af8e6   Dave Chinner   fs: factor inode ...
1586
1587
  		return;
  	}
3f19b2ab9   David Howells   vfs, afs, ext4: M...
1588
  	state = inode->i_state;
45321ac54   Al Viro   Make ->drop_inode...
1589
  	if (!drop) {
3f19b2ab9   David Howells   vfs, afs, ext4: M...
1590
  		WRITE_ONCE(inode->i_state, state | I_WILL_FREE);
250df6ed2   Dave Chinner   fs: protect inode...
1591
  		spin_unlock(&inode->i_lock);
3f19b2ab9   David Howells   vfs, afs, ext4: M...
1592

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1593
  		write_inode_now(inode, 1);
3f19b2ab9   David Howells   vfs, afs, ext4: M...
1594

250df6ed2   Dave Chinner   fs: protect inode...
1595
  		spin_lock(&inode->i_lock);
3f19b2ab9   David Howells   vfs, afs, ext4: M...
1596
1597
1598
  		state = inode->i_state;
  		WARN_ON(state & I_NEW);
  		state &= ~I_WILL_FREE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1599
  	}
7ccf19a80   Nick Piggin   fs: inode split I...
1600

3f19b2ab9   David Howells   vfs, afs, ext4: M...
1601
  	WRITE_ONCE(inode->i_state, state | I_FREEING);
c4ae0c654   Eric Dumazet   vfs: avoid call t...
1602
1603
  	if (!list_empty(&inode->i_lru))
  		inode_lru_list_del(inode);
b2b2af8e6   Dave Chinner   fs: factor inode ...
1604
  	spin_unlock(&inode->i_lock);
b2b2af8e6   Dave Chinner   fs: factor inode ...
1605

644da5960   Al Viro   fs/inode.c:evict(...
1606
  	evict(inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1607
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1608
  /**
6b3304b53   Manish Katiyar   Make checkpatch.p...
1609
   *	iput	- put an inode
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1610
1611
1612
1613
1614
1615
1616
1617
1618
   *	@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)
  {
0ae45f63d   Theodore Ts'o   vfs: add support ...
1619
1620
1621
1622
1623
1624
1625
  	if (!inode)
  		return;
  	BUG_ON(inode->i_state & I_CLEAR);
  retry:
  	if (atomic_dec_and_lock(&inode->i_count, &inode->i_lock)) {
  		if (inode->i_nlink && (inode->i_state & I_DIRTY_TIME)) {
  			atomic_inc(&inode->i_count);
0ae45f63d   Theodore Ts'o   vfs: add support ...
1626
1627
1628
1629
1630
1631
  			spin_unlock(&inode->i_lock);
  			trace_writeback_lazytime_iput(inode);
  			mark_inode_dirty_sync(inode);
  			goto retry;
  		}
  		iput_final(inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1632
1633
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1634
  EXPORT_SYMBOL(iput);
30460e1ea   Carlos Maiolino   fs: Enable bmap()...
1635
  #ifdef CONFIG_BLOCK
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1636
1637
  /**
   *	bmap	- find a block number in a file
30460e1ea   Carlos Maiolino   fs: Enable bmap()...
1638
1639
   *	@inode:  inode owning the block number being requested
   *	@block: pointer containing the block to find
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1640
   *
2b8e8b559   Mauro Carvalho Chehab   fs: inode.c: get ...
1641
   *	Replaces the value in ``*block`` with the block number on the device holding
30460e1ea   Carlos Maiolino   fs: Enable bmap()...
1642
1643
   *	corresponding to the requested block number in the file.
   *	That is, asked for block 4 of inode 1 the function will replace the
2b8e8b559   Mauro Carvalho Chehab   fs: inode.c: get ...
1644
   *	4 in ``*block``, with disk block relative to the disk start that holds that
30460e1ea   Carlos Maiolino   fs: Enable bmap()...
1645
1646
1647
   *	block of the file.
   *
   *	Returns -EINVAL in case of error, 0 otherwise. If mapping falls into a
2b8e8b559   Mauro Carvalho Chehab   fs: inode.c: get ...
1648
   *	hole, returns 0 and ``*block`` is also set to 0.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1649
   */
30460e1ea   Carlos Maiolino   fs: Enable bmap()...
1650
  int bmap(struct inode *inode, sector_t *block)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1651
  {
30460e1ea   Carlos Maiolino   fs: Enable bmap()...
1652
1653
1654
1655
1656
  	if (!inode->i_mapping->a_ops->bmap)
  		return -EINVAL;
  
  	*block = inode->i_mapping->a_ops->bmap(inode->i_mapping, *block);
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1657
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1658
  EXPORT_SYMBOL(bmap);
30460e1ea   Carlos Maiolino   fs: Enable bmap()...
1659
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1660

11ff6f05f   Matthew Garrett   Allow relatime to...
1661
1662
1663
1664
1665
  /*
   * 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.
   */
c67185434   Miklos Szeredi   Revert "vfs: upda...
1666
  static int relatime_need_update(struct vfsmount *mnt, struct inode *inode,
6f22b6649   Arnd Bergmann   fs: use timespec6...
1667
  			     struct timespec64 now)
11ff6f05f   Matthew Garrett   Allow relatime to...
1668
  {
c67185434   Miklos Szeredi   Revert "vfs: upda...
1669
  	if (!(mnt->mnt_flags & MNT_RELATIME))
11ff6f05f   Matthew Garrett   Allow relatime to...
1670
1671
1672
1673
  		return 1;
  	/*
  	 * Is mtime younger than atime? If yes, update atime:
  	 */
95582b008   Deepa Dinamani   vfs: change inode...
1674
  	if (timespec64_compare(&inode->i_mtime, &inode->i_atime) >= 0)
11ff6f05f   Matthew Garrett   Allow relatime to...
1675
1676
1677
1678
  		return 1;
  	/*
  	 * Is ctime younger than atime? If yes, update atime:
  	 */
95582b008   Deepa Dinamani   vfs: change inode...
1679
  	if (timespec64_compare(&inode->i_ctime, &inode->i_atime) >= 0)
11ff6f05f   Matthew Garrett   Allow relatime to...
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
  		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;
  }
95582b008   Deepa Dinamani   vfs: change inode...
1693
  int generic_update_time(struct inode *inode, struct timespec64 *time, int flags)
c3b2da314   Josef Bacik   fs: introduce ino...
1694
  {
0ae45f63d   Theodore Ts'o   vfs: add support ...
1695
  	int iflags = I_DIRTY_TIME;
e38cf302b   Jeff Layton   fs: only set S_VE...
1696
  	bool dirty = false;
c3b2da314   Josef Bacik   fs: introduce ino...
1697
1698
1699
1700
  
  	if (flags & S_ATIME)
  		inode->i_atime = *time;
  	if (flags & S_VERSION)
e38cf302b   Jeff Layton   fs: only set S_VE...
1701
  		dirty = inode_maybe_inc_iversion(inode, false);
c3b2da314   Josef Bacik   fs: introduce ino...
1702
1703
1704
1705
  	if (flags & S_CTIME)
  		inode->i_ctime = *time;
  	if (flags & S_MTIME)
  		inode->i_mtime = *time;
e38cf302b   Jeff Layton   fs: only set S_VE...
1706
1707
1708
  	if ((flags & (S_ATIME | S_CTIME | S_MTIME)) &&
  	    !(inode->i_sb->s_flags & SB_LAZYTIME))
  		dirty = true;
0ae45f63d   Theodore Ts'o   vfs: add support ...
1709

e38cf302b   Jeff Layton   fs: only set S_VE...
1710
  	if (dirty)
0ae45f63d   Theodore Ts'o   vfs: add support ...
1711
1712
  		iflags |= I_DIRTY_SYNC;
  	__mark_inode_dirty(inode, iflags);
c3b2da314   Josef Bacik   fs: introduce ino...
1713
1714
  	return 0;
  }
0ae45f63d   Theodore Ts'o   vfs: add support ...
1715
1716
1717
1718
1719
1720
  EXPORT_SYMBOL(generic_update_time);
  
  /*
   * This does the actual work of updating an inodes time or version.  Must have
   * had called mnt_want_write() before calling this.
   */
95582b008   Deepa Dinamani   vfs: change inode...
1721
  static int update_time(struct inode *inode, struct timespec64 *time, int flags)
0ae45f63d   Theodore Ts'o   vfs: add support ...
1722
  {
23b424d9c   Deepa Dinamani   fs: Do not overlo...
1723
1724
1725
  	if (inode->i_op->update_time)
  		return inode->i_op->update_time(inode, time, flags);
  	return generic_update_time(inode, time, flags);
0ae45f63d   Theodore Ts'o   vfs: add support ...
1726
  }
c3b2da314   Josef Bacik   fs: introduce ino...
1727

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1728
  /**
869243a0f   Christoph Hellwig   [PATCH] remove up...
1729
   *	touch_atime	-	update the access time
185553b22   Randy Dunlap   fs: fix inode.c k...
1730
   *	@path: the &struct path to update
30fdc8ee0   Randy Dunlap   fs/inode.c: fix k...
1731
   *	@inode: inode to update
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1732
1733
1734
1735
1736
   *
   *	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.
   */
c67185434   Miklos Szeredi   Revert "vfs: upda...
1737
  bool atime_needs_update(const struct path *path, struct inode *inode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1738
  {
68ac1234f   Al Viro   switch touch_atim...
1739
  	struct vfsmount *mnt = path->mnt;
95582b008   Deepa Dinamani   vfs: change inode...
1740
  	struct timespec64 now;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1741

cdb70f3f7   Dave Hansen   [PATCH] r/o bind ...
1742
  	if (inode->i_flags & S_NOATIME)
8fa9dd246   NeilBrown   VFS/namei: make t...
1743
  		return false;
0bd23d09b   Eric W. Biederman   vfs: Don't modify...
1744
1745
1746
1747
1748
1749
  
  	/* Atime updates will likely cause i_uid and i_gid to be written
  	 * back improprely if their true value is unknown to the vfs.
  	 */
  	if (HAS_UNMAPPED_ID(inode))
  		return false;
37756ced1   Eric Dumazet   [PATCH] avoid one...
1750
  	if (IS_NOATIME(inode))
8fa9dd246   NeilBrown   VFS/namei: make t...
1751
  		return false;
1751e8a6c   Linus Torvalds   Rename superblock...
1752
  	if ((inode->i_sb->s_flags & SB_NODIRATIME) && S_ISDIR(inode->i_mode))
8fa9dd246   NeilBrown   VFS/namei: make t...
1753
  		return false;
47ae32d6a   Valerie Henson   [PATCH] relative ...
1754

cdb70f3f7   Dave Hansen   [PATCH] r/o bind ...
1755
  	if (mnt->mnt_flags & MNT_NOATIME)
8fa9dd246   NeilBrown   VFS/namei: make t...
1756
  		return false;
cdb70f3f7   Dave Hansen   [PATCH] r/o bind ...
1757
  	if ((mnt->mnt_flags & MNT_NODIRATIME) && S_ISDIR(inode->i_mode))
8fa9dd246   NeilBrown   VFS/namei: make t...
1758
  		return false;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1759

c2050a454   Deepa Dinamani   fs: Replace curre...
1760
  	now = current_time(inode);
11ff6f05f   Matthew Garrett   Allow relatime to...
1761

6f22b6649   Arnd Bergmann   fs: use timespec6...
1762
  	if (!relatime_need_update(mnt, inode, now))
8fa9dd246   NeilBrown   VFS/namei: make t...
1763
  		return false;
11ff6f05f   Matthew Garrett   Allow relatime to...
1764

95582b008   Deepa Dinamani   vfs: change inode...
1765
  	if (timespec64_equal(&inode->i_atime, &now))
8fa9dd246   NeilBrown   VFS/namei: make t...
1766
1767
1768
1769
1770
1771
1772
1773
1774
  		return false;
  
  	return true;
  }
  
  void touch_atime(const struct path *path)
  {
  	struct vfsmount *mnt = path->mnt;
  	struct inode *inode = d_inode(path->dentry);
95582b008   Deepa Dinamani   vfs: change inode...
1775
  	struct timespec64 now;
8fa9dd246   NeilBrown   VFS/namei: make t...
1776

c67185434   Miklos Szeredi   Revert "vfs: upda...
1777
  	if (!atime_needs_update(path, inode))
b12536c27   Andi Kleen   vfs: optimization...
1778
  		return;
5d37e9e6d   Jan Kara   fs: Skip atime up...
1779
  	if (!sb_start_write_trylock(inode->i_sb))
b12536c27   Andi Kleen   vfs: optimization...
1780
  		return;
47ae32d6a   Valerie Henson   [PATCH] relative ...
1781

8fa9dd246   NeilBrown   VFS/namei: make t...
1782
  	if (__mnt_want_write(mnt) != 0)
5d37e9e6d   Jan Kara   fs: Skip atime up...
1783
  		goto skip_update;
c3b2da314   Josef Bacik   fs: introduce ino...
1784
1785
1786
1787
1788
1789
  	/*
  	 * 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...
1790
1791
  	 * 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...
1792
  	 */
c2050a454   Deepa Dinamani   fs: Replace curre...
1793
  	now = current_time(inode);
c3b2da314   Josef Bacik   fs: introduce ino...
1794
  	update_time(inode, &now, S_ATIME);
5d37e9e6d   Jan Kara   fs: Skip atime up...
1795
1796
1797
  	__mnt_drop_write(mnt);
  skip_update:
  	sb_end_write(inode->i_sb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1798
  }
869243a0f   Christoph Hellwig   [PATCH] remove up...
1799
  EXPORT_SYMBOL(touch_atime);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1800

3ed37648e   Cong Wang   fs: move file_rem...
1801
1802
1803
1804
1805
1806
1807
1808
  /*
   * The logic we want is
   *
   *	if suid or (sgid and xgrp)
   *		remove privs
   */
  int should_remove_suid(struct dentry *dentry)
  {
df2b1afde   David Howells   VFS: fs/inode.c h...
1809
  	umode_t mode = d_inode(dentry)->i_mode;
3ed37648e   Cong Wang   fs: move file_rem...
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
  	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);
dbfae0cdc   Jan Kara   fs: Provide funct...
1829
1830
1831
1832
1833
  /*
   * Return mask of changes for notify_change() that need to be done as a
   * response to write or truncate. Return 0 if nothing has to be changed.
   * Negative value on error (change should be denied).
   */
45f147a1b   Jan Kara   fs: Call security...
1834
  int dentry_needs_remove_privs(struct dentry *dentry)
dbfae0cdc   Jan Kara   fs: Provide funct...
1835
  {
dbfae0cdc   Jan Kara   fs: Provide funct...
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
  	struct inode *inode = d_inode(dentry);
  	int mask = 0;
  	int ret;
  
  	if (IS_NOSEC(inode))
  		return 0;
  
  	mask = should_remove_suid(dentry);
  	ret = security_inode_need_killpriv(dentry);
  	if (ret < 0)
  		return ret;
  	if (ret)
  		mask |= ATTR_KILL_PRIV;
  	return mask;
  }
dbfae0cdc   Jan Kara   fs: Provide funct...
1851
1852
  
  static int __remove_privs(struct dentry *dentry, int kill)
3ed37648e   Cong Wang   fs: move file_rem...
1853
1854
1855
1856
  {
  	struct iattr newattrs;
  
  	newattrs.ia_valid = ATTR_FORCE | kill;
27ac0ffea   J. Bruce Fields   locks: break dele...
1857
1858
1859
1860
1861
  	/*
  	 * 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...
1862
  }
5fa8e0a1c   Jan Kara   fs: Rename file_r...
1863
1864
1865
1866
1867
  /*
   * Remove special file priviledges (suid, capabilities) when file is written
   * to or truncated.
   */
  int file_remove_privs(struct file *file)
3ed37648e   Cong Wang   fs: move file_rem...
1868
  {
c1892c377   Miklos Szeredi   vfs: fix deadlock...
1869
1870
  	struct dentry *dentry = file_dentry(file);
  	struct inode *inode = file_inode(file);
dbfae0cdc   Jan Kara   fs: Provide funct...
1871
  	int kill;
3ed37648e   Cong Wang   fs: move file_rem...
1872
  	int error = 0;
f69e749a4   Alexander Lochmann   Abort file_remove...
1873
1874
1875
1876
1877
1878
1879
  	/*
  	 * Fast path for nothing security related.
  	 * As well for non-regular files, e.g. blkdev inodes.
  	 * For example, blkdev_write_iter() might get here
  	 * trying to remove privs which it is not allowed to.
  	 */
  	if (IS_NOSEC(inode) || !S_ISREG(inode->i_mode))
3ed37648e   Cong Wang   fs: move file_rem...
1880
  		return 0;
c1892c377   Miklos Szeredi   vfs: fix deadlock...
1881
  	kill = dentry_needs_remove_privs(dentry);
dbfae0cdc   Jan Kara   fs: Provide funct...
1882
1883
1884
1885
  	if (kill < 0)
  		return kill;
  	if (kill)
  		error = __remove_privs(dentry, kill);
2426f3910   Jan Kara   fs: Fix S_NOSEC h...
1886
1887
  	if (!error)
  		inode_has_no_xattr(inode);
3ed37648e   Cong Wang   fs: move file_rem...
1888
1889
1890
  
  	return error;
  }
5fa8e0a1c   Jan Kara   fs: Rename file_r...
1891
  EXPORT_SYMBOL(file_remove_privs);
3ed37648e   Cong Wang   fs: move file_rem...
1892

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1893
  /**
870f48179   Christoph Hellwig   [PATCH] replace i...
1894
1895
   *	file_update_time	-	update mtime and ctime time
   *	@file: file accessed
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1896
   *
870f48179   Christoph Hellwig   [PATCH] replace i...
1897
1898
1899
1900
   *	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...
1901
   *	S_NOCMTIME inode flag, e.g. for network filesystem where these
c3b2da314   Josef Bacik   fs: introduce ino...
1902
1903
   *	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
1904
   */
c3b2da314   Josef Bacik   fs: introduce ino...
1905
  int file_update_time(struct file *file)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1906
  {
496ad9aa8   Al Viro   new helper: file_...
1907
  	struct inode *inode = file_inode(file);
95582b008   Deepa Dinamani   vfs: change inode...
1908
  	struct timespec64 now;
c3b2da314   Josef Bacik   fs: introduce ino...
1909
1910
  	int sync_it = 0;
  	int ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1911

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

c2050a454   Deepa Dinamani   fs: Replace curre...
1916
  	now = current_time(inode);
95582b008   Deepa Dinamani   vfs: change inode...
1917
  	if (!timespec64_equal(&inode->i_mtime, &now))
ce06e0b21   Andi Kleen   vfs: optimize tou...
1918
  		sync_it = S_MTIME;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1919

95582b008   Deepa Dinamani   vfs: change inode...
1920
  	if (!timespec64_equal(&inode->i_ctime, &now))
ce06e0b21   Andi Kleen   vfs: optimize tou...
1921
  		sync_it |= S_CTIME;
870f48179   Christoph Hellwig   [PATCH] replace i...
1922

e38cf302b   Jeff Layton   fs: only set S_VE...
1923
  	if (IS_I_VERSION(inode) && inode_iversion_need_inc(inode))
ce06e0b21   Andi Kleen   vfs: optimize tou...
1924
  		sync_it |= S_VERSION;
7a224228e   Jean Noel Cordenner   vfs: Add 64 bit i...
1925

ce06e0b21   Andi Kleen   vfs: optimize tou...
1926
  	if (!sync_it)
c3b2da314   Josef Bacik   fs: introduce ino...
1927
  		return 0;
ce06e0b21   Andi Kleen   vfs: optimize tou...
1928
1929
  
  	/* Finally allowed to write? Takes lock. */
eb04c2828   Jan Kara   fs: Add freezing ...
1930
  	if (__mnt_want_write_file(file))
c3b2da314   Josef Bacik   fs: introduce ino...
1931
  		return 0;
ce06e0b21   Andi Kleen   vfs: optimize tou...
1932

c3b2da314   Josef Bacik   fs: introduce ino...
1933
  	ret = update_time(inode, &now, sync_it);
eb04c2828   Jan Kara   fs: Add freezing ...
1934
  	__mnt_drop_write_file(file);
c3b2da314   Josef Bacik   fs: introduce ino...
1935
1936
  
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1937
  }
870f48179   Christoph Hellwig   [PATCH] replace i...
1938
  EXPORT_SYMBOL(file_update_time);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1939

e38f7f53c   Amir Goldstein   vfs: introduce fi...
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
  /* Caller must hold the file's inode lock */
  int file_modified(struct file *file)
  {
  	int err;
  
  	/*
  	 * Clear the security bits if the process is not being run by root.
  	 * This keeps people from modifying setuid and setgid binaries.
  	 */
  	err = file_remove_privs(file);
  	if (err)
  		return err;
  
  	if (unlikely(file->f_mode & FMODE_NOCMTIME))
  		return 0;
  
  	return file_update_time(file);
  }
  EXPORT_SYMBOL(file_modified);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1959
1960
1961
1962
1963
1964
1965
1966
  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
1967
  EXPORT_SYMBOL(inode_needs_sync);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1968
  /*
168a9fd6a   Miklos Szeredi   [PATCH] __wait_on...
1969
1970
1971
1972
1973
1974
   * 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
1975
   * It doesn't matter if I_NEW is not set initially, a call to
250df6ed2   Dave Chinner   fs: protect inode...
1976
1977
   * wake_up_bit(&inode->i_state, __I_NEW) after removing from the hash list
   * will DTRT.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1978
1979
1980
1981
   */
  static void __wait_on_freeing_inode(struct inode *inode)
  {
  	wait_queue_head_t *wq;
eaff8079d   Christoph Hellwig   kill I_LOCK
1982
1983
  	DEFINE_WAIT_BIT(wait, &inode->i_state, __I_NEW);
  	wq = bit_waitqueue(&inode->i_state, __I_NEW);
214171361   Ingo Molnar   sched/wait: Stand...
1984
  	prepare_to_wait(wq, &wait.wq_entry, TASK_UNINTERRUPTIBLE);
250df6ed2   Dave Chinner   fs: protect inode...
1985
  	spin_unlock(&inode->i_lock);
67a23c494   Dave Chinner   fs: rename inode_...
1986
  	spin_unlock(&inode_hash_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1987
  	schedule();
214171361   Ingo Molnar   sched/wait: Stand...
1988
  	finish_wait(wq, &wait.wq_entry);
67a23c494   Dave Chinner   fs: rename inode_...
1989
  	spin_lock(&inode_hash_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1990
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
  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)
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
  	/* 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,
3d375d785   Pavel Tatashin   mm: update caller...
2017
  					HASH_EARLY | HASH_ZERO,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2018
2019
  					&i_hash_shift,
  					&i_hash_mask,
31fe62b95   Tim Bird   mm: add a low lim...
2020
  					0,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2021
  					0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2022
  }
74bf17cff   Denis Cheng   fs: remove the un...
2023
  void __init inode_init(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2024
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2025
  	/* inode slab cache */
b0196009d   Paul Jackson   [PATCH] cpuset me...
2026
2027
2028
2029
  	inode_cachep = kmem_cache_create("inode_cache",
  					 sizeof(struct inode),
  					 0,
  					 (SLAB_RECLAIM_ACCOUNT|SLAB_PANIC|
5d097056c   Vladimir Davydov   kmemcg: account c...
2030
  					 SLAB_MEM_SPREAD|SLAB_ACCOUNT),
20c2df83d   Paul Mundt   mm: Remove slab d...
2031
  					 init_once);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
  
  	/* 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,
3d375d785   Pavel Tatashin   mm: update caller...
2042
  					HASH_ZERO,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2043
2044
  					&i_hash_shift,
  					&i_hash_mask,
31fe62b95   Tim Bird   mm: add a low lim...
2045
  					0,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2046
  					0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
  }
  
  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...
2059
  		inode->i_fop = &pipefifo_fops;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2060
  	else if (S_ISSOCK(mode))
bd9b51e79   Al Viro   make default ->i_...
2061
  		;	/* leave it no_open_fops */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2062
  	else
af0d9ae81   Manish Katiyar   fs/inode.c: add d...
2063
2064
2065
2066
  		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
2067
2068
  }
  EXPORT_SYMBOL(init_special_inode);
a1bd120d1   Dmitry Monakhov   vfs: Add inode ui...
2069
2070
  
  /**
eaae668d0   Ben Hutchings   fs/inode: Fix ker...
2071
   * inode_init_owner - Init uid,gid,mode for new inode according to posix standards
a1bd120d1   Dmitry Monakhov   vfs: Add inode ui...
2072
2073
2074
2075
2076
   * @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...
2077
  			umode_t mode)
a1bd120d1   Dmitry Monakhov   vfs: Add inode ui...
2078
2079
2080
2081
  {
  	inode->i_uid = current_fsuid();
  	if (dir && dir->i_mode & S_ISGID) {
  		inode->i_gid = dir->i_gid;
0fa3ecd87   Linus Torvalds   Fix up non-direct...
2082
2083
  
  		/* Directories are special, and always inherit S_ISGID */
a1bd120d1   Dmitry Monakhov   vfs: Add inode ui...
2084
2085
  		if (S_ISDIR(mode))
  			mode |= S_ISGID;
0fa3ecd87   Linus Torvalds   Fix up non-direct...
2086
2087
2088
2089
  		else if ((mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP) &&
  			 !in_group_p(inode->i_gid) &&
  			 !capable_wrt_inode_uidgid(dir, CAP_FSETID))
  			mode &= ~S_ISGID;
a1bd120d1   Dmitry Monakhov   vfs: Add inode ui...
2090
2091
2092
2093
2094
  	} else
  		inode->i_gid = current_fsgid();
  	inode->i_mode = mode;
  }
  EXPORT_SYMBOL(inode_init_owner);
e795b7179   Serge E. Hallyn   userns: userns: c...
2095

2e1496707   Serge E. Hallyn   userns: rename is...
2096
2097
2098
2099
  /**
   * inode_owner_or_capable - check current task permissions to inode
   * @inode: inode being checked
   *
23adbe12e   Andy Lutomirski   fs,userns: Change...
2100
2101
   * 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...
2102
   */
2e1496707   Serge E. Hallyn   userns: rename is...
2103
  bool inode_owner_or_capable(const struct inode *inode)
e795b7179   Serge E. Hallyn   userns: userns: c...
2104
  {
23adbe12e   Andy Lutomirski   fs,userns: Change...
2105
  	struct user_namespace *ns;
92361636e   Eric W. Biederman   userns: Store uid...
2106
  	if (uid_eq(current_fsuid(), inode->i_uid))
e795b7179   Serge E. Hallyn   userns: userns: c...
2107
  		return true;
23adbe12e   Andy Lutomirski   fs,userns: Change...
2108
2109
  
  	ns = current_user_ns();
cc658db47   Kees Cook   fs: Reorder inode...
2110
  	if (kuid_has_mapping(ns, inode->i_uid) && ns_capable(ns, CAP_FOWNER))
e795b7179   Serge E. Hallyn   userns: userns: c...
2111
2112
2113
  		return true;
  	return false;
  }
2e1496707   Serge E. Hallyn   userns: rename is...
2114
  EXPORT_SYMBOL(inode_owner_or_capable);
1d59d61f6   Trond Myklebust   NFS: Ensure that ...
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
  
  /*
   * 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 {
214171361   Ingo Molnar   sched/wait: Stand...
2125
  		prepare_to_wait(wq, &q.wq_entry, TASK_UNINTERRUPTIBLE);
1d59d61f6   Trond Myklebust   NFS: Ensure that ...
2126
2127
2128
  		if (atomic_read(&inode->i_dio_count))
  			schedule();
  	} while (atomic_read(&inode->i_dio_count));
214171361   Ingo Molnar   sched/wait: Stand...
2129
  	finish_wait(wq, &q.wq_entry);
1d59d61f6   Trond Myklebust   NFS: Ensure that ...
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
  }
  
  /**
   * 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);
  
  /*
5f16f3225   Theodore Ts'o   ext4: atomically ...
2150
2151
2152
2153
2154
2155
2156
   * 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
5fa8e0a1c   Jan Kara   fs: Rename file_r...
2157
2158
   * code path which doesn't today so we use cmpxchg() out of an abundance
   * of caution.
5f16f3225   Theodore Ts'o   ext4: atomically ...
2159
2160
2161
2162
2163
2164
2165
2166
2167
   *
   * 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)
  {
5f16f3225   Theodore Ts'o   ext4: atomically ...
2168
  	WARN_ON_ONCE(flags & ~mask);
a905737fd   Vineet Gupta   fs/inode.c: inode...
2169
  	set_mask_bits(&inode->i_flags, mask, flags);
5f16f3225   Theodore Ts'o   ext4: atomically ...
2170
2171
  }
  EXPORT_SYMBOL(inode_set_flags);
21fc61c73   Al Viro   don't put symlink...
2172
2173
2174
2175
2176
2177
  
  void inode_nohighmem(struct inode *inode)
  {
  	mapping_set_gfp_mask(inode->i_mapping, GFP_USER);
  }
  EXPORT_SYMBOL(inode_nohighmem);
3cd886666   Deepa Dinamani   vfs: Add current_...
2178
2179
  
  /**
50e17c000   Deepa Dinamani   vfs: Add timestam...
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
   * timestamp_truncate - Truncate timespec to a granularity
   * @t: Timespec
   * @inode: inode being updated
   *
   * Truncate a timespec to the granularity supported by the fs
   * containing the inode. Always rounds down. gran must
   * not be 0 nor greater than a second (NSEC_PER_SEC, or 10^9 ns).
   */
  struct timespec64 timestamp_truncate(struct timespec64 t, struct inode *inode)
  {
  	struct super_block *sb = inode->i_sb;
  	unsigned int gran = sb->s_time_gran;
  
  	t.tv_sec = clamp(t.tv_sec, sb->s_time_min, sb->s_time_max);
  	if (unlikely(t.tv_sec == sb->s_time_max || t.tv_sec == sb->s_time_min))
  		t.tv_nsec = 0;
  
  	/* Avoid division in the common cases 1 ns and 1 s. */
  	if (gran == 1)
  		; /* nothing */
  	else if (gran == NSEC_PER_SEC)
  		t.tv_nsec = 0;
  	else if (gran > 1 && gran < NSEC_PER_SEC)
  		t.tv_nsec -= t.tv_nsec % gran;
  	else
  		WARN(1, "invalid file time granularity: %u", gran);
  	return t;
  }
  EXPORT_SYMBOL(timestamp_truncate);
  
  /**
3cd886666   Deepa Dinamani   vfs: Add current_...
2211
2212
2213
2214
2215
2216
2217
2218
2219
   * current_time - Return FS time
   * @inode: inode.
   *
   * Return the current time truncated to the time granularity supported by
   * the fs.
   *
   * Note that inode and inode->sb cannot be NULL.
   * Otherwise, the function warns and returns time without truncation.
   */
95582b008   Deepa Dinamani   vfs: change inode...
2220
  struct timespec64 current_time(struct inode *inode)
3cd886666   Deepa Dinamani   vfs: Add current_...
2221
  {
d651d1607   Arnd Bergmann   vfs: replace curr...
2222
2223
2224
  	struct timespec64 now;
  
  	ktime_get_coarse_real_ts64(&now);
3cd886666   Deepa Dinamani   vfs: Add current_...
2225
2226
2227
2228
2229
  
  	if (unlikely(!inode->i_sb)) {
  		WARN(1, "current_time() called with uninitialized super_block in the inode");
  		return now;
  	}
50e17c000   Deepa Dinamani   vfs: Add timestam...
2230
  	return timestamp_truncate(now, inode);
3cd886666   Deepa Dinamani   vfs: Add current_...
2231
2232
  }
  EXPORT_SYMBOL(current_time);
5aca28421   Darrick J. Wong   vfs: create a gen...
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
  
  /*
   * Generic function to check FS_IOC_SETFLAGS values and reject any invalid
   * configurations.
   *
   * Note: the caller should be holding i_mutex, or else be sure that they have
   * exclusive access to the inode structure.
   */
  int vfs_ioc_setflags_prepare(struct inode *inode, unsigned int oldflags,
  			     unsigned int flags)
  {
  	/*
  	 * The IMMUTABLE and APPEND_ONLY flags can only be changed by
  	 * the relevant capability.
  	 *
  	 * This test looks nicer. Thanks to Pauline Middelink
  	 */
  	if ((flags ^ oldflags) & (FS_APPEND_FL | FS_IMMUTABLE_FL) &&
  	    !capable(CAP_LINUX_IMMUTABLE))
  		return -EPERM;
6e1918cfb   Daniel Rosenberg   fscrypt: don't al...
2253
  	return fscrypt_prepare_setflags(inode, oldflags, flags);
5aca28421   Darrick J. Wong   vfs: create a gen...
2254
2255
  }
  EXPORT_SYMBOL(vfs_ioc_setflags_prepare);
7b0e492e6   Darrick J. Wong   vfs: create a gen...
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
  
  /*
   * Generic function to check FS_IOC_FSSETXATTR values and reject any invalid
   * configurations.
   *
   * Note: the caller should be holding i_mutex, or else be sure that they have
   * exclusive access to the inode structure.
   */
  int vfs_ioc_fssetxattr_check(struct inode *inode, const struct fsxattr *old_fa,
  			     struct fsxattr *fa)
  {
  	/*
  	 * Can't modify an immutable/append-only file unless we have
  	 * appropriate permission.
  	 */
  	if ((old_fa->fsx_xflags ^ fa->fsx_xflags) &
  			(FS_XFLAG_IMMUTABLE | FS_XFLAG_APPEND) &&
  	    !capable(CAP_LINUX_IMMUTABLE))
  		return -EPERM;
f991492ed   Darrick J. Wong   vfs: teach vfs_io...
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
  	/*
  	 * Project Quota ID state is only allowed to change from within the init
  	 * namespace. Enforce that restriction only if we are trying to change
  	 * the quota ID state. Everything else is allowed in user namespaces.
  	 */
  	if (current_user_ns() != &init_user_ns) {
  		if (old_fa->fsx_projid != fa->fsx_projid)
  			return -EINVAL;
  		if ((old_fa->fsx_xflags ^ fa->fsx_xflags) &
  				FS_XFLAG_PROJINHERIT)
  			return -EINVAL;
  	}
ca29be753   Darrick J. Wong   vfs: teach vfs_io...
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
  	/* Check extent size hints. */
  	if ((fa->fsx_xflags & FS_XFLAG_EXTSIZE) && !S_ISREG(inode->i_mode))
  		return -EINVAL;
  
  	if ((fa->fsx_xflags & FS_XFLAG_EXTSZINHERIT) &&
  			!S_ISDIR(inode->i_mode))
  		return -EINVAL;
  
  	if ((fa->fsx_xflags & FS_XFLAG_COWEXTSIZE) &&
  	    !S_ISREG(inode->i_mode) && !S_ISDIR(inode->i_mode))
  		return -EINVAL;
dbc77f31e   Darrick J. Wong   vfs: only allow F...
2298
2299
2300
2301
2302
2303
2304
  	/*
  	 * It is only valid to set the DAX flag on regular files and
  	 * directories on filesystems.
  	 */
  	if ((fa->fsx_xflags & FS_XFLAG_DAX) &&
  	    !(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode)))
  		return -EINVAL;
ca29be753   Darrick J. Wong   vfs: teach vfs_io...
2305
2306
2307
2308
2309
  	/* Extent size hints of zero turn off the flags. */
  	if (fa->fsx_extsize == 0)
  		fa->fsx_xflags &= ~(FS_XFLAG_EXTSIZE | FS_XFLAG_EXTSZINHERIT);
  	if (fa->fsx_cowextsize == 0)
  		fa->fsx_xflags &= ~FS_XFLAG_COWEXTSIZE;
7b0e492e6   Darrick J. Wong   vfs: create a gen...
2310
2311
2312
  	return 0;
  }
  EXPORT_SYMBOL(vfs_ioc_fssetxattr_check);