inode.c 31.9 KB
Newer Older
M
Miklos Szeredi 已提交
1 2
/*
  FUSE: Filesystem in Userspace
M
Miklos Szeredi 已提交
3
  Copyright (C) 2001-2008  Miklos Szeredi <miklos@szeredi.hu>
M
Miklos Szeredi 已提交
4 5 6 7 8 9 10 11 12 13 14 15 16

  This program can be distributed under the terms of the GNU GPL.
  See the file COPYING.
*/

#include "fuse_i.h"

#include <linux/pagemap.h>
#include <linux/slab.h>
#include <linux/file.h>
#include <linux/seq_file.h>
#include <linux/init.h>
#include <linux/module.h>
17
#include <linux/moduleparam.h>
M
Miklos Szeredi 已提交
18 19
#include <linux/parser.h>
#include <linux/statfs.h>
20
#include <linux/random.h>
A
Alexey Dobriyan 已提交
21
#include <linux/sched.h>
M
Miklos Szeredi 已提交
22
#include <linux/exportfs.h>
S
Seth Forshee 已提交
23
#include <linux/posix_acl.h>
M
Miklos Szeredi 已提交
24 25 26 27 28

MODULE_AUTHOR("Miklos Szeredi <miklos@szeredi.hu>");
MODULE_DESCRIPTION("Filesystem in Userspace");
MODULE_LICENSE("GPL");

29
static struct kmem_cache *fuse_inode_cachep;
30 31
struct list_head fuse_conn_list;
DEFINE_MUTEX(fuse_mutex);
M
Miklos Szeredi 已提交
32

33 34
static int set_global_limit(const char *val, struct kernel_param *kp);

35
unsigned max_user_bgreq;
36 37 38 39 40 41 42
module_param_call(max_user_bgreq, set_global_limit, param_get_uint,
		  &max_user_bgreq, 0644);
__MODULE_PARM_TYPE(max_user_bgreq, "uint");
MODULE_PARM_DESC(max_user_bgreq,
 "Global limit for the maximum number of backgrounded requests an "
 "unprivileged user can set");

43
unsigned max_user_congthresh;
44 45 46 47 48 49 50
module_param_call(max_user_congthresh, set_global_limit, param_get_uint,
		  &max_user_congthresh, 0644);
__MODULE_PARM_TYPE(max_user_congthresh, "uint");
MODULE_PARM_DESC(max_user_congthresh,
 "Global limit for the maximum congestion threshold an "
 "unprivileged user can set");

M
Miklos Szeredi 已提交
51 52
#define FUSE_SUPER_MAGIC 0x65735546

M
Miklos Szeredi 已提交
53 54
#define FUSE_DEFAULT_BLKSIZE 512

55 56 57 58 59 60
/** Maximum number of outstanding background requests */
#define FUSE_DEFAULT_MAX_BACKGROUND 12

/** Congestion starts at 75% of maximum */
#define FUSE_DEFAULT_CONGESTION_THRESHOLD (FUSE_DEFAULT_MAX_BACKGROUND * 3 / 4)

M
Miklos Szeredi 已提交
61 62 63
struct fuse_mount_data {
	int fd;
	unsigned rootmode;
64 65
	kuid_t user_id;
	kgid_t group_id;
M
Miklos Szeredi 已提交
66 67 68 69
	unsigned fd_present:1;
	unsigned rootmode_present:1;
	unsigned user_id_present:1;
	unsigned group_id_present:1;
M
Miklos Szeredi 已提交
70 71
	unsigned default_permissions:1;
	unsigned allow_other:1;
72
	unsigned max_read;
M
Miklos Szeredi 已提交
73
	unsigned blksize;
M
Miklos Szeredi 已提交
74 75
};

76
struct fuse_forget_link *fuse_alloc_forget(void)
77 78 79 80
{
	return kzalloc(sizeof(struct fuse_forget_link), GFP_KERNEL);
}

M
Miklos Szeredi 已提交
81 82 83 84 85
static struct inode *fuse_alloc_inode(struct super_block *sb)
{
	struct inode *inode;
	struct fuse_inode *fi;

86
	inode = kmem_cache_alloc(fuse_inode_cachep, GFP_KERNEL);
M
Miklos Szeredi 已提交
87 88 89 90
	if (!inode)
		return NULL;

	fi = get_fuse_inode(inode);
M
Miklos Szeredi 已提交
91
	fi->i_time = 0;
M
Miklos Szeredi 已提交
92
	fi->nodeid = 0;
93
	fi->nlookup = 0;
94
	fi->attr_version = 0;
M
Miklos Szeredi 已提交
95
	fi->writectr = 0;
96
	fi->orig_ino = 0;
97
	fi->state = 0;
98
	INIT_LIST_HEAD(&fi->write_files);
M
Miklos Szeredi 已提交
99 100 101
	INIT_LIST_HEAD(&fi->queued_writes);
	INIT_LIST_HEAD(&fi->writepages);
	init_waitqueue_head(&fi->page_waitq);
102
	mutex_init(&fi->mutex);
103 104
	fi->forget = fuse_alloc_forget();
	if (!fi->forget) {
105 106 107
		kmem_cache_free(fuse_inode_cachep, inode);
		return NULL;
	}
M
Miklos Szeredi 已提交
108 109 110 111

	return inode;
}

N
Nick Piggin 已提交
112 113 114 115 116 117
static void fuse_i_callback(struct rcu_head *head)
{
	struct inode *inode = container_of(head, struct inode, i_rcu);
	kmem_cache_free(fuse_inode_cachep, inode);
}

M
Miklos Szeredi 已提交
118 119
static void fuse_destroy_inode(struct inode *inode)
{
120
	struct fuse_inode *fi = get_fuse_inode(inode);
121
	BUG_ON(!list_empty(&fi->write_files));
M
Miklos Szeredi 已提交
122
	BUG_ON(!list_empty(&fi->queued_writes));
123
	mutex_destroy(&fi->mutex);
124
	kfree(fi->forget);
N
Nick Piggin 已提交
125
	call_rcu(&inode->i_rcu, fuse_i_callback);
M
Miklos Szeredi 已提交
126 127
}

128
static void fuse_evict_inode(struct inode *inode)
M
Miklos Szeredi 已提交
129
{
130
	truncate_inode_pages_final(&inode->i_data);
131
	clear_inode(inode);
M
Miklos Szeredi 已提交
132 133
	if (inode->i_sb->s_flags & MS_ACTIVE) {
		struct fuse_conn *fc = get_fuse_conn(inode);
134
		struct fuse_inode *fi = get_fuse_inode(inode);
135 136
		fuse_queue_forget(fc, fi->forget, fi->nodeid, fi->nlookup);
		fi->forget = NULL;
137
	}
M
Miklos Szeredi 已提交
138 139
}

140 141
static int fuse_remount_fs(struct super_block *sb, int *flags, char *data)
{
142
	sync_filesystem(sb);
143 144 145 146 147 148
	if (*flags & MS_MANDLOCK)
		return -EINVAL;

	return 0;
}

149 150 151 152 153 154 155 156 157 158 159 160
/*
 * ino_t is 32-bits on 32-bit arch. We have to squash the 64-bit value down
 * so that it will fit.
 */
static ino_t fuse_squash_ino(u64 ino64)
{
	ino_t ino = (ino_t) ino64;
	if (sizeof(ino_t) < sizeof(u64))
		ino ^= ino64 >> (sizeof(u64) - sizeof(ino_t)) * 8;
	return ino;
}

M
Miklos Szeredi 已提交
161 162
void fuse_change_attributes_common(struct inode *inode, struct fuse_attr *attr,
				   u64 attr_valid)
