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

  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/file.h>
#include <linux/sched.h>
#include <linux/namei.h>
15
#include <linux/slab.h>
S
Seth Forshee 已提交
16
#include <linux/xattr.h>
17

A
Al Viro 已提交
18
static bool fuse_use_readdirplus(struct inode *dir, struct dir_context *ctx)
19 20 21 22 23 24
{
	struct fuse_conn *fc = get_fuse_conn(dir);
	struct fuse_inode *fi = get_fuse_inode(dir);

	if (!fc->do_readdirplus)
		return false;
25 26
	if (!fc->readdirplus_auto)
		return true;
27 28
	if (test_and_clear_bit(FUSE_I_ADVISE_RDPLUS, &fi->state))
		return true;
A
Al Viro 已提交
29
	if (ctx->pos == 0)
30 31 32 33 34 35 36 37 38 39 40
		return true;
	return false;
}

static void fuse_advise_use_readdirplus(struct inode *dir)
{
	struct fuse_inode *fi = get_fuse_inode(dir);

	set_bit(FUSE_I_ADVISE_RDPLUS, &fi->state);
}

M
Miklos Szeredi 已提交
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
#if BITS_PER_LONG >= 64
static inline void fuse_dentry_settime(struct dentry *entry, u64 time)
{
	entry->d_time = time;
}

static inline u64 fuse_dentry_time(struct dentry *entry)
{
	return entry->d_time;
}
#else
/*
 * On 32 bit archs store the high 32 bits of time in d_fsdata
 */
static void fuse_dentry_settime(struct dentry *entry, u64 time)
{
	entry->d_time = time;
	entry->d_fsdata = (void *) (unsigned long) (time >> 32);
}

static u64 fuse_dentry_time(struct dentry *entry)
{
	return (u64) entry->d_time +
		((u64) (unsigned long) entry->d_fsdata << 32);
}
#endif

68 69 70 71 72 73 74 75 76
/*
 * FUSE caches dentries and attributes with separate timeout.  The
 * time in jiffies until the dentry/attributes are valid is stored in
 * dentry->d_time and fuse_inode->i_time respectively.
 */

/*
 * Calculate the time in jiffies until a dentry/attributes are valid
 */
M
Miklos Szeredi 已提交
77
static u64 time_to_jiffies(unsigned long sec, unsigned long nsec)
78
{
M
Miklos Szeredi 已提交
79 80
	if (sec || nsec) {
		struct timespec ts = {sec, nsec};
M
Miklos Szeredi 已提交
81
		return get_jiffies_64() + timespec_to_jiffies(&ts);
M
Miklos Szeredi 已提交
82
	} else
M
Miklos Szeredi 已提交
83
		return 0;
84 85
}

86 87 88 89
/*
 * Set dentry and possibly attribute timeouts from the lookup/mk*
 * replies
 */
90 91
static void fuse_change_entry_timeout(struct dentry *entry,
				      struct fuse_entry_out *o)
92
{
M
Miklos Szeredi 已提交
93 94
	fuse_dentry_settime(entry,
		time_to_jiffies(o->entry_valid, o->entry_valid_nsec));
95 96 97 98 99 100 101 102 103 104
}

static u64 attr_timeout(struct fuse_attr_out *o)
{
	return time_to_jiffies(o->attr_valid, o->attr_valid_nsec);
}

static u64 entry_attr_timeout(struct fuse_entry_out *o)
{
	return time_to_jiffies(o->attr_valid, o->attr_valid_nsec);
105 106
}

107 108 109 110
/*
 * Mark the attributes as stale, so that at the next call to
 * ->getattr() they will be fetched from userspace
 */
111 112
void fuse_invalidate_attr(struct inode *inode)
{
M
Miklos Szeredi 已提交
113
	get_fuse_inode(inode)->i_time = 0;
114 115
}

116 117 118 119 120 121 122 123 124 125
/**
 * Mark the attributes as stale due to an atime change.  Avoid the invalidate if
 * atime is not used.
 */
void fuse_invalidate_atime(struct inode *inode)
{
	if (!IS_RDONLY(inode))
		fuse_invalidate_attr(inode);
}

126 127 128 129 130 131 132 133
/*
 * Just mark the entry as stale, so that a next attempt to look it up
 * will result in a new lookup call to userspace
 *
 * This is called when a dentry is about to become negative and the
 * timeout is unknown (unlink, rmdir, rename and in some cases
 * lookup)
 */
M
Miklos Szeredi 已提交
134
void fuse_invalidate_entry_cache(struct dentry *entry)
135
{
M
Miklos Szeredi 已提交
136
	fuse_dentry_settime(entry, 0);
137 138
}

139 140 141 142
/*
 * Same as fuse_invalidate_entry_cache(), but also try to remove the
 * dentry from the hash
 */
143 144 145 146
static void fuse_invalidate_entry(struct dentry *entry)
{
	d_invalidate(entry);
	fuse_invalidate_entry_cache(entry);
147 148
}

149
static void fuse_lookup_init(struct fuse_conn *fc, struct fuse_args *args,
A
Al Viro 已提交
150
			     u64 nodeid, const struct qstr *name,
151 152
			     struct fuse_entry_out *outarg)
{
153
	memset(outarg, 0, sizeof(struct fuse_entry_out));
154 155 156 157 158 159
	args->in.h.opcode = FUSE_LOOKUP;
	args->in.h.nodeid = nodeid;
	args->in.numargs = 1;
	args->in.args[0].size = name->len + 1;
	args->in.args[0].value = name->name;
	args->out.numargs = 1;
160
	args->out.args[0].size = sizeof(struct fuse_entry_out);
161
	args->out.args[0].value = outarg;
162 163
}

164
u64 fuse_get_attr_version(struct fuse_conn *fc)
165 166 167 168 169 170 171 172 173 174 175 176 177 178
{
	u64 curr_version;

	/*
	 * The spin lock isn't actually needed on 64bit archs, but we
	 * don't yet care too much about such optimizations.
	 */
	spin_lock(&fc->lock);
	curr_version = fc->attr_version;
	spin_unlock(&fc->lock);

	return curr_version;
}

179 180 181 182 183 184 185 186 187
/*
 * Check whether the dentry is still valid
 *
 * If the entry validity timeout has expired and the dentry is
 * positive, try to redo the lookup.  If the lookup results in a
 * different inode, then let the VFS invalidate the dentry and redo
 * the lookup once more.  If the lookup results in the same inode,
 * then refresh the attributes, timeouts and mark the dentry valid.
 */
188
static int fuse_dentry_revalidate(struct dentry *entry, unsigned int flags)
189
{
190
	struct inode *inode;
191 192
	struct dentry *parent;
	struct fuse_conn *fc;
M
Miklos Szeredi 已提交
193
	struct fuse_inode *fi;
194
	int ret;
195

196
	inode = d_inode_rcu(entry);
197
	if (inode && is_bad_inode(inode))
198
		goto invalid;
199 200
	else if (time_before64(fuse_dentry_time(entry), get_jiffies_64()) ||
		 (flags & LOOKUP_REVAL)) {
201
		struct fuse_entry_out outarg;
202
		FUSE_ARGS(args);
203
		struct fuse_forget_link *forget;
204
		u64 attr_version;
205

206
		/* For negative dentries, always do a fresh lookup */
207
		if (!inode)
208
			goto invalid;
209

210
		ret = -ECHILD;
211
		if (flags & LOOKUP_RCU)
212
			goto out;
213

214
		fc = get_fuse_conn(inode);
215

216
		forget = fuse_alloc_forget();
217 218
		ret = -ENOMEM;
		if (!forget)
219
			goto out;
M
Miklos Szeredi 已提交
220

221
		attr_version = fuse_get_attr_version(fc);
222

223
		parent = dget_parent(entry);
224
		fuse_lookup_init(fc, &args, get_node_id(d_inode(parent)),
225
				 &entry->d_name, &outarg);
226
		ret = fuse_simple_request(fc, &args);
227
		dput(parent);
228
		/* Zero nodeid is same as -ENOENT */
229 230 231
		if (!ret && !outarg.nodeid)
			ret = -ENOENT;
		if (!ret) {
M
Miklos Szeredi 已提交
232
			fi = get_fuse_inode(inode);
233
			if (outarg.nodeid != get_node_id(inode)) {
234
				fuse_queue_forget(fc, forget, outarg.nodeid, 1);
235
				goto invalid;
236
			}
237
			spin_lock(&fc->lock);
M
Miklos Szeredi 已提交
238
			fi->nlookup++;
239
			spin_unlock(&fc->lock);
240
		}
241
		kfree(forget);
242 243 244
		if (ret == -ENOMEM)
			goto out;
		if (ret || (outarg.attr.mode ^ inode->i_mode) & S_IFMT)
245
			goto invalid;
246

247 248 249 250
		fuse_change_attributes(inode, &outarg.attr,
				       entry_attr_timeout(&outarg),
				       attr_version);
		fuse_change_entry_timeout(entry, &outarg);
251
	} else if (inode) {
M
Miklos Szeredi 已提交
252 253 254 255 256
		fi = get_fuse_inode(inode);
		if (flags & LOOKUP_RCU) {
			if (test_bit(FUSE_I_INIT_RDPLUS, &fi->state))
				return -ECHILD;
		} else if (test_and_clear_bit(FUSE_I_INIT_RDPLUS, &fi->state)) {
257
			parent = dget_parent(entry);
258
			fuse_advise_use_readdirplus(d_inode(parent));
259 260
			dput(parent);
		}
261
	}
262 263 264 265 266 267 268
	ret = 1;
out:
	return ret;

invalid:
	ret = 0;
	goto out;
269 270
}

