inode.c 32.8 KB
Newer Older
1 2 3 4 5
/**
 * eCryptfs: Linux filesystem encryption layer
 *
 * Copyright (C) 1997-2004 Erez Zadok
 * Copyright (C) 2001-2004 Stony Brook University
6
 * Copyright (C) 2004-2007 International Business Machines Corp.
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
 *   Author(s): Michael A. Halcrow <mahalcro@us.ibm.com>
 *              Michael C. Thompsion <mcthomps@us.ibm.com>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 * 02111-1307, USA.
 */

#include <linux/file.h>
#include <linux/vmalloc.h>
#include <linux/pagemap.h>
#include <linux/dcache.h>
#include <linux/namei.h>
#include <linux/mount.h>
#include <linux/crypto.h>
33
#include <linux/fs_stack.h>
34
#include <linux/slab.h>
35
#include <linux/xattr.h>
36
#include <asm/unaligned.h>
37 38 39 40 41 42
#include "ecryptfs_kernel.h"

static struct dentry *lock_parent(struct dentry *dentry)
{
	struct dentry *dir;

43
	dir = dget_parent(dentry);
44
	mutex_lock_nested(&(dir->d_inode->i_mutex), I_MUTEX_PARENT);
45 46 47 48 49 50 51 52 53
	return dir;
}

static void unlock_dir(struct dentry *dir)
{
	mutex_unlock(&dir->d_inode->i_mutex);
	dput(dir);
}

54 55 56 57 58 59 60
static int ecryptfs_inode_test(struct inode *inode, void *lower_inode)
{
	if (ecryptfs_inode_to_lower(inode) == (struct inode *)lower_inode)
		return 1;
	return 0;
}

61
static int ecryptfs_inode_set(struct inode *inode, void *opaque)
62
{
63 64 65 66 67 68 69
	struct inode *lower_inode = opaque;

	ecryptfs_set_inode_lower(inode, lower_inode);
	fsstack_copy_attr_all(inode, lower_inode);
	/* i_size will be overwritten for encrypted regular files */
	fsstack_copy_inode_size(inode, lower_inode);
	inode->i_ino = lower_inode->i_ino;
70 71
	inode->i_version++;
	inode->i_mapping->a_ops = &ecryptfs_aops;
72
	inode->i_mapping->backing_dev_info = inode->i_sb->s_bdi;
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87

	if (S_ISLNK(inode->i_mode))
		inode->i_op = &ecryptfs_symlink_iops;
	else if (S_ISDIR(inode->i_mode))
		inode->i_op = &ecryptfs_dir_iops;
	else
		inode->i_op = &ecryptfs_main_iops;

	if (S_ISDIR(inode->i_mode))
		inode->i_fop = &ecryptfs_dir_fops;
	else if (special_file(inode->i_mode))
		init_special_inode(inode, inode->i_mode, inode->i_rdev);
	else
		inode->i_fop = &ecryptfs_main_fops;

88 89 90
	return 0;
}

91 92
static struct inode *__ecryptfs_get_inode(struct inode *lower_inode,
					  struct super_block *sb)
93 94 95
{
	struct inode *inode;

96 97 98 99
	if (lower_inode->i_sb != ecryptfs_superblock_to_lower(sb))
		return ERR_PTR(-EXDEV);
	if (!igrab(lower_inode))
		return ERR_PTR(-ESTALE);
100 101 102 103 104
	inode = iget5_locked(sb, (unsigned long)lower_inode,
			     ecryptfs_inode_test, ecryptfs_inode_set,
			     lower_inode);
	if (!inode) {
		iput(lower_inode);
105
		return ERR_PTR(-EACCES);
106
	}
107
	if (!(inode->i_state & I_NEW))
108
		iput(lower_inode);
109 110 111 112 113 114 115 116 117 118 119 120

	return inode;
}

struct inode *ecryptfs_get_inode(struct inode *lower_inode,
				 struct super_block *sb)
{
	struct inode *inode = __ecryptfs_get_inode(lower_inode, sb);

	if (!IS_ERR(inode) && (inode->i_state & I_NEW))
		unlock_new_inode(inode);

121 122 123 124 125 126 127 128 129 130 131 132 133 134
	return inode;
}

/**
 * ecryptfs_interpose
 * @lower_dentry: Existing dentry in the lower filesystem
 * @dentry: ecryptfs' dentry
 * @sb: ecryptfs's super_block
 *
 * Interposes upper and lower dentries.
 *
 * Returns zero on success; non-zero otherwise
 */
static int ecryptfs_interpose(struct dentry *lower_dentry,
135
			      struct dentry *dentry, struct super_block *sb)
136
{
137 138
	struct inode *inode = ecryptfs_get_inode(lower_dentry->d_inode, sb);

139 140
	if (IS_ERR(inode))
		return PTR_ERR(inode);
141 142
	d_instantiate(dentry, inode);

143 144 145
	return 0;
}

146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
static int ecryptfs_do_unlink(struct inode *dir, struct dentry *dentry,
			      struct inode *inode)
{
	struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry);
	struct inode *lower_dir_inode = ecryptfs_inode_to_lower(dir);
	struct dentry *lower_dir_dentry;
	int rc;

	dget(lower_dentry);
	lower_dir_dentry = lock_parent(lower_dentry);
	rc = vfs_unlink(lower_dir_inode, lower_dentry);
	if (rc) {
		printk(KERN_ERR "Error in vfs_unlink; rc = [%d]\n", rc);
		goto out_unlock;
	}
	fsstack_copy_attr_times(dir, lower_dir_inode);
	set_nlink(inode, ecryptfs_inode_to_lower(inode)->i_nlink);
	inode->i_ctime = dir->i_ctime;
	d_drop(dentry);
out_unlock:
	unlock_dir(lower_dir_dentry);
	dput(lower_dentry);
	return rc;
}

