From: "Timothy R. Chavez" <tinytim@us.ibm.com>
To: Phillip Hellewell <phillip@hellewell.homeip.net>
Cc: Andrew Morton <akpm@osdl.org>,
linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org,
viro@ftp.linux.org.uk, mike@halcrow.us, mhalcrow@us.ibm.com,
mcthomps@us.ibm.com, toml@us.ibm.com, yoder1@us.ibm.com,
James Morris <jmorris@namei.org>,
"Stephen C. Tweedie" <sct@redhat.com>,
Erez Zadok <ezk@cs.sunysb.edu>,
David Howells <dhowells@redhat.com>
Subject: Re: [PATCH 6/13: eCryptfs] Superblock operations
Date: Fri, 05 May 2006 11:15:30 -0500 [thread overview]
Message-ID: <1146845730.12533.25.camel@localhost.localdomain> (raw)
In-Reply-To: <20060504033829.GE28613@hellewell.homeip.net>
On Wed, 2006-05-03 at 21:38 -0600, Phillip Hellewell wrote:
> This is the 6th patch in a series of 13 constituting the kernel
> components of the eCryptfs cryptographic filesystem.
>
> eCryptfs superblock operations and inode allocation, deallocation, and
> initialization functions.
>
> Signed-off-by: Phillip Hellewell <phillip@hellewell.homeip.net>
> Signed-off-by: Michael Halcrow <mhalcrow@us.ibm.com>
Hello,
I looked over this code and had just a few nits; all pretty trivial.
Comments below.
-tim
> ---
>
> super.c | 225 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 225 insertions(+)
>
> Index: linux-2.6.17-rc3-mm1-ecryptfs/fs/ecryptfs/super.c
> ===================================================================
> --- /dev/null 1970-01-01 00:00:00.000000000 +0000
> +++ linux-2.6.17-rc3-mm1-ecryptfs/fs/ecryptfs/super.c 2006-05-02 19:36:04.000000000 -0600
> @@ -0,0 +1,225 @@
> +/**
> + * eCryptfs: Linux filesystem encryption layer
> + *
> + * Copyright (C) 1997-2003 Erez Zadok
> + * Copyright (C) 2001-2003 Stony Brook University
> + * Copyright (C) 2004-2006 International Business Machines Corp.
> + * Author(s): Michael A. Halcrow <mahalcro@us.ibm.com>
> + * Michael C. Thompson <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/fs.h>
> +#include <linux/mount.h>
> +#include <linux/key.h>
> +#include <linux/seq_file.h>
> +#include "ecryptfs_kernel.h"
> +
> +kmem_cache_t *ecryptfs_inode_info_cache;
Can this be declared static?
[..]
> +
> +/**
> + * Called to bring an inode into existence.
> + *
> + * Note that setting the self referencing pointer doesn't work here:
> + * i.e. ECRYPTFS_INODE_TO_PRIVATE_SM(inode) = ei;
> + *
> + * Only handle allocation, setting up structures should be done in
> + * ecryptfs_read_inode. This is because the kernel, between now and
> + * then, will 0 out the private data pointer.
> + *
> + * @param sb Pointer to the super block of the filesystem
> + * @return Pointer to a newly allocated inode, NULL otherwise
> + */
> +static struct inode *ecryptfs_alloc_inode(struct super_block *sb) {
> + struct ecryptfs_inode_info *ecryptfs_inode = NULL;
> + struct inode *inode = NULL;
> +
> + ecryptfs_printk(KERN_DEBUG, "Enter; sb = [%p]\n", sb);
> + ecryptfs_inode = kmem_cache_alloc(ecryptfs_inode_info_cache,
> + SLAB_KERNEL);
> + if (unlikely(!ecryptfs_inode)) {
> + ecryptfs_printk(KERN_WARNING,
> + "Failed to allocate new inode\n");
> + goto out;
> + }
> + ecryptfs_init_crypt_stat(&(ecryptfs_inode->crypt_stat));
> + inode = &(ecryptfs_inode->vfs_inode);
> +out:
> + ecryptfs_printk(KERN_DEBUG, "Exit; inode = [%p]\n", inode);
> + return inode;
> +}
> +
> +/**
> + * This is used during the final destruction of the inode.
> + * All allocation of memory related to the inode, including allocated
> + * memory in the crypt_stat struct, will be released here.
> + * There should be no chance that this deallocation will be missed.
> + */
> +static void ecryptfs_destroy_inode(struct inode *inode) {
> + struct ecryptfs_crypt_stat *crypt_stat;
> +
> + ecryptfs_printk(KERN_DEBUG, "Enter; inode = [%p]\n", inode);
> + crypt_stat = &(ECRYPTFS_INODE_TO_PRIVATE(inode))->crypt_stat;
> + ecryptfs_destruct_crypt_stat(crypt_stat);
> + kmem_cache_free(ecryptfs_inode_info_cache,
> + ECRYPTFS_INODE_TO_PRIVATE(inode));
> + ecryptfs_printk(KERN_DEBUG, "Exit\n");
> +}
> +
> +/**
> + * Set up the ecryptfs inode.
> + */
> +static void ecryptfs_read_inode(struct inode *inode)
> +{
> + ecryptfs_printk(KERN_DEBUG, "Enter; inode = [%p]\n", inode);
> + /* This is where we setup the self-reference in the vfs_inode's
> + * u.generic_ip. That way we don't have to walk the list again. */
> + ECRYPTFS_INODE_TO_PRIVATE_SM(inode) =
> + list_entry(inode, struct ecryptfs_inode_info, vfs_inode);
> + ECRYPTFS_INODE_TO_LOWER(inode) = NULL;
> + inode->i_version++;
> + inode->i_op = &ecryptfs_main_iops;
> + inode->i_fop = &ecryptfs_main_fops;
> + inode->i_mapping->a_ops = &ecryptfs_aops;
> + ecryptfs_printk(KERN_DEBUG, "Exit\n");
> +}
> +
> +
> +/**
> + * This is called through iput_final().
> + * This is function will replace generic_drop_inode. The end result of which
This is function? :)
[..]
> + * is we are skipping the check in inode->i_nlink, which we do not use.
> + */
> +static void ecryptfs_drop_inode(struct inode *inode) {
> + generic_delete_inode(inode);
> +}
> +
Might you static inline this function?
[..]
> +/**
> + * Final actions when unmounting a file system.
> + * This will handle deallocation and release of our private data.
> + */
> +static void ecryptfs_put_super(struct super_block *sb)
> +{
> + struct ecryptfs_sb_info *sb_info = ECRYPTFS_SUPERBLOCK_TO_PRIVATE(sb);
> +
> + ecryptfs_printk(KERN_DEBUG, "Enter\n");
> + mntput(sb_info->lower_mnt);
> + key_put(sb_info->mount_crypt_stat.global_auth_tok_key);
> + kmem_cache_free(ecryptfs_sb_info_cache, sb_info);
> + ECRYPTFS_SUPERBLOCK_TO_PRIVATE_SM(sb) = NULL;
> + ecryptfs_printk(KERN_DEBUG, "Exit\n");
> +}
> +
> +/**
> + * Get the filesystem statistics. Currently, we let this pass right through
> + * to the lower filesystem and take no action ourselves.
> + */
> +static int ecryptfs_statfs(struct super_block *sb, struct kstatfs *buf)
> +{
> + int rc = 0;
Trivial, but this initialization really isn't necessary.
[..]
> +
> + ecryptfs_printk(KERN_DEBUG, "Enter\n");
> + rc = vfs_statfs(ECRYPTFS_SUPERBLOCK_TO_LOWER(sb), buf);
> + ecryptfs_printk(KERN_DEBUG, "Exit; rc = [%d]\n", rc);
> + return rc;
> +}
> +
> +/**
> + * Called to ask filesystem to change mount options. Not implemented;
> + * returns -ENOSYS every time.
> + */
> +static int ecryptfs_remount_fs(struct super_block *sb, int *flags, char *data)
> +{
> + ecryptfs_printk(KERN_DEBUG, "Enter\n");
> + ecryptfs_printk(KERN_DEBUG, "Exit\n");
> + return -ENOSYS;
> +}
This may also be trivial, but why have place holder code when you could
simply set ecryptfs_ops.remount_fs function ptr to NULL? Besides...
wouldn't -ENOTSUPP be a better error code here? Maybe not.
[..]
> +
> +/**
> + * Called by iput() when the inode reference count reached zero
> + * and the inode is not hashed anywhere. Used to clear anything
> + * that needs to be, before the inode is completely destroyed and put
> + * on the inode free list. We use this to drop out reference to the
> + * lower inode.
> + */
> +static void ecryptfs_clear_inode(struct inode *inode)
> +{
> + ecryptfs_printk(KERN_DEBUG, "Enter; inode = [%p]; i_ino = [0x%.16x]\n",
> + inode, inode->i_ino);
> + iput(ECRYPTFS_INODE_TO_LOWER(inode));
> + ecryptfs_printk(KERN_DEBUG, "Exit\n");
> +}
> +
> +/**
> + * Called in do_umount() if the MNT_FORCE flag was used and this
> + * function is defined. See comment in linux/fs/super.c:do_umount().
> + * Used only in nfs, to kill any pending RPC tasks, so that subsequent
> + * code can actually succeed and won't leave tasks that need handling.
> + */
> +static void ecryptfs_umount_begin(struct vfsmount *vfsmnt, int flags)
> +{
> + struct vfsmount *lower_mnt;
> + struct super_block *lower_sb;
> +
> + ecryptfs_printk(KERN_DEBUG, "Enter\n");
> + lower_mnt = ECRYPTFS_SUPERBLOCK_TO_PRIVATE(vfsmnt->mnt_sb)->lower_mnt;
> + lower_sb = lower_mnt->mnt_sb;
> + if (lower_sb->s_op->umount_begin)
> + lower_sb->s_op->umount_begin(lower_mnt, flags);
> + ecryptfs_printk(KERN_DEBUG, "Exit\n");
> +}
> +
> +/**
> + * Prints the directory we are currently mounted over
> + *
> + * @return Zero on success; non-zero otherwise
> + */
> +static int ecryptfs_show_options(struct seq_file *m, struct vfsmount *mnt)
> +{
> + struct super_block *sb = mnt->mnt_sb;
> + int rc = 0;
> + char *tmp = NULL;
> + char *path;
> +
> + ecryptfs_printk(KERN_DEBUG, "Enter\n");
> + tmp = (char *)__get_free_page(GFP_KERNEL);
> + if (!tmp) {
> + rc = -ENOMEM;
> + goto out;
> + }
> + path = d_path(ECRYPTFS_DENTRY_TO_LOWER(sb->s_root),
> + ECRYPTFS_SUPERBLOCK_TO_PRIVATE(sb)->lower_mnt, tmp,
> + PAGE_SIZE);
Might you check IS_ERR on path?
> + seq_printf(m, ",dir=%s", path);
> + free_page((unsigned long)tmp);
> +out:
> + ecryptfs_printk(KERN_DEBUG, "Exit; rc = [%d]\n", rc);
> + return rc;
> +}
> +
> +struct super_operations ecryptfs_sops = {
> + .alloc_inode = ecryptfs_alloc_inode,
> + .destroy_inode = ecryptfs_destroy_inode,
> + .read_inode = ecryptfs_read_inode,
> + .drop_inode = ecryptfs_drop_inode,
> + .put_super = ecryptfs_put_super,
> + .statfs = ecryptfs_statfs,
> + .remount_fs = ecryptfs_remount_fs,
> + .clear_inode = ecryptfs_clear_inode,
> + .umount_begin = ecryptfs_umount_begin,
> + .show_options = ecryptfs_show_options
> +};
next prev parent reply other threads:[~2006-05-05 16:15 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-05-04 3:17 [PATCH 0/12: eCryptfs] eCryptfs version 0.1.6 Phillip Hellewell
2006-05-04 3:27 ` [PATCH 1/13: eCryptfs] fs/Makefile and fs/Kconfig Phillip Hellewell
2006-05-04 3:35 ` [PATCH 2/13: eCryptfs] Documentation Phillip Hellewell
2006-05-04 7:32 ` Pavel Machek
2006-05-04 12:11 ` Michael Halcrow
2006-05-04 3:36 ` [PATCH 3/13: eCryptfs] Makefile Phillip Hellewell
2006-05-04 3:37 ` [PATCH 4/13: eCryptfs] Main module functions Phillip Hellewell
2006-05-04 3:37 ` [PATCH 5/13: eCryptfs] Header declarations Phillip Hellewell
2006-05-04 14:51 ` Pekka Enberg
2006-05-04 14:58 ` Artem B. Bityutskiy
2006-05-04 15:22 ` Pekka Enberg
2006-05-04 15:29 ` Artem B. Bityutskiy
2006-05-04 15:08 ` Michael Thompson
2006-05-04 3:38 ` [PATCH 6/13: eCryptfs] Superblock operations Phillip Hellewell
2006-05-04 9:55 ` Pavel Machek
2006-05-04 14:02 ` Michael Thompson
2006-05-04 14:26 ` Pekka Enberg
2006-05-04 14:37 ` Pekka Enberg
2006-05-04 15:00 ` Michael Thompson
2006-05-04 15:12 ` Pekka Enberg
2006-05-04 21:40 ` David Howells
2006-05-05 13:12 ` Dave Kleikamp
2006-05-05 14:03 ` David Howells
2006-05-05 14:34 ` Dave Kleikamp
2006-05-05 14:52 ` David Howells
2006-05-05 16:15 ` Timothy R. Chavez [this message]
2006-05-04 3:39 ` [PATCH 7/13: eCryptfs] Dentry operations Phillip Hellewell
2006-05-05 16:46 ` Timothy R. Chavez
2006-05-04 3:39 ` [PATCH 8/13: eCryptfs] File operations Phillip Hellewell
2006-05-04 4:06 ` Eric Dumazet
2006-05-05 18:55 ` Timothy R. Chavez
2006-05-04 3:40 ` [PATCH 9/13: eCryptfs] Inode operations Phillip Hellewell
2006-05-04 3:41 ` [PATCH 10/13: eCryptfs] Mmap operations Phillip Hellewell
2006-05-04 15:13 ` Pekka Enberg
2006-05-04 21:43 ` David Howells
2006-05-05 15:22 ` Dave Kleikamp
2006-05-05 15:38 ` Pekka Enberg
2006-05-06 2:21 ` Andrew Morton
2006-05-06 16:00 ` Michael Halcrow
2006-05-06 16:42 ` Andrew Morton
2006-05-06 16:57 ` Linus Torvalds
2006-05-04 3:42 ` [PATCH 11/13: eCryptfs] Keystore Phillip Hellewell
2006-05-04 3:42 ` [PATCH 12/13: eCryptfs] Crypto functions Phillip Hellewell
2006-05-04 3:43 ` [PATCH 13/13: eCryptfs] Debug functions Phillip Hellewell
2006-05-04 20:30 ` Randy.Dunlap
2006-05-04 7:28 ` [PATCH 0/12: eCryptfs] eCryptfs version 0.1.6 Pavel Machek
2006-05-04 12:08 ` Michael Halcrow
2006-05-05 9:05 ` Alon Bar-Lev
2006-05-05 16:08 ` Michael Halcrow
-- strict thread matches above, loose matches on Subject: below --
2006-05-13 3:37 [PATCH 0/13: eCryptfs] eCryptfs Patch Set Phillip Hellewell
2006-05-13 3:44 ` [PATCH 6/13: eCryptfs] Superblock operations Phillip Hellewell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1146845730.12533.25.camel@localhost.localdomain \
--to=tinytim@us.ibm.com \
--cc=akpm@osdl.org \
--cc=dhowells@redhat.com \
--cc=ezk@cs.sunysb.edu \
--cc=jmorris@namei.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mcthomps@us.ibm.com \
--cc=mhalcrow@us.ibm.com \
--cc=mike@halcrow.us \
--cc=phillip@hellewell.homeip.net \
--cc=sct@redhat.com \
--cc=toml@us.ibm.com \
--cc=viro@ftp.linux.org.uk \
--cc=yoder1@us.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.