inode.c 32.7 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
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);
156
	rc = vfs_unlink(lower_dir_inode, lower_dentry, NULL);
157 158 159 160 161 162 163 164 165 166 167 168 169 170
	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
	if (IS_ERR(inode)) {
211
		vfs_unlink(lower_dir_dentry->d_inode, lower_dentry, NULL);
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
	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,
J
J. Bruce Fields 已提交
478
		      lower_new_dentry, NULL);
479 480
	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
	rc = vfs_rename(lower_old_dir_dentry->d_inode, lower_old_dentry,
643
			lower_new_dir_dentry->d_inode, lower_new_dentry,
M
Miklos Szeredi 已提交
644
			NULL, 0);
645 646
	if (rc)
		goto out_lock;
647 648 649
	if (target_inode)
		fsstack_copy_attr_all(target_inode,
				      ecryptfs_inode_to_lower(target_inode));
650
	fsstack_copy_attr_all(new_dir, lower_new_dir_dentry->d_inode);
651
	if (new_dir != old_dir)
652
		fsstack_copy_attr_all(old_dir, lower_old_dir_dentry->d_inode);
653 654
out_lock:
	unlock_rename(lower_old_dir_dentry, lower_new_dir_dentry);
655 656
	dput(lower_new_dir_dentry);
	dput(lower_old_dir_dentry);
657 658 659 660 661
	dput(lower_new_dentry);
	dput(lower_old_dentry);
	return rc;
}

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

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

688
static void *ecryptfs_follow_link(struct dentry *dentry, struct nameidata *nd)
689
{
690 691 692
	size_t len;
	char *buf = ecryptfs_readlink_lower(dentry, &len);
	if (IS_ERR(buf))
693 694 695
		goto out;
	fsstack_copy_attr_atime(dentry->d_inode,
				ecryptfs_dentry_to_lower(dentry)->d_inode);
696
	buf[len] = '\0';
697
out:
698 699
	nd_set_link(nd, buf);
	return NULL;
700 701 702 703 704 705 706
}

/**
 * upper_size_to_lower_size
 * @crypt_stat: Crypt_stat associated with file
 * @upper_size: Size of the upper file
 *
707
 * Calculate the required size of the lower file based on the
708 709 710 711 712 713 714 715 716 717 718
 * 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;

719
	lower_size = ecryptfs_lower_header_size(crypt_stat);
720 721 722 723 724 725 726 727 728 729 730 731
	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;
}

/**
732
 * truncate_upper
733
 * @dentry: The ecryptfs layer dentry
734 735
 * @ia: Address of the ecryptfs inode's attributes
 * @lower_ia: Address of the lower inode's attributes
736 737 738
 *
 * Function to handle truncations modifying the size of the file. Note
 * that the file sizes are interpolated. When expanding, we are simply
739 740 741 742 743
 * 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.
744 745 746
 *
 * Returns zero on success; non-zero otherwise
 */
747 748
static int truncate_upper(struct dentry *dentry, struct iattr *ia,
			  struct iattr *lower_ia)