171 172 173 174 175 176 177 178 179 180 181
/**
 * ecryptfs_do_create
 * @directory_inode: inode of the new file's dentry's parent in ecryptfs
 * @ecryptfs_dentry: New file's dentry in ecryptfs
 * @mode: The mode of the new file
 * @nd: nameidata of ecryptfs' parent's dentry & vfsmount
 *
 * Creates the underlying file and the eCryptfs inode which will link to
 * it. It will also update the eCryptfs directory inode to mimic the
 * stat of the lower directory inode.
 *
182
 * Returns the new eCryptfs inode on success; an ERR_PTR on error condition
183
 */
184
static struct inode *
185
ecryptfs_do_create(struct inode *directory_inode,
A
Al Viro 已提交
186
		   struct dentry *ecryptfs_dentry, umode_t mode)
187 188 189 190
{
	int rc;
	struct dentry *lower_dentry;
	struct dentry *lower_dir_dentry;
191
	struct inode *inode;
192 193 194

	lower_dentry = ecryptfs_dentry_to_lower(ecryptfs_dentry);
	lower_dir_dentry = lock_parent(lower_dentry);
195
	if (IS_ERR(lower_dir_dentry)) {
196 197
		ecryptfs_printk(KERN_ERR, "Error locking directory of "
				"dentry\n");
198
		inode = ERR_CAST(lower_dir_dentry);
199 200
		goto out;
	}
A
Al Viro 已提交
201
	rc = vfs_create(lower_dir_dentry->d_inode, lower_dentry, mode, true);
202
	if (rc) {
203
		printk(KERN_ERR "%s: Failure to create dentry in lower fs; "
204
		       "rc = [%d]\n", __func__, rc);
205
		inode = ERR_PTR(rc);
206
		goto out_lock;
207
	}
208 209
	inode = __ecryptfs_get_inode(lower_dentry->d_inode,
				     directory_inode->i_sb);
210 211
	if (IS_ERR(inode)) {
		vfs_unlink(lower_dir_dentry->d_inode, lower_dentry);
212
		goto out_lock;
213
	}
214 215
	fsstack_copy_attr_times(directory_inode, lower_dir_dentry->d_inode);
	fsstack_copy_inode_size(directory_inode, lower_dir_dentry->d_inode);
216 217 218
out_lock:
	unlock_dir(lower_dir_dentry);
out:
219
	return inode;
220 221 222 223 224 225 226 227 228 229
}

/**
 * ecryptfs_initialize_file
 *
 * Cause the file to be changed from a basic empty file to an ecryptfs
 * file with a header and first data page.
 *
 * Returns zero on success
 */
230 231
int ecryptfs_initialize_file(struct dentry *ecryptfs_dentry,
			     struct inode *ecryptfs_inode)
232
{
233
	struct ecryptfs_crypt_stat *crypt_stat =
234
		&ecryptfs_inode_to_private(ecryptfs_inode)->crypt_stat;
235 236
	int rc = 0;

237
	if (S_ISDIR(ecryptfs_inode->i_mode)) {
238
		ecryptfs_printk(KERN_DEBUG, "This is a directory\n");
239
		crypt_stat->flags &= ~(ECRYPTFS_ENCRYPTED);
240
		goto out;
241 242
	}
	ecryptfs_printk(KERN_DEBUG, "Initializing crypto context\n");
243
	rc = ecryptfs_new_file_context(ecryptfs_inode);
244
	if (rc) {
245 246 247
		ecryptfs_printk(KERN_ERR, "Error creating new file "
				"context; rc = [%d]\n", rc);
		goto out;
248
	}
249
	rc = ecryptfs_get_lower_file(ecryptfs_dentry, ecryptfs_inode);
250 251
	if (rc) {
		printk(KERN_ERR "%s: Error attempting to initialize "
252
			"the lower file for the dentry with name "
253 254 255
			"[%s]; rc = [%d]\n", __func__,
			ecryptfs_dentry->d_name.name, rc);
		goto out;
256
	}
257
	rc = ecryptfs_write_metadata(ecryptfs_dentry, ecryptfs_inode);
258
	if (rc)
259
		printk(KERN_ERR "Error writing headers; rc = [%d]\n", rc);
260
	ecryptfs_put_lower_file(ecryptfs_inode);
261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276
out:
	return rc;
}

/**
 * ecryptfs_create
 * @dir: The inode of the directory in which to create the file.
 * @dentry: The eCryptfs dentry
 * @mode: The mode of the new file.
 *
 * Creates a new file.
 *
 * Returns zero on success; non-zero on error condition
 */
static int
ecryptfs_create(struct inode *directory_inode, struct dentry *ecryptfs_dentry,
A
Al Viro 已提交
277
		umode_t mode, bool excl)
278
{
279
	struct inode *ecryptfs_inode;
280 281
	int rc;

282 283 284
	ecryptfs_inode = ecryptfs_do_create(directory_inode, ecryptfs_dentry,
					    mode);
	if (unlikely(IS_ERR(ecryptfs_inode))) {
285 286
		ecryptfs_printk(KERN_WARNING, "Failed to create file in"
				"lower filesystem\n");
287
		rc = PTR_ERR(ecryptfs_inode);
288 289 290 291
		goto out;
	}
	/* At this point, a file exists on "disk"; we need to make sure
	 * that this on disk file is prepared to be an ecryptfs file */
292 293
	rc = ecryptfs_initialize_file(ecryptfs_dentry, ecryptfs_inode);
	if (rc) {
294 295 296
		ecryptfs_do_unlink(directory_inode, ecryptfs_dentry,
				   ecryptfs_inode);
		make_bad_inode(ecryptfs_inode);
297 298 299 300 301
		unlock_new_inode(ecryptfs_inode);
		iput(ecryptfs_inode);
		goto out;
	}
	unlock_new_inode(ecryptfs_inode);
302
	d_instantiate(ecryptfs_dentry, ecryptfs_inode);
303 304 305 306
out:
	return rc;
}