M
Miklos Szeredi 已提交
163
{
M
Miklos Szeredi 已提交
164
	struct fuse_conn *fc = get_fuse_conn(inode);
165
	struct fuse_inode *fi = get_fuse_inode(inode);
M
Miklos Szeredi 已提交
166

167 168 169
	fi->attr_version = ++fc->attr_version;
	fi->i_time = attr_valid;

170
	inode->i_ino     = fuse_squash_ino(attr->ino);
171
	inode->i_mode    = (inode->i_mode & S_IFMT) | (attr->mode & 07777);
M
Miklos Szeredi 已提交
172
	set_nlink(inode, attr->nlink);
173 174
	inode->i_uid     = make_kuid(&init_user_ns, attr->uid);
	inode->i_gid     = make_kgid(&init_user_ns, attr->gid);
M
Miklos Szeredi 已提交
175 176 177
	inode->i_blocks  = attr->blocks;
	inode->i_atime.tv_sec   = attr->atime;
	inode->i_atime.tv_nsec  = attr->atimensec;
M
Maxim Patlasov 已提交
178 179 180 181
	/* mtime from server may be stale due to local buffered write */
	if (!fc->writeback_cache || !S_ISREG(inode->i_mode)) {
		inode->i_mtime.tv_sec   = attr->mtime;
		inode->i_mtime.tv_nsec  = attr->mtimensec;
M
Maxim Patlasov 已提交
182 183
		inode->i_ctime.tv_sec   = attr->ctime;
		inode->i_ctime.tv_nsec  = attr->ctimensec;
M
Maxim Patlasov 已提交
184
	}
185

186 187 188 189 190
	if (attr->blksize != 0)
		inode->i_blkbits = ilog2(attr->blksize);
	else
		inode->i_blkbits = inode->i_sb->s_blocksize_bits;

191 192 193 194 195 196
	/*
	 * Don't set the sticky bit in i_mode, unless we want the VFS
	 * to check permissions.  This prevents failures due to the
	 * check in may_delete().
	 */
	fi->orig_i_mode = inode->i_mode;
M
Miklos Szeredi 已提交
197
	if (!fc->default_permissions)
198
		inode->i_mode &= ~S_ISVTX;
199 200

	fi->orig_ino = attr->ino;
M
Miklos Szeredi 已提交
201 202 203 204 205 206 207
}

void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr,
			    u64 attr_valid, u64 attr_version)
{
	struct fuse_conn *fc = get_fuse_conn(inode);
	struct fuse_inode *fi = get_fuse_inode(inode);
P
Pavel Emelyanov 已提交
208
	bool is_wb = fc->writeback_cache;
M
Miklos Szeredi 已提交
209
	loff_t oldsize;
210
	struct timespec old_mtime;
M
Miklos Szeredi 已提交
211 212

	spin_lock(&fc->lock);
213 214
	if ((attr_version != 0 && fi->attr_version > attr_version) ||
	    test_bit(FUSE_I_SIZE_UNSTABLE, &fi->state)) {
M
Miklos Szeredi 已提交
215 216 217 218
		spin_unlock(&fc->lock);
		return;
	}

219
	old_mtime = inode->i_mtime;
M
Miklos Szeredi 已提交
220
	fuse_change_attributes_common(inode, attr, attr_valid);
221

222
	oldsize = inode->i_size;
P
Pavel Emelyanov 已提交
223 224 225 226 227 228 229
	/*
	 * In case of writeback_cache enabled, the cached writes beyond EOF
	 * extend local i_size without keeping userspace server in sync. So,
	 * attr->size coming from server can be stale. We cannot trust it.
	 */
	if (!is_wb || !S_ISREG(inode->i_mode))
		i_size_write(inode, attr->size);
230 231
	spin_unlock(&fc->lock);

P
Pavel Emelyanov 已提交
232
	if (!is_wb && S_ISREG(inode->i_mode)) {
233 234 235
		bool inval = false;

		if (oldsize != attr->size) {
236
			truncate_pagecache(inode, attr->size);
237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253
			inval = true;
		} else if (fc->auto_inval_data) {
			struct timespec new_mtime = {
				.tv_sec = attr->mtime,
				.tv_nsec = attr->mtimensec,
			};

			/*
			 * Auto inval mode also checks and invalidates if mtime
			 * has changed.
			 */
			if (!timespec_equal(&old_mtime, &new_mtime))
				inval = true;
		}

		if (inval)
			invalidate_inode_pages2(inode->i_mapping);
254
	}
M
Miklos Szeredi 已提交
255 256 257 258 259
}

static void fuse_init_inode(struct inode *inode, struct fuse_attr *attr)
{
	inode->i_mode = attr->mode & S_IFMT;
M
Miklos Szeredi 已提交
260
	inode->i_size = attr->size;
M
Maxim Patlasov 已提交
261 262
	inode->i_mtime.tv_sec  = attr->mtime;
	inode->i_mtime.tv_nsec = attr->mtimensec;
M
Maxim Patlasov 已提交
263 264
	inode->i_ctime.tv_sec  = attr->ctime;
	inode->i_ctime.tv_nsec = attr->ctimensec;
265 266
	if (S_ISREG(inode->i_mode)) {
		fuse_init_common(inode);
M
Miklos Szeredi 已提交
267
		fuse_init_file_inode(inode);
268 269 270 271 272 273 274 275 276
	} else if (S_ISDIR(inode->i_mode))
		fuse_init_dir(inode);
	else if (S_ISLNK(inode->i_mode))
		fuse_init_symlink(inode);
	else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) ||
		 S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) {
		fuse_init_common(inode);
		init_special_inode(inode, inode->i_mode,
				   new_decode_dev(attr->rdev));
277 278
	} else
		BUG();
M
Miklos Szeredi 已提交
279 280
}

J
John Muir 已提交
281
int fuse_inode_eq(struct inode *inode, void *_nodeidp)
M
Miklos Szeredi 已提交
282
{
M
Miklos Szeredi 已提交
283
	u64 nodeid = *(u64 *) _nodeidp;
M
Miklos Szeredi 已提交
284 285 286 287 288 289 290 291
	if (get_node_id(inode) == nodeid)
		return 1;
	else
		return 0;
}

static int fuse_inode_set(struct inode *inode, void *_nodeidp)
{
M
Miklos Szeredi 已提交
292
	u64 nodeid = *(u64 *) _nodeidp;
M
Miklos Szeredi 已提交
293 294 295 296
	get_fuse_inode(inode)->nodeid = nodeid;
	return 0;
}

M
Miklos Szeredi 已提交
297
struct inode *fuse_iget(struct super_block *sb, u64 nodeid,
298 299
			int generation, struct fuse_attr *attr,
			u64 attr_valid, u64 attr_version)
M
Miklos Szeredi 已提交
300 301
{
	struct inode *inode;
302
	struct fuse_inode *fi;
M
Miklos Szeredi 已提交
303 304 305 306 307 308 309 310
	struct fuse_conn *fc = get_fuse_conn_super(sb);

 retry:
	inode = iget5_locked(sb, nodeid, fuse_inode_eq, fuse_inode_set, &nodeid);
	if (!inode)
		return NULL;

	if ((inode->i_state & I_NEW)) {
M
Maxim Patlasov 已提交
311
		inode->i_flags |= S_NOATIME;
312
		if (!fc->writeback_cache || !S_ISREG(attr->mode))
M
Maxim Patlasov 已提交
313
			inode->i_flags |= S_NOCMTIME;
M
Miklos Szeredi 已提交
314 315 316 317 318 319 320 321 322 323
		inode->i_generation = generation;
		fuse_init_inode(inode, attr);
		unlock_new_inode(inode);
	} else if ((inode->i_mode ^ attr->mode) & S_IFMT) {
		/* Inode has changed type, any I/O on the old should fail */
		make_bad_inode(inode);
		iput(inode);
		goto retry;
	}

324
	fi = get_fuse_inode(inode);
325
	spin_lock(&fc->lock);
M
Miklos Szeredi 已提交
326
	fi->nlookup++;
327
	spin_unlock(&fc->lock);
328 329
	fuse_change_attributes(inode, attr, attr_valid, attr_version);

M
Miklos Szeredi 已提交
330 331 332
	return inode;
}