749 750 751 752 753 754 755 756
{
	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;

757 758
	if (unlikely((ia->ia_size == i_size))) {
		lower_ia->ia_valid &= ~ATTR_SIZE;
759
		return 0;
760
	}
761
	rc = ecryptfs_get_lower_file(dentry, inode);
762 763
	if (rc)
		return rc;
764 765
	crypt_stat = &ecryptfs_inode_to_private(dentry->d_inode)->crypt_stat;
	/* Switch on growing or shrinking file */
766
	if (ia->ia_size > i_size) {
767 768
		char zero[] = { 0x00 };

769
		lower_ia->ia_valid &= ~ATTR_SIZE;
770 771 772 773
		/* 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 */
774
		rc = ecryptfs_write(inode, zero,
775 776 777 778 779
				    (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
780 781
		 * PAGE_CACHE_SIZE with zeros. */
		size_t num_zeros = (PAGE_CACHE_SIZE
782
				    - (ia->ia_size & ~PAGE_CACHE_MASK));
783

784
		if (!(crypt_stat->flags & ECRYPTFS_ENCRYPTED)) {
785
			truncate_setsize(inode, ia->ia_size);
786 787
			lower_ia->ia_size = ia->ia_size;
			lower_ia->ia_valid |= ATTR_SIZE;
788
			goto out;
789
		}
790 791 792 793 794 795
		if (num_zeros) {
			char *zeros_virt;

			zeros_virt = kzalloc(num_zeros, GFP_KERNEL);
			if (!zeros_virt) {
				rc = -ENOMEM;
796
				goto out;
797
			}
798
			rc = ecryptfs_write(inode, zeros_virt,
799
					    ia->ia_size, num_zeros);
800
			kfree(zeros_virt);
801
			if (rc) {
802 803 804
				printk(KERN_ERR "Error attempting to zero out "
				       "the remainder of the end page on "
				       "reducing truncate; rc = [%d]\n", rc);
805
				goto out;
806 807
			}
		}
808
		truncate_setsize(inode, ia->ia_size);
809
		rc = ecryptfs_write_inode_size_to_metadata(inode);
810 811 812 813
		if (rc) {
			printk(KERN_ERR	"Problem with "
			       "ecryptfs_write_inode_size_to_metadata; "
			       "rc = [%d]\n", rc);
814
			goto out;
815
		}
816 817 818 819 820
		/* 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 =
821 822 823 824 825 826
		    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;
827 828
	}
out:
829
	ecryptfs_put_lower_file(inode);
830 831 832
	return rc;
}

833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854
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;
}

855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870
/**
 * 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;

871 872 873 874
	rc = ecryptfs_inode_newsize_ok(dentry->d_inode, new_length);
	if (rc)
		return rc;

875 876 877 878 879
	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);
880
		rc = notify_change(lower_dentry, &lower_ia, NULL);
881 882 883 884 885
		mutex_unlock(&lower_dentry->d_inode->i_mutex);
	}
	return rc;
}

886
static int
887
ecryptfs_permission(struct inode *inode, int mask)
888
{
889
	return inode_permission(ecryptfs_inode_to_lower(inode), mask);
890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907
}

/**
 * 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;
908
	struct iattr lower_ia;
909 910 911 912 913
	struct inode *inode;
	struct inode *lower_inode;
	struct ecryptfs_crypt_stat *crypt_stat;

	crypt_stat = &ecryptfs_inode_to_private(dentry->d_inode)->crypt_stat;
914 915
	if (!(crypt_stat->flags & ECRYPTFS_STRUCT_INITIALIZED))
		ecryptfs_init_crypt_stat(crypt_stat);
916 917
	inode = dentry->d_inode;
	lower_inode = ecryptfs_inode_to_lower(inode);
918 919 920 921
	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);
922 923 924
	else if (S_ISREG(dentry->d_inode->i_mode)
		 && (!(crypt_stat->flags & ECRYPTFS_POLICY_APPLIED)
		     || !(crypt_stat->flags & ECRYPTFS_KEY_VALID))) {
925 926 927 928
		struct ecryptfs_mount_crypt_stat *mount_crypt_stat;

		mount_crypt_stat = &ecryptfs_superblock_to_private(
			dentry->d_sb)->mount_crypt_stat;
929
		rc = ecryptfs_get_lower_file(dentry, inode);
930 931 932 933
		if (rc) {
			mutex_unlock(&crypt_stat->cs_mutex);
			goto out;
		}
934
		rc = ecryptfs_read_metadata(dentry);
935
		ecryptfs_put_lower_file(inode);
936
		if (rc) {
937 938 939
			if (!(mount_crypt_stat->flags
			      & ECRYPTFS_PLAINTEXT_PASSTHROUGH_ENABLED)) {
				rc = -EIO;
940
				printk(KERN_WARNING "Either the lower file "
941
				       "is not in a valid eCryptfs format, "
942 943
				       "or the key could not be retrieved. "
				       "Plaintext passthrough mode is not "
944 945 946 947 948
				       "enabled; returning -EIO\n");
				mutex_unlock(&crypt_stat->cs_mutex);
				goto out;
			}
			rc = 0;
949 950
			crypt_stat->flags &= ~(ECRYPTFS_I_SIZE_INITIALIZED
					       | ECRYPTFS_ENCRYPTED);
951 952 953
		}
	}
	mutex_unlock(&crypt_stat->cs_mutex);
954 955 956 957 958 959 960 961 962 963

	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;
	}

964 965 966
	memcpy(&lower_ia, ia, sizeof(lower_ia));
	if (ia->ia_valid & ATTR_FILE)
		lower_ia.ia_file = ecryptfs_file_to_lower(ia->ia_file);
967
	if (ia->ia_valid & ATTR_SIZE) {
968
		rc = truncate_upper(dentry, ia, &lower_ia);
969 970 971
		if (rc < 0)
			goto out;
	}
972 973 974 975 976

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

980
	mutex_lock(&lower_dentry->d_inode->i_mutex);
981
	rc = notify_change(lower_dentry, &lower_ia, NULL);
982
	mutex_unlock(&lower_dentry->d_inode->i_mutex);
983
out:
984
	fsstack_copy_attr_all(inode, lower_inode);
985 986 987
	return rc;
}

988 989
static int ecryptfs_getattr_link(struct vfsmount *mnt, struct dentry *dentry,
				 struct kstat *stat)
990 991 992 993 994 995 996 997 998 999 1000
{
	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;

1001 1002
		target = ecryptfs_readlink_lower(dentry, &targetsiz);
		if (!IS_ERR(target)) {
1003 1004
			kfree(target);
			stat->size = targetsiz;
1005 1006
		} else {
			rc = PTR_ERR(target);
1007 1008 1009 1010 1011
		}
	}
	return rc;
}

1012 1013
static int ecryptfs_getattr(struct vfsmount *mnt, struct dentry *dentry,
			    struct kstat *stat)
T
Tyler Hicks 已提交
1014 1015 1016 1017
{
	struct kstat lower_stat;
	int rc;

A
Al Viro 已提交
1018
	rc = vfs_getattr(ecryptfs_dentry_to_lower_path(dentry), &lower_stat);
T
Tyler Hicks 已提交
1019
	if (!rc) {
1020 1021
		fsstack_copy_attr_all(dentry->d_inode,
				      ecryptfs_inode_to_lower(dentry->d_inode));
T
Tyler Hicks 已提交
1022 1023 1024 1025 1026 1027
		generic_fillattr(dentry->d_inode, stat);
		stat->blocks = lower_stat.blocks;
	}
	return rc;
}

1028
int
1029 1030 1031 1032 1033 1034 1035 1036
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) {
1037
		rc = -EOPNOTSUPP;
1038 1039
		goto out;
	}
1040 1041

	rc = vfs_setxattr(lower_dentry, name, value, size, flags);
1042 1043
	if (!rc)
		fsstack_copy_attr_all(dentry->d_inode, lower_dentry->d_inode);
1044 1045 1046 1047
out:
	return rc;
}

1048 1049 1050 1051 1052 1053 1054
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) {
1055
		rc = -EOPNOTSUPP;
1056 1057 1058 1059 1060 1061 1062 1063 1064 1065
		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 已提交
1066
static ssize_t
1067 1068 1069
ecryptfs_getxattr(struct dentry *dentry, const char *name, void *value,
		  size_t size)
{
1070 1071
	return ecryptfs_getxattr_lower(ecryptfs_dentry_to_lower(dentry), name,
				       value, size);
1072 1073 1074 1075 1076 1077 1078 1079 1080 1081
}

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) {
1082
		rc = -EOPNOTSUPP;
1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098
		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) {
1099
		rc = -EOPNOTSUPP;
1100 1101 1102 1103 1104 1105 1106 1107 1108
		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;
}

1109
const struct inode_operations ecryptfs_symlink_iops = {
1110
	.readlink = generic_readlink,
1111
	.follow_link = ecryptfs_follow_link,
A
Al Viro 已提交
1112
	.put_link = kfree_put_link,
1113 1114
	.permission = ecryptfs_permission,
	.setattr = ecryptfs_setattr,
1115
	.getattr = ecryptfs_getattr_link,
1116 1117 1118 1119 1120 1121
	.setxattr = ecryptfs_setxattr,
	.getxattr = ecryptfs_getxattr,
	.listxattr = ecryptfs_listxattr,
	.removexattr = ecryptfs_removexattr
};

1122
const struct inode_operations ecryptfs_dir_iops = {
1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139
	.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
};

1140
const struct inode_operations ecryptfs_main_iops = {
1141 1142
	.permission = ecryptfs_permission,
	.setattr = ecryptfs_setattr,
T
Tyler Hicks 已提交
1143
	.getattr = ecryptfs_getattr,
1144 1145 1146 1147 1148
	.setxattr = ecryptfs_setxattr,
	.getxattr = ecryptfs_getxattr,
	.listxattr = ecryptfs_listxattr,
	.removexattr = ecryptfs_removexattr
};