307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337
static int ecryptfs_i_size_read(struct dentry *dentry, struct inode *inode)
{
	struct ecryptfs_crypt_stat *crypt_stat;
	int rc;

	rc = ecryptfs_get_lower_file(dentry, inode);
	if (rc) {
		printk(KERN_ERR "%s: Error attempting to initialize "
			"the lower file for the dentry with name "
			"[%s]; rc = [%d]\n", __func__,
			dentry->d_name.name, rc);
		return rc;
	}

	crypt_stat = &ecryptfs_inode_to_private(inode)->crypt_stat;
	/* TODO: lock for crypt_stat comparison */
	if (!(crypt_stat->flags & ECRYPTFS_POLICY_APPLIED))
		ecryptfs_set_default_sizes(crypt_stat);

	rc = ecryptfs_read_and_validate_header_region(inode);
	ecryptfs_put_lower_file(inode);
	if (rc) {
		rc = ecryptfs_read_and_validate_xattr_region(dentry, inode);
		if (!rc)
			crypt_stat->flags |= ECRYPTFS_METADATA_IN_XATTR;
	}

	/* Must return 0 to allow non-eCryptfs files to be looked up, too */
	return 0;
}

338
/**
339
 * ecryptfs_lookup_interpose - Dentry interposition for a lookup
340
 */
341
static int ecryptfs_lookup_interpose(struct dentry *dentry,
342
				     struct dentry *lower_dentry,
343
				     struct inode *dir_inode)
344
{
345 346
	struct inode *inode, *lower_inode = lower_dentry->d_inode;
	struct ecryptfs_dentry_info *dentry_info;
347
	struct vfsmount *lower_mnt;
348 349 350 351
	int rc = 0;

	dentry_info = kmem_cache_alloc(ecryptfs_dentry_info_cache, GFP_KERNEL);
	if (!dentry_info) {
352 353 354
		printk(KERN_ERR "%s: Out of memory whilst attempting "
		       "to allocate ecryptfs_dentry_info struct\n",
			__func__);
355 356
		dput(lower_dentry);
		return -ENOMEM;
357
	}
358 359 360

	lower_mnt = mntget(ecryptfs_dentry_to_lower_mnt(dentry->d_parent));
	fsstack_copy_attr_atime(dir_inode, lower_dentry->d_parent->d_inode);
A
Al Viro 已提交
361
	BUG_ON(!d_count(lower_dentry));
362 363

	ecryptfs_set_dentry_private(dentry, dentry_info);
364 365
	dentry_info->lower_path.mnt = lower_mnt;
	dentry_info->lower_path.dentry = lower_dentry;
366

367 368
	if (!lower_dentry->d_inode) {
		/* We want to add because we couldn't find in lower */
369 370
		d_add(dentry, NULL);
		return 0;
371
	}
372
	inode = __ecryptfs_get_inode(lower_inode, dir_inode->i_sb);
373
	if (IS_ERR(inode)) {
374 375 376
		printk(KERN_ERR "%s: Error interposing; rc = [%ld]\n",
		       __func__, PTR_ERR(inode));
		return PTR_ERR(inode);
377
	}
378 379
	if (S_ISREG(inode->i_mode)) {
		rc = ecryptfs_i_size_read(dentry, inode);
380
		if (rc) {
381 382
			make_bad_inode(inode);
			return rc;
383 384
		}
	}
385

386 387
	if (inode->i_state & I_NEW)
		unlock_new_inode(inode);
388 389
	d_add(dentry, inode);

390 391 392 393 394 395 396 397 398 399 400 401 402 403
	return rc;
}

/**
 * ecryptfs_lookup
 * @ecryptfs_dir_inode: The eCryptfs directory inode
 * @ecryptfs_dentry: The eCryptfs dentry that we are looking up
 * @ecryptfs_nd: nameidata; may be NULL
 *
 * Find a file on disk. If the file does not exist, then we'll add it to the
 * dentry cache and continue on to read it from the disk.
 */
static struct dentry *ecryptfs_lookup(struct inode *ecryptfs_dir_inode,
				      struct dentry *ecryptfs_dentry,
A
Al Viro 已提交
404
				      unsigned int flags)
405 406
{
	char *encrypted_and_encoded_name = NULL;
407
	size_t encrypted_and_encoded_name_size;
408 409 410 411 412
	struct ecryptfs_mount_crypt_stat *mount_crypt_stat = NULL;
	struct dentry *lower_dir_dentry, *lower_dentry;
	int rc = 0;

	lower_dir_dentry = ecryptfs_dentry_to_lower(ecryptfs_dentry->d_parent);
413 414 415 416 417
	mutex_lock(&lower_dir_dentry->d_inode->i_mutex);
	lower_dentry = lookup_one_len(ecryptfs_dentry->d_name.name,
				      lower_dir_dentry,
				      ecryptfs_dentry->d_name.len);
	mutex_unlock(&lower_dir_dentry->d_inode->i_mutex);
418 419
	if (IS_ERR(lower_dentry)) {
		rc = PTR_ERR(lower_dentry);
420
		ecryptfs_printk(KERN_DEBUG, "%s: lookup_one_len() returned "
421
				"[%d] on lower_dentry = [%s]\n", __func__, rc,
A
Al Viro 已提交
422 423
				ecryptfs_dentry->d_name.name);
		goto out;
424 425
	}
	if (lower_dentry->d_inode)
426
		goto interpose;
427 428 429 430
	mount_crypt_stat = &ecryptfs_superblock_to_private(
				ecryptfs_dentry->d_sb)->mount_crypt_stat;
	if (!(mount_crypt_stat
	    && (mount_crypt_stat->flags & ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES)))
431
		goto interpose;
432 433 434
	dput(lower_dentry);
	rc = ecryptfs_encrypt_and_encode_filename(
		&encrypted_and_encoded_name, &encrypted_and_encoded_name_size,
435
		NULL, mount_crypt_stat, ecryptfs_dentry->d_name.name,
436 437 438 439
		ecryptfs_dentry->d_name.len);
	if (rc) {
		printk(KERN_ERR "%s: Error attempting to encrypt and encode "
		       "filename; rc = [%d]\n", __func__, rc);
A
Al Viro 已提交
440
		goto out;
441
	}
442 443 444 445 446
	mutex_lock(&lower_dir_dentry->d_inode->i_mutex);
	lower_dentry = lookup_one_len(encrypted_and_encoded_name,
				      lower_dir_dentry,
				      encrypted_and_encoded_name_size);
	mutex_unlock(&lower_dir_dentry->d_inode->i_mutex);
447 448
	if (IS_ERR(lower_dentry)) {
		rc = PTR_ERR(lower_dentry);
449
		ecryptfs_printk(KERN_DEBUG, "%s: lookup_one_len() returned "
450 451
				"[%d] on lower_dentry = [%s]\n", __func__, rc,
				encrypted_and_encoded_name);
A
Al Viro 已提交
452
		goto out;
453
	}
454 455 456
interpose:
	rc = ecryptfs_lookup_interpose(ecryptfs_dentry, lower_dentry,
				       ecryptfs_dir_inode);
457
out:
458
	kfree(encrypted_and_encoded_name);
459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480
	return ERR_PTR(rc);
}

