diff options
| author | Maxime Ripard <maxime.ripard@free-electrons.com> | 2013-04-08 21:36:54 +0200 | 
|---|---|---|
| committer | Maxime Ripard <maxime.ripard@free-electrons.com> | 2013-04-08 21:36:54 +0200 | 
| commit | 0b824f8dad9fdfc7c1bf9c1d3ac744075eb73ec6 (patch) | |
| tree | 7559859702f2fa02f6a4db64cf10f6c2e3f80c21 /fs/ecryptfs | |
| parent | 6dbe51c251a327e012439c4772097a13df43c5b8 (diff) | |
| parent | 3d5a96582303e28c48699f3faaf920ef7d43e6f2 (diff) | |
| download | olio-linux-3.10-0b824f8dad9fdfc7c1bf9c1d3ac744075eb73ec6.tar.xz olio-linux-3.10-0b824f8dad9fdfc7c1bf9c1d3ac744075eb73ec6.zip  | |
Merge remote-tracking branch 'arm-soc/clksrc/cleanup' into sunxi/core-for-3.10
Diffstat (limited to 'fs/ecryptfs')
| -rw-r--r-- | fs/ecryptfs/Kconfig | 8 | ||||
| -rw-r--r-- | fs/ecryptfs/Makefile | 7 | ||||
| -rw-r--r-- | fs/ecryptfs/crypto.c | 9 | ||||
| -rw-r--r-- | fs/ecryptfs/dentry.c | 2 | ||||
| -rw-r--r-- | fs/ecryptfs/ecryptfs_kernel.h | 40 | ||||
| -rw-r--r-- | fs/ecryptfs/file.c | 2 | ||||
| -rw-r--r-- | fs/ecryptfs/inode.c | 8 | ||||
| -rw-r--r-- | fs/ecryptfs/keystore.c | 9 | ||||
| -rw-r--r-- | fs/ecryptfs/main.c | 1 | ||||
| -rw-r--r-- | fs/ecryptfs/messaging.c | 5 | 
10 files changed, 65 insertions, 26 deletions
diff --git a/fs/ecryptfs/Kconfig b/fs/ecryptfs/Kconfig index e15ef38c24f..434aa313f07 100644 --- a/fs/ecryptfs/Kconfig +++ b/fs/ecryptfs/Kconfig @@ -12,3 +12,11 @@ config ECRYPT_FS  	  To compile this file system support as a module, choose M here: the  	  module will be called ecryptfs. + +config ECRYPT_FS_MESSAGING +	bool "Enable notifications for userspace key wrap/unwrap" +	depends on ECRYPT_FS +	help +	  Enables the /dev/ecryptfs entry for use by ecryptfsd. This allows +	  for userspace to wrap/unwrap file encryption keys by other +	  backends, like OpenSSL. diff --git a/fs/ecryptfs/Makefile b/fs/ecryptfs/Makefile index 2cc9ee4ad2e..49678a69947 100644 --- a/fs/ecryptfs/Makefile +++ b/fs/ecryptfs/Makefile @@ -1,7 +1,10 @@  # -# Makefile for the Linux 2.6 eCryptfs +# Makefile for the Linux eCryptfs  #  obj-$(CONFIG_ECRYPT_FS) += ecryptfs.o -ecryptfs-objs := dentry.o file.o inode.o main.o super.o mmap.o read_write.o crypto.o keystore.o messaging.o miscdev.o kthread.o debug.o +ecryptfs-y := dentry.o file.o inode.o main.o super.o mmap.o read_write.o \ +	      crypto.o keystore.o kthread.o debug.o + +ecryptfs-$(CONFIG_ECRYPT_FS_MESSAGING) += messaging.o miscdev.o diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c index a7b0c2dfb3d..d5c25db4398 100644 --- a/fs/ecryptfs/crypto.c +++ b/fs/ecryptfs/crypto.c @@ -301,17 +301,14 @@ int virt_to_scatterlist(const void *addr, int size, struct scatterlist *sg,  	while (size > 0 && i < sg_size) {  		pg = virt_to_page(addr);  		offset = offset_in_page(addr); -		if (sg) -			sg_set_page(&sg[i], pg, 0, offset); +		sg_set_page(&sg[i], pg, 0, offset);  		remainder_of_page = PAGE_CACHE_SIZE - offset;  		if (size >= remainder_of_page) { -			if (sg) -				sg[i].length = remainder_of_page; +			sg[i].length = remainder_of_page;  			addr += remainder_of_page;  			size -= remainder_of_page;  		} else { -			if (sg) -				sg[i].length = size; +			sg[i].length = size;  			addr += size;  			size = 0;  		} diff --git a/fs/ecryptfs/dentry.c b/fs/ecryptfs/dentry.c index 1b5d9af937d..bf12ba5dd22 100644 --- a/fs/ecryptfs/dentry.c +++ b/fs/ecryptfs/dentry.c @@ -45,14 +45,12 @@  static int ecryptfs_d_revalidate(struct dentry *dentry, unsigned int flags)  {  	struct dentry *lower_dentry; -	struct vfsmount *lower_mnt;  	int rc = 1;  	if (flags & LOOKUP_RCU)  		return -ECHILD;  	lower_dentry = ecryptfs_dentry_to_lower(dentry); -	lower_mnt = ecryptfs_dentry_to_lower_mnt(dentry);  	if (!lower_dentry->d_op || !lower_dentry->d_op->d_revalidate)  		goto out;  	rc = lower_dentry->d_op->d_revalidate(lower_dentry, flags); diff --git a/fs/ecryptfs/ecryptfs_kernel.h b/fs/ecryptfs/ecryptfs_kernel.h index 7e2c6f5d798..dd299b389d4 100644 --- a/fs/ecryptfs/ecryptfs_kernel.h +++ b/fs/ecryptfs/ecryptfs_kernel.h @@ -172,6 +172,19 @@ ecryptfs_get_key_payload_data(struct key *key)  #define ECRYPTFS_FNEK_ENCRYPTED_FILENAME_PREFIX_SIZE 24  #define ECRYPTFS_ENCRYPTED_DENTRY_NAME_LEN (18 + 1 + 4 + 1 + 32) +#ifdef CONFIG_ECRYPT_FS_MESSAGING +# define ECRYPTFS_VERSIONING_MASK_MESSAGING (ECRYPTFS_VERSIONING_DEVMISC \ +					     | ECRYPTFS_VERSIONING_PUBKEY) +#else +# define ECRYPTFS_VERSIONING_MASK_MESSAGING 0 +#endif + +#define ECRYPTFS_VERSIONING_MASK (ECRYPTFS_VERSIONING_PASSPHRASE \ +				  | ECRYPTFS_VERSIONING_PLAINTEXT_PASSTHROUGH \ +				  | ECRYPTFS_VERSIONING_XATTR \ +				  | ECRYPTFS_VERSIONING_MULTKEY \ +				  | ECRYPTFS_VERSIONING_MASK_MESSAGING \ +				  | ECRYPTFS_VERSIONING_FILENAME_ENCRYPTION)  struct ecryptfs_key_sig {  	struct list_head crypt_stat_list;  	char keysig[ECRYPTFS_SIG_SIZE_HEX + 1]; @@ -399,7 +412,9 @@ struct ecryptfs_daemon {  	struct hlist_node euid_chain;  }; +#ifdef CONFIG_ECRYPT_FS_MESSAGING  extern struct mutex ecryptfs_daemon_hash_mux; +#endif  static inline size_t  ecryptfs_lower_header_size(struct ecryptfs_crypt_stat *crypt_stat) @@ -610,6 +625,7 @@ int  ecryptfs_setxattr(struct dentry *dentry, const char *name, const void *value,  		  size_t size, int flags);  int ecryptfs_read_xattr_region(char *page_virt, struct inode *ecryptfs_inode); +#ifdef CONFIG_ECRYPT_FS_MESSAGING  int ecryptfs_process_response(struct ecryptfs_daemon *daemon,  			      struct ecryptfs_message *msg, u32 seq);  int ecryptfs_send_message(char *data, int data_len, @@ -618,6 +634,24 @@ int ecryptfs_wait_for_response(struct ecryptfs_msg_ctx *msg_ctx,  			       struct ecryptfs_message **emsg);  int ecryptfs_init_messaging(void);  void ecryptfs_release_messaging(void); +#else +static inline int ecryptfs_init_messaging(void) +{ +	return 0; +} +static inline void ecryptfs_release_messaging(void) +{ } +static inline int ecryptfs_send_message(char *data, int data_len, +					struct ecryptfs_msg_ctx **msg_ctx) +{ +	return -ENOTCONN; +} +static inline int ecryptfs_wait_for_response(struct ecryptfs_msg_ctx *msg_ctx, +					     struct ecryptfs_message **emsg) +{ +	return -ENOMSG; +} +#endif  void  ecryptfs_write_header_metadata(char *virt, @@ -655,12 +689,11 @@ int ecryptfs_read_lower_page_segment(struct page *page_for_ecryptfs,  				     size_t offset_in_page, size_t size,  				     struct inode *ecryptfs_inode);  struct page *ecryptfs_get_locked_page(struct inode *inode, loff_t index); -int ecryptfs_exorcise_daemon(struct ecryptfs_daemon *daemon); -int ecryptfs_find_daemon_by_euid(struct ecryptfs_daemon **daemon);  int ecryptfs_parse_packet_length(unsigned char *data, size_t *size,  				 size_t *length_size);  int ecryptfs_write_packet_length(char *dest, size_t size,  				 size_t *packet_size_length); +#ifdef CONFIG_ECRYPT_FS_MESSAGING  int ecryptfs_init_ecryptfs_miscdev(void);  void ecryptfs_destroy_ecryptfs_miscdev(void);  int ecryptfs_send_miscdev(char *data, size_t data_size, @@ -669,6 +702,9 @@ int ecryptfs_send_miscdev(char *data, size_t data_size,  void ecryptfs_msg_ctx_alloc_to_free(struct ecryptfs_msg_ctx *msg_ctx);  int  ecryptfs_spawn_daemon(struct ecryptfs_daemon **daemon, struct file *file); +int ecryptfs_exorcise_daemon(struct ecryptfs_daemon *daemon); +int ecryptfs_find_daemon_by_euid(struct ecryptfs_daemon **daemon); +#endif  int ecryptfs_init_kthread(void);  void ecryptfs_destroy_kthread(void);  int ecryptfs_privileged_open(struct file **lower_file, diff --git a/fs/ecryptfs/file.c b/fs/ecryptfs/file.c index 53acc9d0c13..63b1f54b6a1 100644 --- a/fs/ecryptfs/file.c +++ b/fs/ecryptfs/file.c @@ -199,7 +199,6 @@ static int ecryptfs_open(struct inode *inode, struct file *file)  	struct dentry *ecryptfs_dentry = file->f_path.dentry;  	/* Private value of ecryptfs_dentry allocated in  	 * ecryptfs_lookup() */ -	struct dentry *lower_dentry;  	struct ecryptfs_file_info *file_info;  	mount_crypt_stat = &ecryptfs_superblock_to_private( @@ -222,7 +221,6 @@ static int ecryptfs_open(struct inode *inode, struct file *file)  		rc = -ENOMEM;  		goto out;  	} -	lower_dentry = ecryptfs_dentry_to_lower(ecryptfs_dentry);  	crypt_stat = &ecryptfs_inode_to_private(inode)->crypt_stat;  	mutex_lock(&crypt_stat->cs_mutex);  	if (!(crypt_stat->flags & ECRYPTFS_POLICY_APPLIED)) { diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index e0f07fb6d56..5eab400e259 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c @@ -999,8 +999,8 @@ out:  	return rc;  } -int ecryptfs_getattr_link(struct vfsmount *mnt, struct dentry *dentry, -			  struct kstat *stat) +static int ecryptfs_getattr_link(struct vfsmount *mnt, struct dentry *dentry, +				 struct kstat *stat)  {  	struct ecryptfs_mount_crypt_stat *mount_crypt_stat;  	int rc = 0; @@ -1021,8 +1021,8 @@ int ecryptfs_getattr_link(struct vfsmount *mnt, struct dentry *dentry,  	return rc;  } -int ecryptfs_getattr(struct vfsmount *mnt, struct dentry *dentry, -		     struct kstat *stat) +static int ecryptfs_getattr(struct vfsmount *mnt, struct dentry *dentry, +			    struct kstat *stat)  {  	struct kstat lower_stat;  	int rc; diff --git a/fs/ecryptfs/keystore.c b/fs/ecryptfs/keystore.c index 2333203a120..7d52806c211 100644 --- a/fs/ecryptfs/keystore.c +++ b/fs/ecryptfs/keystore.c @@ -1150,7 +1150,7 @@ decrypt_pki_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok,  	struct ecryptfs_message *msg = NULL;  	char *auth_tok_sig;  	char *payload; -	size_t payload_len; +	size_t payload_len = 0;  	int rc;  	rc = ecryptfs_get_auth_tok_sig(&auth_tok_sig, auth_tok); @@ -1168,7 +1168,7 @@ decrypt_pki_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok,  	rc = ecryptfs_send_message(payload, payload_len, &msg_ctx);  	if (rc) {  		ecryptfs_printk(KERN_ERR, "Error sending message to " -				"ecryptfsd\n"); +				"ecryptfsd: %d\n", rc);  		goto out;  	}  	rc = ecryptfs_wait_for_response(msg_ctx, &msg); @@ -1202,8 +1202,7 @@ decrypt_pki_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok,  				  crypt_stat->key_size);  	}  out: -	if (msg) -		kfree(msg); +	kfree(msg);  	return rc;  } @@ -1989,7 +1988,7 @@ pki_encrypt_session_key(struct key *auth_tok_key,  	rc = ecryptfs_send_message(payload, payload_len, &msg_ctx);  	if (rc) {  		ecryptfs_printk(KERN_ERR, "Error sending message to " -				"ecryptfsd\n"); +				"ecryptfsd: %d\n", rc);  		goto out;  	}  	rc = ecryptfs_wait_for_response(msg_ctx, &msg); diff --git a/fs/ecryptfs/main.c b/fs/ecryptfs/main.c index 4e0886c9e5c..e924cf45aad 100644 --- a/fs/ecryptfs/main.c +++ b/fs/ecryptfs/main.c @@ -629,6 +629,7 @@ static struct file_system_type ecryptfs_fs_type = {  	.kill_sb = ecryptfs_kill_block_super,  	.fs_flags = 0  }; +MODULE_ALIAS_FS("ecryptfs");  /**   * inode_info_init_once diff --git a/fs/ecryptfs/messaging.c b/fs/ecryptfs/messaging.c index 8d7a577ae49..49ff8ea08f1 100644 --- a/fs/ecryptfs/messaging.c +++ b/fs/ecryptfs/messaging.c @@ -97,8 +97,7 @@ static void ecryptfs_msg_ctx_free_to_alloc(struct ecryptfs_msg_ctx *msg_ctx)  void ecryptfs_msg_ctx_alloc_to_free(struct ecryptfs_msg_ctx *msg_ctx)  {  	list_move(&(msg_ctx->node), &ecryptfs_msg_ctx_free_list); -	if (msg_ctx->msg) -		kfree(msg_ctx->msg); +	kfree(msg_ctx->msg);  	msg_ctx->msg = NULL;  	msg_ctx->state = ECRYPTFS_MSG_CTX_STATE_FREE;  } @@ -283,7 +282,7 @@ ecryptfs_send_message_locked(char *data, int data_len, u8 msg_type,  	int rc;  	rc = ecryptfs_find_daemon_by_euid(&daemon); -	if (rc || !daemon) { +	if (rc) {  		rc = -ENOTCONN;  		goto out;  	}  |