271
static int invalid_nodeid(u64 nodeid)
272 273 274 275
{
	return !nodeid || nodeid == FUSE_ROOT_ID;
}

A
Al Viro 已提交
276
const struct dentry_operations fuse_dentry_operations = {
277 278 279
	.d_revalidate	= fuse_dentry_revalidate,
};

280
int fuse_valid_type(int m)
281 282 283 284 285
{
	return S_ISREG(m) || S_ISDIR(m) || S_ISLNK(m) || S_ISCHR(m) ||
		S_ISBLK(m) || S_ISFIFO(m) || S_ISSOCK(m);
}

A
Al Viro 已提交
286
int fuse_lookup_name(struct super_block *sb, u64 nodeid, const struct qstr *name,
287
		     struct fuse_entry_out *outarg, struct inode **inode)
288
{
289
	struct fuse_conn *fc = get_fuse_conn_super(sb);
290
	FUSE_ARGS(args);
291
	struct fuse_forget_link *forget;
292
	u64 attr_version;
293
	int err;
294

295 296 297 298
	*inode = NULL;
	err = -ENAMETOOLONG;
	if (name->len > FUSE_NAME_MAX)
		goto out;
299 300


301 302
	forget = fuse_alloc_forget();
	err = -ENOMEM;
303
	if (!forget)
304
		goto out;
M
Miklos Szeredi 已提交
305

306
	attr_version = fuse_get_attr_version(fc);
307

308 309
	fuse_lookup_init(fc, &args, nodeid, name, outarg);
	err = fuse_simple_request(fc, &args);
310
	/* Zero nodeid is same as -ENOENT, but with valid timeout */
311 312 313 314 315 316 317 318 319 320 321 322 323 324
	if (err || !outarg->nodeid)
		goto out_put_forget;

	err = -EIO;
	if (!outarg->nodeid)
		goto out_put_forget;
	if (!fuse_valid_type(outarg->attr.mode))
		goto out_put_forget;

	*inode = fuse_iget(sb, outarg->nodeid, outarg->generation,
			   &outarg->attr, entry_attr_timeout(outarg),
			   attr_version);
	err = -ENOMEM;
	if (!*inode) {
325
		fuse_queue_forget(fc, forget, outarg->nodeid, 1);
326
		goto out;
327
	}
328 329 330
	err = 0;

 out_put_forget:
331
	kfree(forget);
332 333 334 335 336
 out:
	return err;
}

static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry,
A
Al Viro 已提交
337
				  unsigned int flags)