static int ecryptfs_link(struct dentry *old_dentry, struct inode *dir,
			 struct dentry *new_dentry)
{
	struct dentry *lower_old_dentry;
	struct dentry *lower_new_dentry;
	struct dentry *lower_dir_dentry;
	u64 file_size_save;
	int rc;

	file_size_save = i_size_read(old_dentry->d_inode);
	lower_old_dentry = ecryptfs_dentry_to_lower(old_dentry);
	lower_new_dentry = ecryptfs_dentry_to_lower(new_dentry);
	dget(lower_old_dentry);
	dget(lower_new_dentry);
	lower_dir_dentry = lock_parent(lower_new_dentry);
	rc = vfs_link(lower_old_dentry, lower_dir_dentry->d_inode,
		      lower_new_dentry);
	if (rc || !lower_new_dentry->d_inode)
		goto out_lock;
481
	rc = ecryptfs_interpose(lower_new_dentry, new_dentry, dir->i_sb);
482 483
	if (rc)
		goto out_lock;
484 485
	fsstack_copy_attr_times(dir, lower_dir_dentry->d_inode);
	fsstack_copy_inode_size(dir, lower_dir_dentry->d_inode);
M
Miklos Szeredi 已提交
486 487
	set_nlink(old_dentry->d_inode,
		  ecryptfs_inode_to_lower(old_dentry->d_inode)->i_nlink);
488 489 490 491 492 493 494 495 496 497
	i_size_write(new_dentry->d_inode, file_size_save);
out_lock:
	unlock_dir(lower_dir_dentry);
	dput(lower_new_dentry);
	dput(lower_old_dentry);
	return rc;
}

static int ecryptfs_unlink(struct inode *dir, struct dentry *dentry)
{
498
	return ecryptfs_do_unlink(dir, dentry, dentry->d_inode);
499 500 501 502 503 504 505 506 507
}

static int ecryptfs_symlink(struct inode *dir, struct dentry *dentry,
			    const char *symname)
{
	int rc;
	struct dentry *lower_dentry;
	struct dentry *lower_dir_dentry;
	char *encoded_symname;
508 509
	size_t encoded_symlen;
	struct ecryptfs_mount_crypt_stat *mount_crypt_stat = NULL;
510 511 512 513

	lower_dentry = ecryptfs_dentry_to_lower(dentry);
	dget(lower_dentry);
	lower_dir_dentry = lock_parent(lower_dentry);
514 515 516 517 518 519 520 521
	mount_crypt_stat = &ecryptfs_superblock_to_private(
		dir->i_sb)->mount_crypt_stat;
	rc = ecryptfs_encrypt_and_encode_filename(&encoded_symname,
						  &encoded_symlen,
						  NULL,
						  mount_crypt_stat, symname,
						  strlen(symname));
	if (rc)
522 523
		goto out_lock;
	rc = vfs_symlink(lower_dir_dentry->d_inode, lower_dentry,
524
			 encoded_symname);
525 526 527
	kfree(encoded_symname);
	if (rc || !lower_dentry->d_inode)
		goto out_lock;
528
	rc = ecryptfs_interpose(lower_dentry, dentry, dir->i_sb);
529 530
	if (rc)
		goto out_lock;
531 532
	fsstack_copy_attr_times(dir, lower_dir_dentry->d_inode);
	fsstack_copy_inode_size(dir, lower_dir_dentry->d_inode);
533 534 535 536 537 538 539 540
out_lock:
	unlock_dir(lower_dir_dentry);
	dput(lower_dentry);
	if (!dentry->d_inode)
		d_drop(dentry);
	return rc;
}

541
static int ecryptfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
542 543 544 545 546 547 548 549 550 551
{
	int rc;
	struct dentry *lower_dentry;
	struct dentry *lower_dir_dentry;

	lower_dentry = ecryptfs_dentry_to_lower(dentry);
	lower_dir_dentry = lock_parent(lower_dentry);
	rc = vfs_mkdir(lower_dir_dentry->d_inode, lower_dentry, mode);
	if (rc || !lower_dentry->d_inode)
		goto out;
552
	rc = ecryptfs_interpose(lower_dentry, dentry, dir->i_sb);
553 554
	if (rc)
		goto out;
555 556
	fsstack_copy_attr_times(dir, lower_dir_dentry->d_inode);
	fsstack_copy_inode_size(dir, lower_dir_dentry->d_inode);
M
Miklos Szeredi 已提交
557
	set_nlink(dir, lower_dir_dentry->d_inode->i_nlink);
558 559 560 561 562 563 564 565 566 567 568
out:
	unlock_dir(lower_dir_dentry);
	if (!dentry->d_inode)
		d_drop(dentry);
	return rc;
}

static int ecryptfs_rmdir(struct inode *dir, struct dentry *dentry)
{
	struct dentry *lower_dentry;
	struct dentry *lower_dir_dentry;
569
	int rc;
570 571

	lower_dentry = ecryptfs_dentry_to_lower(dentry);
572
	dget(dentry);
573
	lower_dir_dentry = lock_parent(lower_dentry);
574
	dget(lower_dentry);
575
	rc = vfs_rmdir(lower_dir_dentry->d_inode, lower_dentry);
576
	dput(lower_dentry);
T
Tyler Hicks 已提交
577 578
	if (!rc && dentry->d_inode)
		clear_nlink(dentry->d_inode);
579
	fsstack_copy_attr_times(dir, lower_dir_dentry->d_inode);
M
Miklos Szeredi 已提交
580
	set_nlink(dir, lower_dir_dentry->d_inode->i_nlink);
581 582 583
	unlock_dir(lower_dir_dentry);
	if (!rc)
		d_drop(dentry);
584
	dput(dentry);
585 586 587 588
	return rc;
}