J
John Muir 已提交
333 334 335 336 337 338 339 340 341 342 343 344
int fuse_reverse_inval_inode(struct super_block *sb, u64 nodeid,
			     loff_t offset, loff_t len)
{
	struct inode *inode;
	pgoff_t pg_start;
	pgoff_t pg_end;

	inode = ilookup5(sb, nodeid, fuse_inode_eq, &nodeid);
	if (!inode)
		return -ENOENT;

	fuse_invalidate_attr(inode);
S
Seth Forshee 已提交
345
	forget_all_cached_acls(inode);
J
John Muir 已提交
346
	if (offset >= 0) {
347
		pg_start = offset >> PAGE_SHIFT;
J
John Muir 已提交
348 349 350
		if (len <= 0)
			pg_end = -1;
		else
351
			pg_end = (offset + len - 1) >> PAGE_SHIFT;
J
John Muir 已提交
352 353 354 355 356 357 358
		invalidate_inode_pages2_range(inode->i_mapping,
					      pg_start, pg_end);
	}
	iput(inode);
	return 0;
}

359 360 361 362 363 364 365 366 367 368 369 370
void fuse_lock_inode(struct inode *inode)
{
	if (!get_fuse_conn(inode)->parallel_dirops)
		mutex_lock(&get_fuse_inode(inode)->mutex);
}

void fuse_unlock_inode(struct inode *inode)
{
	if (!get_fuse_conn(inode)->parallel_dirops)
		mutex_unlock(&get_fuse_inode(inode)->mutex);
}

371
static void fuse_umount_begin(struct super_block *sb)
372
{
373
	fuse_abort_conn(get_fuse_conn_super(sb));
374 375
}

376 377 378 379 380 381
static void fuse_send_destroy(struct fuse_conn *fc)
{
	struct fuse_req *req = fc->destroy_req;
	if (req && fc->conn_init) {
		fc->destroy_req = NULL;
		req->in.h.opcode = FUSE_DESTROY;
M
Miklos Szeredi 已提交
382 383
		__set_bit(FR_FORCE, &req->flags);
		__clear_bit(FR_BACKGROUND, &req->flags);
384
		fuse_request_send(fc, req);
385 386 387 388
		fuse_put_request(fc, req);
	}
}

389 390 391 392 393
static void fuse_put_super(struct super_block *sb)
{
	struct fuse_conn *fc = get_fuse_conn_super(sb);

	fuse_send_destroy(fc);
M
Miklos Szeredi 已提交
394

M
Miklos Szeredi 已提交
395
	fuse_abort_conn(fc);
M
Miklos Szeredi 已提交
396 397 398 399 400
	mutex_lock(&fuse_mutex);
	list_del(&fc->entry);
	fuse_ctl_remove_conn(fc);
	mutex_unlock(&fuse_mutex);

401
	fuse_conn_put(fc);
M
Miklos Szeredi 已提交
402 403
}

404 405 406 407
static void convert_fuse_statfs(struct kstatfs *stbuf, struct fuse_kstatfs *attr)
{
	stbuf->f_type    = FUSE_SUPER_MAGIC;
	stbuf->f_bsize   = attr->bsize;
408
	stbuf->f_frsize  = attr->frsize;
409 410 411 412 413 414 415 416 417
	stbuf->f_blocks  = attr->blocks;
	stbuf->f_bfree   = attr->bfree;
	stbuf->f_bavail  = attr->bavail;
	stbuf->f_files   = attr->files;
	stbuf->f_ffree   = attr->ffree;
	stbuf->f_namelen = attr->namelen;
	/* fsid is left zero */
}

418
static int fuse_statfs(struct dentry *dentry, struct kstatfs *buf)
419
{
420
	struct super_block *sb = dentry->d_sb;
421
	struct fuse_conn *fc = get_fuse_conn_super(sb);
422
	FUSE_ARGS(args);
423 424 425
	struct fuse_statfs_out outarg;
	int err;

426
	if (!fuse_allow_current_process(fc)) {
M
Miklos Szeredi 已提交
427 428 429 430
		buf->f_type = FUSE_SUPER_MAGIC;
		return 0;
	}

431
	memset(&outarg, 0, sizeof(outarg));
432 433
	args.in.numargs = 0;
	args.in.h.opcode = FUSE_STATFS;
434
	args.in.h.nodeid = get_node_id(d_inode(dentry));
435
	args.out.numargs = 1;
436
	args.out.args[0].size = sizeof(outarg);
437 438
	args.out.args[0].value = &outarg;
	err = fuse_simple_request(fc, &args);
439 440 441 442 443
	if (!err)
		convert_fuse_statfs(buf, &outarg.st);
	return err;
}

M
Miklos Szeredi 已提交
444 445 446 447
enum {
	OPT_FD,
	OPT_ROOTMODE,
	OPT_USER_ID,
448
	OPT_GROUP_ID,
M
Miklos Szeredi 已提交
449 450
	OPT_DEFAULT_PERMISSIONS,
	OPT_ALLOW_OTHER,
451
	OPT_MAX_READ,
M
Miklos Szeredi 已提交
452
	OPT_BLKSIZE,
M
Miklos Szeredi 已提交
453 454 455
	OPT_ERR
};

456
static const match_table_t tokens = {
M
Miklos Szeredi 已提交
457 458 459
	{OPT_FD,			"fd=%u"},
	{OPT_ROOTMODE,			"rootmode=%o"},
	{OPT_USER_ID,			"user_id=%u"},
460
	{OPT_GROUP_ID,			"group_id=%u"},
M
Miklos Szeredi 已提交
461 462
	{OPT_DEFAULT_PERMISSIONS,	"default_permissions"},
	{OPT_ALLOW_OTHER,		"allow_other"},
463
	{OPT_MAX_READ,			"max_read=%u"},
M
Miklos Szeredi 已提交
464
	{OPT_BLKSIZE,			"blksize=%u"},
M
Miklos Szeredi 已提交
465 466 467
	{OPT_ERR,			NULL}
};

468 469 470 471 472 473 474 475 476 477 478
static int fuse_match_uint(substring_t *s, unsigned int *res)
{
	int err = -ENOMEM;
	char *buf = match_strdup(s);
	if (buf) {
		err = kstrtouint(buf, 10, res);
		kfree(buf);
	}
	return err;
}