338 339 340 341 342 343 344
{
	int err;
	struct fuse_entry_out outarg;
	struct inode *inode;
	struct dentry *newent;
	bool outarg_valid = true;

345
	fuse_lock_inode(dir);
346 347
	err = fuse_lookup_name(dir->i_sb, get_node_id(dir), &entry->d_name,
			       &outarg, &inode);
348
	fuse_unlock_inode(dir);
349 350 351 352 353 354 355 356 357 358
	if (err == -ENOENT) {
		outarg_valid = false;
		err = 0;
	}
	if (err)
		goto out_err;

	err = -EIO;
	if (inode && get_node_id(inode) == FUSE_ROOT_ID)
		goto out_iput;
359

360
	newent = d_splice_alias(inode, entry);
361 362 363
	err = PTR_ERR(newent);
	if (IS_ERR(newent))
		goto out_err;
364

365
	entry = newent ? newent : entry;
366
	if (outarg_valid)
367
		fuse_change_entry_timeout(entry, &outarg);
368 369
	else
		fuse_invalidate_entry_cache(entry);
370

371
	fuse_advise_use_readdirplus(dir);
372
	return newent;
373 374 375 376 377

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

380 381 382 383 384 385
/*
 * Atomic create+open operation
 *
 * If the filesystem doesn't support this, then fall back to separate
 * 'mknod' + 'open' requests.
 */
A
Al Viro 已提交
386
static int fuse_create_open(struct inode *dir, struct dentry *entry,
A
Al Viro 已提交
387
			    struct file *file, unsigned flags,
A
Al Viro 已提交
388
			    umode_t mode, int *opened)
M
Miklos Szeredi 已提交
389 390 391 392
{
	int err;
	struct inode *inode;
	struct fuse_conn *fc = get_fuse_conn(dir);
393
	FUSE_ARGS(args);
394
	struct fuse_forget_link *forget;
395
	struct fuse_create_in inarg;
M
Miklos Szeredi 已提交
396 397 398 399
	struct fuse_open_out outopen;
	struct fuse_entry_out outentry;
	struct fuse_file *ff;

400 401 402
	/* Userspace expects S_IFREG in create mode */
	BUG_ON((mode & S_IFMT) != S_IFREG);

403
	forget = fuse_alloc_forget();
404
	err = -ENOMEM;
405
	if (!forget)
406
		goto out_err;
407

408
	err = -ENOMEM;
T
Tejun Heo 已提交
409
	ff = fuse_file_alloc(fc);
M
Miklos Szeredi 已提交
410
	if (!ff)
411
		goto out_put_forget_req;
M
Miklos Szeredi 已提交
412

413 414 415
	if (!fc->dont_mask)
		mode &= ~current_umask();

M
Miklos Szeredi 已提交
416 417
	flags &= ~O_NOCTTY;
	memset(&inarg, 0, sizeof(inarg));
418
	memset(&outentry, 0, sizeof(outentry));
M
Miklos Szeredi 已提交
419 420
	inarg.flags = flags;
	inarg.mode = mode;
421
	inarg.umask = current_umask();
422 423 424
	args.in.h.opcode = FUSE_CREATE;
	args.in.h.nodeid = get_node_id(dir);
	args.in.numargs = 2;
425
	args.in.args[0].size = sizeof(inarg);
426 427 428 429
	args.in.args[0].value = &inarg;
	args.in.args[1].size = entry->d_name.len + 1;
	args.in.args[1].value = entry->d_name.name;
	args.out.numargs = 2;
430
	args.out.args[0].size = sizeof(outentry);
431 432 433 434
	args.out.args[0].value = &outentry;
	args.out.args[1].size = sizeof(outopen);
	args.out.args[1].value = &outopen;
	err = fuse_simple_request(fc, &args);
435
	if (err)
M
Miklos Szeredi 已提交
436 437 438
		goto out_free_ff;

	err = -EIO;
439
	if (!S_ISREG(outentry.attr.mode) || invalid_nodeid(outentry.nodeid))
M
Miklos Szeredi 已提交
440 441
		goto out_free_ff;

442 443 444
	ff->fh = outopen.fh;
	ff->nodeid = outentry.nodeid;
	ff->open_flags = outopen.open_flags;
M
Miklos Szeredi 已提交
445
	inode = fuse_iget(dir->i_sb, outentry.nodeid, outentry.generation,
446
			  &outentry.attr, entry_attr_timeout(&outentry), 0);
M
Miklos Szeredi 已提交
447 448
	if (!inode) {
		flags &= ~(O_CREAT | O_EXCL | O_TRUNC);
449
		fuse_sync_release(ff, flags);
450
		fuse_queue_forget(fc, forget, outentry.nodeid, 1);
451 452
		err = -ENOMEM;
		goto out_err;
M
Miklos Szeredi 已提交
453
	}
454
	kfree(forget);
M
Miklos Szeredi 已提交
455
	d_instantiate(entry, inode);
456
	fuse_change_entry_timeout(entry, &outentry);
457
	fuse_invalidate_attr(dir);
A
Al Viro 已提交
458 459
	err = finish_open(file, entry, generic_file_open, opened);
	if (err) {
460
		fuse_sync_release(ff, flags);
461 462 463
	} else {
		file->private_data = fuse_file_get(ff);
		fuse_finish_open(inode, file);
M
Miklos Szeredi 已提交
464
	}
A
Al Viro 已提交
465
	return err;
M
Miklos Szeredi 已提交
466

467
out_free_ff:
M
Miklos Szeredi 已提交
468
	fuse_file_free(ff);
469
out_put_forget_req:
470
	kfree(forget);
471
out_err:
A
Al Viro 已提交
472
	return err;
473 474 475
}

static int fuse_mknod(struct inode *, struct dentry *, umode_t, dev_t);
A
Al Viro 已提交
476
static int fuse_atomic_open(struct inode *dir, struct dentry *entry,
A
Al Viro 已提交
477
			    struct file *file, unsigned flags,
A
Al Viro 已提交
478
			    umode_t mode, int *opened)
479 480 481 482 483
{
	int err;
	struct fuse_conn *fc = get_fuse_conn(dir);
	struct dentry *res = NULL;

484
	if (d_in_lookup(entry)) {
A
Al Viro 已提交
485
		res = fuse_lookup(dir, entry, 0);
486
		if (IS_ERR(res))
A
Al Viro 已提交
487
			return PTR_ERR(res);
488 489 490 491 492

		if (res)
			entry = res;
	}

493
	if (!(flags & O_CREAT) || d_really_is_positive(entry))
494 495 496
		goto no_open;

	/* Only creates */
497
	*opened |= FILE_CREATED;
498 499 500 501

	if (fc->no_create)
		goto mknod;

A
Al Viro 已提交
502
	err = fuse_create_open(dir, entry, file, flags, mode, opened);
A
Al Viro 已提交
503
	if (err == -ENOSYS) {
504 505 506 507 508
		fc->no_create = 1;
		goto mknod;
	}
out_dput:
	dput(res);
A
Al Viro 已提交
509
	return err;
510 511 512

mknod:
	err = fuse_mknod(dir, entry, mode, 0);
A
Al Viro 已提交
513
	if (err)
514 515
		goto out_dput;
no_open:
A
Al Viro 已提交
516
	return finish_no_open(file, res);
M
Miklos Szeredi 已提交
517 518
}

519 520 521
/*
 * Code shared between mknod, mkdir, symlink and link
 */
522
static int create_new_entry(struct fuse_conn *fc, struct fuse_args *args,
523
			    struct inode *dir, struct dentry *entry,
A
Al Viro 已提交
524
			    umode_t mode)
525 526 527 528
{
	struct fuse_entry_out outarg;
	struct inode *inode;
	int err;
529
	struct fuse_forget_link *forget;
M
Miklos Szeredi 已提交
530

531
	forget = fuse_alloc_forget();
532
	if (!forget)
533
		return -ENOMEM;
534

535
	memset(&outarg, 0, sizeof(outarg));
536 537
	args->in.h.nodeid = get_node_id(dir);
	args->out.numargs = 1;
538
	args->out.args[0].size = sizeof(outarg);
539 540
	args->out.args[0].value = &outarg;
	err = fuse_simple_request(fc, args);
M
Miklos Szeredi 已提交
541 542 543
	if (err)
		goto out_put_forget_req;

544 545
	err = -EIO;
	if (invalid_nodeid(outarg.nodeid))
M
Miklos Szeredi 已提交
546
		goto out_put_forget_req;
547 548

	if ((outarg.attr.mode ^ mode) & S_IFMT)
M
Miklos Szeredi 已提交
549
		goto out_put_forget_req;
550

551
	inode = fuse_iget(dir->i_sb, outarg.nodeid, outarg.generation,
552
			  &outarg.attr, entry_attr_timeout(&outarg), 0);
553
	if (!inode) {
554
		fuse_queue_forget(fc, forget, outarg.nodeid, 1);
555 556
		return -ENOMEM;
	}
557
	kfree(forget);
558

559 560 561
	err = d_instantiate_no_diralias(entry, inode);
	if (err)
		return err;
562

563
	fuse_change_entry_timeout(entry, &outarg);
564 565
	fuse_invalidate_attr(dir);
	return 0;
566

M
Miklos Szeredi 已提交
567
 out_put_forget_req:
568
	kfree(forget);
569
	return err;
570 571
}

A
Al Viro 已提交
572
static int fuse_mknod(struct inode *dir, struct dentry *entry, umode_t mode,
573 574 575 576
		      dev_t rdev)
{
	struct fuse_mknod_in inarg;
	struct fuse_conn *fc = get_fuse_conn(dir);
577
	FUSE_ARGS(args);
578

579 580 581
	if (!fc->dont_mask)
		mode &= ~current_umask();

582 583 584
	memset(&inarg, 0, sizeof(inarg));
	inarg.mode = mode;
	inarg.rdev = new_encode_dev(rdev);
585
	inarg.umask = current_umask();
586 587
	args.in.h.opcode = FUSE_MKNOD;
	args.in.numargs = 2;
588
	args.in.args[0].size = sizeof(inarg);
589 590 591 592
	args.in.args[0].value = &inarg;
	args.in.args[1].size = entry->d_name.len + 1;
	args.in.args[1].value = entry->d_name.name;
	return create_new_entry(fc, &args, dir, entry, mode);
593 594
}

A
Al Viro 已提交
595
static int fuse_create(struct inode *dir, struct dentry *entry, umode_t mode,
A
Al Viro 已提交
596
		       bool excl)
597 598 599 600
{
	return fuse_mknod(dir, entry, mode, 0);
}

601
static int fuse_mkdir(struct inode *dir, struct dentry *entry, umode_t mode)
602 603 604
{
	struct fuse_mkdir_in inarg;
	struct fuse_conn *fc = get_fuse_conn(dir);
605
	FUSE_ARGS(args);
606

607 608 609
	if (!fc->dont_mask)
		mode &= ~current_umask();

610 611
	memset(&inarg, 0, sizeof(inarg));
	inarg.mode = mode;
612
	inarg.umask = current_umask();
613 614 615 616 617 618 619
	args.in.h.opcode = FUSE_MKDIR;
	args.in.numargs = 2;
	args.in.args[0].size = sizeof(inarg);
	args.in.args[0].value = &inarg;
	args.in.args[1].size = entry->d_name.len + 1;
	args.in.args[1].value = entry->d_name.name;
	return create_new_entry(fc, &args, dir, entry, S_IFDIR);
620 621 622 623 624 625 626
}

static int fuse_symlink(struct inode *dir, struct dentry *entry,
			const char *link)
{
	struct fuse_conn *fc = get_fuse_conn(dir);
	unsigned len = strlen(link) + 1;
627
	FUSE_ARGS(args);
628

629 630 631 632 633 634 635
	args.in.h.opcode = FUSE_SYMLINK;
	args.in.numargs = 2;
	args.in.args[0].size = entry->d_name.len + 1;
	args.in.args[0].value = entry->d_name.name;
	args.in.args[1].size = len;
	args.in.args[1].value = link;
	return create_new_entry(fc, &args, dir, entry, S_IFLNK);
636 637
}

S
Seth Forshee 已提交
638
void fuse_update_ctime(struct inode *inode)
M
Maxim Patlasov 已提交
639 640 641 642 643 644 645
{
	if (!IS_NOCMTIME(inode)) {
		inode->i_ctime = current_fs_time(inode->i_sb);
		mark_inode_dirty_sync(inode);
	}
}

646 647 648 649
static int fuse_unlink(struct inode *dir, struct dentry *entry)
{
	int err;
	struct fuse_conn *fc = get_fuse_conn(dir);
650 651 652 653 654 655 656 657
	FUSE_ARGS(args);

	args.in.h.opcode = FUSE_UNLINK;
	args.in.h.nodeid = get_node_id(dir);
	args.in.numargs = 1;
	args.in.args[0].size = entry->d_name.len + 1;
	args.in.args[0].value = entry->d_name.name;
	err = fuse_simple_request(fc, &args);
658
	if (!err) {
659
		struct inode *inode = d_inode(entry);
M
Miklos Szeredi 已提交
660
		struct fuse_inode *fi = get_fuse_inode(inode);
661

M
Miklos Szeredi 已提交
662 663
		spin_lock(&fc->lock);
		fi->attr_version = ++fc->attr_version;
664 665 666 667 668 669 670 671
		/*
		 * If i_nlink == 0 then unlink doesn't make sense, yet this can
		 * happen if userspace filesystem is careless.  It would be
		 * difficult to enforce correct nlink usage so just ignore this
		 * condition here
		 */
		if (inode->i_nlink > 0)
			drop_nlink(inode);
M
Miklos Szeredi 已提交
672
		spin_unlock(&fc->lock);
673 674
		fuse_invalidate_attr(inode);
		fuse_invalidate_attr(dir);
675
		fuse_invalidate_entry_cache(entry);
M
Maxim Patlasov 已提交
676
		fuse_update_ctime(inode);
677 678 679 680 681 682 683 684 685
	} else if (err == -EINTR)
		fuse_invalidate_entry(entry);
	return err;
}

static int fuse_rmdir(struct inode *dir, struct dentry *entry)
{
	int err;
	struct fuse_conn *fc = get_fuse_conn(dir);
686 687 688 689 690 691 692 693
	FUSE_ARGS(args);

	args.in.h.opcode = FUSE_RMDIR;
	args.in.h.nodeid = get_node_id(dir);
	args.in.numargs = 1;
	args.in.args[0].size = entry->d_name.len + 1;
	args.in.args[0].value = entry->d_name.name;
	err = fuse_simple_request(fc, &args);
694
	if (!err) {
695
		clear_nlink(d_inode(entry));
696
		fuse_invalidate_attr(dir);
697
		fuse_invalidate_entry_cache(entry);
698 699 700 701 702
	} else if (err == -EINTR)
		fuse_invalidate_entry(entry);
	return err;
}

M
Miklos Szeredi 已提交
703 704 705
static int fuse_rename_common(struct inode *olddir, struct dentry *oldent,
			      struct inode *newdir, struct dentry *newent,
			      unsigned int flags, int opcode, size_t argsize)
706 707
{
	int err;
M
Miklos Szeredi 已提交
708
	struct fuse_rename2_in inarg;
709
	struct fuse_conn *fc = get_fuse_conn(olddir);
710
	FUSE_ARGS(args);
711

M
Miklos Szeredi 已提交
712
	memset(&inarg, 0, argsize);
713
	inarg.newdir = get_node_id(newdir);
M
Miklos Szeredi 已提交
714
	inarg.flags = flags;
715 716 717 718 719 720 721 722 723 724
	args.in.h.opcode = opcode;
	args.in.h.nodeid = get_node_id(olddir);
	args.in.numargs = 3;
	args.in.args[0].size = argsize;
	args.in.args[0].value = &inarg;
	args.in.args[1].size = oldent->d_name.len + 1;
	args.in.args[1].value = oldent->d_name.name;
	args.in.args[2].size = newent->d_name.len + 1;
	args.in.args[2].value = newent->d_name.name;
	err = fuse_simple_request(fc, &args);
725
	if (!err) {
726
		/* ctime changes */
727 728
		fuse_invalidate_attr(d_inode(oldent));
		fuse_update_ctime(d_inode(oldent));
729

M
Miklos Szeredi 已提交
730
		if (flags & RENAME_EXCHANGE) {
731 732
			fuse_invalidate_attr(d_inode(newent));
			fuse_update_ctime(d_inode(newent));
M
Miklos Szeredi 已提交
733 734
		}

735 736 737
		fuse_invalidate_attr(olddir);
		if (olddir != newdir)
			fuse_invalidate_attr(newdir);
738 739

		/* newent will end up negative */
740 741
		if (!(flags & RENAME_EXCHANGE) && d_really_is_positive(newent)) {
			fuse_invalidate_attr(d_inode(newent));
742
			fuse_invalidate_entry_cache(newent);
743
			fuse_update_ctime(d_inode(newent));
M
Miklos Szeredi 已提交
744
		}
745 746 747 748 749 750 751
	} else if (err == -EINTR) {
		/* If request was interrupted, DEITY only knows if the
		   rename actually took place.  If the invalidation
		   fails (e.g. some process has CWD under the renamed
		   directory), then there can be inconsistency between
		   the dcache and the real filesystem.  Tough luck. */
		fuse_invalidate_entry(oldent);
752
		if (d_really_is_positive(newent))
753 754 755 756 757 758
			fuse_invalidate_entry(newent);
	}

	return err;
}

M
Miklos Szeredi 已提交
759 760 761 762 763 764 765 766 767 768
static int fuse_rename2(struct inode *olddir, struct dentry *oldent,
			struct inode *newdir, struct dentry *newent,
			unsigned int flags)
{
	struct fuse_conn *fc = get_fuse_conn(olddir);
	int err;

	if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE))
		return -EINVAL;