static int
A
Al Viro 已提交
589
ecryptfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev)
590 591 592 593 594 595 596 597 598 599
{
	int rc;
	struct dentry *lower_dentry;
	struct dentry *lower_dir_dentry;

	lower_dentry = ecryptfs_dentry_to_lower(dentry);
	lower_dir_dentry = lock_parent(lower_dentry);
	rc = vfs_mknod(lower_dir_dentry->d_inode, lower_dentry, mode, dev);
	if (rc || !lower_dentry->d_inode)
		goto out;
600
	rc = ecryptfs_interpose(lower_dentry, dentry, dir->i_sb);
601 602
	if (rc)
		goto out;
603 604
	fsstack_copy_attr_times(dir, lower_dir_dentry->d_inode);
	fsstack_copy_inode_size(dir, lower_dir_dentry->d_inode);
605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620
out:
	unlock_dir(lower_dir_dentry);
	if (!dentry->d_inode)
		d_drop(dentry);
	return rc;
}

static int
ecryptfs_rename(struct inode *old_dir, struct dentry *old_dentry,
		struct inode *new_dir, struct dentry *new_dentry)
{
	int rc;
	struct dentry *lower_old_dentry;
	struct dentry *lower_new_dentry;
	struct dentry *lower_old_dir_dentry;
	struct dentry *lower_new_dir_dentry;
621
	struct dentry *trap = NULL;
622
	struct inode *target_inode;
623 624 625 626 627 628 629

	lower_old_dentry = ecryptfs_dentry_to_lower(old_dentry);
	lower_new_dentry = ecryptfs_dentry_to_lower(new_dentry);
	dget(lower_old_dentry);
	dget(lower_new_dentry);
	lower_old_dir_dentry = dget_parent(lower_old_dentry);
	lower_new_dir_dentry = dget_parent(lower_new_dentry);
630
	target_inode = new_dentry->d_inode;
631 632 633 634 635 636 637 638 639 640 641
	trap = lock_rename(lower_old_dir_dentry, lower_new_dir_dentry);
	/* source should not be ancestor of target */
	if (trap == lower_old_dentry) {
		rc = -EINVAL;
		goto out_lock;
	}
	/* target should not be ancestor of source */
	if (trap == lower_new_dentry) {
		rc = -ENOTEMPTY;
		goto out_lock;
	}
642 643 644 645
	rc = vfs_rename(lower_old_dir_dentry->d_inode, lower_old_dentry,
			lower_new_dir_dentry->d_inode, lower_new_dentry);
	if (rc)
		goto out_lock;
646 647 648
	if (target_inode)
		fsstack_copy_attr_all(target_inode,
				      ecryptfs_inode_to_lower(target_inode));
649
	fsstack_copy_attr_all(new_dir, lower_new_dir_dentry->d_inode);
650
	if (new_dir != old_dir)
651
		fsstack_copy_attr_all(old_dir, lower_old_dir_dentry->d_inode);
652 653
out_lock:
	unlock_rename(lower_old_dir_dentry, lower_new_dir_dentry);
654 655
	dput(lower_new_dir_dentry);
	dput(lower_old_dir_dentry);
656 657 658 659 660
	dput(lower_new_dentry);
	dput(lower_old_dentry);
	return rc;
}

661 662
static int ecryptfs_readlink_lower(struct dentry *dentry, char **buf,
				   size_t *bufsiz)
663
{
664
	struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry);
665
	char *lower_buf;
666 667
	mm_segment_t old_fs;
	int rc;
668

669
	lower_buf = kmalloc(PATH_MAX, GFP_KERNEL);
670
	if (!lower_buf) {
671 672 673 674 675 676 677
		rc = -ENOMEM;
		goto out;
	}
	old_fs = get_fs();
	set_fs(get_ds());
	rc = lower_dentry->d_inode->i_op->readlink(lower_dentry,
						   (char __user *)lower_buf,
678
						   PATH_MAX);
679
	set_fs(old_fs);
680 681
	if (rc < 0)
		goto out;
682
	rc = ecryptfs_decode_and_decrypt_filename(buf, bufsiz, dentry->d_sb,
683
						  lower_buf, rc);
684
out:
685
	kfree(lower_buf);
686 687 688
	return rc;
}

689
static void *ecryptfs_follow_link(struct dentry *dentry, struct nameidata *nd)
690
{
691 692
	char *buf;
	size_t len = PATH_MAX;
693 694
	int rc;

695
	rc = ecryptfs_readlink_lower(dentry, &buf, &len);
696 697 698 699
	if (rc)
		goto out;
	fsstack_copy_attr_atime(dentry->d_inode,
				ecryptfs_dentry_to_lower(dentry)->d_inode);
700
	buf[len] = '\0';
701
out:
702 703
	nd_set_link(nd, buf);
	return NULL;
704 705 706 707 708
}

static void
ecryptfs_put_link(struct dentry *dentry, struct nameidata *nd, void *ptr)
{
709 710 711 712 713
	char *buf = nd_get_link(nd);
	if (!IS_ERR(buf)) {
		/* Free the char* */
		kfree(buf);
	}
714 715 716 717 718 719 720
}

/**
 * upper_size_to_lower_size
 * @crypt_stat: Crypt_stat associated with file
 * @upper_size: Size of the upper file
 *
721
 * Calculate the required size of the lower file based on the
722 723 724 725 726 727 728 729 730 731 732
 * specified size of the upper file. This calculation is based on the
 * number of headers in the underlying file and the extent size.
 *
 * Returns Calculated size of the lower file.
 */