M
Miklos Szeredi 已提交
479
static int parse_fuse_opt(char *opt, struct fuse_mount_data *d, int is_bdev)
M
Miklos Szeredi 已提交
480 481 482
{
	char *p;
	memset(d, 0, sizeof(struct fuse_mount_data));
483
	d->max_read = ~0;
M
Miklos Szeredi 已提交
484
	d->blksize = FUSE_DEFAULT_BLKSIZE;
M
Miklos Szeredi 已提交
485 486 487 488

	while ((p = strsep(&opt, ",")) != NULL) {
		int token;
		int value;
489
		unsigned uv;
M
Miklos Szeredi 已提交
490 491 492 493 494 495 496 497 498 499
		substring_t args[MAX_OPT_ARGS];
		if (!*p)
			continue;

		token = match_token(p, tokens, args);
		switch (token) {
		case OPT_FD:
			if (match_int(&args[0], &value))
				return 0;
			d->fd = value;
500
			d->fd_present = 1;
M
Miklos Szeredi 已提交
501 502 503 504 505
			break;

		case OPT_ROOTMODE:
			if (match_octal(&args[0], &value))
				return 0;
506 507
			if (!fuse_valid_type(value))
				return 0;
M
Miklos Szeredi 已提交
508
			d->rootmode = value;
509
			d->rootmode_present = 1;
M
Miklos Szeredi 已提交
510 511 512
			break;

		case OPT_USER_ID:
513
			if (fuse_match_uint(&args[0], &uv))
M
Miklos Szeredi 已提交
514
				return 0;
515
			d->user_id = make_kuid(current_user_ns(), uv);
516 517
			if (!uid_valid(d->user_id))
				return 0;
518
			d->user_id_present = 1;
M
Miklos Szeredi 已提交
519 520
			break;

521
		case OPT_GROUP_ID:
522
			if (fuse_match_uint(&args[0], &uv))
523
				return 0;
524
			d->group_id = make_kgid(current_user_ns(), uv);
525 526
			if (!gid_valid(d->group_id))
				return 0;
527
			d->group_id_present = 1;
528 529
			break;

M
Miklos Szeredi 已提交
530
		case OPT_DEFAULT_PERMISSIONS:
M
Miklos Szeredi 已提交
531
			d->default_permissions = 1;
M
Miklos Szeredi 已提交
532 533 534
			break;

		case OPT_ALLOW_OTHER:
M
Miklos Szeredi 已提交
535
			d->allow_other = 1;
M
Miklos Szeredi 已提交
536 537
			break;

538 539 540 541 542 543
		case OPT_MAX_READ:
			if (match_int(&args[0], &value))
				return 0;
			d->max_read = value;
			break;

M
Miklos Szeredi 已提交
544 545 546 547 548 549
		case OPT_BLKSIZE:
			if (!is_bdev || match_int(&args[0], &value))
				return 0;
			d->blksize = value;
			break;

M
Miklos Szeredi 已提交
550 551 552 553
		default:
			return 0;
		}
	}
554 555 556

	if (!d->fd_present || !d->rootmode_present ||
	    !d->user_id_present || !d->group_id_present)
M
Miklos Szeredi 已提交
557 558 559 560 561
		return 0;

	return 1;
}

562
static int fuse_show_options(struct seq_file *m, struct dentry *root)
M
Miklos Szeredi 已提交
563
{
564 565
	struct super_block *sb = root->d_sb;
	struct fuse_conn *fc = get_fuse_conn_super(sb);
M
Miklos Szeredi 已提交
566

567 568
	seq_printf(m, ",user_id=%u", from_kuid_munged(&init_user_ns, fc->user_id));
	seq_printf(m, ",group_id=%u", from_kgid_munged(&init_user_ns, fc->group_id));
M
Miklos Szeredi 已提交
569
	if (fc->default_permissions)
M
Miklos Szeredi 已提交
570
		seq_puts(m, ",default_permissions");
M
Miklos Szeredi 已提交
571
	if (fc->allow_other)
M
Miklos Szeredi 已提交
572
		seq_puts(m, ",allow_other");
573 574
	if (fc->max_read != ~0)
		seq_printf(m, ",max_read=%u", fc->max_read);
575 576
	if (sb->s_bdev && sb->s_blocksize != FUSE_DEFAULT_BLKSIZE)
		seq_printf(m, ",blksize=%lu", sb->s_blocksize);
M
Miklos Szeredi 已提交
577 578 579
	return 0;
}

M
Miklos Szeredi 已提交
580 581 582 583 584 585 586
static void fuse_iqueue_init(struct fuse_iqueue *fiq)
{
	memset(fiq, 0, sizeof(struct fuse_iqueue));
	init_waitqueue_head(&fiq->waitq);
	INIT_LIST_HEAD(&fiq->pending);
	INIT_LIST_HEAD(&fiq->interrupts);
	fiq->forget_list_tail = &fiq->forget_list_head;
587
	fiq->connected = 1;
M
Miklos Szeredi 已提交
588 589
}

590 591 592
static void fuse_pqueue_init(struct fuse_pqueue *fpq)
{
	memset(fpq, 0, sizeof(struct fuse_pqueue));
M
Miklos Szeredi 已提交
593
	spin_lock_init(&fpq->lock);
594 595
	INIT_LIST_HEAD(&fpq->processing);
	INIT_LIST_HEAD(&fpq->io);
596
	fpq->connected = 1;
597 598
}

599
void fuse_conn_init(struct fuse_conn *fc)
M
Miklos Szeredi 已提交
600
{
601 602
	memset(fc, 0, sizeof(*fc));
	spin_lock_init(&fc->lock);
J
John Muir 已提交
603
	init_rwsem(&fc->killsb);
604
	atomic_set(&fc->count, 1);
605
	atomic_set(&fc->dev_count, 1);
606 607
	init_waitqueue_head(&fc->blocked_waitq);
	init_waitqueue_head(&fc->reserved_req_waitq);
M
Miklos Szeredi 已提交
608
	fuse_iqueue_init(&fc->iq);
609 610
	INIT_LIST_HEAD(&fc->bg_queue);
	INIT_LIST_HEAD(&fc->entry);
611
	INIT_LIST_HEAD(&fc->devices);
612
	atomic_set(&fc->num_waiting, 0);
613 614
	fc->max_background = FUSE_DEFAULT_MAX_BACKGROUND;
	fc->congestion_threshold = FUSE_DEFAULT_CONGESTION_THRESHOLD;
615 616
	fc->khctr = 0;
	fc->polled_files = RB_ROOT;
617
	fc->blocked = 0;
M
Maxim Patlasov 已提交
618
	fc->initialized = 0;
619
	fc->connected = 1;
620 621
	fc->attr_version = 1;
	get_random_bytes(&fc->scramble_key, sizeof(fc->scramble_key));
M
Miklos Szeredi 已提交
622
}
623
EXPORT_SYMBOL_GPL(fuse_conn_init);
M
Miklos Szeredi 已提交
624

625 626
void fuse_conn_put(struct fuse_conn *fc)
{
627
	if (atomic_dec_and_test(&fc->count)) {
628 629
		if (fc->destroy_req)
			fuse_request_free(fc->destroy_req);
T
Tejun Heo 已提交
630
		fc->release(fc);
631
	}
632
}
633
EXPORT_SYMBOL_GPL(fuse_conn_put);
634 635 636 637 638 639

struct fuse_conn *fuse_conn_get(struct fuse_conn *fc)
{
	atomic_inc(&fc->count);
	return fc;
}
640
EXPORT_SYMBOL_GPL(fuse_conn_get);
641

642
static struct inode *fuse_get_root_inode(struct super_block *sb, unsigned mode)
M
Miklos Szeredi 已提交
643 644 645 646 647 648
{
	struct fuse_attr attr;
	memset(&attr, 0, sizeof(attr));

	attr.mode = mode;
	attr.ino = FUSE_ROOT_ID;
649
	attr.nlink = 1;
650
	return fuse_iget(sb, 1, 0, &attr, 0, 0);
M
Miklos Szeredi 已提交
651 652
}

M
Miklos Szeredi 已提交
653
struct fuse_inode_handle {
M
Miklos Szeredi 已提交
654 655 656 657 658 659 660
	u64 nodeid;
	u32 generation;
};

