Blame view

fs/libfs.c 39.6 KB
457c89965   Thomas Gleixner   treewide: Add SPD...
1
  // SPDX-License-Identifier: GPL-2.0-only
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
3
4
5
  /*
   *	fs/libfs.c
   *	Library for filesystems writers.
   */
ac13a829f   Fabian Frederick   fs/libfs.c: add g...
6
  #include <linux/blkdev.h>
630d9c472   Paul Gortmaker   fs: reduce the us...
7
  #include <linux/export.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
8
  #include <linux/pagemap.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
9
  #include <linux/slab.h>
5b825c3af   Ingo Molnar   sched/headers: Pr...
10
  #include <linux/cred.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
11
12
  #include <linux/mount.h>
  #include <linux/vfs.h>
7bb46a673   npiggin@suse.de   fs: introduce new...
13
  #include <linux/quotaops.h>
7cf34c761   Ingo Molnar   [PATCH] sem2mutex...
14
  #include <linux/mutex.h>
87dc800be   Al Viro   new helper: kfree...
15
  #include <linux/namei.h>
2596110a3   Christoph Hellwig   exportfs: add new...
16
  #include <linux/exportfs.h>
d5aacad54   Al Viro   New helper - simp...
17
  #include <linux/writeback.h>
ff01bb483   Al Viro   fs: move code out...
18
  #include <linux/buffer_head.h> /* sync_mapping_buffers */
31d6d5ce5   David Howells   vfs: Provide a mo...
19
20
  #include <linux/fs_context.h>
  #include <linux/pseudo_fs.h>
a3d1e7eb5   Al Viro   simple_recursive_...
21
  #include <linux/fsnotify.h>
6ea0a439a   Daniel Rosenberg   FROMLIST: Add sta...
22
23
  #include <linux/unicode.h>
  #include <linux/fscrypt.h>
7cf34c761   Ingo Molnar   [PATCH] sem2mutex...
24

7c0f6ba68   Linus Torvalds   Replace <asm/uacc...
25
  #include <linux/uaccess.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
26

a4464dbc0   Al Viro   Make ->d_sb assig...
27
  #include "internal.h"