static loff_t
upper_size_to_lower_size(struct ecryptfs_crypt_stat *crypt_stat,
			 loff_t upper_size)
{
	loff_t lower_size;

733
	lower_size = ecryptfs_lower_header_size(crypt_stat);
734 735 736 737 738 739 740 741 742 743 744 745
	if (upper_size != 0) {
		loff_t num_extents;

		num_extents = upper_size >> crypt_stat->extent_shift;
		if (upper_size & ~crypt_stat->extent_mask)
			num_extents++;
		lower_size += (num_extents * crypt_stat->extent_size);
	}
	return lower_size;
}

/**
746
 * truncate_upper
747
 * @dentry: The ecryptfs layer dentry
748 749
 * @ia: Address of the ecryptfs inode's attributes
 * @lower_ia: Address of the lower inode's attributes
750 751 752
 *
 * Function to handle truncations modifying the size of the file. Note
 * that the file sizes are interpolated. When expanding, we are simply
753 754 755 756 757
 * writing strings of 0's out. When truncating, we truncate the upper
 * inode and update the lower_ia according to the page index
 * interpolations. If ATTR_SIZE is set in lower_ia->ia_valid upon return,
 * the caller must use lower_ia in a call to notify_change() to perform
 * the truncation of the lower inode.
758 759 760
 *
 * Returns zero on success; non-zero otherwise
 */
761 762
static int truncate_upper(struct dentry *dentry, struct iattr *ia,
			  struct iattr *lower_ia)
763 764 765 766 767 768 769 770
{
	int rc = 0;
	struct inode *inode = dentry->d_inode;
	struct ecryptfs_crypt_stat *crypt_stat;
	loff_t i_size = i_size_read(inode);
	loff_t lower_size_before_truncate;
	loff_t lower_size_after_truncate;

771 772
	if (unlikely((ia->ia_size == i_size))) {
		lower_ia->ia_valid &= ~ATTR_SIZE;
773
		return 0;
774
	}
775
	rc = ecryptfs_get_lower_file(dentry, inode);
776 777
	if (rc)
		return rc;
778 779
	crypt_stat = &ecryptfs_inode_to_private(dentry->d_inode)->crypt_stat;
	/* Switch on growing or shrinking file */
780
	if (ia->ia_size > i_size) {
781 782
		char zero[] = { 0x00 };

783
		lower_ia->ia_valid &= ~ATTR_SIZE;
784 785 786 787
		/* Write a single 0 at the last position of the file;
		 * this triggers code that will fill in 0's throughout
		 * the intermediate portion of the previous end of the
		 * file and the new and of the file */
788
		rc = ecryptfs_write(inode, zero,
789 790 791 792 793
				    (ia->ia_size - 1), 1);
	} else { /* ia->ia_size < i_size_read(inode) */
		/* We're chopping off all the pages down to the page
		 * in which ia->ia_size is located. Fill in the end of
		 * that page from (ia->ia_size & ~PAGE_CACHE_MASK) to
794 795
		 * PAGE_CACHE_SIZE with zeros. */
		size_t num_zeros = (PAGE_CACHE_SIZE
796
				    - (ia->ia_size & ~PAGE_CACHE_MASK));
797

798
		if (!(crypt_stat->flags & ECRYPTFS_ENCRYPTED)) {
799
			truncate_setsize(inode, ia->ia_size);
800 801
			lower_ia->ia_size = ia->ia_size;
			lower_ia->ia_valid |= ATTR_SIZE;
802
			goto out;
803
		}
804 805 806 807 808 809
		if (num_zeros) {
			char *zeros_virt;

			zeros_virt = kzalloc(num_zeros, GFP_KERNEL);
			if (!zeros_virt) {
				rc = -ENOMEM;
810
				goto out;
811
			}
812
			rc = ecryptfs_write(inode, zeros_virt,
813
					    ia->ia_size, num_zeros);
814
			kfree(zeros_virt);
815
			if (rc) {
816 817 818
				printk(KERN_ERR "Error attempting to zero out "
				       "the remainder of the end page on "
				       "reducing truncate; rc = [%d]\n", rc);
819
				goto out;
820 821
			}
		}
822
		truncate_setsize(inode, ia->ia_size);
823
		rc = ecryptfs_write_inode_size_to_metadata(inode);
824 825 826 827
		if (rc) {
			printk(KERN_ERR	"Problem with "
			       "ecryptfs_write_inode_size_to_metadata; "
			       "rc = [%d]\n", rc);
828
			goto out;
829
		}
830 831 832 833 834
		/* We are reducing the size of the ecryptfs file, and need to
		 * know if we need to reduce the size of the lower file. */
		lower_size_before_truncate =
		    upper_size_to_lower_size(crypt_stat, i_size);
		lower_size_after_truncate =
835 836 837 838 839 840
		    upper_size_to_lower_size(crypt_stat, ia->ia_size);
		if (lower_size_after_truncate < lower_size_before_truncate) {
			lower_ia->ia_size = lower_size_after_truncate;
			lower_ia->ia_valid |= ATTR_SIZE;
		} else
			lower_ia->ia_valid &= ~ATTR_SIZE;
841 842
	}
out:
843
	ecryptfs_put_lower_file(inode);
844 845 846
	return rc;
}

847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868
static int ecryptfs_inode_newsize_ok(struct inode *inode, loff_t offset)
{
	struct ecryptfs_crypt_stat *crypt_stat;
	loff_t lower_oldsize, lower_newsize;

	crypt_stat = &ecryptfs_inode_to_private(inode)->crypt_stat;
	lower_oldsize = upper_size_to_lower_size(crypt_stat,
						 i_size_read(inode));
	lower_newsize = upper_size_to_lower_size(crypt_stat, offset);
	if (lower_newsize > lower_oldsize) {
		/*
		 * The eCryptfs inode and the new *lower* size are mixed here
		 * because we may not have the lower i_mutex held and/or it may
		 * not be appropriate to call inode_newsize_ok() with inodes
		 * from other filesystems.
		 */
		return inode_newsize_ok(inode, lower_newsize);
	}

	return 0;
}

869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884
/**
 * ecryptfs_truncate
 * @dentry: The ecryptfs layer dentry
 * @new_length: The length to expand the file to
 *
 * Simple function that handles the truncation of an eCryptfs inode and
 * its corresponding lower inode.
 *
 * Returns zero on success; non-zero otherwise
 */