M
Miklos Szeredi 已提交
769 770 771
	if (flags) {
		if (fc->no_rename2 || fc->minor < 23)
			return -EINVAL;
M
Miklos Szeredi 已提交
772

M
Miklos Szeredi 已提交
773 774 775 776 777 778 779 780 781 782 783
		err = fuse_rename_common(olddir, oldent, newdir, newent, flags,
					 FUSE_RENAME2,
					 sizeof(struct fuse_rename2_in));
		if (err == -ENOSYS) {
			fc->no_rename2 = 1;
			err = -EINVAL;
		}
	} else {
		err = fuse_rename_common(olddir, oldent, newdir, newent, 0,
					 FUSE_RENAME,
					 sizeof(struct fuse_rename_in));
M
Miklos Szeredi 已提交
784
	}
M
Miklos Szeredi 已提交
785

M
Miklos Szeredi 已提交
786
	return err;
M
Miklos Szeredi 已提交
787
}
M
Miklos Szeredi 已提交
788

789 790 791 792 793
static int fuse_link(struct dentry *entry, struct inode *newdir,
		     struct dentry *newent)
{
	int err;
	struct fuse_link_in inarg;
794
	struct inode *inode = d_inode(entry);
795
	struct fuse_conn *fc = get_fuse_conn(inode);
796
	FUSE_ARGS(args);
797 798 799

	memset(&inarg, 0, sizeof(inarg));
	inarg.oldnodeid = get_node_id(inode);
800 801 802 803 804 805 806
	args.in.h.opcode = FUSE_LINK;
	args.in.numargs = 2;
	args.in.args[0].size = sizeof(inarg);
	args.in.args[0].value = &inarg;
	args.in.args[1].size = newent->d_name.len + 1;
	args.in.args[1].value = newent->d_name.name;
	err = create_new_entry(fc, &args, newdir, newent, inode->i_mode);
807 808 809 810 811 812
	/* Contrary to "normal" filesystems it can happen that link
	   makes two "logical" inodes point to the same "physical"
	   inode.  We invalidate the attributes of the old one, so it
	   will reflect changes in the backing inode (link count,
	   etc.)
	*/
M
Miklos Szeredi 已提交
813 814 815 816 817 818 819
	if (!err) {
		struct fuse_inode *fi = get_fuse_inode(inode);

		spin_lock(&fc->lock);
		fi->attr_version = ++fc->attr_version;
		inc_nlink(inode);
		spin_unlock(&fc->lock);
820
		fuse_invalidate_attr(inode);
M
Maxim Patlasov 已提交
821
		fuse_update_ctime(inode);
M
Miklos Szeredi 已提交
822 823 824
	} else if (err == -EINTR) {
		fuse_invalidate_attr(inode);
	}
825 826 827
	return err;
}

828 829 830
static void fuse_fillattr(struct inode *inode, struct fuse_attr *attr,
			  struct kstat *stat)
{
M
Miklos Szeredi 已提交
831
	unsigned int blkbits;
P
Pavel Emelyanov 已提交
832 833 834
	struct fuse_conn *fc = get_fuse_conn(inode);

	/* see the comment in fuse_change_attributes() */
M
Maxim Patlasov 已提交
835
	if (fc->writeback_cache && S_ISREG(inode->i_mode)) {
P
Pavel Emelyanov 已提交
836
		attr->size = i_size_read(inode);
M
Maxim Patlasov 已提交
837 838
		attr->mtime = inode->i_mtime.tv_sec;
		attr->mtimensec = inode->i_mtime.tv_nsec;
M
Maxim Patlasov 已提交
839 840
		attr->ctime = inode->i_ctime.tv_sec;
		attr->ctimensec = inode->i_ctime.tv_nsec;
M
Maxim Patlasov 已提交
841
	}
M
Miklos Szeredi 已提交
842

843 844 845 846
	stat->dev = inode->i_sb->s_dev;
	stat->ino = attr->ino;
	stat->mode = (inode->i_mode & S_IFMT) | (attr->mode & 07777);
	stat->nlink = attr->nlink;
847 848
	stat->uid = make_kuid(&init_user_ns, attr->uid);
	stat->gid = make_kgid(&init_user_ns, attr->gid);
849 850 851 852 853 854 855 856 857
	stat->rdev = inode->i_rdev;
	stat->atime.tv_sec = attr->atime;
	stat->atime.tv_nsec = attr->atimensec;
	stat->mtime.tv_sec = attr->mtime;
	stat->mtime.tv_nsec = attr->mtimensec;
	stat->ctime.tv_sec = attr->ctime;
	stat->ctime.tv_nsec = attr->ctimensec;
	stat->size = attr->size;
	stat->blocks = attr->blocks;
M
Miklos Szeredi 已提交
858 859 860 861 862 863 864

	if (attr->blksize != 0)
		blkbits = ilog2(attr->blksize);
	else
		blkbits = inode->i_sb->s_blocksize_bits;

	stat->blksize = 1 << blkbits;
865 866
}

867 868
static int fuse_do_getattr(struct inode *inode, struct kstat *stat,
			   struct file *file)
869 870
{
	int err;
871 872
	struct fuse_getattr_in inarg;
	struct fuse_attr_out outarg;
873
	struct fuse_conn *fc = get_fuse_conn(inode);
874
	FUSE_ARGS(args);
875 876
	u64 attr_version;

877
	attr_version = fuse_get_attr_version(fc);
878

879
	memset(&inarg, 0, sizeof(inarg));
880
	memset(&outarg, 0, sizeof(outarg));
881 882 883 884 885 886 887
	/* Directories have separate file-handle space */
	if (file && S_ISREG(inode->i_mode)) {
		struct fuse_file *ff = file->private_data;

		inarg.getattr_flags |= FUSE_GETATTR_FH;
		inarg.fh = ff->fh;
	}
888 889 890 891 892 893
	args.in.h.opcode = FUSE_GETATTR;
	args.in.h.nodeid = get_node_id(inode);
	args.in.numargs = 1;
	args.in.args[0].size = sizeof(inarg);
	args.in.args[0].value = &inarg;
	args.out.numargs = 1;
894
	args.out.args[0].size = sizeof(outarg);
895 896
	args.out.args[0].value = &outarg;
	err = fuse_simple_request(fc, &args);
897
	if (!err) {
898
		if ((inode->i_mode ^ outarg.attr.mode) & S_IFMT) {
899 900 901
			make_bad_inode(inode);
			err = -EIO;
		} else {
902 903
			fuse_change_attributes(inode, &outarg.attr,
					       attr_timeout(&outarg),
904 905
					       attr_version);
			if (stat)
906
				fuse_fillattr(inode, &outarg.attr, stat);
907 908 909 910 911
		}
	}
	return err;
}

M
Miklos Szeredi 已提交
912 913 914 915 916 917 918
int fuse_update_attributes(struct inode *inode, struct kstat *stat,
			   struct file *file, bool *refreshed)
{
	struct fuse_inode *fi = get_fuse_inode(inode);
	int err;
	bool r;

M
Miklos Szeredi 已提交
919
	if (time_before64(fi->i_time, get_jiffies_64())) {
M
Miklos Szeredi 已提交
920 921 922 923 924 925 926 927
		r = true;
		err = fuse_do_getattr(inode, stat, file);
	} else {
		r = false;
		err = 0;
		if (stat) {
			generic_fillattr(inode, stat);
			stat->mode = fi->orig_i_mode;
928
			stat->ino = fi->orig_ino;
M
Miklos Szeredi 已提交
929 930 931 932 933 934 935 936 937
		}
	}