static struct dentry *fuse_get_dentry(struct super_block *sb,
				      struct fuse_inode_handle *handle)
{
661
	struct fuse_conn *fc = get_fuse_conn_super(sb);
M
Miklos Szeredi 已提交
662 663 664 665 666 667 668 669
	struct inode *inode;
	struct dentry *entry;
	int err = -ESTALE;

	if (handle->nodeid == 0)
		goto out_err;

	inode = ilookup5(sb, handle->nodeid, fuse_inode_eq, &handle->nodeid);
670 671
	if (!inode) {
		struct fuse_entry_out outarg;
A
Al Viro 已提交
672
		const struct qstr name = QSTR_INIT(".", 1);
673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688

		if (!fc->export_support)
			goto out_err;

		err = fuse_lookup_name(sb, handle->nodeid, &name, &outarg,
				       &inode);
		if (err && err != -ENOENT)
			goto out_err;
		if (err || !inode) {
			err = -ESTALE;
			goto out_err;
		}
		err = -EIO;
		if (get_node_id(inode) != handle->nodeid)
			goto out_iput;
	}
M
Miklos Szeredi 已提交
689 690 691 692
	err = -ESTALE;
	if (inode->i_generation != handle->generation)
		goto out_iput;

693
	entry = d_obtain_alias(inode);
A
Al Viro 已提交
694
	if (!IS_ERR(entry) && get_node_id(inode) != FUSE_ROOT_ID)
M
Miklos Szeredi 已提交
695 696 697 698 699 700 701 702 703 704
		fuse_invalidate_entry_cache(entry);

	return entry;

 out_iput:
	iput(inode);
 out_err:
	return ERR_PTR(err);
}

A
Al Viro 已提交
705 706
static int fuse_encode_fh(struct inode *inode, u32 *fh, int *max_len,
			   struct inode *parent)
M
Miklos Szeredi 已提交
707
{
A
Al Viro 已提交
708
	int len = parent ? 6 : 3;
M
Miklos Szeredi 已提交
709 710 711
	u64 nodeid;
	u32 generation;

712 713
	if (*max_len < len) {
		*max_len = len;
714
		return  FILEID_INVALID;
715
	}
M
Miklos Szeredi 已提交
716 717 718 719 720 721 722 723

	nodeid = get_fuse_inode(inode)->nodeid;
	generation = inode->i_generation;

	fh[0] = (u32)(nodeid >> 32);
	fh[1] = (u32)(nodeid & 0xffffffff);
	fh[2] = generation;

A
Al Viro 已提交
724
	if (parent) {
M
Miklos Szeredi 已提交
725 726 727 728 729 730 731 732 733
		nodeid = get_fuse_inode(parent)->nodeid;
		generation = parent->i_generation;

		fh[3] = (u32)(nodeid >> 32);
		fh[4] = (u32)(nodeid & 0xffffffff);
		fh[5] = generation;
	}

	*max_len = len;
A
Al Viro 已提交
734
	return parent ? 0x82 : 0x81;
M
Miklos Szeredi 已提交
735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764
}

static struct dentry *fuse_fh_to_dentry(struct super_block *sb,
		struct fid *fid, int fh_len, int fh_type)
{
	struct fuse_inode_handle handle;

	if ((fh_type != 0x81 && fh_type != 0x82) || fh_len < 3)
		return NULL;

	handle.nodeid = (u64) fid->raw[0] << 32;
	handle.nodeid |= (u64) fid->raw[1];
	handle.generation = fid->raw[2];
	return fuse_get_dentry(sb, &handle);
}

static struct dentry *fuse_fh_to_parent(struct super_block *sb,
		struct fid *fid, int fh_len, int fh_type)
{
	struct fuse_inode_handle parent;

	if (fh_type != 0x82 || fh_len < 6)
		return NULL;

	parent.nodeid = (u64) fid->raw[3] << 32;
	parent.nodeid |= (u64) fid->raw[4];
	parent.generation = fid->raw[5];
	return fuse_get_dentry(sb, &parent);
}

765 766
static struct dentry *fuse_get_parent(struct dentry *child)
{
767
	struct inode *child_inode = d_inode(child);
768 769 770 771
	struct fuse_conn *fc = get_fuse_conn(child_inode);
	struct inode *inode;
	struct dentry *parent;
	struct fuse_entry_out outarg;
A
Al Viro 已提交
772
	const struct qstr name = QSTR_INIT("..", 2);
773 774 775 776 777 778 779
	int err;

	if (!fc->export_support)
		return ERR_PTR(-ESTALE);

	err = fuse_lookup_name(child_inode->i_sb, get_node_id(child_inode),
			       &name, &outarg, &inode);
780 781 782
	if (err) {
		if (err == -ENOENT)
			return ERR_PTR(-ESTALE);
783 784
		return ERR_PTR(err);
	}
785 786

	parent = d_obtain_alias(inode);
A
Al Viro 已提交
787
	if (!IS_ERR(parent) && get_node_id(inode) != FUSE_ROOT_ID)
788 789 790 791
		fuse_invalidate_entry_cache(parent);

	return parent;
}
M
Miklos Szeredi 已提交
792 793 794 795 796

static const struct export_operations fuse_export_operations = {
	.fh_to_dentry	= fuse_fh_to_dentry,
	.fh_to_parent	= fuse_fh_to_parent,
	.encode_fh	= fuse_encode_fh,
797
	.get_parent	= fuse_get_parent,
M
Miklos Szeredi 已提交
798 799
};

800
static const struct super_operations fuse_super_operations = {
M
Miklos Szeredi 已提交
801 802
	.alloc_inode    = fuse_alloc_inode,
	.destroy_inode  = fuse_destroy_inode,
803
	.evict_inode	= fuse_evict_inode,
M
Miklos Szeredi 已提交
804
	.write_inode	= fuse_write_inode,
M
Miklos Szeredi 已提交
805
	.drop_inode	= generic_delete_inode,
806
	.remount_fs	= fuse_remount_fs,
M
Miklos Szeredi 已提交
807
	.put_super	= fuse_put_super,
808
	.umount_begin	= fuse_umount_begin,
809
	.statfs		= fuse_statfs,
M
Miklos Szeredi 已提交
810 811 812
	.show_options	= fuse_show_options,
};

813 814 815
static void sanitize_global_limit(unsigned *limit)
{
	if (*limit == 0)
816
		*limit = ((totalram_pages << PAGE_SHIFT) >> 13) /
817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860
			 sizeof(struct fuse_req);

	if (*limit >= 1 << 16)
		*limit = (1 << 16) - 1;
}

static int set_global_limit(const char *val, struct kernel_param *kp)
{
	int rv;

	rv = param_set_uint(val, kp);
	if (rv)
		return rv;

	sanitize_global_limit((unsigned *)kp->arg);

	return 0;
}

static void process_init_limits(struct fuse_conn *fc, struct fuse_init_out *arg)
{
	int cap_sys_admin = capable(CAP_SYS_ADMIN);

	if (arg->minor < 13)
		return;

	sanitize_global_limit(&max_user_bgreq);
	sanitize_global_limit(&max_user_congthresh);

	if (arg->max_background) {
		fc->max_background = arg->max_background;

		if (!cap_sys_admin && fc->max_background > max_user_bgreq)
			fc->max_background = max_user_bgreq;
	}
	if (arg->congestion_threshold) {
		fc->congestion_threshold = arg->congestion_threshold;

		if (!cap_sys_admin &&
		    fc->congestion_threshold > max_user_congthresh)
			fc->congestion_threshold = max_user_congthresh;
	}
}

