inode.c 32.6 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 644
			lower_new_dir_dentry->d_inode, lower_new_dentry,
			NULL);
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 663
static int ecryptfs_readlink_lower(struct dentry *dentry, char **buf,
				   size_t *bufsiz)
664
{
665
	struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry);
666
	char *lower_buf;
667 668
	mm_segment_t old_fs;
	int rc;
669

670
	lower_buf = kmalloc(PATH_MAX, GFP_KERNEL);
671
	if (!lower_buf) {
672 673 674 675 676 677 678
		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,
679
						   PATH_MAX);
680
	set_fs(old_fs);
681 682
	if (rc < 0)
		goto out;
683
	rc = ecryptfs_decode_and_decrypt_filename(buf, bufsiz, dentry->d_sb,
684
						  lower_buf, rc);
685
out:
686
	kfree(lower_buf);
687 688 689
	return rc;
}

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

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

/**
 * upper_size_to_lower_size
 * @crypt_stat: Crypt_stat associated with file
 * @upper_size: Size of the upper file
 *
712
 * Calculate the required size of the lower file based on the
713 714 715 716 717 718 719 720 721 722 723
 * 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;

724
	lower_size = ecryptfs_lower_header_size(crypt_stat);
725 726 727 728 729 730 731 732 733 734 735 736
	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;
}

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

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

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

789
		if (!(crypt_stat->flags & ECRYPTFS_ENCRYPTED)) {
790
			truncate_setsize(inode, ia->ia_size);
791 792
			lower_ia->ia_size = ia->ia_size;
			lower_ia->ia_valid |= ATTR_SIZE;
793
			goto out;
794
		}
795 796 797 798 799 800
		if (num_zeros) {
			char *zeros_virt;

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

838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859
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;
}

860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875
/**
 * 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;

876 877 878 879
	rc = ecryptfs_inode_newsize_ok(dentry->d_inode, new_length);
	if (rc)
		return rc;

880 881 882 883 884
	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);
885
		rc = notify_change(lower_dentry, &lower_ia, NULL);
886 887 888 889 890
		mutex_unlock(&lower_dentry->d_inode->i_mutex);
	}
	return rc;
}

891
static int
892
ecryptfs_permission(struct inode *inode, int mask)
893
{
894
	return inode_permission(ecryptfs_inode_to_lower(inode), mask);
895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912
}

/**
 * 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;
913
	struct iattr lower_ia;
914 915 916 917 918
	struct inode *inode;
	struct inode *lower_inode;
	struct ecryptfs_crypt_stat *crypt_stat;

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

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

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

969 970 971
	memcpy(&lower_ia, ia, sizeof(lower_ia));
	if (ia->ia_valid & ATTR_FILE)
		lower_ia.ia_file = ecryptfs_file_to_lower(ia->ia_file);
972
	if (ia->ia_valid & ATTR_SIZE) {
973
		rc = truncate_upper(dentry, ia, &lower_ia);
974 975 976
		if (rc < 0)
			goto out;
	}
977 978 979 980 981

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

985
	mutex_lock(&lower_dentry->d_inode->i_mutex);
986
	rc = notify_change(lower_dentry, &lower_ia, NULL);
987
	mutex_unlock(&lower_dentry->d_inode->i_mutex);
988
out:
989
	fsstack_copy_attr_all(inode, lower_inode);
990 991 992
	return rc;
}

993 994
static int ecryptfs_getattr_link(struct vfsmount *mnt, struct dentry *dentry,
				 struct kstat *stat)
995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014
{
	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;
}

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

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

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

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

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

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

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

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

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