	if (refreshed != NULL)
		*refreshed = r;

	return err;
}

J
John Muir 已提交
938
int fuse_reverse_inval_entry(struct super_block *sb, u64 parent_nodeid,
939
			     u64 child_nodeid, struct qstr *name)
J
John Muir 已提交
940 941 942 943 944 945 946 947 948 949
{
	int err = -ENOTDIR;
	struct inode *parent;
	struct dentry *dir;
	struct dentry *entry;

	parent = ilookup5(sb, parent_nodeid, fuse_inode_eq, &parent_nodeid);
	if (!parent)
		return -ENOENT;

A
Al Viro 已提交
950
	inode_lock(parent);
J
John Muir 已提交
951 952 953 954 955 956 957 958
	if (!S_ISDIR(parent->i_mode))
		goto unlock;

	err = -ENOENT;
	dir = d_find_alias(parent);
	if (!dir)
		goto unlock;

959
	name->hash = full_name_hash(dir, name->name, name->len);
J
John Muir 已提交
960 961 962 963 964 965 966
	entry = d_lookup(dir, name);
	dput(dir);
	if (!entry)
		goto unlock;

	fuse_invalidate_attr(parent);
	fuse_invalidate_entry(entry);
967

968
	if (child_nodeid != 0 && d_really_is_positive(entry)) {
A
Al Viro 已提交
969
		inode_lock(d_inode(entry));
970
		if (get_node_id(d_inode(entry)) != child_nodeid) {
971 972 973 974 975 976 977
			err = -ENOENT;
			goto badentry;
		}
		if (d_mountpoint(entry)) {
			err = -EBUSY;
			goto badentry;
		}
978
		if (d_is_dir(entry)) {
979 980 981 982 983
			shrink_dcache_parent(entry);
			if (!simple_empty(entry)) {
				err = -ENOTEMPTY;
				goto badentry;
			}
984
			d_inode(entry)->i_flags |= S_DEAD;
985 986
		}
		dont_mount(entry);
987
		clear_nlink(d_inode(entry));
988 989
		err = 0;
 badentry:
A
Al Viro 已提交
990
		inode_unlock(d_inode(entry));
991 992 993 994 995
		if (!err)
			d_delete(entry);
	} else {
		err = 0;
	}
J
John Muir 已提交
996 997 998
	dput(entry);

 unlock:
A
Al Viro 已提交
999
	inode_unlock(parent);
J
John Muir 已提交
1000 1001 1002 1003
	iput(parent);
	return err;
}

1004 1005
/*
 * Calling into a user-controlled filesystem gives the filesystem
1006
 * daemon ptrace-like capabilities over the current process.  This
1007 1008 1009 1010 1011 1012 1013 1014 1015 1016
 * means, that the filesystem daemon is able to record the exact
 * filesystem operations performed, and can also control the behavior
 * of the requester process in otherwise impossible ways.  For example
 * it can delay the operation for arbitrary length of time allowing
 * DoS against the requester.
 *
 * For this reason only those processes can call into the filesystem,
 * for which the owner of the mount has ptrace privilege.  This
 * excludes processes started by other users, suid or sgid processes.
 */
1017
int fuse_allow_current_process(struct fuse_conn *fc)
1018
{
1019
	const struct cred *cred;
1020

1021
	if (fc->flags & FUSE_ALLOW_OTHER)
1022 1023
		return 1;

1024
	cred = current_cred();
1025 1026 1027 1028 1029 1030
	if (uid_eq(cred->euid, fc->user_id) &&
	    uid_eq(cred->suid, fc->user_id) &&
	    uid_eq(cred->uid,  fc->user_id) &&
	    gid_eq(cred->egid, fc->group_id) &&
	    gid_eq(cred->sgid, fc->group_id) &&
	    gid_eq(cred->gid,  fc->group_id))
1031
		return 1;
1032

1033
	return 0;
1034 1035
}

M
Miklos Szeredi 已提交
1036 1037 1038
static int fuse_access(struct inode *inode, int mask)
{
	struct fuse_conn *fc = get_fuse_conn(inode);
1039
	FUSE_ARGS(args);
M
Miklos Szeredi 已提交
1040 1041 1042
	struct fuse_access_in inarg;
	int err;

1043 1044
	BUG_ON(mask & MAY_NOT_BLOCK);

M
Miklos Szeredi 已提交
1045 1046 1047 1048
	if (fc->no_access)
		return 0;

	memset(&inarg, 0, sizeof(inarg));
1049
	inarg.mask = mask & (MAY_READ | MAY_WRITE | MAY_EXEC);
1050 1051 1052 1053 1054 1055
	args.in.h.opcode = FUSE_ACCESS;
	args.in.h.nodeid = get_node_id(inode);
	args.in.numargs = 1;
	args.in.args[0].size = sizeof(inarg);
	args.in.args[0].value = &inarg;
	err = fuse_simple_request(fc, &args);
M
Miklos Szeredi 已提交
1056 1057 1058 1059 1060 1061 1062
	if (err == -ENOSYS) {
		fc->no_access = 1;
		err = 0;
	}
	return err;
}

1063
static int fuse_perm_getattr(struct inode *inode, int mask)
1064
{
1065
	if (mask & MAY_NOT_BLOCK)
1066 1067 1068 1069 1070
		return -ECHILD;

	return fuse_do_getattr(inode, NULL, NULL);
}

1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083
/*
 * Check permission.  The two basic access models of FUSE are:
 *
 * 1) Local access checking ('default_permissions' mount option) based
 * on file mode.  This is the plain old disk filesystem permission
 * modell.
 *
 * 2) "Remote" access checking, where server is responsible for
 * checking permission in each inode operation.  An exception to this
 * is if ->permission() was invoked from sys_access() in which case an
 * access request is sent.  Execute permission is still checked
 * locally based on file mode.
 */
1084
static int fuse_permission(struct inode *inode, int mask)
1085 1086
{
	struct fuse_conn *fc = get_fuse_conn(inode);
1087 1088
	bool refreshed = false;
	int err = 0;
1089

1090
	if (!fuse_allow_current_process(fc))
1091
		return -EACCES;
1092 1093

	/*
1094
	 * If attributes are needed, refresh them before proceeding
1095
	 */
1096 1097
	if ((fc->flags & FUSE_DEFAULT_PERMISSIONS) ||
	    ((mask & MAY_EXEC) && S_ISREG(inode->i_mode))) {
1098 1099
		struct fuse_inode *fi = get_fuse_inode(inode);

M
Miklos Szeredi 已提交
1100
		if (time_before64(fi->i_time, get_jiffies_64())) {
1101 1102
			refreshed = true;

1103
			err = fuse_perm_getattr(inode, mask);
1104 1105 1106
			if (err)
				return err;
		}
1107 1108 1109
	}

	if (fc->flags & FUSE_DEFAULT_PERMISSIONS) {
1110
		err = generic_permission(inode, mask);
M
Miklos Szeredi 已提交
1111 1112 1113 1114

		/* If permission is denied, try to refresh file
		   attributes.  This is also needed, because the root
		   node will at first have no permissions */
1115
		if (err == -EACCES && !refreshed) {
1116
			err = fuse_perm_getattr(inode, mask);
M
Miklos Szeredi 已提交
1117
			if (!err)
1118
				err = generic_permission(inode, mask);
M
Miklos Szeredi 已提交
1119 1120
		}

1121 1122 1123 1124
		/* Note: the opposite of the above test does not
		   exist.  So if permissions are revoked this won't be
		   noticed immediately, only after the attribute
		   timeout has expired */
E
Eric Paris 已提交
1125
	} else if (mask & (MAY_ACCESS | MAY_CHDIR)) {
1126 1127 1128 1129 1130 1131
		err = fuse_access(inode, mask);
	} else if ((mask & MAY_EXEC) && S_ISREG(inode->i_mode)) {
		if (!(inode->i_mode & S_IXUGO)) {
			if (refreshed)
				return -EACCES;

1132
			err = fuse_perm_getattr(inode, mask);
1133 1134 1135
			if (!err && !(inode->i_mode & S_IXUGO))
				return -EACCES;
		}
1136
	}
1137
	return err;
1138 1139 1140
}

static int parse_dirfile(char *buf, size_t nbytes, struct file *file,
A
Al Viro 已提交
1141
			 struct dir_context *ctx)
1142 1143 1144 1145 1146 1147 1148 1149
{
	while (nbytes >= FUSE_NAME_OFFSET) {
		struct fuse_dirent *dirent = (struct fuse_dirent *) buf;
		size_t reclen = FUSE_DIRENT_SIZE(dirent);
		if (!dirent->namelen || dirent->namelen > FUSE_NAME_MAX)
			return -EIO;
		if (reclen > nbytes)
			break;
1150 1151
		if (memchr(dirent->name, '/', dirent->namelen) != NULL)
			return -EIO;
1152

A
Al Viro 已提交
1153 1154
		if (!dir_emit(ctx, dirent->name, dirent->namelen,
			       dirent->ino, dirent->type))
1155 1156 1157 1158
			break;

		buf += reclen;
		nbytes -= reclen;
A
Al Viro 已提交
1159
		ctx->pos = dirent->off;
1160 1161 1162 1163 1164
	}

	return 0;
}