int ecryptfs_truncate(struct dentry *dentry, loff_t new_length)
{
	struct iattr ia = { .ia_valid = ATTR_SIZE, .ia_size = new_length };
	struct iattr lower_ia = { .ia_valid = 0 };
	int rc;

885 886 887 888
	rc = ecryptfs_inode_newsize_ok(dentry->d_inode, new_length);
	if (rc)
		return rc;

889 890 891 892 893 894 895 896 897 898 899
	rc = truncate_upper(dentry, &ia, &lower_ia);
	if (!rc && lower_ia.ia_valid & ATTR_SIZE) {
		struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry);

		mutex_lock(&lower_dentry->d_inode->i_mutex);
		rc = notify_change(lower_dentry, &lower_ia);
		mutex_unlock(&lower_dentry->d_inode->i_mutex);
	}
	return rc;
}

900
static int
901
ecryptfs_permission(struct inode *inode, int mask)
902
{
903
	return inode_permission(ecryptfs_inode_to_lower(inode), mask);
904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921
}

/**
 * ecryptfs_setattr
 * @dentry: dentry handle to the inode to modify
 * @ia: Structure with flags of what to change and values
 *
 * Updates the metadata of an inode. If the update is to the size
 * i.e. truncation, then ecryptfs_truncate will handle the size modification
 * of both the ecryptfs inode and the lower inode.
 *
 * All other metadata changes will be passed right to the lower filesystem,
 * and we will just update our inode to look like the lower.
 */
static int ecryptfs_setattr(struct dentry *dentry, struct iattr *ia)
{
	int rc = 0;
	struct dentry *lower_dentry;
922
	struct iattr lower_ia;
923 924 925 926 927
	struct inode *inode;
	struct inode *lower_inode;
	struct ecryptfs_crypt_stat *crypt_stat;

	crypt_stat = &ecryptfs_inode_to_private(dentry->d_inode)->crypt_stat;
928 929
	if (!(crypt_stat->flags & ECRYPTFS_STRUCT_INITIALIZED))
		ecryptfs_init_crypt_stat(crypt_stat);
930 931
	inode = dentry->d_inode;
	lower_inode = ecryptfs_inode_to_lower(inode);
932 933 934 935
	lower_dentry = ecryptfs_dentry_to_lower(dentry);
	mutex_lock(&crypt_stat->cs_mutex);
	if (S_ISDIR(dentry->d_inode->i_mode))
		crypt_stat->flags &= ~(ECRYPTFS_ENCRYPTED);
936 937 938
	else if (S_ISREG(dentry->d_inode->i_mode)
		 && (!(crypt_stat->flags & ECRYPTFS_POLICY_APPLIED)
		     || !(crypt_stat->flags & ECRYPTFS_KEY_VALID))) {
939 940 941 942
		struct ecryptfs_mount_crypt_stat *mount_crypt_stat;

		mount_crypt_stat = &ecryptfs_superblock_to_private(
			dentry->d_sb)->mount_crypt_stat;
943
		rc = ecryptfs_get_lower_file(dentry, inode);
944 945 946 947
		if (rc) {
			mutex_unlock(&crypt_stat->cs_mutex);
			goto out;
		}
948
		rc = ecryptfs_read_metadata(dentry);
949
		ecryptfs_put_lower_file(inode);
950
		if (rc) {
951 952 953
			if (!(mount_crypt_stat->flags
			      & ECRYPTFS_PLAINTEXT_PASSTHROUGH_ENABLED)) {
				rc = -EIO;
954
				printk(KERN_WARNING "Either the lower file "
955
				       "is not in a valid eCryptfs format, "
956 957
				       "or the key could not be retrieved. "
				       "Plaintext passthrough mode is not "
958 959 960 961 962
				       "enabled; returning -EIO\n");
				mutex_unlock(&crypt_stat->cs_mutex);
				goto out;
			}
			rc = 0;
963 964
			crypt_stat->flags &= ~(ECRYPTFS_I_SIZE_INITIALIZED
					       | ECRYPTFS_ENCRYPTED);
965 966 967
		}
	}
	mutex_unlock(&crypt_stat->cs_mutex);
968 969 970 971 972 973 974 975 976 977

	rc = inode_change_ok(inode, ia);
	if (rc)
		goto out;
	if (ia->ia_valid & ATTR_SIZE) {
		rc = ecryptfs_inode_newsize_ok(inode, ia->ia_size);
		if (rc)
			goto out;
	}

978 979 980
	memcpy(&lower_ia, ia, sizeof(lower_ia));
	if (ia->ia_valid & ATTR_FILE)
		lower_ia.ia_file = ecryptfs_file_to_lower(ia->ia_file);
981
	if (ia->ia_valid & ATTR_SIZE) {
982
		rc = truncate_upper(dentry, ia, &lower_ia);
983 984 985
		if (rc < 0)
			goto out;
	}
986 987 988 989 990

	/*
	 * mode change is for clearing setuid/setgid bits. Allow lower fs
	 * to interpret this in its own way.
	 */
991 992
	if (lower_ia.ia_valid & (ATTR_KILL_SUID | ATTR_KILL_SGID))
		lower_ia.ia_valid &= ~ATTR_MODE;
993

994
	mutex_lock(&lower_dentry->d_inode->i_mutex);
995
	rc = notify_change(lower_dentry, &lower_ia);
996
	mutex_unlock(&lower_dentry->d_inode->i_mutex);
997
out:
998
	fsstack_copy_attr_all(inode, lower_inode);
999 1000 1001
	return rc;
}

1002 1003
static int ecryptfs_getattr_link(struct vfsmount *mnt, struct dentry *dentry,
				 struct kstat *stat)
1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023
{
	struct ecryptfs_mount_crypt_stat *mount_crypt_stat;
	int rc = 0;

	mount_crypt_stat = &ecryptfs_superblock_to_private(
						dentry->d_sb)->mount_crypt_stat;
	generic_fillattr(dentry->d_inode, stat);
	if (mount_crypt_stat->flags & ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES) {
		char *target;
		size_t targetsiz;

		rc = ecryptfs_readlink_lower(dentry, &target, &targetsiz);
		if (!rc) {
			kfree(target);
			stat->size = targetsiz;
		}
	}
	return rc;
}