a528d35e8   David Howells   statx: Add a syst...
28
29
  int simple_getattr(const struct path *path, struct kstat *stat,
  		   u32 request_mask, unsigned int query_flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
  {
a528d35e8   David Howells   statx: Add a syst...
31
  	struct inode *inode = d_inode(path->dentry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
32
  	generic_fillattr(inode, stat);
09cbfeaf1   Kirill A. Shutemov   mm, fs: get rid o...
33
  	stat->blocks = inode->i_mapping->nrpages << (PAGE_SHIFT - 9);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
34
35
  	return 0;
  }
12f388722   Al Viro   libfs: get export...
36
  EXPORT_SYMBOL(simple_getattr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
37

726c33422   David Howells   [PATCH] VFS: Perm...
38
  int simple_statfs(struct dentry *dentry, struct kstatfs *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
39
  {
726c33422   David Howells   [PATCH] VFS: Perm...
40
  	buf->f_type = dentry->d_sb->s_magic;
09cbfeaf1   Kirill A. Shutemov   mm, fs: get rid o...
41
  	buf->f_bsize = PAGE_SIZE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
42
43
44
  	buf->f_namelen = NAME_MAX;
  	return 0;
  }
12f388722   Al Viro   libfs: get export...
45
  EXPORT_SYMBOL(simple_statfs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
46
47
48
49
50
  
  /*
   * Retaining negative dentries for an in-memory filesystem just wastes
   * memory and lookup time: arrange for them to be deleted immediately.
   */
b26d4cd38   Al Viro   consolidate simpl...
51
  int always_delete_dentry(const struct dentry *dentry)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52
53
54
  {
  	return 1;
  }
b26d4cd38   Al Viro   consolidate simpl...
55
56
57
58
59
60
  EXPORT_SYMBOL(always_delete_dentry);
  
  const struct dentry_operations simple_dentry_operations = {
  	.d_delete = always_delete_dentry,
  };
  EXPORT_SYMBOL(simple_dentry_operations);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
61
62
63
64
65
  
  /*
   * Lookup the data. This is trivial - if the dentry didn't already
   * exist, we know it is negative.  Set d_op to delete negative dentries.
   */
00cd8dd3b   Al Viro   stop passing name...
66
  struct dentry *simple_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
67
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
68
69
  	if (dentry->d_name.len > NAME_MAX)
  		return ERR_PTR(-ENAMETOOLONG);
74931da7a   Al Viro   make simple_looku...
70
71
  	if (!dentry->d_sb->s_d_op)
  		d_set_d_op(dentry, &simple_dentry_operations);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
72
73
74
  	d_add(dentry, NULL);
  	return NULL;
  }
12f388722   Al Viro   libfs: get export...
75
  EXPORT_SYMBOL(simple_lookup);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
76

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
77
78
  int dcache_dir_open(struct inode *inode, struct file *file)
  {
ba65dc5ef   Al Viro   much milder d_wal...
79
  	file->private_data = d_alloc_cursor(file->f_path.dentry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
80
81
82
  
  	return file->private_data ? 0 : -ENOMEM;
  }
12f388722   Al Viro   libfs: get export...
83
  EXPORT_SYMBOL(dcache_dir_open);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
84
85
86
87
88
89
  
  int dcache_dir_close(struct inode *inode, struct file *file)
  {
  	dput(file->private_data);
  	return 0;
  }
12f388722   Al Viro   libfs: get export...
90
  EXPORT_SYMBOL(dcache_dir_close);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
91

4f42c1b5b   Al Viro   libfs.c: new help...
92
  /* parent is locked at least shared */
d4f4de5e5   Al Viro   Fix the locking i...
93
94
95
  /*
   * Returns an element of siblings' list.
   * We are looking for <count>th positive after <p>; if
26b6c9843   Al Viro   libfs: take curso...
96
97
   * found, dentry is grabbed and returned to caller.
   * If no such element exists, NULL is returned.
d4f4de5e5   Al Viro   Fix the locking i...
98
   */
26b6c9843   Al Viro   libfs: take curso...
99
  static struct dentry *scan_positives(struct dentry *cursor,
d4f4de5e5   Al Viro   Fix the locking i...
100
101
  					struct list_head *p,
  					loff_t count,
26b6c9843   Al Viro   libfs: take curso...
102
  					struct dentry *last)
4f42c1b5b   Al Viro   libfs.c: new help...
103
  {
d4f4de5e5   Al Viro   Fix the locking i...
104
105
106
107
  	struct dentry *dentry = cursor->d_parent, *found = NULL;
  
  	spin_lock(&dentry->d_lock);
  	while ((p = p->next) != &dentry->d_subdirs) {
4f42c1b5b   Al Viro   libfs.c: new help...
108
  		struct dentry *d = list_entry(p, struct dentry, d_child);
d4f4de5e5   Al Viro   Fix the locking i...
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
  		// we must at least skip cursors, to avoid livelocks
  		if (d->d_flags & DCACHE_DENTRY_CURSOR)
  			continue;
  		if (simple_positive(d) && !--count) {
  			spin_lock_nested(&d->d_lock, DENTRY_D_LOCK_NESTED);
  			if (simple_positive(d))
  				found = dget_dlock(d);
  			spin_unlock(&d->d_lock);
  			if (likely(found))
  				break;
  			count = 1;
  		}
  		if (need_resched()) {
  			list_move(&cursor->d_child, p);
  			p = &cursor->d_child;
  			spin_unlock(&dentry->d_lock);
  			cond_resched();
  			spin_lock(&dentry->d_lock);
4f42c1b5b   Al Viro   libfs.c: new help...
127
128
  		}
  	}
d4f4de5e5   Al Viro   Fix the locking i...
129
  	spin_unlock(&dentry->d_lock);
26b6c9843   Al Viro   libfs: take curso...
130
131
  	dput(last);
  	return found;
4f42c1b5b   Al Viro   libfs.c: new help...
132
  }
965c8e59c   Andrew Morton   lseek: the "whenc...
133
  loff_t dcache_dir_lseek(struct file *file, loff_t offset, int whence)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
134
  {
2fd6b7f50   Nick Piggin   fs: dcache scale ...
135
  	struct dentry *dentry = file->f_path.dentry;
965c8e59c   Andrew Morton   lseek: the "whenc...
136
  	switch (whence) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
137
138
  		case 1:
  			offset += file->f_pos;
df561f668   Gustavo A. R. Silva   treewide: Use fal...
139
  			fallthrough;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
140
141
142
  		case 0:
  			if (offset >= 0)
  				break;
df561f668   Gustavo A. R. Silva   treewide: Use fal...
143
  			fallthrough;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
144
  		default:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
145
146
147
  			return -EINVAL;
  	}
  	if (offset != file->f_pos) {
d4f4de5e5   Al Viro   Fix the locking i...
148
149
  		struct dentry *cursor = file->private_data;
  		struct dentry *to = NULL;
d4f4de5e5   Al Viro   Fix the locking i...
150

d4f4de5e5   Al Viro   Fix the locking i...
151
  		inode_lock_shared(dentry->d_inode);
26b6c9843   Al Viro   libfs: take curso...
152
153
154
155
156
157
158
  		if (offset > 2)
  			to = scan_positives(cursor, &dentry->d_subdirs,
  					    offset - 2, NULL);
  		spin_lock(&dentry->d_lock);
  		if (to)
  			list_move(&cursor->d_child, &to->d_child);
  		else
d4f4de5e5   Al Viro   Fix the locking i...
159
  			list_del_init(&cursor->d_child);
26b6c9843   Al Viro   libfs: take curso...
160
  		spin_unlock(&dentry->d_lock);
d4f4de5e5   Al Viro   Fix the locking i...
161
  		dput(to);
26b6c9843   Al Viro   libfs: take curso...
162
  		file->f_pos = offset;
d4f4de5e5   Al Viro   Fix the locking i...
163
  		inode_unlock_shared(dentry->d_inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
164
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
165
166
  	return offset;
  }
12f388722   Al Viro   libfs: get export...
167
  EXPORT_SYMBOL(dcache_dir_lseek);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
168
169
170
171
172
173
174
175
176
177
178
179
  
  /* Relationship between i_mode and the DT_xxx types */
  static inline unsigned char dt_type(struct inode *inode)
  {
  	return (inode->i_mode >> 12) & 15;
  }
  
  /*
   * Directory is locked and all positive dentries in it are safe, since
   * for ramfs-type trees they can't go away without unlink() or rmdir(),
   * both impossible due to the lock on directory.
   */
5f99f4e79   Al Viro   [readdir] switch ...
180
  int dcache_readdir(struct file *file, struct dir_context *ctx)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
181
  {
5f99f4e79   Al Viro   [readdir] switch ...
182
183
  	struct dentry *dentry = file->f_path.dentry;
  	struct dentry *cursor = file->private_data;
d4f4de5e5   Al Viro   Fix the locking i...
184
185
186
  	struct list_head *anchor = &dentry->d_subdirs;
  	struct dentry *next = NULL;
  	struct list_head *p;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
187

5f99f4e79   Al Viro   [readdir] switch ...
188
189
  	if (!dir_emit_dots(file, ctx))
  		return 0;
5f99f4e79   Al Viro   [readdir] switch ...
190

4f42c1b5b   Al Viro   libfs.c: new help...
191
  	if (ctx->pos == 2)
d4f4de5e5   Al Viro   Fix the locking i...
192
  		p = anchor;
26b6c9843   Al Viro   libfs: take curso...
193
  	else if (!list_empty(&cursor->d_child))
d4f4de5e5   Al Viro   Fix the locking i...
194
  		p = &cursor->d_child;
26b6c9843   Al Viro   libfs: take curso...
195
196
  	else
  		return 0;
d4f4de5e5   Al Viro   Fix the locking i...
197

26b6c9843   Al Viro   libfs: take curso...
198
  	while ((next = scan_positives(cursor, p, 1, next)) != NULL) {
5f99f4e79   Al Viro   [readdir] switch ...
199
  		if (!dir_emit(ctx, next->d_name.name, next->d_name.len,
dea655c28   David Howells   VFS: fs library h...
200
  			      d_inode(next)->i_ino, dt_type(d_inode(next))))
4f42c1b5b   Al Viro   libfs.c: new help...
201
  			break;
5f99f4e79   Al Viro   [readdir] switch ...
202
  		ctx->pos++;
26b6c9843   Al Viro   libfs: take curso...
203
  		p = &next->d_child;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
204
  	}
d4f4de5e5   Al Viro   Fix the locking i...
205
  	spin_lock(&dentry->d_lock);
26b6c9843   Al Viro   libfs: take curso...
206
207
208
209
  	if (next)
  		list_move_tail(&cursor->d_child, &next->d_child);
  	else
  		list_del_init(&cursor->d_child);
d4f4de5e5   Al Viro   Fix the locking i...
210
211
  	spin_unlock(&dentry->d_lock);
  	dput(next);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
212
213
  	return 0;
  }
12f388722   Al Viro   libfs: get export...
214
  EXPORT_SYMBOL(dcache_readdir);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
215
216
217
218
219
  
  ssize_t generic_read_dir(struct file *filp, char __user *buf, size_t siz, loff_t *ppos)
  {
  	return -EISDIR;
  }
12f388722   Al Viro   libfs: get export...
220
  EXPORT_SYMBOL(generic_read_dir);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
221

4b6f5d20b   Arjan van de Ven   [PATCH] Make most...
222
  const struct file_operations simple_dir_operations = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
223
224
225
226
  	.open		= dcache_dir_open,
  	.release	= dcache_dir_close,
  	.llseek		= dcache_dir_lseek,
  	.read		= generic_read_dir,
4e82901cd   Al Viro   dcache_{readdir,d...
227
  	.iterate_shared	= dcache_readdir,
1b061d924   Christoph Hellwig   rename the generi...
228
  	.fsync		= noop_fsync,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
229
  };
12f388722   Al Viro   libfs: get export...
230
  EXPORT_SYMBOL(simple_dir_operations);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
231

92e1d5be9   Arjan van de Ven   [PATCH] mark stru...
232
  const struct inode_operations simple_dir_inode_operations = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
233
234
  	.lookup		= simple_lookup,
  };
12f388722   Al Viro   libfs: get export...
235
  EXPORT_SYMBOL(simple_dir_inode_operations);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
236

a3d1e7eb5   Al Viro   simple_recursive_...
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
  static struct dentry *find_next_child(struct dentry *parent, struct dentry *prev)
  {
  	struct dentry *child = NULL;
  	struct list_head *p = prev ? &prev->d_child : &parent->d_subdirs;
  
  	spin_lock(&parent->d_lock);
  	while ((p = p->next) != &parent->d_subdirs) {
  		struct dentry *d = container_of(p, struct dentry, d_child);
  		if (simple_positive(d)) {
  			spin_lock_nested(&d->d_lock, DENTRY_D_LOCK_NESTED);
  			if (simple_positive(d))
  				child = dget_dlock(d);
  			spin_unlock(&d->d_lock);
  			if (likely(child))
  				break;
  		}
  	}
  	spin_unlock(&parent->d_lock);
  	dput(prev);
  	return child;
  }
  
  void simple_recursive_removal(struct dentry *dentry,
                                void (*callback)(struct dentry *))
  {
  	struct dentry *this = dget(dentry);
  	while (true) {
  		struct dentry *victim = NULL, *child;
  		struct inode *inode = this->d_inode;
  
  		inode_lock(inode);
  		if (d_is_dir(this))
  			inode->i_flags |= S_DEAD;
  		while ((child = find_next_child(this, victim)) == NULL) {
  			// kill and ascend
  			// update metadata while it's still locked
  			inode->i_ctime = current_time(inode);
  			clear_nlink(inode);
  			inode_unlock(inode);
  			victim = this;
  			this = this->d_parent;
  			inode = this->d_inode;
  			inode_lock(inode);
  			if (simple_positive(victim)) {
  				d_invalidate(victim);	// avoid lost mounts
  				if (d_is_dir(victim))
  					fsnotify_rmdir(inode, victim);
  				else
  					fsnotify_unlink(inode, victim);
  				if (callback)
  					callback(victim);
  				dput(victim);		// unpin it
  			}
  			if (victim == dentry) {
  				inode->i_ctime = inode->i_mtime =
  					current_time(inode);
  				if (d_is_dir(dentry))
  					drop_nlink(inode);
  				inode_unlock(inode);
  				dput(dentry);
  				return;
  			}
  		}
  		inode_unlock(inode);
  		this = child;
  	}
  }
  EXPORT_SYMBOL(simple_recursive_removal);
759b9775c   Hugh Dickins   [PATCH] shmem and...
305
306
307
  static const struct super_operations simple_super_operations = {
  	.statfs		= simple_statfs,
  };
db2c246a0   David Howells   vfs: Use sget_fc(...
308
  static int pseudo_fs_fill_super(struct super_block *s, struct fs_context *fc)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
309
  {
31d6d5ce5   David Howells   vfs: Provide a mo...
310
  	struct pseudo_fs_context *ctx = fc->fs_private;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
311
  	struct inode *root;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
312

89a4eb4b6   Jeff Layton   vfs: make get_sb_...
313
  	s->s_maxbytes = MAX_LFS_FILESIZE;
3971e1a91   Alex Nixon   VFS: increase pse...
314
315
  	s->s_blocksize = PAGE_SIZE;
  	s->s_blocksize_bits = PAGE_SHIFT;
8d9e46d80   Al Viro   fold mount_pseudo...
316
317
318
  	s->s_magic = ctx->magic;
  	s->s_op = ctx->ops ?: &simple_super_operations;
  	s->s_xattr = ctx->xattr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
319
320
321
  	s->s_time_gran = 1;
  	root = new_inode(s);
  	if (!root)
db2c246a0   David Howells   vfs: Use sget_fc(...
322
  		return -ENOMEM;
1a1c9bb43   Jeff Layton   inode numbering: ...
323
324
325
326
327
328
  	/*
  	 * since this is the first inode, make it number 1. New inodes created
  	 * after this must take care not to collide with it (by passing
  	 * max_reserved of 1 to iunique).
  	 */
  	root->i_ino = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
329
  	root->i_mode = S_IFDIR | S_IRUSR | S_IWUSR;
078cd8279   Deepa Dinamani   fs: Replace CURRE...
330
  	root->i_atime = root->i_mtime = root->i_ctime = current_time(root);
8d9e46d80   Al Viro   fold mount_pseudo...
331
332
  	s->s_root = d_make_root(root);
  	if (!s->s_root)
db2c246a0   David Howells   vfs: Use sget_fc(...
333
  		return -ENOMEM;
8d9e46d80   Al Viro   fold mount_pseudo...
334
  	s->s_d_op = ctx->dops;
31d6d5ce5   David Howells   vfs: Provide a mo...
335
  	return 0;
db2c246a0   David Howells   vfs: Use sget_fc(...
336
  }
8d9e46d80   Al Viro   fold mount_pseudo...
337

db2c246a0   David Howells   vfs: Use sget_fc(...
338
339
  static int pseudo_fs_get_tree(struct fs_context *fc)
  {
2ac295d4f   Al Viro   convenience helpe...
340
  	return get_tree_nodev(fc, pseudo_fs_fill_super);
31d6d5ce5   David Howells   vfs: Provide a mo...
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
  }
  
  static void pseudo_fs_free(struct fs_context *fc)
  {
  	kfree(fc->fs_private);
  }
  
  static const struct fs_context_operations pseudo_fs_context_ops = {
  	.free		= pseudo_fs_free,
  	.get_tree	= pseudo_fs_get_tree,
  };
  
  /*
   * Common helper for pseudo-filesystems (sockfs, pipefs, bdev - stuff that
   * will never be mountable)
   */
  struct pseudo_fs_context *init_pseudo(struct fs_context *fc,
  					unsigned long magic)
  {
  	struct pseudo_fs_context *ctx;
  
  	ctx = kzalloc(sizeof(struct pseudo_fs_context), GFP_KERNEL);
  	if (likely(ctx)) {
  		ctx->magic = magic;
  		fc->fs_private = ctx;
  		fc->ops = &pseudo_fs_context_ops;
db2c246a0   David Howells   vfs: Use sget_fc(...
367
368
  		fc->sb_flags |= SB_NOUSER;
  		fc->global = true;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
369
  	}
31d6d5ce5   David Howells   vfs: Provide a mo...
370
  	return ctx;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
371
  }
31d6d5ce5   David Howells   vfs: Provide a mo...
372
  EXPORT_SYMBOL(init_pseudo);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
373

20955e891   Stephen Boyd   libfs: add simple...
374
375
376
377
378
379
  int simple_open(struct inode *inode, struct file *file)
  {
  	if (inode->i_private)
  		file->private_data = inode->i_private;
  	return 0;
  }
12f388722   Al Viro   libfs: get export...
380
  EXPORT_SYMBOL(simple_open);
20955e891   Stephen Boyd   libfs: add simple...
381

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
382
383
  int simple_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry)
  {
dea655c28   David Howells   VFS: fs library h...
384
  	struct inode *inode = d_inode(old_dentry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
385

078cd8279   Deepa Dinamani   fs: Replace CURRE...
386
  	inode->i_ctime = dir->i_ctime = dir->i_mtime = current_time(inode);
d8c76e6f4   Dave Hansen   [PATCH] r/o bind ...
387
  	inc_nlink(inode);
7de9c6ee3   Al Viro   new helper: ihold()
388
  	ihold(inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
389
390
391
392
  	dget(dentry);
  	d_instantiate(dentry, inode);
  	return 0;
  }
12f388722   Al Viro   libfs: get export...
393
  EXPORT_SYMBOL(simple_link);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
394

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
395
396
397
398
  int simple_empty(struct dentry *dentry)
  {
  	struct dentry *child;
  	int ret = 0;
2fd6b7f50   Nick Piggin   fs: dcache scale ...
399
  	spin_lock(&dentry->d_lock);
946e51f2b   Al Viro   move d_rcu from o...
400
  	list_for_each_entry(child, &dentry->d_subdirs, d_child) {
da5029563   Nick Piggin   fs: dcache scale ...
401
402
403
  		spin_lock_nested(&child->d_lock, DENTRY_D_LOCK_NESTED);
  		if (simple_positive(child)) {
  			spin_unlock(&child->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
404
  			goto out;
da5029563   Nick Piggin   fs: dcache scale ...
405
406
407
  		}
  		spin_unlock(&child->d_lock);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
408
409
  	ret = 1;
  out:
2fd6b7f50   Nick Piggin   fs: dcache scale ...
410
  	spin_unlock(&dentry->d_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
411
412
  	return ret;
  }
12f388722   Al Viro   libfs: get export...
413
  EXPORT_SYMBOL(simple_empty);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
414
415
416
  
  int simple_unlink(struct inode *dir, struct dentry *dentry)
  {
dea655c28   David Howells   VFS: fs library h...
417
  	struct inode *inode = d_inode(dentry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
418

078cd8279   Deepa Dinamani   fs: Replace CURRE...
419
  	inode->i_ctime = dir->i_ctime = dir->i_mtime = current_time(inode);
9a53c3a78   Dave Hansen   [PATCH] r/o bind ...
420
  	drop_nlink(inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
421
422
423
  	dput(dentry);
  	return 0;
  }
12f388722   Al Viro   libfs: get export...
424
  EXPORT_SYMBOL(simple_unlink);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
425
426
427
428
429
  
  int simple_rmdir(struct inode *dir, struct dentry *dentry)
  {
  	if (!simple_empty(dentry))
  		return -ENOTEMPTY;
dea655c28   David Howells   VFS: fs library h...
430
  	drop_nlink(d_inode(dentry));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
431
  	simple_unlink(dir, dentry);
9a53c3a78   Dave Hansen   [PATCH] r/o bind ...
432
  	drop_nlink(dir);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
433
434
  	return 0;
  }
12f388722   Al Viro   libfs: get export...
435
  EXPORT_SYMBOL(simple_rmdir);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
436
437
  
  int simple_rename(struct inode *old_dir, struct dentry *old_dentry,
e0e0be8a8   Miklos Szeredi   libfs: support RE...
438
439
  		  struct inode *new_dir, struct dentry *new_dentry,
  		  unsigned int flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
440
  {
dea655c28   David Howells   VFS: fs library h...
441
  	struct inode *inode = d_inode(old_dentry);
e36cb0b89   David Howells   VFS: (Scripted) C...
442
  	int they_are_dirs = d_is_dir(old_dentry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
443

e0e0be8a8   Miklos Szeredi   libfs: support RE...
444
445
  	if (flags & ~RENAME_NOREPLACE)
  		return -EINVAL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
446
447
  	if (!simple_empty(new_dentry))
  		return -ENOTEMPTY;
dea655c28   David Howells   VFS: fs library h...
448
  	if (d_really_is_positive(new_dentry)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
449
  		simple_unlink(new_dir, new_dentry);
841590ce1   Al Viro   fix IN_DELETE_SEL...
450
  		if (they_are_dirs) {
dea655c28   David Howells   VFS: fs library h...
451
  			drop_nlink(d_inode(new_dentry));
9a53c3a78   Dave Hansen   [PATCH] r/o bind ...
452
  			drop_nlink(old_dir);
841590ce1   Al Viro   fix IN_DELETE_SEL...
453
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
454
  	} else if (they_are_dirs) {
9a53c3a78   Dave Hansen   [PATCH] r/o bind ...
455
  		drop_nlink(old_dir);
d8c76e6f4   Dave Hansen   [PATCH] r/o bind ...
456
  		inc_nlink(new_dir);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
457
458
459
  	}
  
  	old_dir->i_ctime = old_dir->i_mtime = new_dir->i_ctime =
078cd8279   Deepa Dinamani   fs: Replace CURRE...
460
  		new_dir->i_mtime = inode->i_ctime = current_time(old_dir);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
461
462
463
  
  	return 0;
  }
12f388722   Al Viro   libfs: get export...
464
  EXPORT_SYMBOL(simple_rename);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
465

7bb46a673   npiggin@suse.de   fs: introduce new...
466
  /**
eef2380c1   Christoph Hellwig   default to simple...
467
   * simple_setattr - setattr for simple filesystem
7bb46a673   npiggin@suse.de   fs: introduce new...
468
469
470
471
472
   * @dentry: dentry
   * @iattr: iattr structure
   *
   * Returns 0 on success, -error on failure.
   *
eef2380c1   Christoph Hellwig   default to simple...
473
474
475
476
477
478
   * simple_setattr is a simple ->setattr implementation without a proper
   * implementation of size changes.
   *
   * It can either be used for in-memory filesystems or special files
   * on simple regular filesystems.  Anything that needs to change on-disk
   * or wire state on size changes needs its own setattr method.
7bb46a673   npiggin@suse.de   fs: introduce new...
479
480
481
   */
  int simple_setattr(struct dentry *dentry, struct iattr *iattr)
  {
dea655c28   David Howells   VFS: fs library h...
482
  	struct inode *inode = d_inode(dentry);
7bb46a673   npiggin@suse.de   fs: introduce new...
483
  	int error;
31051c85b   Jan Kara   fs: Give dentry t...
484
  	error = setattr_prepare(dentry, iattr);
7bb46a673   npiggin@suse.de   fs: introduce new...
485
486
  	if (error)
  		return error;
2c27c65ed   Christoph Hellwig   check ATTR_SIZE c...
487
488
  	if (iattr->ia_valid & ATTR_SIZE)
  		truncate_setsize(inode, iattr->ia_size);
6a1a90ad1   Christoph Hellwig   rename generic_se...
489
  	setattr_copy(inode, iattr);
eef2380c1   Christoph Hellwig   default to simple...
490
491
  	mark_inode_dirty(inode);
  	return 0;
7bb46a673   npiggin@suse.de   fs: introduce new...
492
493
  }
  EXPORT_SYMBOL(simple_setattr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
494
495
  int simple_readpage(struct file *file, struct page *page)
  {
c0d92cbc5   Pekka J Enberg   [PATCH] libfs: re...
496
  	clear_highpage(page);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
497
498
  	flush_dcache_page(page);
  	SetPageUptodate(page);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
499
500
501
  	unlock_page(page);
  	return 0;
  }
12f388722   Al Viro   libfs: get export...
502
  EXPORT_SYMBOL(simple_readpage);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
503

afddba49d   Nick Piggin   fs: introduce wri...
504
505
506
507
508
509
  int simple_write_begin(struct file *file, struct address_space *mapping,
  			loff_t pos, unsigned len, unsigned flags,
  			struct page **pagep, void **fsdata)
  {
  	struct page *page;
  	pgoff_t index;
afddba49d   Nick Piggin   fs: introduce wri...
510

09cbfeaf1   Kirill A. Shutemov   mm, fs: get rid o...
511
  	index = pos >> PAGE_SHIFT;
afddba49d   Nick Piggin   fs: introduce wri...
512

54566b2c1   Nick Piggin   fs: symlink write...
513
  	page = grab_cache_page_write_begin(mapping, index, flags);
afddba49d   Nick Piggin   fs: introduce wri...
514
515
516
517
  	if (!page)
  		return -ENOMEM;
  
  	*pagep = page;
09cbfeaf1   Kirill A. Shutemov   mm, fs: get rid o...
518
519
  	if (!PageUptodate(page) && (len != PAGE_SIZE)) {
  		unsigned from = pos & (PAGE_SIZE - 1);
193cf4b99   Boaz Harrosh   libfs: Unexport a...
520

09cbfeaf1   Kirill A. Shutemov   mm, fs: get rid o...
521
  		zero_user_segments(page, 0, from, from + len, PAGE_SIZE);
193cf4b99   Boaz Harrosh   libfs: Unexport a...
522
523
  	}
  	return 0;
afddba49d   Nick Piggin   fs: introduce wri...
524
  }
12f388722   Al Viro   libfs: get export...
525
  EXPORT_SYMBOL(simple_write_begin);
afddba49d   Nick Piggin   fs: introduce wri...
526

ad2a722f1   Boaz Harrosh   libfs: Open code ...
527
528
  /**
   * simple_write_end - .write_end helper for non-block-device FSes
8e88bfba7   Randy Dunlap   fs/libfs.c: fix k...
529
   * @file: See .write_end of address_space_operations
ad2a722f1   Boaz Harrosh   libfs: Open code ...
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
   * @mapping: 		"
   * @pos: 		"
   * @len: 		"
   * @copied: 		"
   * @page: 		"
   * @fsdata: 		"
   *
   * simple_write_end does the minimum needed for updating a page after writing is
   * done. It has the same API signature as the .write_end of
   * address_space_operations vector. So it can just be set onto .write_end for
   * FSes that don't need any other processing. i_mutex is assumed to be held.
   * Block based filesystems should use generic_write_end().
   * NOTE: Even though i_size might get updated by this function, mark_inode_dirty
   * is not called, so a filesystem that actually does store data in .write_inode
   * should extend on what's done here with a call to mark_inode_dirty() in the
   * case that i_size has changed.
04fff6416   Al Viro   simple_write_end(...
546
547
   *
   * Use *ONLY* with simple_readpage()
ad2a722f1   Boaz Harrosh   libfs: Open code ...
548
   */
afddba49d   Nick Piggin   fs: introduce wri...
549
550
551
552
  int simple_write_end(struct file *file, struct address_space *mapping,
  			loff_t pos, unsigned len, unsigned copied,
  			struct page *page, void *fsdata)
  {
ad2a722f1   Boaz Harrosh   libfs: Open code ...
553
554
  	struct inode *inode = page->mapping->host;
  	loff_t last_pos = pos + copied;
afddba49d   Nick Piggin   fs: introduce wri...
555
556
  
  	/* zero the stale part of the page if we did a short copy */
04fff6416   Al Viro   simple_write_end(...
557
558
559
  	if (!PageUptodate(page)) {
  		if (copied < len) {
  			unsigned from = pos & (PAGE_SIZE - 1);
afddba49d   Nick Piggin   fs: introduce wri...
560

04fff6416   Al Viro   simple_write_end(...
561
562
  			zero_user(page, from + copied, len - copied);
  		}
ad2a722f1   Boaz Harrosh   libfs: Open code ...
563
  		SetPageUptodate(page);
04fff6416   Al Viro   simple_write_end(...
564
  	}
ad2a722f1   Boaz Harrosh   libfs: Open code ...
565
566
567
568
569
570
  	/*
  	 * No need to use i_size_read() here, the i_size
  	 * cannot change under us because we hold the i_mutex.
  	 */
  	if (last_pos > inode->i_size)
  		i_size_write(inode, last_pos);
afddba49d   Nick Piggin   fs: introduce wri...
571

ad2a722f1   Boaz Harrosh   libfs: Open code ...
572
  	set_page_dirty(page);
afddba49d   Nick Piggin   fs: introduce wri...
573
  	unlock_page(page);
09cbfeaf1   Kirill A. Shutemov   mm, fs: get rid o...
574
  	put_page(page);
afddba49d   Nick Piggin   fs: introduce wri...
575
576
577
  
  	return copied;
  }
12f388722   Al Viro   libfs: get export...
578
  EXPORT_SYMBOL(simple_write_end);
afddba49d   Nick Piggin   fs: introduce wri...
579

1a1c9bb43   Jeff Layton   inode numbering: ...
580
581
582
583
584
  /*
   * the inodes created here are not hashed. If you use iunique to generate
   * unique inode values later for this filesystem, then you must take care
   * to pass it an appropriate max_reserved value to avoid collisions.
   */
7d683a099   Roberto Sassu   wrong type for 'm...
585
  int simple_fill_super(struct super_block *s, unsigned long magic,
cda37124f   Eric Biggers   fs: constify tree...
586
  		      const struct tree_descr *files)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
587
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
588
589
590
591
  	struct inode *inode;
  	struct dentry *root;
  	struct dentry *dentry;
  	int i;
09cbfeaf1   Kirill A. Shutemov   mm, fs: get rid o...
592
593
  	s->s_blocksize = PAGE_SIZE;
  	s->s_blocksize_bits = PAGE_SHIFT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
594
  	s->s_magic = magic;
759b9775c   Hugh Dickins   [PATCH] shmem and...
595
  	s->s_op = &simple_super_operations;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
596
597
598
599
600
  	s->s_time_gran = 1;
  
  	inode = new_inode(s);
  	if (!inode)
  		return -ENOMEM;
1a1c9bb43   Jeff Layton   inode numbering: ...
601
602
603
604
605
  	/*
  	 * because the root inode is 1, the files array must not contain an
  	 * entry at index 1
  	 */
  	inode->i_ino = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
606
  	inode->i_mode = S_IFDIR | 0755;
078cd8279   Deepa Dinamani   fs: Replace CURRE...
607
  	inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
608
609
  	inode->i_op = &simple_dir_inode_operations;
  	inode->i_fop = &simple_dir_operations;
bfe868486   Miklos Szeredi   filesystems: add ...
610
  	set_nlink(inode, 2);
48fde701a   Al Viro   switch open-coded...
611
612
  	root = d_make_root(inode);
  	if (!root)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
613
  		return -ENOMEM;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
614
615
616
  	for (i = 0; !files->name || files->name[0]; i++, files++) {
  		if (!files->name)
  			continue;
1a1c9bb43   Jeff Layton   inode numbering: ...
617
618
619
620
621
622
623
  
  		/* warn if it tries to conflict with the root inode */
  		if (unlikely(i == 1))
  			printk(KERN_WARNING "%s: %s passed in a files array"
  				"with an index of 1!
  ", __func__,
  				s->s_type->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
624
625
626
627
  		dentry = d_alloc_name(root, files->name);
  		if (!dentry)
  			goto out;
  		inode = new_inode(s);
32096ea1a   Konstantin Khlebnikov   vfs: fix dentry l...
628
629
  		if (!inode) {
  			dput(dentry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
630
  			goto out;
32096ea1a   Konstantin Khlebnikov   vfs: fix dentry l...
631
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
632
  		inode->i_mode = S_IFREG | files->mode;
078cd8279   Deepa Dinamani   fs: Replace CURRE...
633
  		inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
634
635
636
637
638
639
640
641
  		inode->i_fop = files->ops;
  		inode->i_ino = i;
  		d_add(dentry, inode);
  	}
  	s->s_root = root;
  	return 0;
  out:
  	d_genocide(root);
640946f20   Al Viro   dentry leak in si...
642
  	shrink_dcache_parent(root);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
643
644
645
  	dput(root);
  	return -ENOMEM;
  }
12f388722   Al Viro   libfs: get export...
646
  EXPORT_SYMBOL(simple_fill_super);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
647
648
  
  static DEFINE_SPINLOCK(pin_fs_lock);
1f5ce9e93   Trond Myklebust   VFS: Unexport do_...
649
  int simple_pin_fs(struct file_system_type *type, struct vfsmount **mount, int *count)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
650
651
652
653
654
  {
  	struct vfsmount *mnt = NULL;
  	spin_lock(&pin_fs_lock);
  	if (unlikely(!*mount)) {
  		spin_unlock(&pin_fs_lock);
1751e8a6c   Linus Torvalds   Rename superblock...
655
  		mnt = vfs_kern_mount(type, SB_KERNMOUNT, type->name, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
656
657
658
659
660
661
662
663
664
665
666
667
  		if (IS_ERR(mnt))
  			return PTR_ERR(mnt);
  		spin_lock(&pin_fs_lock);
  		if (!*mount)
  			*mount = mnt;
  	}
  	mntget(*mount);
  	++*count;
  	spin_unlock(&pin_fs_lock);
  	mntput(mnt);
  	return 0;
  }
12f388722   Al Viro   libfs: get export...
668
  EXPORT_SYMBOL(simple_pin_fs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
669
670
671
672
673
674
675
676
677
678
679
  
  void simple_release_fs(struct vfsmount **mount, int *count)
  {
  	struct vfsmount *mnt;
  	spin_lock(&pin_fs_lock);
  	mnt = *mount;
  	if (!--*count)
  		*mount = NULL;
  	spin_unlock(&pin_fs_lock);
  	mntput(mnt);
  }
12f388722   Al Viro   libfs: get export...
680
  EXPORT_SYMBOL(simple_release_fs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
681

6d1029b56   Akinobu Mita   add kernel-doc fo...
682
683
684
685
686
687
688
689
690
691
692
693
694
695
  /**
   * simple_read_from_buffer - copy data from the buffer to user space
   * @to: the user space buffer to read to
   * @count: the maximum number of bytes to read
   * @ppos: the current position in the buffer
   * @from: the buffer to read from
   * @available: the size of the buffer
   *
   * The simple_read_from_buffer() function reads up to @count bytes from the
   * buffer @from at offset @ppos into the user space address starting at @to.
   *
   * On success, the number of bytes read is returned and the offset @ppos is
   * advanced by this number, or negative value is returned on error.
   **/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
696
697
698
699
  ssize_t simple_read_from_buffer(void __user *to, size_t count, loff_t *ppos,
  				const void *from, size_t available)
  {
  	loff_t pos = *ppos;
14be27460   Steven Rostedt   libfs: make simpl...
700
  	size_t ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
701
702
  	if (pos < 0)
  		return -EINVAL;
14be27460   Steven Rostedt   libfs: make simpl...
703
  	if (pos >= available || !count)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
704
705
706
  		return 0;
  	if (count > available - pos)
  		count = available - pos;
14be27460   Steven Rostedt   libfs: make simpl...
707
708
  	ret = copy_to_user(to, from + pos, count);
  	if (ret == count)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
709
  		return -EFAULT;
14be27460   Steven Rostedt   libfs: make simpl...
710
  	count -= ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
711
712
713
  	*ppos = pos + count;
  	return count;
  }
12f388722   Al Viro   libfs: get export...
714
  EXPORT_SYMBOL(simple_read_from_buffer);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
715

6d1029b56   Akinobu Mita   add kernel-doc fo...
716
  /**
6a727b43b   Jiri Slaby   FS / libfs: Imple...
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
   * simple_write_to_buffer - copy data from user space to the buffer
   * @to: the buffer to write to
   * @available: the size of the buffer
   * @ppos: the current position in the buffer
   * @from: the user space buffer to read from
   * @count: the maximum number of bytes to read
   *
   * The simple_write_to_buffer() function reads up to @count bytes from the user
   * space address starting at @from into the buffer @to at offset @ppos.
   *
   * On success, the number of bytes written is returned and the offset @ppos is
   * advanced by this number, or negative value is returned on error.
   **/
  ssize_t simple_write_to_buffer(void *to, size_t available, loff_t *ppos,
  		const void __user *from, size_t count)
  {
  	loff_t pos = *ppos;
  	size_t res;
  
  	if (pos < 0)
  		return -EINVAL;
  	if (pos >= available || !count)
  		return 0;
  	if (count > available - pos)
  		count = available - pos;
  	res = copy_from_user(to + pos, from, count);
  	if (res == count)
  		return -EFAULT;
  	count -= res;
  	*ppos = pos + count;
  	return count;
  }
12f388722   Al Viro   libfs: get export...
749
  EXPORT_SYMBOL(simple_write_to_buffer);
6a727b43b   Jiri Slaby   FS / libfs: Imple...
750
751
  
  /**
6d1029b56   Akinobu Mita   add kernel-doc fo...
752
753
754
755
756
757
758
759
760
761
762
763
764
   * memory_read_from_buffer - copy data from the buffer
   * @to: the kernel space buffer to read to
   * @count: the maximum number of bytes to read
   * @ppos: the current position in the buffer
   * @from: the buffer to read from
   * @available: the size of the buffer
   *
   * The memory_read_from_buffer() function reads up to @count bytes from the
   * buffer @from at offset @ppos into the kernel space address starting at @to.
   *
   * On success, the number of bytes read is returned and the offset @ppos is
   * advanced by this number, or negative value is returned on error.
   **/
93b071139   Akinobu Mita   introduce memory_...
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
  ssize_t memory_read_from_buffer(void *to, size_t count, loff_t *ppos,
  				const void *from, size_t available)
  {
  	loff_t pos = *ppos;
  
  	if (pos < 0)
  		return -EINVAL;
  	if (pos >= available)
  		return 0;
  	if (count > available - pos)
  		count = available - pos;
  	memcpy(to, from + pos, count);
  	*ppos = pos + count;
  
  	return count;
  }
12f388722   Al Viro   libfs: get export...
781
  EXPORT_SYMBOL(memory_read_from_buffer);
93b071139   Akinobu Mita   introduce memory_...
782

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
783
784
785
786
787
788
  /*
   * Transaction based IO.
   * The file expects a single write which triggers the transaction, and then
   * possibly a read which collects the result - which is stored in a
   * file-local buffer.
   */
76791ab2d   Ingo Molnar   kmemtrace, fs: un...
789
790
791
792
793
794
795
796
797
798
799
800
801
802
  
  void simple_transaction_set(struct file *file, size_t n)
  {
  	struct simple_transaction_argresp *ar = file->private_data;
  
  	BUG_ON(n > SIMPLE_TRANSACTION_LIMIT);
  
  	/*
  	 * The barrier ensures that ar->size will really remain zero until
  	 * ar->data is ready for reading.
  	 */
  	smp_mb();
  	ar->size = n;
  }
12f388722   Al Viro   libfs: get export...
803
  EXPORT_SYMBOL(simple_transaction_set);
76791ab2d   Ingo Molnar   kmemtrace, fs: un...
804

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
  char *simple_transaction_get(struct file *file, const char __user *buf, size_t size)
  {
  	struct simple_transaction_argresp *ar;
  	static DEFINE_SPINLOCK(simple_transaction_lock);
  
  	if (size > SIMPLE_TRANSACTION_LIMIT - 1)
  		return ERR_PTR(-EFBIG);
  
  	ar = (struct simple_transaction_argresp *)get_zeroed_page(GFP_KERNEL);
  	if (!ar)
  		return ERR_PTR(-ENOMEM);
  
  	spin_lock(&simple_transaction_lock);
  
  	/* only one write allowed per open */
  	if (file->private_data) {
  		spin_unlock(&simple_transaction_lock);
  		free_page((unsigned long)ar);
  		return ERR_PTR(-EBUSY);
  	}
  
  	file->private_data = ar;
  
  	spin_unlock(&simple_transaction_lock);
  
  	if (copy_from_user(ar->data, buf, size))
  		return ERR_PTR(-EFAULT);
  
  	return ar->data;
  }
12f388722   Al Viro   libfs: get export...
835
  EXPORT_SYMBOL(simple_transaction_get);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
836
837
838
839
840
841
842
843
844
  
  ssize_t simple_transaction_read(struct file *file, char __user *buf, size_t size, loff_t *pos)
  {
  	struct simple_transaction_argresp *ar = file->private_data;
  
  	if (!ar)
  		return 0;
  	return simple_read_from_buffer(buf, size, pos, ar->data, ar->size);
  }
12f388722   Al Viro   libfs: get export...
845
  EXPORT_SYMBOL(simple_transaction_read);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
846
847
848
849
850
851
  
  int simple_transaction_release(struct inode *inode, struct file *file)
  {
  	free_page((unsigned long)file->private_data);
  	return 0;
  }
12f388722   Al Viro   libfs: get export...
852
  EXPORT_SYMBOL(simple_transaction_release);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
853

acaefc25d   Arnd Bergmann   [PATCH] libfs: ad...
854
855
856
  /* Simple attribute files */
  
  struct simple_attr {
8b88b0998   Christoph Hellwig   libfs: allow erro...
857
858
  	int (*get)(void *, u64 *);
  	int (*set)(void *, u64);
acaefc25d   Arnd Bergmann   [PATCH] libfs: ad...
859
860
861
862
863
  	char get_buf[24];	/* enough to store a u64 and "
  \0" */
  	char set_buf[24];
  	void *data;
  	const char *fmt;	/* format for read operation */
7cf34c761   Ingo Molnar   [PATCH] sem2mutex...
864
  	struct mutex mutex;	/* protects access to these buffers */
acaefc25d   Arnd Bergmann   [PATCH] libfs: ad...
865
866
867
868
869
  };
  
  /* simple_attr_open is called by an actual attribute open file operation
   * to set the attribute specific access operations. */
  int simple_attr_open(struct inode *inode, struct file *file,
8b88b0998   Christoph Hellwig   libfs: allow erro...
870
  		     int (*get)(void *, u64 *), int (*set)(void *, u64),
acaefc25d   Arnd Bergmann   [PATCH] libfs: ad...
871
872
873
  		     const char *fmt)
  {
  	struct simple_attr *attr;
a65cab7d7   Eric Biggers   libfs: fix infole...
874
  	attr = kzalloc(sizeof(*attr), GFP_KERNEL);
acaefc25d   Arnd Bergmann   [PATCH] libfs: ad...
875
876
877
878
879
  	if (!attr)
  		return -ENOMEM;
  
  	attr->get = get;
  	attr->set = set;
8e18e2941   Theodore Ts'o   [PATCH] inode_die...
880
  	attr->data = inode->i_private;
acaefc25d   Arnd Bergmann   [PATCH] libfs: ad...
881
  	attr->fmt = fmt;
7cf34c761   Ingo Molnar   [PATCH] sem2mutex...
882
  	mutex_init(&attr->mutex);
acaefc25d   Arnd Bergmann   [PATCH] libfs: ad...
883
884
885
886
887
  
  	file->private_data = attr;
  
  	return nonseekable_open(inode, file);
  }
12f388722   Al Viro   libfs: get export...
888
  EXPORT_SYMBOL_GPL(simple_attr_open);
acaefc25d   Arnd Bergmann   [PATCH] libfs: ad...
889

74bedc4d5   Christoph Hellwig   libfs: rename sim...
890
  int simple_attr_release(struct inode *inode, struct file *file)
acaefc25d   Arnd Bergmann   [PATCH] libfs: ad...
891
892
893
894
  {
  	kfree(file->private_data);
  	return 0;
  }
12f388722   Al Viro   libfs: get export...
895
  EXPORT_SYMBOL_GPL(simple_attr_release);	/* GPL-only?  This?  Really? */
acaefc25d   Arnd Bergmann   [PATCH] libfs: ad...
896
897
898
899
900
901
902
903
904
905
906
907
908
  
  /* read from the buffer that is filled with the get function */
  ssize_t simple_attr_read(struct file *file, char __user *buf,
  			 size_t len, loff_t *ppos)
  {
  	struct simple_attr *attr;
  	size_t size;
  	ssize_t ret;
  
  	attr = file->private_data;
  
  	if (!attr->get)
  		return -EACCES;
9261303ab   Christoph Hellwig   libfs: make simpl...
909
910
911
  	ret = mutex_lock_interruptible(&attr->mutex);
  	if (ret)
  		return ret;
a65cab7d7   Eric Biggers   libfs: fix infole...
912
913
  	if (*ppos && attr->get_buf[0]) {
  		/* continued read */
acaefc25d   Arnd Bergmann   [PATCH] libfs: ad...
914
  		size = strlen(attr->get_buf);
a65cab7d7   Eric Biggers   libfs: fix infole...
915
916
  	} else {
  		/* first read */
8b88b0998   Christoph Hellwig   libfs: allow erro...
917
918
919
920
  		u64 val;
  		ret = attr->get(attr->data, &val);
  		if (ret)
  			goto out;
acaefc25d   Arnd Bergmann   [PATCH] libfs: ad...
921
  		size = scnprintf(attr->get_buf, sizeof(attr->get_buf),
8b88b0998   Christoph Hellwig   libfs: allow erro...
922
923
  				 attr->fmt, (unsigned long long)val);
  	}
acaefc25d   Arnd Bergmann   [PATCH] libfs: ad...
924
925
  
  	ret = simple_read_from_buffer(buf, len, ppos, attr->get_buf, size);
8b88b0998   Christoph Hellwig   libfs: allow erro...
926
  out:
7cf34c761   Ingo Molnar   [PATCH] sem2mutex...
927
  	mutex_unlock(&attr->mutex);
acaefc25d   Arnd Bergmann   [PATCH] libfs: ad...
928
929
  	return ret;
  }
12f388722   Al Viro   libfs: get export...
930
  EXPORT_SYMBOL_GPL(simple_attr_read);
acaefc25d   Arnd Bergmann   [PATCH] libfs: ad...
931
932
933
934
935
936
  
  /* interpret the buffer as a number to call the set function with */
  ssize_t simple_attr_write(struct file *file, const char __user *buf,
  			  size_t len, loff_t *ppos)
  {
  	struct simple_attr *attr;
488dac0c9   Yicong Yang   libfs: fix error ...
937
  	unsigned long long val;
acaefc25d   Arnd Bergmann   [PATCH] libfs: ad...
938
939
940
941
  	size_t size;
  	ssize_t ret;
  
  	attr = file->private_data;
acaefc25d   Arnd Bergmann   [PATCH] libfs: ad...
942
943
  	if (!attr->set)
  		return -EACCES;
9261303ab   Christoph Hellwig   libfs: make simpl...
944
945
946
  	ret = mutex_lock_interruptible(&attr->mutex);
  	if (ret)
  		return ret;
acaefc25d   Arnd Bergmann   [PATCH] libfs: ad...
947
948
949
950
  	ret = -EFAULT;
  	size = min(sizeof(attr->set_buf) - 1, len);
  	if (copy_from_user(attr->set_buf, buf, size))
  		goto out;
acaefc25d   Arnd Bergmann   [PATCH] libfs: ad...
951
  	attr->set_buf[size] = '\0';
488dac0c9   Yicong Yang   libfs: fix error ...
952
953
954
  	ret = kstrtoull(attr->set_buf, 0, &val);
  	if (ret)
  		goto out;
05cc0cee6   Wu Fengguang   libfs: return err...
955
956
957
  	ret = attr->set(attr->data, val);
  	if (ret == 0)
  		ret = len; /* on success, claim we got the whole input */
acaefc25d   Arnd Bergmann   [PATCH] libfs: ad...
958
  out:
7cf34c761   Ingo Molnar   [PATCH] sem2mutex...
959
  	mutex_unlock(&attr->mutex);
acaefc25d   Arnd Bergmann   [PATCH] libfs: ad...
960
961
  	return ret;
  }
12f388722   Al Viro   libfs: get export...
962
  EXPORT_SYMBOL_GPL(simple_attr_write);
acaefc25d   Arnd Bergmann   [PATCH] libfs: ad...
963

2596110a3   Christoph Hellwig   exportfs: add new...
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
  /**
   * generic_fh_to_dentry - generic helper for the fh_to_dentry export operation
   * @sb:		filesystem to do the file handle conversion on
   * @fid:	file handle to convert
   * @fh_len:	length of the file handle in bytes
   * @fh_type:	type of file handle
   * @get_inode:	filesystem callback to retrieve inode
   *
   * This function decodes @fid as long as it has one of the well-known
   * Linux filehandle types and calls @get_inode on it to retrieve the
   * inode for the object specified in the file handle.
   */
  struct dentry *generic_fh_to_dentry(struct super_block *sb, struct fid *fid,
  		int fh_len, int fh_type, struct inode *(*get_inode)
  			(struct super_block *sb, u64 ino, u32 gen))
  {
  	struct inode *inode = NULL;
  
  	if (fh_len < 2)
  		return NULL;
  
  	switch (fh_type) {
  	case FILEID_INO32_GEN:
  	case FILEID_INO32_GEN_PARENT:
  		inode = get_inode(sb, fid->i32.ino, fid->i32.gen);
  		break;
  	}
4ea3ada29   Christoph Hellwig   [PATCH] new helpe...
991
  	return d_obtain_alias(inode);
2596110a3   Christoph Hellwig   exportfs: add new...
992
993
994
995
  }
  EXPORT_SYMBOL_GPL(generic_fh_to_dentry);
  
  /**
ca1868309   Yanchuan Nian   vfs: fix kerneldo...
996
   * generic_fh_to_parent - generic helper for the fh_to_parent export operation
2596110a3   Christoph Hellwig   exportfs: add new...
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
   * @sb:		filesystem to do the file handle conversion on
   * @fid:	file handle to convert
   * @fh_len:	length of the file handle in bytes
   * @fh_type:	type of file handle
   * @get_inode:	filesystem callback to retrieve inode
   *
   * This function decodes @fid as long as it has one of the well-known
   * Linux filehandle types and calls @get_inode on it to retrieve the
   * inode for the _parent_ object specified in the file handle if it
   * is specified in the file handle, or NULL otherwise.
   */
  struct dentry *generic_fh_to_parent(struct super_block *sb, struct fid *fid,
  		int fh_len, int fh_type, struct inode *(*get_inode)
  			(struct super_block *sb, u64 ino, u32 gen))
  {
  	struct inode *inode = NULL;
  
  	if (fh_len <= 2)
  		return NULL;
  
  	switch (fh_type) {
  	case FILEID_INO32_GEN_PARENT:
  		inode = get_inode(sb, fid->i32.parent_ino,
  				  (fh_len > 3 ? fid->i32.parent_gen : 0));
  		break;
  	}
4ea3ada29   Christoph Hellwig   [PATCH] new helpe...
1023
  	return d_obtain_alias(inode);
2596110a3   Christoph Hellwig   exportfs: add new...
1024
1025
  }
  EXPORT_SYMBOL_GPL(generic_fh_to_parent);
1b061d924   Christoph Hellwig   rename the generi...
1026
  /**
ac13a829f   Fabian Frederick   fs/libfs.c: add g...
1027
1028
   * __generic_file_fsync - generic fsync implementation for simple filesystems
   *
1b061d924   Christoph Hellwig   rename the generi...
1029
   * @file:	file to synchronize
ac13a829f   Fabian Frederick   fs/libfs.c: add g...
1030
1031
   * @start:	start offset in bytes
   * @end:	end offset in bytes (inclusive)
1b061d924   Christoph Hellwig   rename the generi...
1032
1033
1034
1035
1036
1037
   * @datasync:	only synchronize essential metadata if true
   *
   * This is a generic implementation of the fsync method for simple
   * filesystems which track all non-inode metadata in the buffers list
   * hanging off the address_space structure.
   */
ac13a829f   Fabian Frederick   fs/libfs.c: add g...
1038
1039
  int __generic_file_fsync(struct file *file, loff_t start, loff_t end,
  				 int datasync)
d5aacad54   Al Viro   New helper - simp...
1040
  {
7ea808591   Christoph Hellwig   drop unused dentr...
1041
  	struct inode *inode = file->f_mapping->host;
d5aacad54   Al Viro   New helper - simp...
1042
1043
  	int err;
  	int ret;
383aa543c   Jeff Layton   fs: convert __gen...
1044
  	err = file_write_and_wait_range(file, start, end);
02c24a821   Josef Bacik   fs: push i_mutex ...
1045
1046
  	if (err)
  		return err;
5955102c9   Al Viro   wrappers for ->i_...
1047
  	inode_lock(inode);
d5aacad54   Al Viro   New helper - simp...
1048
  	ret = sync_mapping_buffers(inode->i_mapping);
0ae45f63d   Theodore Ts'o   vfs: add support ...
1049
  	if (!(inode->i_state & I_DIRTY_ALL))
02c24a821   Josef Bacik   fs: push i_mutex ...
1050
  		goto out;
d5aacad54   Al Viro   New helper - simp...
1051
  	if (datasync && !(inode->i_state & I_DIRTY_DATASYNC))
02c24a821   Josef Bacik   fs: push i_mutex ...
1052
  		goto out;
d5aacad54   Al Viro   New helper - simp...
1053

c37650161   Christoph Hellwig   fs: add sync_inod...
1054
  	err = sync_inode_metadata(inode, 1);
d5aacad54   Al Viro   New helper - simp...
1055
1056
  	if (ret == 0)
  		ret = err;
ac13a829f   Fabian Frederick   fs/libfs.c: add g...
1057

02c24a821   Josef Bacik   fs: push i_mutex ...
1058
  out:
5955102c9   Al Viro   wrappers for ->i_...
1059
  	inode_unlock(inode);
383aa543c   Jeff Layton   fs: convert __gen...
1060
1061
1062
1063
1064
  	/* check and advance again to catch errors after syncing out buffers */
  	err = file_check_and_advance_wb_err(file);
  	if (ret == 0)
  		ret = err;
  	return ret;
d5aacad54   Al Viro   New helper - simp...
1065
  }
ac13a829f   Fabian Frederick   fs/libfs.c: add g...
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
  EXPORT_SYMBOL(__generic_file_fsync);
  
  /**
   * generic_file_fsync - generic fsync implementation for simple filesystems
   *			with flush
   * @file:	file to synchronize
   * @start:	start offset in bytes
   * @end:	end offset in bytes (inclusive)
   * @datasync:	only synchronize essential metadata if true
   *
   */
  
  int generic_file_fsync(struct file *file, loff_t start, loff_t end,
  		       int datasync)
  {
  	struct inode *inode = file->f_mapping->host;
  	int err;
  
  	err = __generic_file_fsync(file, start, end, datasync);
  	if (err)
  		return err;
9398554fb   Christoph Hellwig   block: remove the...
1087
  	return blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL);
ac13a829f   Fabian Frederick   fs/libfs.c: add g...
1088
  }
1b061d924   Christoph Hellwig   rename the generi...
1089
  EXPORT_SYMBOL(generic_file_fsync);
30ca22c70   Patrick J. LoPresti   ext3/ext4: Factor...
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
  /**
   * generic_check_addressable - Check addressability of file system
   * @blocksize_bits:	log of file system block size
   * @num_blocks:		number of blocks in file system
   *
   * Determine whether a file system with @num_blocks blocks (and a
   * block size of 2**@blocksize_bits) is addressable by the sector_t
   * and page cache of the system.  Return 0 if so and -EFBIG otherwise.
   */
  int generic_check_addressable(unsigned blocksize_bits, u64 num_blocks)
  {
  	u64 last_fs_block = num_blocks - 1;
a33f13efe   Joel Becker   libfs: Fix shift ...
1102
  	u64 last_fs_page =
09cbfeaf1   Kirill A. Shutemov   mm, fs: get rid o...
1103
  		last_fs_block >> (PAGE_SHIFT - blocksize_bits);
30ca22c70   Patrick J. LoPresti   ext3/ext4: Factor...
1104
1105
1106
  
  	if (unlikely(num_blocks == 0))
  		return 0;
09cbfeaf1   Kirill A. Shutemov   mm, fs: get rid o...
1107
  	if ((blocksize_bits < 9) || (blocksize_bits > PAGE_SHIFT))
30ca22c70   Patrick J. LoPresti   ext3/ext4: Factor...
1108
  		return -EINVAL;
a33f13efe   Joel Becker   libfs: Fix shift ...
1109
1110
  	if ((last_fs_block > (sector_t)(~0ULL) >> (blocksize_bits - 9)) ||
  	    (last_fs_page > (pgoff_t)(~0ULL))) {
30ca22c70   Patrick J. LoPresti   ext3/ext4: Factor...
1111
1112
1113
1114
1115
  		return -EFBIG;
  	}
  	return 0;
  }
  EXPORT_SYMBOL(generic_check_addressable);
1b061d924   Christoph Hellwig   rename the generi...
1116
1117
1118
  /*
   * No-op implementation of ->fsync for in-memory filesystems.
   */
02c24a821   Josef Bacik   fs: push i_mutex ...
1119
  int noop_fsync(struct file *file, loff_t start, loff_t end, int datasync)
1b061d924   Christoph Hellwig   rename the generi...
1120
1121
1122
  {
  	return 0;
  }
1b061d924   Christoph Hellwig   rename the generi...
1123
  EXPORT_SYMBOL(noop_fsync);
87dc800be   Al Viro   new helper: kfree...
1124

f44c77630   Dan Williams   fs, dax: prepare ...
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
  int noop_set_page_dirty(struct page *page)
  {
  	/*
  	 * Unlike __set_page_dirty_no_writeback that handles dirty page
  	 * tracking in the page object, dax does all dirty tracking in
  	 * the inode address_space in response to mkwrite faults. In the
  	 * dax case we only need to worry about potentially dirty CPU
  	 * caches, not dirty page cache pages to write back.
  	 *
  	 * This callback is defined to prevent fallback to
  	 * __set_page_dirty_buffers() in set_page_dirty().
  	 */
  	return 0;
  }
  EXPORT_SYMBOL_GPL(noop_set_page_dirty);
  
  void noop_invalidatepage(struct page *page, unsigned int offset,
  		unsigned int length)
  {
  	/*
  	 * There is no page cache to invalidate in the dax case, however
  	 * we need this callback defined to prevent falling back to
  	 * block_invalidatepage() in do_invalidatepage().
  	 */
  }
  EXPORT_SYMBOL_GPL(noop_invalidatepage);
  
  ssize_t noop_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
  {
  	/*
  	 * iomap based filesystems support direct I/O without need for
  	 * this callback. However, it still needs to be set in
  	 * inode->a_ops so that open/fcntl know that direct I/O is
  	 * generally supported.
  	 */
  	return -EINVAL;
  }
  EXPORT_SYMBOL_GPL(noop_direct_IO);
fceef393a   Al Viro   switch ->get_link...
1163
1164
  /* Because kfree isn't assignment-compatible with void(void*) ;-/ */
  void kfree_link(void *p)
87dc800be   Al Viro   new helper: kfree...
1165
  {
fceef393a   Al Viro   switch ->get_link...
1166
  	kfree(p);
87dc800be   Al Viro   new helper: kfree...
1167
  }
fceef393a   Al Viro   switch ->get_link...
1168
  EXPORT_SYMBOL(kfree_link);
6987843ff   Al Viro   take anon inode a...
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
  
  /*
   * nop .set_page_dirty method so that people can use .page_mkwrite on
   * anon inodes.
   */
  static int anon_set_page_dirty(struct page *page)
  {
  	return 0;
  };
  
  /*
   * A single inode exists for all anon_inode files. Contrary to pipes,
   * anon_inode inodes have no associated per-instance data, so we need
   * only allocate one of them.
   */
  struct inode *alloc_anon_inode(struct super_block *s)
  {
  	static const struct address_space_operations anon_aops = {
  		.set_page_dirty = anon_set_page_dirty,
  	};
  	struct inode *inode = new_inode_pseudo(s);
  
  	if (!inode)
  		return ERR_PTR(-ENOMEM);
  
  	inode->i_ino = get_next_ino();
  	inode->i_mapping->a_ops = &anon_aops;
  
  	/*
  	 * Mark the inode dirty from the very beginning,
  	 * that way it will never be moved to the dirty
  	 * list because mark_inode_dirty() will think
  	 * that it already _is_ on the dirty list.
  	 */
  	inode->i_state = I_DIRTY;
  	inode->i_mode = S_IRUSR | S_IWUSR;
  	inode->i_uid = current_fsuid();
  	inode->i_gid = current_fsgid();
  	inode->i_flags |= S_PRIVATE;
078cd8279   Deepa Dinamani   fs: Replace CURRE...
1208
  	inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode);
6987843ff   Al Viro   take anon inode a...
1209
1210
1211
  	return inode;
  }
  EXPORT_SYMBOL(alloc_anon_inode);
1c994a090   Jeff Layton   locks: consolidat...
1212
1213
1214
1215
1216
1217
  
  /**
   * simple_nosetlease - generic helper for prohibiting leases
   * @filp: file pointer
   * @arg: type of lease to obtain
   * @flp: new lease supplied for insertion
e6f5c7893   Jeff Layton   locks: plumb a "p...
1218
   * @priv: private data for lm_setup operation
1c994a090   Jeff Layton   locks: consolidat...
1219
1220
1221
1222
1223
   *
   * Generic helper for filesystems that do not wish to allow leases to be set.
   * All arguments are ignored and it just returns -EINVAL.
   */
  int
e6f5c7893   Jeff Layton   locks: plumb a "p...
1224
1225
  simple_nosetlease(struct file *filp, long arg, struct file_lock **flp,
  		  void **priv)
1c994a090   Jeff Layton   locks: consolidat...
1226
1227
1228
1229
  {
  	return -EINVAL;
  }
  EXPORT_SYMBOL(simple_nosetlease);
61ba64fc0   Al Viro   libfs: simple_fol...
1230

6ee9706aa   Eric Biggers   libfs: document s...
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
  /**
   * simple_get_link - generic helper to get the target of "fast" symlinks
   * @dentry: not used here
   * @inode: the symlink inode
   * @done: not used here
   *
   * Generic helper for filesystems to use for symlink inodes where a pointer to
   * the symlink target is stored in ->i_link.  NOTE: this isn't normally called,
   * since as an optimization the path lookup code uses any non-NULL ->i_link
   * directly, without calling ->get_link().  But ->get_link() still must be set,
   * to mark the inode_operations as being for a symlink.
   *
   * Return: the symlink target
   */
6b2553918   Al Viro   replace ->follow_...
1245
  const char *simple_get_link(struct dentry *dentry, struct inode *inode,
fceef393a   Al Viro   switch ->get_link...
1246
  			    struct delayed_call *done)
61ba64fc0   Al Viro   libfs: simple_fol...
1247
  {
6b2553918   Al Viro   replace ->follow_...
1248
  	return inode->i_link;
61ba64fc0   Al Viro   libfs: simple_fol...
1249
  }
6b2553918   Al Viro   replace ->follow_...
1250
  EXPORT_SYMBOL(simple_get_link);
61ba64fc0   Al Viro   libfs: simple_fol...
1251
1252
  
  const struct inode_operations simple_symlink_inode_operations = {
6b2553918   Al Viro   replace ->follow_...
1253
  	.get_link = simple_get_link,
61ba64fc0   Al Viro   libfs: simple_fol...
1254
1255
  };
  EXPORT_SYMBOL(simple_symlink_inode_operations);
fbabfd0f4   Eric W. Biederman   fs: Add helper fu...
1256
1257
1258
1259
1260
1261
1262
1263
  
  /*
   * Operations for a permanently empty directory.
   */
  static struct dentry *empty_dir_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags)
  {
  	return ERR_PTR(-ENOENT);
  }
a528d35e8   David Howells   statx: Add a syst...
1264
1265
  static int empty_dir_getattr(const struct path *path, struct kstat *stat,
  			     u32 request_mask, unsigned int query_flags)
fbabfd0f4   Eric W. Biederman   fs: Add helper fu...
1266
  {
a528d35e8   David Howells   statx: Add a syst...
1267
  	struct inode *inode = d_inode(path->dentry);
fbabfd0f4   Eric W. Biederman   fs: Add helper fu...
1268
1269
1270
1271
1272
1273
1274
1275
  	generic_fillattr(inode, stat);
  	return 0;
  }
  
  static int empty_dir_setattr(struct dentry *dentry, struct iattr *attr)
  {
  	return -EPERM;
  }
fbabfd0f4   Eric W. Biederman   fs: Add helper fu...
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
  static ssize_t empty_dir_listxattr(struct dentry *dentry, char *list, size_t size)
  {
  	return -EOPNOTSUPP;
  }
  
  static const struct inode_operations empty_dir_inode_operations = {
  	.lookup		= empty_dir_lookup,
  	.permission	= generic_permission,
  	.setattr	= empty_dir_setattr,
  	.getattr	= empty_dir_getattr,
fbabfd0f4   Eric W. Biederman   fs: Add helper fu...
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
  	.listxattr	= empty_dir_listxattr,
  };
  
  static loff_t empty_dir_llseek(struct file *file, loff_t offset, int whence)
  {
  	/* An empty directory has two entries . and .. at offsets 0 and 1 */
  	return generic_file_llseek_size(file, offset, whence, 2, 2);
  }
  
  static int empty_dir_readdir(struct file *file, struct dir_context *ctx)
  {
  	dir_emit_dots(file, ctx);
  	return 0;
  }
  
  static const struct file_operations empty_dir_operations = {
  	.llseek		= empty_dir_llseek,
  	.read		= generic_read_dir,
c51da20c4   Al Viro   more trivial ->it...
1304
  	.iterate_shared	= empty_dir_readdir,
fbabfd0f4   Eric W. Biederman   fs: Add helper fu...
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
  	.fsync		= noop_fsync,
  };
  
  
  void make_empty_dir_inode(struct inode *inode)
  {
  	set_nlink(inode, 2);
  	inode->i_mode = S_IFDIR | S_IRUGO | S_IXUGO;
  	inode->i_uid = GLOBAL_ROOT_UID;
  	inode->i_gid = GLOBAL_ROOT_GID;
  	inode->i_rdev = 0;
4b75de861   Eric W. Biederman   fs: Set the size ...
1316
  	inode->i_size = 0;
fbabfd0f4   Eric W. Biederman   fs: Add helper fu...
1317
1318
1319
1320
  	inode->i_blkbits = PAGE_SHIFT;
  	inode->i_blocks = 0;
  
  	inode->i_op = &empty_dir_inode_operations;
f5c244383   Andreas Gruenbacher   libfs: Use IOP_XA...
1321
  	inode->i_opflags &= ~IOP_XATTR;
fbabfd0f4   Eric W. Biederman   fs: Add helper fu...
1322
1323
1324
1325
1326
1327
1328
1329
  	inode->i_fop = &empty_dir_operations;
  }
  
  bool is_empty_dir_inode(struct inode *inode)
  {
  	return (inode->i_fop == &empty_dir_operations) &&
  		(inode->i_op == &empty_dir_inode_operations);
  }
6ea0a439a   Daniel Rosenberg   FROMLIST: Add sta...
1330
1331
  
  #ifdef CONFIG_UNICODE
76bfcb2dc   Eric Biggers   ANDROID: sync gen...
1332
1333
1334
1335
1336
1337
  /*
   * Determine if the name of a dentry should be casefolded.
   *
   * Return: if names will need casefolding
   */
  static bool needs_casefold(const struct inode *dir)
6ea0a439a   Daniel Rosenberg   FROMLIST: Add sta...
1338
  {
76bfcb2dc   Eric Biggers   ANDROID: sync gen...
1339
  	return IS_CASEFOLDED(dir) && dir->i_sb->s_encoding;
6ea0a439a   Daniel Rosenberg   FROMLIST: Add sta...
1340
  }
6ea0a439a   Daniel Rosenberg   FROMLIST: Add sta...
1341

76bfcb2dc   Eric Biggers   ANDROID: sync gen...
1342
1343
1344
1345
1346
1347
1348
1349
1350
  /**
   * generic_ci_d_compare - generic d_compare implementation for casefolding filesystems
   * @dentry:	dentry whose name we are checking against
   * @len:	len of name of dentry
   * @str:	str pointer to name of dentry
   * @name:	Name to compare against
   *
   * Return: 0 if names match, 1 if mismatch, or -ERRNO
   */
6ea0a439a   Daniel Rosenberg   FROMLIST: Add sta...
1351
1352
1353
1354
  int generic_ci_d_compare(const struct dentry *dentry, unsigned int len,
  			  const char *str, const struct qstr *name)
  {
  	const struct dentry *parent = READ_ONCE(dentry->d_parent);
76bfcb2dc   Eric Biggers   ANDROID: sync gen...
1355
  	const struct inode *dir = READ_ONCE(parent->d_inode);
6ea0a439a   Daniel Rosenberg   FROMLIST: Add sta...
1356
1357
  	const struct super_block *sb = dentry->d_sb;
  	const struct unicode_map *um = sb->s_encoding;
76bfcb2dc   Eric Biggers   ANDROID: sync gen...
1358
  	struct qstr qstr = QSTR_INIT(str, len);
2b4c70da9   Eric Biggers   ANDROID: f2fs: fi...
1359
  	char strbuf[DNAME_INLINE_LEN];
6ea0a439a   Daniel Rosenberg   FROMLIST: Add sta...
1360
  	int ret;
76bfcb2dc   Eric Biggers   ANDROID: sync gen...
1361
  	if (!dir || !needs_casefold(dir))
6ea0a439a   Daniel Rosenberg   FROMLIST: Add sta...
1362
  		goto fallback;
2b4c70da9   Eric Biggers   ANDROID: f2fs: fi...
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
  	/*
  	 * If the dentry name is stored in-line, then it may be concurrently
  	 * modified by a rename.  If this happens, the VFS will eventually retry
  	 * the lookup, so it doesn't matter what ->d_compare() returns.
  	 * However, it's unsafe to call utf8_strncasecmp() with an unstable
  	 * string.  Therefore, we have to copy the name into a temporary buffer.
  	 */
  	if (len <= DNAME_INLINE_LEN - 1) {
  		memcpy(strbuf, str, len);
  		strbuf[len] = 0;
76bfcb2dc   Eric Biggers   ANDROID: sync gen...
1373
  		qstr.name = strbuf;
2b4c70da9   Eric Biggers   ANDROID: f2fs: fi...
1374
1375
1376
  		/* prevent compiler from optimizing out the temporary buffer */
  		barrier();
  	}
76bfcb2dc   Eric Biggers   ANDROID: sync gen...
1377
  	ret = utf8_strncasecmp(um, name, &qstr);
6ea0a439a   Daniel Rosenberg   FROMLIST: Add sta...
1378
1379
  	if (ret >= 0)
  		return ret;
76bfcb2dc   Eric Biggers   ANDROID: sync gen...
1380
  	if (sb_has_strict_encoding(sb))
6ea0a439a   Daniel Rosenberg   FROMLIST: Add sta...
1381
1382
1383
1384
1385
1386
1387
  		return -EINVAL;
  fallback:
  	if (len != name->len)
  		return 1;
  	return !!memcmp(str, name->name, len);
  }
  EXPORT_SYMBOL(generic_ci_d_compare);
76bfcb2dc   Eric Biggers   ANDROID: sync gen...
1388
1389
1390
1391
1392
1393
1394
  /**
   * generic_ci_d_hash - generic d_hash implementation for casefolding filesystems
   * @dentry:	dentry of the parent directory
   * @str:	qstr of name whose hash we should fill in
   *
   * Return: 0 if hash was successful or unchanged, and -EINVAL on error
   */
6ea0a439a   Daniel Rosenberg   FROMLIST: Add sta...
1395
1396
  int generic_ci_d_hash(const struct dentry *dentry, struct qstr *str)
  {
76bfcb2dc   Eric Biggers   ANDROID: sync gen...
1397
  	const struct inode *dir = READ_ONCE(dentry->d_inode);
6ea0a439a   Daniel Rosenberg   FROMLIST: Add sta...
1398
1399
1400
  	struct super_block *sb = dentry->d_sb;
  	const struct unicode_map *um = sb->s_encoding;
  	int ret = 0;
76bfcb2dc   Eric Biggers   ANDROID: sync gen...
1401
  	if (!dir || !needs_casefold(dir))
6ea0a439a   Daniel Rosenberg   FROMLIST: Add sta...
1402
1403
1404
  		return 0;
  
  	ret = utf8_casefold_hash(um, dentry, str);
76bfcb2dc   Eric Biggers   ANDROID: sync gen...
1405
1406
  	if (ret < 0 && sb_has_strict_encoding(sb))
  		return -EINVAL;
6ea0a439a   Daniel Rosenberg   FROMLIST: Add sta...
1407
  	return 0;
6ea0a439a   Daniel Rosenberg   FROMLIST: Add sta...
1408
1409
  }
  EXPORT_SYMBOL(generic_ci_d_hash);
a2a87df67   Daniel Rosenberg   FROMLIST: fscrypt...
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
  
  static const struct dentry_operations generic_ci_dentry_ops = {
  	.d_hash = generic_ci_d_hash,
  	.d_compare = generic_ci_d_compare,
  };
  #endif
  
  #ifdef CONFIG_FS_ENCRYPTION
  static const struct dentry_operations generic_encrypted_dentry_ops = {
  	.d_revalidate = fscrypt_d_revalidate,
  };
  #endif
35693714b   Eric Biggers   ANDROID: sync enc...
1422
  #if defined(CONFIG_FS_ENCRYPTION) && defined(CONFIG_UNICODE)
a2a87df67   Daniel Rosenberg   FROMLIST: fscrypt...
1423
1424
1425
1426
1427
1428
1429
1430
1431
  static const struct dentry_operations generic_encrypted_ci_dentry_ops = {
  	.d_hash = generic_ci_d_hash,
  	.d_compare = generic_ci_d_compare,
  	.d_revalidate = fscrypt_d_revalidate,
  };
  #endif
  
  /**
   * generic_set_encrypted_ci_d_ops - helper for setting d_ops for given dentry
35693714b   Eric Biggers   ANDROID: sync enc...
1432
   * @dentry:	dentry to set ops on
a2a87df67   Daniel Rosenberg   FROMLIST: fscrypt...
1433
   *
35693714b   Eric Biggers   ANDROID: sync enc...
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
   * Casefolded directories need d_hash and d_compare set, so that the dentries
   * contained in them are handled case-insensitively.  Note that these operations
   * are needed on the parent directory rather than on the dentries in it, and
   * while the casefolding flag can be toggled on and off on an empty directory,
   * dentry_operations can't be changed later.  As a result, if the filesystem has
   * casefolding support enabled at all, we have to give all dentries the
   * casefolding operations even if their inode doesn't have the casefolding flag
   * currently (and thus the casefolding ops would be no-ops for now).
   *
   * Encryption works differently in that the only dentry operation it needs is
   * d_revalidate, which it only needs on dentries that have the no-key name flag.
   * The no-key flag can't be set "later", so we don't have to worry about that.
   *
   * Finally, to maximize compatibility with overlayfs (which isn't compatible
   * with certain dentry operations) and to avoid taking an unnecessary
   * performance hit, we use custom dentry_operations for each possible
   * combination rather than always installing all operations.
a2a87df67   Daniel Rosenberg   FROMLIST: fscrypt...
1451
   */
35693714b   Eric Biggers   ANDROID: sync enc...
1452
  void generic_set_encrypted_ci_d_ops(struct dentry *dentry)
a2a87df67   Daniel Rosenberg   FROMLIST: fscrypt...
1453
1454
  {
  #ifdef CONFIG_FS_ENCRYPTION
35693714b   Eric Biggers   ANDROID: sync enc...
1455
1456
  	bool needs_encrypt_ops = dentry->d_flags & DCACHE_NOKEY_NAME;
  #endif
a2a87df67   Daniel Rosenberg   FROMLIST: fscrypt...
1457
  #ifdef CONFIG_UNICODE
35693714b   Eric Biggers   ANDROID: sync enc...
1458
  	bool needs_ci_ops = dentry->d_sb->s_encoding;
6ea0a439a   Daniel Rosenberg   FROMLIST: Add sta...
1459
  #endif
35693714b   Eric Biggers   ANDROID: sync enc...
1460
1461
1462
1463
1464
1465
1466
1467
  #if defined(CONFIG_FS_ENCRYPTION) && defined(CONFIG_UNICODE)
  	if (needs_encrypt_ops && needs_ci_ops) {
  		d_set_d_op(dentry, &generic_encrypted_ci_dentry_ops);
  		return;
  	}
  #endif
  #ifdef CONFIG_FS_ENCRYPTION
  	if (needs_encrypt_ops) {
a2a87df67   Daniel Rosenberg   FROMLIST: fscrypt...
1468
1469
1470
1471
1472
  		d_set_d_op(dentry, &generic_encrypted_dentry_ops);
  		return;
  	}
  #endif
  #ifdef CONFIG_UNICODE
35693714b   Eric Biggers   ANDROID: sync enc...
1473
  	if (needs_ci_ops) {
a2a87df67   Daniel Rosenberg   FROMLIST: fscrypt...
1474
1475
1476
1477
1478
1479
  		d_set_d_op(dentry, &generic_ci_dentry_ops);
  		return;
  	}
  #endif
  }
  EXPORT_SYMBOL(generic_set_encrypted_ci_d_ops);