1165 1166 1167 1168 1169 1170 1171 1172 1173 1174
static int fuse_direntplus_link(struct file *file,
				struct fuse_direntplus *direntplus,
				u64 attr_version)
{
	struct fuse_entry_out *o = &direntplus->entry_out;
	struct fuse_dirent *dirent = &direntplus->dirent;
	struct dentry *parent = file->f_path.dentry;
	struct qstr name = QSTR_INIT(dirent->name, dirent->namelen);
	struct dentry *dentry;
	struct dentry *alias;
1175
	struct inode *dir = d_inode(parent);
1176 1177
	struct fuse_conn *fc;
	struct inode *inode;
A
Al Viro 已提交
1178
	DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq);
1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200

	if (!o->nodeid) {
		/*
		 * Unlike in the case of fuse_lookup, zero nodeid does not mean
		 * ENOENT. Instead, it only means the userspace filesystem did
		 * not want to return attributes/handle for this entry.
		 *
		 * So do nothing.
		 */
		return 0;
	}

	if (name.name[0] == '.') {
		/*
		 * We could potentially refresh the attributes of the directory
		 * and its parent?
		 */
		if (name.len == 1)
			return 0;
		if (name.name[1] == '.' && name.len == 2)
			return 0;
	}
1201 1202 1203 1204 1205 1206

	if (invalid_nodeid(o->nodeid))
		return -EIO;
	if (!fuse_valid_type(o->attr.mode))
		return -EIO;

1207 1208
	fc = get_fuse_conn(dir);

1209
	name.hash = full_name_hash(parent, name.name, name.len);
1210
	dentry = d_lookup(parent, &name);
A
Al Viro 已提交
1211 1212 1213 1214 1215 1216 1217 1218
	if (!dentry) {
retry:
		dentry = d_alloc_parallel(parent, &name, &wq);
		if (IS_ERR(dentry))
			return PTR_ERR(dentry);
	}
	if (!d_in_lookup(dentry)) {
		struct fuse_inode *fi;
1219
		inode = d_inode(dentry);
A
Al Viro 已提交
1220 1221 1222
		if (!inode ||
		    get_node_id(inode) != o->nodeid ||
		    ((o->attr.mode ^ inode->i_mode) & S_IFMT)) {
1223
			d_invalidate(dentry);
A
Al Viro 已提交
1224 1225 1226 1227 1228 1229
			dput(dentry);
			goto retry;
		}
		if (is_bad_inode(inode)) {
			dput(dentry);
			return -EIO;
1230 1231
		}

A
Al Viro 已提交
1232 1233 1234 1235
		fi = get_fuse_inode(inode);
		spin_lock(&fc->lock);
		fi->nlookup++;
		spin_unlock(&fc->lock);
1236

A
Al Viro 已提交
1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249
		fuse_change_attributes(inode, &o->attr,
				       entry_attr_timeout(o),
				       attr_version);
		/*
		 * The other branch comes via fuse_iget()
		 * which bumps nlookup inside
		 */
	} else {
		inode = fuse_iget(dir->i_sb, o->nodeid, o->generation,
				  &o->attr, entry_attr_timeout(o),
				  attr_version);
		if (!inode)
			inode = ERR_PTR(-ENOMEM);
1250

A
Al Viro 已提交
1251 1252 1253 1254 1255 1256 1257 1258
		alias = d_splice_alias(inode, dentry);
		d_lookup_done(dentry);
		if (alias) {
			dput(dentry);
			dentry = alias;
		}
		if (IS_ERR(dentry))
			return PTR_ERR(dentry);
1259
	}
M
Miklos Szeredi 已提交
1260 1261
	if (fc->readdirplus_auto)
		set_bit(FUSE_I_INIT_RDPLUS, &get_fuse_inode(inode)->state);
1262 1263
	fuse_change_entry_timeout(dentry, o);

M
Miklos Szeredi 已提交
1264
	dput(dentry);
A
Al Viro 已提交
1265
	return 0;
1266 1267 1268
}

static int parse_dirplusfile(char *buf, size_t nbytes, struct file *file,
A
Al Viro 已提交
1269
			     struct dir_context *ctx, u64 attr_version)
1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285
{
	struct fuse_direntplus *direntplus;
	struct fuse_dirent *dirent;
	size_t reclen;
	int over = 0;
	int ret;

	while (nbytes >= FUSE_NAME_OFFSET_DIRENTPLUS) {
		direntplus = (struct fuse_direntplus *) buf;
		dirent = &direntplus->dirent;
		reclen = FUSE_DIRENTPLUS_SIZE(direntplus);

		if (!dirent->namelen || dirent->namelen > FUSE_NAME_MAX)
			return -EIO;
		if (reclen > nbytes)
			break;
1286 1287
		if (memchr(dirent->name, '/', dirent->namelen) != NULL)
			return -EIO;
1288 1289 1290 1291 1292 1293 1294 1295

		if (!over) {
			/* We fill entries into dstbuf only as much as
			   it can hold. But we still continue iterating
			   over remaining entries to link them. If not,
			   we need to send a FORGET for each of those
			   which we did not link.
			*/
A
Al Viro 已提交
1296 1297 1298
			over = !dir_emit(ctx, dirent->name, dirent->namelen,
				       dirent->ino, dirent->type);
			ctx->pos = dirent->off;
1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311
		}

		buf += reclen;
		nbytes -= reclen;

		ret = fuse_direntplus_link(file, direntplus, attr_version);
		if (ret)
			fuse_force_forget(file, direntplus->entry_out.nodeid);
	}

	return 0;
}

A
Al Viro 已提交
1312
static int fuse_readdir(struct file *file, struct dir_context *ctx)
1313
{
1314
	int plus, err;
1315 1316
	size_t nbytes;
	struct page *page;
A
Al Viro 已提交
1317
	struct inode *inode = file_inode(file);
1318
	struct fuse_conn *fc = get_fuse_conn(inode);
1319
	struct fuse_req *req;
1320
	u64 attr_version = 0;
1321 1322 1323 1324

	if (is_bad_inode(inode))
		return -EIO;

M
Maxim Patlasov 已提交
1325
	req = fuse_get_req(fc, 1);
1326 1327
	if (IS_ERR(req))
		return PTR_ERR(req);
1328

1329 1330 1331 1332 1333
	page = alloc_page(GFP_KERNEL);
	if (!page) {
		fuse_put_request(fc, req);
		return -ENOMEM;
	}
1334

A
Al Viro 已提交
1335
	plus = fuse_use_readdirplus(inode, ctx);
1336
	req->out.argpages = 1;
1337 1338
	req->num_pages = 1;
	req->pages[0] = page;
1339
	req->page_descs[0].length = PAGE_SIZE;
1340
	if (plus) {
1341
		attr_version = fuse_get_attr_version(fc);
A
Al Viro 已提交
1342
		fuse_read_fill(req, file, ctx->pos, PAGE_SIZE,
1343 1344
			       FUSE_READDIRPLUS);
	} else {
A
Al Viro 已提交
1345
		fuse_read_fill(req, file, ctx->pos, PAGE_SIZE,
1346 1347
			       FUSE_READDIR);
	}
1348
	fuse_lock_inode(inode);
1349
	fuse_request_send(fc, req);
1350
	fuse_unlock_inode(inode);
1351
	nbytes = req->out.args[0].size;
1352 1353
	err = req->out.h.error;
	fuse_put_request(fc, req);
1354
	if (!err) {
1355
		if (plus) {
1356
			err = parse_dirplusfile(page_address(page), nbytes,
A
Al Viro 已提交
1357
						file, ctx,
1358 1359 1360
						attr_version);
		} else {
			err = parse_dirfile(page_address(page), nbytes, file,
A
Al Viro 已提交
1361
					    ctx);
1362 1363
		}
	}
1364

1365
	__free_page(page);
1366
	fuse_invalidate_atime(inode);
1367
	return err;
1368 1369
}

1370
static const char *fuse_get_link(struct dentry *dentry,
1371 1372
				 struct inode *inode,
				 struct delayed_call *done)
1373 1374
{
	struct fuse_conn *fc = get_fuse_conn(inode);
1375
	FUSE_ARGS(args);
1376
	char *link;
1377
	ssize_t ret;
1378

1379 1380 1381
	if (!dentry)
		return ERR_PTR(-ECHILD);

A
Al Viro 已提交
1382
	link = kmalloc(PAGE_SIZE, GFP_KERNEL);
1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393
	if (!link)
		return ERR_PTR(-ENOMEM);

	args.in.h.opcode = FUSE_READLINK;
	args.in.h.nodeid = get_node_id(inode);
	args.out.argvar = 1;
	args.out.numargs = 1;
	args.out.args[0].size = PAGE_SIZE - 1;
	args.out.args[0].value = link;
	ret = fuse_simple_request(fc, &args);
	if (ret < 0) {
A
Al Viro 已提交
1394
		kfree(link);
1395 1396 1397
		link = ERR_PTR(ret);
	} else {
		link[ret] = '\0';
1398
		set_delayed_call(done, kfree_link, link);
1399
	}
1400
	fuse_invalidate_atime(inode);
1401 1402 1403 1404 1405
	return link;
}

static int fuse_dir_open(struct inode *inode, struct file *file)
{
1406
	return fuse_open_common(inode, file, true);
1407 1408 1409 1410
}

static int fuse_dir_release(struct inode *inode, struct file *file)
{
1411 1412 1413
	fuse_release_common(file, FUSE_RELEASEDIR);

	return 0;
1414 1415
}