861 862 863 864 865 866 867
static void process_init_reply(struct fuse_conn *fc, struct fuse_req *req)
{
	struct fuse_init_out *arg = &req->misc.init_out;

	if (req->out.h.error || arg->major != FUSE_KERNEL_VERSION)
		fc->conn_error = 1;
	else {
868 869
		unsigned long ra_pages;

870 871
		process_init_limits(fc, arg);

872
		if (arg->minor >= 6) {
873
			ra_pages = arg->max_readahead / PAGE_SIZE;
874 875
			if (arg->flags & FUSE_ASYNC_READ)
				fc->async_read = 1;
876 877
			if (!(arg->flags & FUSE_POSIX_LOCKS))
				fc->no_lock = 1;
M
Miklos Szeredi 已提交
878 879 880
			if (arg->minor >= 17) {
				if (!(arg->flags & FUSE_FLOCK_LOCKS))
					fc->no_flock = 1;
M
Miklos Szeredi 已提交
881 882 883
			} else {
				if (!(arg->flags & FUSE_POSIX_LOCKS))
					fc->no_flock = 1;
M
Miklos Szeredi 已提交
884
			}
885 886
			if (arg->flags & FUSE_ATOMIC_O_TRUNC)
				fc->atomic_o_trunc = 1;
887 888 889 890 891
			if (arg->minor >= 9) {
				/* LOOKUP has dependency on proto version */
				if (arg->flags & FUSE_EXPORT_SUPPORT)
					fc->export_support = 1;
			}
892 893
			if (arg->flags & FUSE_BIG_WRITES)
				fc->big_writes = 1;
894 895
			if (arg->flags & FUSE_DONT_MASK)
				fc->dont_mask = 1;
896 897
			if (arg->flags & FUSE_AUTO_INVAL_DATA)
				fc->auto_inval_data = 1;
898
			if (arg->flags & FUSE_DO_READDIRPLUS) {
899
				fc->do_readdirplus = 1;
900 901 902
				if (arg->flags & FUSE_READDIRPLUS_AUTO)
					fc->readdirplus_auto = 1;
			}
903 904
			if (arg->flags & FUSE_ASYNC_DIO)
				fc->async_dio = 1;
P
Pavel Emelyanov 已提交
905 906
			if (arg->flags & FUSE_WRITEBACK_CACHE)
				fc->writeback_cache = 1;
907 908
			if (arg->flags & FUSE_PARALLEL_DIROPS)
				fc->parallel_dirops = 1;
909 910
			if (arg->flags & FUSE_HANDLE_KILLPRIV)
				fc->handle_killpriv = 1;
911 912
			if (arg->time_gran && arg->time_gran <= 1000000000)
				fc->sb->s_time_gran = arg->time_gran;
S
Seth Forshee 已提交
913
			if ((arg->flags & FUSE_POSIX_ACL)) {
M
Miklos Szeredi 已提交
914
				fc->default_permissions = 1;
S
Seth Forshee 已提交
915 916 917
				fc->posix_acl = 1;
				fc->sb->s_xattr = fuse_acl_xattr_handlers;
			}
918
		} else {
919
			ra_pages = fc->max_read / PAGE_SIZE;
920
			fc->no_lock = 1;
M
Miklos Szeredi 已提交
921
			fc->no_flock = 1;
922
		}
923

924 925
		fc->sb->s_bdi->ra_pages =
				min(fc->sb->s_bdi->ra_pages, ra_pages);
926 927
		fc->minor = arg->minor;
		fc->max_write = arg->minor < 5 ? 4096 : arg->max_write;
928
		fc->max_write = max_t(unsigned, 4096, fc->max_write);
929
		fc->conn_init = 1;
930
	}
931
	fuse_set_initialized(fc);
932
	wake_up_all(&fc->blocked_waitq);
933 934
}

935
static void fuse_send_init(struct fuse_conn *fc, struct fuse_req *req)
936 937
{
	struct fuse_init_in *arg = &req->misc.init_in;
M
Miklos Szeredi 已提交
938

939 940
	arg->major = FUSE_KERNEL_VERSION;
	arg->minor = FUSE_KERNEL_MINOR_VERSION;
941
	arg->max_readahead = fc->sb->s_bdi->ra_pages * PAGE_SIZE;
942
	arg->flags |= FUSE_ASYNC_READ | FUSE_POSIX_LOCKS | FUSE_ATOMIC_O_TRUNC |
M
Miklos Szeredi 已提交
943
		FUSE_EXPORT_SUPPORT | FUSE_BIG_WRITES | FUSE_DONT_MASK |
M
Miklos Szeredi 已提交
944
		FUSE_SPLICE_WRITE | FUSE_SPLICE_MOVE | FUSE_SPLICE_READ |
945
		FUSE_FLOCK_LOCKS | FUSE_HAS_IOCTL_DIR | FUSE_AUTO_INVAL_DATA |
P
Pavel Emelyanov 已提交
946
		FUSE_DO_READDIRPLUS | FUSE_READDIRPLUS_AUTO | FUSE_ASYNC_DIO |
947
		FUSE_WRITEBACK_CACHE | FUSE_NO_OPEN_SUPPORT |
S
Seth Forshee 已提交
948
		FUSE_PARALLEL_DIROPS | FUSE_HANDLE_KILLPRIV | FUSE_POSIX_ACL;
949 950 951 952 953
	req->in.h.opcode = FUSE_INIT;
	req->in.numargs = 1;
	req->in.args[0].size = sizeof(*arg);
	req->in.args[0].value = arg;
	req->out.numargs = 1;
D
Daniel Mack 已提交
954
	/* Variable length argument used for backward compatibility
955 956 957 958 959 960
	   with interface version < 7.5.  Rest of init_out is zeroed
	   by do_get_request(), so a short reply is not a problem */
	req->out.argvar = 1;
	req->out.args[0].size = sizeof(struct fuse_init_out);
	req->out.args[0].value = &req->misc.init_out;
	req->end = process_init_reply;
961
	fuse_request_send_background(fc, req);
962 963
}

T
Tejun Heo 已提交
964 965
static void fuse_free_conn(struct fuse_conn *fc)
{
966
	WARN_ON(!list_empty(&fc->devices));
A
Al Viro 已提交
967
	kfree_rcu(fc, rcu);
T
Tejun Heo 已提交
968 969
}

970 971 972
static int fuse_bdi_init(struct fuse_conn *fc, struct super_block *sb)
{
	int err;
973
	char *suffix = "";
974

975 976 977 978
	if (sb->s_bdev)
		suffix = "-fuseblk";
	err = super_setup_bdi_name(sb, "%u:%u%s", MAJOR(fc->dev),
				   MINOR(fc->dev), suffix);
979 980 981
	if (err)
		return err;

982 983 984
	sb->s_bdi->ra_pages = (VM_MAX_READAHEAD * 1024) / PAGE_SIZE;
	/* fuse does it's own writeback accounting */
	sb->s_bdi->capabilities = BDI_CAP_NO_ACCT_WB | BDI_CAP_STRICTLIMIT;
985 986 987 988 989 990 991 992 993 994 995 996 997

	/*
	 * For a single fuse filesystem use max 1% of dirty +
	 * writeback threshold.
	 *
	 * This gives about 1M of write buffer for memory maps on a
	 * machine with 1G and 10% dirty_ratio, which should be more
	 * than enough.
	 *
	 * Privileged users can raise it by writing to
	 *
	 *    /sys/class/bdi/<bdi>/max_ratio
	 */
998
	bdi_set_max_ratio(sb->s_bdi, 1);
999 1000 1001 1002

	return 0;
}