1024 1025
static int ecryptfs_getattr(struct vfsmount *mnt, struct dentry *dentry,
			    struct kstat *stat)
T
Tyler Hicks 已提交
1026 1027 1028 1029
{
	struct kstat lower_stat;
	int rc;

A
Al Viro 已提交
1030
	rc = vfs_getattr(ecryptfs_dentry_to_lower_path(dentry), &lower_stat);
T
Tyler Hicks 已提交
1031
	if (!rc) {
1032 1033
		fsstack_copy_attr_all(dentry->d_inode,
				      ecryptfs_inode_to_lower(dentry->d_inode));
T
Tyler Hicks 已提交
1034 1035 1036 1037 1038 1039
		generic_fillattr(dentry->d_inode, stat);
		stat->blocks = lower_stat.blocks;
	}
	return rc;
}

1040
int
1041 1042 1043 1044 1045 1046 1047 1048
ecryptfs_setxattr(struct dentry *dentry, const char *name, const void *value,
		  size_t size, int flags)
{
	int rc = 0;
	struct dentry *lower_dentry;

	lower_dentry = ecryptfs_dentry_to_lower(dentry);
	if (!lower_dentry->d_inode->i_op->setxattr) {
1049
		rc = -EOPNOTSUPP;
1050 1051
		goto out;
	}
1052 1053

	rc = vfs_setxattr(lower_dentry, name, value, size, flags);
1054 1055
	if (!rc)
		fsstack_copy_attr_all(dentry->d_inode, lower_dentry->d_inode);
1056 1057 1058 1059
out:
	return rc;
}

1060 1061 1062 1063 1064 1065 1066
ssize_t
ecryptfs_getxattr_lower(struct dentry *lower_dentry, const char *name,
			void *value, size_t size)
{
	int rc = 0;

	if (!lower_dentry->d_inode->i_op->getxattr) {
1067
		rc = -EOPNOTSUPP;
1068 1069 1070 1071 1072 1073 1074 1075 1076 1077
		goto out;
	}
	mutex_lock(&lower_dentry->d_inode->i_mutex);
	rc = lower_dentry->d_inode->i_op->getxattr(lower_dentry, name, value,
						   size);
	mutex_unlock(&lower_dentry->d_inode->i_mutex);
out:
	return rc;
}

A
Adrian Bunk 已提交
1078
static ssize_t
1079 1080 1081
ecryptfs_getxattr(struct dentry *dentry, const char *name, void *value,
		  size_t size)
{
1082 1083
	return ecryptfs_getxattr_lower(ecryptfs_dentry_to_lower(dentry), name,
				       value, size);
1084 1085 1086 1087 1088 1089 1090 1091 1092 1093
}

static ssize_t
ecryptfs_listxattr(struct dentry *dentry, char *list, size_t size)
{
	int rc = 0;
	struct dentry *lower_dentry;

	lower_dentry = ecryptfs_dentry_to_lower(dentry);
	if (!lower_dentry->d_inode->i_op->listxattr) {
1094
		rc = -EOPNOTSUPP;
1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110
		goto out;
	}
	mutex_lock(&lower_dentry->d_inode->i_mutex);
	rc = lower_dentry->d_inode->i_op->listxattr(lower_dentry, list, size);
	mutex_unlock(&lower_dentry->d_inode->i_mutex);
out:
	return rc;
}

static int ecryptfs_removexattr(struct dentry *dentry, const char *name)
{
	int rc = 0;
	struct dentry *lower_dentry;

	lower_dentry = ecryptfs_dentry_to_lower(dentry);
	if (!lower_dentry->d_inode->i_op->removexattr) {
1111
		rc = -EOPNOTSUPP;
1112 1113 1114 1115 1116 1117 1118 1119 1120
		goto out;
	}
	mutex_lock(&lower_dentry->d_inode->i_mutex);
	rc = lower_dentry->d_inode->i_op->removexattr(lower_dentry, name);
	mutex_unlock(&lower_dentry->d_inode->i_mutex);
out:
	return rc;
}

1121
const struct inode_operations ecryptfs_symlink_iops = {
1122
	.readlink = generic_readlink,
1123 1124 1125 1126
	.follow_link = ecryptfs_follow_link,
	.put_link = ecryptfs_put_link,
	.permission = ecryptfs_permission,
	.setattr = ecryptfs_setattr,
1127
	.getattr = ecryptfs_getattr_link,
1128 1129 1130 1131 1132 1133
	.setxattr = ecryptfs_setxattr,
	.getxattr = ecryptfs_getxattr,
	.listxattr = ecryptfs_listxattr,
	.removexattr = ecryptfs_removexattr
};

1134
const struct inode_operations ecryptfs_dir_iops = {
1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151
	.create = ecryptfs_create,
	.lookup = ecryptfs_lookup,
	.link = ecryptfs_link,
	.unlink = ecryptfs_unlink,
	.symlink = ecryptfs_symlink,
	.mkdir = ecryptfs_mkdir,
	.rmdir = ecryptfs_rmdir,
	.mknod = ecryptfs_mknod,
	.rename = ecryptfs_rename,
	.permission = ecryptfs_permission,
	.setattr = ecryptfs_setattr,
	.setxattr = ecryptfs_setxattr,
	.getxattr = ecryptfs_getxattr,
	.listxattr = ecryptfs_listxattr,
	.removexattr = ecryptfs_removexattr
};

1152
const struct inode_operations ecryptfs_main_iops = {
1153 1154
	.permission = ecryptfs_permission,
	.setattr = ecryptfs_setattr,
T
Tyler Hicks 已提交
1155
	.getattr = ecryptfs_getattr,
1156 1157 1158 1159 1160
	.setxattr = ecryptfs_setxattr,
	.getxattr = ecryptfs_getxattr,
	.listxattr = ecryptfs_listxattr,
	.removexattr = ecryptfs_removexattr
};