1416 1417
static int fuse_dir_fsync(struct file *file, loff_t start, loff_t end,
			  int datasync)
1418
{
1419
	return fuse_fsync_common(file, start, end, datasync, 1);
1420 1421
}

1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445
static long fuse_dir_ioctl(struct file *file, unsigned int cmd,
			    unsigned long arg)
{
	struct fuse_conn *fc = get_fuse_conn(file->f_mapping->host);

	/* FUSE_IOCTL_DIR only supported for API version >= 7.18 */
	if (fc->minor < 18)
		return -ENOTTY;

	return fuse_ioctl_common(file, cmd, arg, FUSE_IOCTL_DIR);
}

static long fuse_dir_compat_ioctl(struct file *file, unsigned int cmd,
				   unsigned long arg)
{
	struct fuse_conn *fc = get_fuse_conn(file->f_mapping->host);

	if (fc->minor < 18)
		return -ENOTTY;

	return fuse_ioctl_common(file, cmd, arg,
				 FUSE_IOCTL_COMPAT | FUSE_IOCTL_DIR);
}

M
Maxim Patlasov 已提交
1446
static bool update_mtime(unsigned ivalid, bool trust_local_mtime)
M
Miklos Szeredi 已提交
1447 1448 1449 1450 1451
{
	/* Always update if mtime is explicitly set  */
	if (ivalid & ATTR_MTIME_SET)
		return true;

M
Maxim Patlasov 已提交
1452 1453 1454 1455
	/* Or if kernel i_mtime is the official one */
	if (trust_local_mtime)
		return true;

M
Miklos Szeredi 已提交
1456 1457 1458 1459 1460 1461 1462 1463
	/* If it's an open(O_TRUNC) or an ftruncate(), don't update */
	if ((ivalid & ATTR_SIZE) && (ivalid & (ATTR_OPEN | ATTR_FILE)))
		return false;

	/* In all other cases update */
	return true;
}

M
Maxim Patlasov 已提交
1464
static void iattr_to_fattr(struct iattr *iattr, struct fuse_setattr_in *arg,
1465
			   bool trust_local_cmtime)
1466 1467 1468 1469
{
	unsigned ivalid = iattr->ia_valid;

	if (ivalid & ATTR_MODE)
1470
		arg->valid |= FATTR_MODE,   arg->mode = iattr->ia_mode;
1471
	if (ivalid & ATTR_UID)
1472
		arg->valid |= FATTR_UID,    arg->uid = from_kuid(&init_user_ns, iattr->ia_uid);
1473
	if (ivalid & ATTR_GID)
1474
		arg->valid |= FATTR_GID,    arg->gid = from_kgid(&init_user_ns, iattr->ia_gid);
1475
	if (ivalid & ATTR_SIZE)
1476
		arg->valid |= FATTR_SIZE,   arg->size = iattr->ia_size;
M
Miklos Szeredi 已提交
1477 1478
	if (ivalid & ATTR_ATIME) {
		arg->valid |= FATTR_ATIME;
1479
		arg->atime = iattr->ia_atime.tv_sec;
M
Miklos Szeredi 已提交
1480 1481 1482 1483
		arg->atimensec = iattr->ia_atime.tv_nsec;
		if (!(ivalid & ATTR_ATIME_SET))
			arg->valid |= FATTR_ATIME_NOW;
	}
1484
	if ((ivalid & ATTR_MTIME) && update_mtime(ivalid, trust_local_cmtime)) {
M
Miklos Szeredi 已提交
1485
		arg->valid |= FATTR_MTIME;
1486
		arg->mtime = iattr->ia_mtime.tv_sec;
M
Miklos Szeredi 已提交
1487
		arg->mtimensec = iattr->ia_mtime.tv_nsec;
1488
		if (!(ivalid & ATTR_MTIME_SET) && !trust_local_cmtime)
M
Miklos Szeredi 已提交
1489
			arg->valid |= FATTR_MTIME_NOW;
1490
	}
1491 1492 1493 1494 1495
	if ((ivalid & ATTR_CTIME) && trust_local_cmtime) {
		arg->valid |= FATTR_CTIME;
		arg->ctime = iattr->ia_ctime.tv_sec;
		arg->ctimensec = iattr->ia_ctime.tv_nsec;
	}
1496 1497
}

M
Miklos Szeredi 已提交
1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508
/*
 * Prevent concurrent writepages on inode
 *
 * This is done by adding a negative bias to the inode write counter
 * and waiting for all pending writes to finish.
 */
void fuse_set_nowrite(struct inode *inode)
{
	struct fuse_conn *fc = get_fuse_conn(inode);
	struct fuse_inode *fi = get_fuse_inode(inode);

A
Al Viro 已提交
1509
	BUG_ON(!inode_is_locked(inode));
M
Miklos Szeredi 已提交
1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541

	spin_lock(&fc->lock);
	BUG_ON(fi->writectr < 0);
	fi->writectr += FUSE_NOWRITE;
	spin_unlock(&fc->lock);
	wait_event(fi->page_waitq, fi->writectr == FUSE_NOWRITE);
}

/*
 * Allow writepages on inode
 *
 * Remove the bias from the writecounter and send any queued
 * writepages.
 */
static void __fuse_release_nowrite(struct inode *inode)
{
	struct fuse_inode *fi = get_fuse_inode(inode);

	BUG_ON(fi->writectr != FUSE_NOWRITE);
	fi->writectr = 0;
	fuse_flush_writepages(inode);
}

void fuse_release_nowrite(struct inode *inode)
{
	struct fuse_conn *fc = get_fuse_conn(inode);

	spin_lock(&fc->lock);
	__fuse_release_nowrite(inode);
	spin_unlock(&fc->lock);
}

1542
static void fuse_setattr_fill(struct fuse_conn *fc, struct fuse_args *args,
M
Maxim Patlasov 已提交
1543 1544 1545 1546
			      struct inode *inode,
			      struct fuse_setattr_in *inarg_p,
			      struct fuse_attr_out *outarg_p)
{
1547 1548 1549 1550 1551 1552
	args->in.h.opcode = FUSE_SETATTR;
	args->in.h.nodeid = get_node_id(inode);
	args->in.numargs = 1;
	args->in.args[0].size = sizeof(*inarg_p);
	args->in.args[0].value = inarg_p;
	args->out.numargs = 1;
1553
	args->out.args[0].size = sizeof(*outarg_p);
1554
	args->out.args[0].value = outarg_p;
M
Maxim Patlasov 已提交
1555 1556 1557 1558 1559
}

/*
 * Flush inode->i_mtime to the server
 */
1560
int fuse_flush_times(struct inode *inode, struct fuse_file *ff)
M
Maxim Patlasov 已提交
1561 1562
{
	struct fuse_conn *fc = get_fuse_conn(inode);
1563
	FUSE_ARGS(args);
M
Maxim Patlasov 已提交
1564 1565 1566 1567 1568 1569
	struct fuse_setattr_in inarg;
	struct fuse_attr_out outarg;

	memset(&inarg, 0, sizeof(inarg));
	memset(&outarg, 0, sizeof(outarg));

1570
	inarg.valid = FATTR_MTIME;
M
Maxim Patlasov 已提交
1571 1572
	inarg.mtime = inode->i_mtime.tv_sec;
	inarg.mtimensec = inode->i_mtime.tv_nsec;
1573 1574 1575 1576 1577
	if (fc->minor >= 23) {
		inarg.valid |= FATTR_CTIME;
		inarg.ctime = inode->i_ctime.tv_sec;
		inarg.ctimensec = inode->i_ctime.tv_nsec;
	}
M
Miklos Szeredi 已提交
1578 1579 1580 1581
	if (ff) {
		inarg.valid |= FATTR_FH;
		inarg.fh = ff->fh;
	}
1582
	fuse_setattr_fill(fc, &args, inode, &inarg, &outarg);
M
Maxim Patlasov 已提交
1583

1584
	return fuse_simple_request(fc, &args);
M
Maxim Patlasov 已提交
1585 1586
}

1587 1588 1589 1590 1591
/*
 * Set attributes, and at the same time refresh them.
 *
 * Truncation is slightly complicated, because the 'truncate' request
 * may fail, in which case we don't want to touch the mapping.
M
Miklos Szeredi 已提交
1592 1593
 * vmtruncate() doesn't allow for this case, so do the rlimit checking
 * and the actual truncation by hand.
1594
 */
1595 1596
int fuse_do_setattr(struct inode *inode, struct iattr *attr,
		    struct file *file)