1003 1004 1005 1006 1007 1008 1009
struct fuse_dev *fuse_dev_alloc(struct fuse_conn *fc)
{
	struct fuse_dev *fud;

	fud = kzalloc(sizeof(struct fuse_dev), GFP_KERNEL);
	if (fud) {
		fud->fc = fuse_conn_get(fc);
1010
		fuse_pqueue_init(&fud->pq);
1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035

		spin_lock(&fc->lock);
		list_add_tail(&fud->entry, &fc->devices);
		spin_unlock(&fc->lock);
	}

	return fud;
}
EXPORT_SYMBOL_GPL(fuse_dev_alloc);

void fuse_dev_free(struct fuse_dev *fud)
{
	struct fuse_conn *fc = fud->fc;

	if (fc) {
		spin_lock(&fc->lock);
		list_del(&fud->entry);
		spin_unlock(&fc->lock);

		fuse_conn_put(fc);
	}
	kfree(fud);
}
EXPORT_SYMBOL_GPL(fuse_dev_free);

M
Miklos Szeredi 已提交
1036 1037
static int fuse_fill_super(struct super_block *sb, void *data, int silent)
{
1038
	struct fuse_dev *fud;
M
Miklos Szeredi 已提交
1039 1040 1041 1042
	struct fuse_conn *fc;
	struct inode *root;
	struct fuse_mount_data d;
	struct file *file;
1043
	struct dentry *root_dentry;
1044
	struct fuse_req *init_req;
M
Miklos Szeredi 已提交
1045
	int err;
M
Miklos Szeredi 已提交
1046
	int is_bdev = sb->s_bdev != NULL;
M
Miklos Szeredi 已提交
1047

1048
	err = -EINVAL;
1049
	if (sb->s_flags & MS_MANDLOCK)
1050
		goto err;
1051

M
Miklos Szeredi 已提交
1052
	sb->s_flags &= ~(MS_NOSEC | MS_I_VERSION);
A
Al Viro 已提交
1053

H
Himangi Saraogi 已提交
1054
	if (!parse_fuse_opt(data, &d, is_bdev))
1055
		goto err;
M
Miklos Szeredi 已提交
1056

M
Miklos Szeredi 已提交
1057
	if (is_bdev) {
1058
#ifdef CONFIG_BLOCK
1059
		err = -EINVAL;
M
Miklos Szeredi 已提交
1060
		if (!sb_set_blocksize(sb, d.blksize))
1061
			goto err;
1062
#endif
M
Miklos Szeredi 已提交
1063
	} else {
1064 1065
		sb->s_blocksize = PAGE_SIZE;
		sb->s_blocksize_bits = PAGE_SHIFT;
M
Miklos Szeredi 已提交
1066
	}
M
Miklos Szeredi 已提交
1067 1068
	sb->s_magic = FUSE_SUPER_MAGIC;
	sb->s_op = &fuse_super_operations;
S
Seth Forshee 已提交
1069
	sb->s_xattr = fuse_xattr_handlers;
M
Miklos Szeredi 已提交
1070
	sb->s_maxbytes = MAX_LFS_FILESIZE;
1071
	sb->s_time_gran = 1;
M
Miklos Szeredi 已提交
1072
	sb->s_export_op = &fuse_export_operations;
M
Miklos Szeredi 已提交
1073 1074

	file = fget(d.fd);
1075
	err = -EINVAL;
M
Miklos Szeredi 已提交
1076
	if (!file)
1077
		goto err;
M
Miklos Szeredi 已提交
1078

1079 1080
	if ((file->f_op != &fuse_dev_operations) ||
	    (file->f_cred->user_ns != &init_user_ns))
1081
		goto err_fput;
M
Miklos Szeredi 已提交
1082

1083
	fc = kmalloc(sizeof(*fc), GFP_KERNEL);
1084 1085 1086
	err = -ENOMEM;
	if (!fc)
		goto err_fput;
M
Miklos Szeredi 已提交
1087

1088
	fuse_conn_init(fc);
1089
	fc->release = fuse_free_conn;
1090

1091 1092 1093 1094
	fud = fuse_dev_alloc(fc);
	if (!fud)
		goto err_put_conn;

1095
	fc->dev = sb->s_dev;
J
John Muir 已提交
1096
	fc->sb = sb;
1097 1098
	err = fuse_bdi_init(fc, sb);
	if (err)
1099
		goto err_dev_free;
1100

1101 1102 1103 1104 1105
	/* Handle umasking inside the fuse code */
	if (sb->s_flags & MS_POSIXACL)
		fc->dont_mask = 1;
	sb->s_flags |= MS_POSIXACL;

M
Miklos Szeredi 已提交
1106 1107
	fc->default_permissions = d.default_permissions;
	fc->allow_other = d.allow_other;
M
Miklos Szeredi 已提交
1108
	fc->user_id = d.user_id;
1109
	fc->group_id = d.group_id;
1110
	fc->max_read = max_t(unsigned, 4096, d.max_read);
M
Miklos Szeredi 已提交
1111

1112 1113 1114
	/* Used by get_root_inode() */
	sb->s_fs_info = fc;

M
Miklos Szeredi 已提交
1115
	err = -ENOMEM;
1116
	root = fuse_get_root_inode(sb, d.rootmode);
1117
	sb->s_d_op = &fuse_root_dentry_operations;
1118 1119
	root_dentry = d_make_root(root);
	if (!root_dentry)
1120
		goto err_dev_free;
1121
	/* Root dentry doesn't have .d_revalidate */
A
Al Viro 已提交
1122
	sb->s_d_op = &fuse_dentry_operations;
1123

1124
	init_req = fuse_request_alloc(0);
1125 1126
	if (!init_req)
		goto err_put_root;
M
Miklos Szeredi 已提交
1127
	__set_bit(FR_BACKGROUND, &init_req->flags);
1128

1129
	if (is_bdev) {
1130
		fc->destroy_req = fuse_request_alloc(0);
1131
		if (!fc->destroy_req)
J
Julia Lawall 已提交
1132
			goto err_free_init_req;
1133 1134
	}

1135
	mutex_lock(&fuse_mutex);
1136 1137
	err = -EINVAL;
	if (file->private_data)
1138
		goto err_unlock;
1139

1140 1141 1142 1143 1144
	err = fuse_ctl_add_conn(fc);
	if (err)
		goto err_unlock;

	list_add_tail(&fc->entry, &fuse_conn_list);
1145
	sb->s_root = root_dentry;
1146
	file->private_data = fud;
1147
	mutex_unlock(&fuse_mutex);
M
Miklos Szeredi 已提交
1148 1149 1150 1151 1152 1153
	/*
	 * atomic_dec_and_test() in fput() provides the necessary
	 * memory barrier for file->private_data to be visible on all
	 * CPUs after this
	 */
	fput(file);
1154

1155
	fuse_send_init(fc, init_req);
1156

M
Miklos Szeredi 已提交
1157 1158
	return 0;

1159 1160
 err_unlock:
	mutex_unlock(&fuse_mutex);
J
Julia Lawall 已提交
1161
 err_free_init_req:
1162
	fuse_request_free(init_req);
1163 1164
 err_put_root:
	dput(root_dentry);
1165 1166
 err_dev_free:
	fuse_dev_free(fud);
1167
 err_put_conn:
1168
	fuse_conn_put(fc);
1169 1170 1171
 err_fput:
	fput(file);
 err:
M
Miklos Szeredi 已提交
1172 1173 1174
	return err;
}

A
Al Viro 已提交
1175
static struct dentry *fuse_mount(struct file_system_type *fs_type,
1176
		       int flags, const char *dev_name,
A
Al Viro 已提交
1177
		       void *raw_data)