1597 1598
{
	struct fuse_conn *fc = get_fuse_conn(inode);
1599
	struct fuse_inode *fi = get_fuse_inode(inode);
1600
	FUSE_ARGS(args);
1601 1602
	struct fuse_setattr_in inarg;
	struct fuse_attr_out outarg;
M
Miklos Szeredi 已提交
1603
	bool is_truncate = false;
P
Pavel Emelyanov 已提交
1604
	bool is_wb = fc->writeback_cache;
M
Miklos Szeredi 已提交
1605
	loff_t oldsize;
1606
	int err;
1607
	bool trust_local_cmtime = is_wb && S_ISREG(inode->i_mode);
1608

1609 1610 1611 1612 1613 1614
	if (!(fc->flags & FUSE_DEFAULT_PERMISSIONS))
		attr->ia_valid |= ATTR_FORCE;

	err = inode_change_ok(inode, attr);
	if (err)
		return err;
M
Miklos Szeredi 已提交
1615

M
Miklos Szeredi 已提交
1616 1617 1618 1619 1620
	if (attr->ia_valid & ATTR_OPEN) {
		if (fc->atomic_o_trunc)
			return 0;
		file = NULL;
	}
1621

1622
	if (attr->ia_valid & ATTR_SIZE)
M
Miklos Szeredi 已提交
1623
		is_truncate = true;
1624

1625
	if (is_truncate) {
M
Miklos Szeredi 已提交
1626
		fuse_set_nowrite(inode);
1627
		set_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
1628 1629
		if (trust_local_cmtime && attr->ia_size != inode->i_size)
			attr->ia_valid |= ATTR_MTIME | ATTR_CTIME;
1630
	}
M
Miklos Szeredi 已提交
1631

1632
	memset(&inarg, 0, sizeof(inarg));
1633
	memset(&outarg, 0, sizeof(outarg));
1634
	iattr_to_fattr(attr, &inarg, trust_local_cmtime);
1635 1636 1637 1638 1639
	if (file) {
		struct fuse_file *ff = file->private_data;
		inarg.valid |= FATTR_FH;
		inarg.fh = ff->fh;
	}
1640 1641 1642 1643 1644
	if (attr->ia_valid & ATTR_SIZE) {
		/* For mandatory locking in truncate */
		inarg.valid |= FATTR_LOCKOWNER;
		inarg.lock_owner = fuse_lock_owner_id(fc, current->files);
	}
1645 1646
	fuse_setattr_fill(fc, &args, inode, &inarg, &outarg);
	err = fuse_simple_request(fc, &args);
1647 1648 1649
	if (err) {
		if (err == -EINTR)
			fuse_invalidate_attr(inode);
M
Miklos Szeredi 已提交
1650
		goto error;
1651
	}
1652

1653 1654
	if ((inode->i_mode ^ outarg.attr.mode) & S_IFMT) {
		make_bad_inode(inode);
M
Miklos Szeredi 已提交
1655 1656 1657 1658 1659
		err = -EIO;
		goto error;
	}

	spin_lock(&fc->lock);
M
Maxim Patlasov 已提交
1660
	/* the kernel maintains i_mtime locally */
1661 1662 1663 1664 1665
	if (trust_local_cmtime) {
		if (attr->ia_valid & ATTR_MTIME)
			inode->i_mtime = attr->ia_mtime;
		if (attr->ia_valid & ATTR_CTIME)
			inode->i_ctime = attr->ia_ctime;
M
Miklos Szeredi 已提交
1666
		/* FIXME: clear I_DIRTY_SYNC? */
M
Maxim Patlasov 已提交
1667 1668
	}

M
Miklos Szeredi 已提交
1669 1670 1671
	fuse_change_attributes_common(inode, &outarg.attr,
				      attr_timeout(&outarg));
	oldsize = inode->i_size;
P
Pavel Emelyanov 已提交
1672 1673 1674
	/* see the comment in fuse_change_attributes() */
	if (!is_wb || is_truncate || !S_ISREG(inode->i_mode))
		i_size_write(inode, outarg.attr.size);
M
Miklos Szeredi 已提交
1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685

	if (is_truncate) {
		/* NOTE: this may release/reacquire fc->lock */
		__fuse_release_nowrite(inode);
	}
	spin_unlock(&fc->lock);

	/*
	 * Only call invalidate_inode_pages2() after removing
	 * FUSE_NOWRITE, otherwise fuse_launder_page() would deadlock.
	 */
P
Pavel Emelyanov 已提交
1686 1687
	if ((is_truncate || !is_wb) &&
	    S_ISREG(inode->i_mode) && oldsize != outarg.attr.size) {
1688
		truncate_pagecache(inode, outarg.attr.size);
M
Miklos Szeredi 已提交
1689
		invalidate_inode_pages2(inode->i_mapping);
1690 1691
	}

1692
	clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
1693
	return 0;
M
Miklos Szeredi 已提交
1694 1695 1696 1697 1698

error:
	if (is_truncate)
		fuse_release_nowrite(inode);

1699
	clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
M
Miklos Szeredi 已提交
1700
	return err;
1701 1702
}

1703 1704
static int fuse_setattr(struct dentry *entry, struct iattr *attr)
{
1705
	struct inode *inode = d_inode(entry);
1706
	struct file *file = (attr->ia_valid & ATTR_FILE) ? attr->ia_file : NULL;
1707
	int ret;
1708 1709 1710 1711

	if (!fuse_allow_current_process(get_fuse_conn(inode)))
		return -EACCES;

1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737
	if (attr->ia_valid & (ATTR_KILL_SUID | ATTR_KILL_SGID)) {
		int kill;

		attr->ia_valid &= ~(ATTR_KILL_SUID | ATTR_KILL_SGID |
				    ATTR_MODE);
		/*
		 * ia_mode calculation may have used stale i_mode.  Refresh and
		 * recalculate.
		 */
		ret = fuse_do_getattr(inode, NULL, file);
		if (ret)
			return ret;

		attr->ia_mode = inode->i_mode;
		kill = should_remove_suid(entry);
		if (kill & ATTR_KILL_SUID) {
			attr->ia_valid |= ATTR_MODE;
			attr->ia_mode &= ~S_ISUID;
		}
		if (kill & ATTR_KILL_SGID) {
			attr->ia_valid |= ATTR_MODE;
			attr->ia_mode &= ~S_ISGID;
		}
	}
	if (!attr->ia_valid)
		return 0;
1738

1739
	ret = fuse_do_setattr(inode, attr, file);
1740 1741 1742 1743 1744 1745
	if (!ret) {
		/* Directory mode changed, may need to revalidate access */
		if (d_is_dir(entry) && (attr->ia_valid & ATTR_MODE))
			fuse_invalidate_entry_cache(entry);
	}
	return ret;
1746 1747
}

1748 1749 1750
static int fuse_getattr(struct vfsmount *mnt, struct dentry *entry,
			struct kstat *stat)
{
1751
	struct inode *inode = d_inode(entry);
1752 1753
	struct fuse_conn *fc = get_fuse_conn(inode);

1754
	if (!fuse_allow_current_process(fc))
1755 1756
		return -EACCES;

M
Miklos Szeredi 已提交
1757
	return fuse_update_attributes(inode, stat, NULL, NULL);
1758 1759
}

1760
static const struct inode_operations fuse_dir_inode_operations = {
1761
	.lookup		= fuse_lookup,
1762 1763 1764 1765
	.mkdir		= fuse_mkdir,
	.symlink	= fuse_symlink,
	.unlink		= fuse_unlink,
	.rmdir		= fuse_rmdir,
M
Miklos Szeredi 已提交
1766
	.rename2	= fuse_rename2,
1767 1768 1769
	.link		= fuse_link,
	.setattr	= fuse_setattr,
	.create		= fuse_create,
1770
	.atomic_open	= fuse_atomic_open,
1771
	.mknod		= fuse_mknod,
1772 1773
	.permission	= fuse_permission,
	.getattr	= fuse_getattr,
S
Seth Forshee 已提交
1774 1775
	.setxattr	= generic_setxattr,
	.getxattr	= generic_getxattr,
1776
	.listxattr	= fuse_listxattr,
S
Seth Forshee 已提交
1777
	.removexattr	= generic_removexattr,
1778 1779
};

1780
static const struct file_operations fuse_dir_operations = {
M
Miklos Szeredi 已提交
1781
	.llseek		= generic_file_llseek,
1782
	.read		= generic_read_dir,
A
Al Viro 已提交
1783
	.iterate_shared	= fuse_readdir,
1784 1785
	.open		= fuse_dir_open,
	.release	= fuse_dir_release,
1786
	.fsync		= fuse_dir_fsync,
1787 1788
	.unlocked_ioctl	= fuse_dir_ioctl,
	.compat_ioctl	= fuse_dir_compat_ioctl,
1789 1790
};

1791
static const struct inode_operations fuse_common_inode_operations = {
1792
	.setattr	= fuse_setattr,
1793 1794
	.permission	= fuse_permission,
	.getattr	= fuse_getattr,
S
Seth Forshee 已提交
1795 1796
	.setxattr	= generic_setxattr,
	.getxattr	= generic_getxattr,
1797
	.listxattr	= fuse_listxattr,
S
Seth Forshee 已提交
1798
	.removexattr	= generic_removexattr,
1799 1800
};

1801
static const struct inode_operations fuse_symlink_inode_operations = {
1802
	.setattr	= fuse_setattr,
1803
	.get_link	= fuse_get_link,
1804 1805
	.readlink	= generic_readlink,
	.getattr	= fuse_getattr,
S
Seth Forshee 已提交
1806 1807
	.setxattr	= generic_setxattr,
	.getxattr	= generic_getxattr,
1808
	.listxattr	= fuse_listxattr,
S
Seth Forshee 已提交
1809
	.removexattr	= generic_removexattr,
1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826
};

void fuse_init_common(struct inode *inode)
{
	inode->i_op = &fuse_common_inode_operations;
}

void fuse_init_dir(struct inode *inode)
{
	inode->i_op = &fuse_dir_inode_operations;
	inode->i_fop = &fuse_dir_operations;
}

void fuse_init_symlink(struct inode *inode)
{
	inode->i_op = &fuse_symlink_inode_operations;
}