M
Miklos Szeredi 已提交
1178
{
A
Al Viro 已提交
1179
	return mount_nodev(fs_type, flags, raw_data, fuse_fill_super);
M
Miklos Szeredi 已提交
1180 1181
}

J
John Muir 已提交
1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194
static void fuse_kill_sb_anon(struct super_block *sb)
{
	struct fuse_conn *fc = get_fuse_conn_super(sb);

	if (fc) {
		down_write(&fc->killsb);
		fc->sb = NULL;
		up_write(&fc->killsb);
	}

	kill_anon_super(sb);
}

1195 1196 1197
static struct file_system_type fuse_fs_type = {
	.owner		= THIS_MODULE,
	.name		= "fuse",
M
Miklos Szeredi 已提交
1198
	.fs_flags	= FS_HAS_SUBTYPE,
A
Al Viro 已提交
1199
	.mount		= fuse_mount,
J
John Muir 已提交
1200
	.kill_sb	= fuse_kill_sb_anon,
1201
};
1202
MODULE_ALIAS_FS("fuse");
1203 1204

#ifdef CONFIG_BLOCK
A
Al Viro 已提交
1205
static struct dentry *fuse_mount_blk(struct file_system_type *fs_type,
1206
			   int flags, const char *dev_name,
A
Al Viro 已提交
1207
			   void *raw_data)
1208
{
A
Al Viro 已提交
1209
	return mount_bdev(fs_type, flags, dev_name, raw_data, fuse_fill_super);
1210 1211
}

J
John Muir 已提交
1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224
static void fuse_kill_sb_blk(struct super_block *sb)
{
	struct fuse_conn *fc = get_fuse_conn_super(sb);

	if (fc) {
		down_write(&fc->killsb);
		fc->sb = NULL;
		up_write(&fc->killsb);
	}

	kill_block_super(sb);
}

1225 1226 1227
static struct file_system_type fuseblk_fs_type = {
	.owner		= THIS_MODULE,
	.name		= "fuseblk",
A
Al Viro 已提交
1228
	.mount		= fuse_mount_blk,
J
John Muir 已提交
1229
	.kill_sb	= fuse_kill_sb_blk,
A
Alexey Dobriyan 已提交
1230
	.fs_flags	= FS_REQUIRES_DEV | FS_HAS_SUBTYPE,
1231
};
1232
MODULE_ALIAS_FS("fuseblk");
1233

1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253
static inline int register_fuseblk(void)
{
	return register_filesystem(&fuseblk_fs_type);
}

static inline void unregister_fuseblk(void)
{
	unregister_filesystem(&fuseblk_fs_type);
}
#else
static inline int register_fuseblk(void)
{
	return 0;
}

static inline void unregister_fuseblk(void)
{
}
#endif

1254
static void fuse_inode_init_once(void *foo)
M
Miklos Szeredi 已提交
1255
{
M
Miklos Szeredi 已提交
1256
	struct inode *inode = foo;
M
Miklos Szeredi 已提交
1257

C
Christoph Lameter 已提交
1258
	inode_init_once(inode);
M
Miklos Szeredi 已提交
1259 1260 1261 1262 1263 1264
}

static int __init fuse_fs_init(void)
{
	int err;

1265
	fuse_inode_cachep = kmem_cache_create("fuse_inode",
1266 1267
					      sizeof(struct fuse_inode), 0,
					      SLAB_HWCACHE_ALIGN|SLAB_ACCOUNT,
1268
					      fuse_inode_init_once);
1269 1270
	err = -ENOMEM;
	if (!fuse_inode_cachep)
1271 1272 1273 1274 1275 1276 1277 1278 1279
		goto out;

	err = register_fuseblk();
	if (err)
		goto out2;

	err = register_filesystem(&fuse_fs_type);
	if (err)
		goto out3;
1280 1281

	return 0;
M
Miklos Szeredi 已提交
1282

1283
 out3:
1284
	unregister_fuseblk();
1285 1286
 out2:
	kmem_cache_destroy(fuse_inode_cachep);
1287
 out:
M
Miklos Szeredi 已提交
1288 1289 1290 1291 1292 1293
	return err;
}

static void fuse_fs_cleanup(void)
{
	unregister_filesystem(&fuse_fs_type);
1294
	unregister_fuseblk();
1295 1296 1297 1298 1299 1300

	/*
	 * Make sure all delayed rcu free inodes are flushed before we
	 * destroy cache.
	 */
	rcu_barrier();
M
Miklos Szeredi 已提交
1301 1302 1303
	kmem_cache_destroy(fuse_inode_cachep);
}

1304 1305
static struct kobject *fuse_kobj;

1306 1307 1308 1309
static int fuse_sysfs_init(void)
{
	int err;

1310
	fuse_kobj = kobject_create_and_add("fuse", fs_kobj);
1311 1312
	if (!fuse_kobj) {
		err = -ENOMEM;
1313
		goto out_err;
1314
	}
1315

1316 1317
	err = sysfs_create_mount_point(fuse_kobj, "connections");
	if (err)
1318 1319 1320 1321 1322
		goto out_fuse_unregister;

	return 0;

 out_fuse_unregister:
1323
	kobject_put(fuse_kobj);
1324 1325 1326 1327 1328 1329
 out_err:
	return err;
}

static void fuse_sysfs_cleanup(void)
{
1330
	sysfs_remove_mount_point(fuse_kobj, "connections");
1331
	kobject_put(fuse_kobj);
1332 1333
}

M
Miklos Szeredi 已提交
1334 1335 1336 1337
static int __init fuse_init(void)
{
	int res;

M
Miklos Szeredi 已提交
1338
	printk(KERN_INFO "fuse init (API version %i.%i)\n",
M
Miklos Szeredi 已提交
1339 1340
	       FUSE_KERNEL_VERSION, FUSE_KERNEL_MINOR_VERSION);

1341
	INIT_LIST_HEAD(&fuse_conn_list);
M
Miklos Szeredi 已提交
1342 1343 1344 1345
	res = fuse_fs_init();
	if (res)
		goto err;

M
Miklos Szeredi 已提交
1346 1347 1348 1349
	res = fuse_dev_init();
	if (res)
		goto err_fs_cleanup;

1350 1351 1352 1353
	res = fuse_sysfs_init();
	if (res)
		goto err_dev_cleanup;

1354 1355 1356 1357
	res = fuse_ctl_init();
	if (res)
		goto err_sysfs_cleanup;

1358 1359 1360
	sanitize_global_limit(&max_user_bgreq);
	sanitize_global_limit(&max_user_congthresh);

M
Miklos Szeredi 已提交
1361 1362
	return 0;

1363 1364
 err_sysfs_cleanup:
	fuse_sysfs_cleanup();
1365 1366
 err_dev_cleanup:
	fuse_dev_cleanup();
M
Miklos Szeredi 已提交
1367 1368
 err_fs_cleanup:
	fuse_fs_cleanup();
M
Miklos Szeredi 已提交
1369 1370 1371 1372 1373 1374 1375 1376
 err:
	return res;
}

static void __exit fuse_exit(void)
{
	printk(KERN_DEBUG "fuse exit\n");

1377
	fuse_ctl_cleanup();
1378
	fuse_sysfs_cleanup();
M
Miklos Szeredi 已提交
1379
	fuse_fs_cleanup();
M
Miklos Szeredi 已提交
1380
	fuse_dev_cleanup();
M
Miklos Szeredi 已提交
1381 1382 1383 1384
}

module_init(fuse_init);
module_exit(fuse_exit);