28 Mar, 2011

10 commits

  • A requested key is write locked in order to prevent modifications on the
    authentication token while it is being used.

    Signed-off-by: Roberto Sassu
    Signed-off-by: Tyler Hicks

    Roberto Sassu
     
  • The ecryptfs_find_auth_tok_for_sig() call is moved before the
    mutex_lock(s->tfm_mutex) instruction in order to avoid possible deadlocks
    that may occur by holding the lock on the two semaphores 'key->sem' and
    's->tfm_mutex' in reverse order.

    Signed-off-by: Roberto Sassu
    Signed-off-by: Tyler Hicks

    Roberto Sassu
     
  • Authentication tokens content may change if another requestor calls the
    update() method of the corresponding key. The new function
    ecryptfs_verify_auth_tok_from_key() retrieves the authentication token from
    the provided key and verifies if it is still valid before being used to
    encrypt or decrypt an eCryptfs file.

    Signed-off-by: Roberto Sassu
    [tyhicks: Minor formatting changes]
    Signed-off-by: Tyler Hicks

    Roberto Sassu
     
  • The size of the 'keysig' array is incremented of one byte in order to make
    room for the NULL character. The 'keysig' variable is used, in the function
    ecryptfs_generate_key_packet_set(), to find an authentication token with
    the given signature and is printed a debug message if it cannot be
    retrieved.

    Signed-off-by: Roberto Sassu
    Signed-off-by: Tyler Hicks

    Roberto Sassu
     
  • This patch removes the 'num_global_auth_toks' field of the
    ecryptfs_mount_crypt_stat structure, used to count the number of items in
    the 'global_auth_tok_list' list. This variable is not needed because there
    are no checks based upon it.

    Signed-off-by: Roberto Sassu
    Signed-off-by: Tyler Hicks

    Roberto Sassu
     
  • The pointer '(*auth_tok_key)' is set to NULL in case request_key()
    fails, in order to prevent its use by functions calling
    ecryptfs_keyring_auth_tok_for_sig().

    Signed-off-by: Roberto Sassu
    Cc:
    Signed-off-by: Tyler Hicks

    Roberto Sassu
     
  • Unlock the page in error path of ecryptfs_write_begin(). This may
    happen, for example, if decryption fails while bring the page
    up-to-date.

    Cc:
    Signed-off-by: Tyler Hicks

    Tyler Hicks
     
  • Change the write path to encrypt the data only when the page is written to
    disk in ecryptfs_writepage. Previously, ecryptfs encrypts the page in
    ecryptfs_write_end which means that if there are multiple write requests to
    the same page, ecryptfs ends up re-encrypting that page over and over again.
    This patch minimizes the number of encryptions needed.

    Signed-off-by: Thieu Le
    [tyhicks: Changed NULL .drop_inode sop pointer to generic_drop_inode]
    Signed-off-by: Tyler Hicks

    Thieu Le
     
  • Now that grow_file() is not called in the ecryptfs_create() path, the
    ECRYPTFS_NEW_FILE flag is no longer needed. It helped
    ecryptfs_readpage() know not to decrypt zeroes that were read from the
    lower file in the grow_file() path.

    Signed-off-by: Tyler Hicks

    Tyler Hicks
     
  • When creating a new eCryptfs file, the crypto metadata is written out
    and then the lower file was being "grown" with 4 kB of encrypted zeroes.
    I suspect that growing the encrypted file was to prevent an information
    leak that the unencrypted file was empty. However, the unencrypted file
    size is stored, in plaintext, in the metadata so growing the file is
    unnecessary.

    Signed-off-by: Tyler Hicks

    Tyler Hicks
     

22 Feb, 2011

3 commits

  • The lower filesystem may do some type of inode revalidation during a
    getattr call. eCryptfs should take advantage of that by copying the
    lower inode attributes to the eCryptfs inode after a call to
    vfs_getattr() on the lower inode.

    I originally wrote this fix while working on eCryptfs on nfsv3 support,
    but discovered it also fixed an eCryptfs on ext4 nanosecond timestamp
    bug that was reported.

    https://bugs.launchpad.net/bugs/613873

    Cc:
    Signed-off-by: Tyler Hicks

    Tyler Hicks
     
  • read() calls against a file descriptor connected to a directory are
    incorrectly returning EINVAL rather than EISDIR:

    [EISDIR]
    [XSI] [Option Start] The fildes argument refers to a directory and the
    implementation does not allow the directory to be read using read()
    or pread(). The readdir() function should be used instead. [Option End]

    This occurs because we do not have a .read operation defined for
    ecryptfs directories. Connect this up to generic_read_dir().

    BugLink: http://bugs.launchpad.net/bugs/719691
    Signed-off-by: Andy Whitcroft
    Signed-off-by: Tyler Hicks

    Andy Whitcroft
     
  • Allow for NULL nameidata pointers in eCryptfs create, lookup, and
    d_revalidate functions.

    Signed-off-by: Tyler Hicks

    Tyler Hicks
     

18 Feb, 2011

1 commit

  • This reverts commit 21edad32205e97dc7ccb81a85234c77e760364c8 and commit
    93c3fe40c279f002906ad14584c30671097d4394, which fixed a regression by
    the former.

    Al Viro pointed out bypassed dcache lookups in
    ecryptfs_new_lower_dentry(), misuse of vfs_path_lookup() in
    ecryptfs_lookup_one_lower() and a dislike of passing nameidata to the
    lower filesystem.

    Reported-by: Al Viro
    Signed-off-by: Tyler Hicks

    Tyler Hicks
     

18 Jan, 2011

8 commits


14 Jan, 2011

1 commit

  • Stephen Rothwell reports that the vfs merge broke the build of ecryptfs.
    The breakage comes from commit 66cb76666d69 ("sanitize ecryptfs
    ->mount()") which was obviously not even build tested. Tssk, tssk, Al.

    This is the minimal build fixup for the situation, although I don't have
    a filesystem to actually test it with.

    Reported-by: Stephen Rothwell
    Cc: Al Viro
    Signed-off-by: Linus Torvalds

    Linus Torvalds
     

13 Jan, 2011

1 commit


07 Jan, 2011

6 commits

  • Signed-off-by: Nick Piggin

    Nick Piggin
     
  • Require filesystems be aware of .d_revalidate being called in rcu-walk
    mode (nd->flags & LOOKUP_RCU). For now do a simple push down, returning
    -ECHILD from all implementations.

    Signed-off-by: Nick Piggin

    Nick Piggin
     
  • Reduce some branches and memory accesses in dcache lookup by adding dentry
    flags to indicate common d_ops are set, rather than having to check them.
    This saves a pointer memory access (dentry->d_op) in common path lookup
    situations, and saves another pointer load and branch in cases where we
    have d_op but not the particular operation.

    Patched with:

    git grep -E '[.>]([[:space:]])*d_op([[:space:]])*=' | xargs sed -e 's/\([^\t ]*\)->d_op = \(.*\);/d_set_d_op(\1, \2);/' -e 's/\([^\t ]*\)\.d_op = \(.*\);/d_set_d_op(\&\1, \2);/' -i

    Signed-off-by: Nick Piggin

    Nick Piggin
     
  • RCU free the struct inode. This will allow:

    - Subsequent store-free path walking patch. The inode must be consulted for
    permissions when walking, so an RCU inode reference is a must.
    - sb_inode_list_lock to be moved inside i_lock because sb list walkers who want
    to take i_lock no longer need to take sb_inode_list_lock to walk the list in
    the first place. This will simplify and optimize locking.
    - Could remove some nested trylock loops in dcache code
    - Could potentially simplify things a bit in VM land. Do not need to take the
    page lock to follow page->mapping.

    The downsides of this is the performance cost of using RCU. In a simple
    creat/unlink microbenchmark, performance drops by about 10% due to inability to
    reuse cache-hot slab objects. As iterations increase and RCU freeing starts
    kicking over, this increases to about 20%.

    In cases where inode lifetimes are longer (ie. many inodes may be allocated
    during the average life span of a single inode), a lot of this cache reuse is
    not applicable, so the regression caused by this patch is smaller.

    The cache-hot regression could largely be avoided by using SLAB_DESTROY_BY_RCU,
    however this adds some complexity to list walking and store-free path walking,
    so I prefer to implement this at a later date, if it is shown to be a win in
    real situations. I haven't found a regression in any non-micro benchmark so I
    doubt it will be a problem.

    Signed-off-by: Nick Piggin

    Nick Piggin
     
  • Make d_count non-atomic and protect it with d_lock. This allows us to ensure a
    0 refcount dentry remains 0 without dcache_lock. It is also fairly natural when
    we start protecting many other dentry members with d_lock.

    Signed-off-by: Nick Piggin

    Nick Piggin
     
  • Change d_hash so it may be called from lock-free RCU lookups. See similar
    patch for d_compare for details.

    For in-tree filesystems, this is just a mechanical change.

    Signed-off-by: Nick Piggin

    Nick Piggin
     

18 Nov, 2010

1 commit


30 Oct, 2010

1 commit


29 Oct, 2010

7 commits

  • When printing mount options, print the new ecryptfs_mount_auth_tok_only
    mount option.

    Signed-off-by: Tyler Hicks

    Tyler Hicks
     
  • This patch adds a new mount parameter 'ecryptfs_mount_auth_tok_only' to
    force ecryptfs to use only authentication tokens which signature has
    been specified at mount time with parameters 'ecryptfs_sig' and
    'ecryptfs_fnek_sig'. In this way, after disabling the passthrough and
    the encrypted view modes, it's possible to make available to users only
    files encrypted with the specified authentication token.

    Signed-off-by: Roberto Sassu
    Cc: Dustin Kirkland
    Cc: James Morris
    [Tyler: Clean up coding style errors found by checkpatch]
    Signed-off-by: Tyler Hicks

    Roberto Sassu
     
  • This patch replaces the check of the 'matching_auth_tok' pointer with
    the exit status of ecryptfs_find_auth_tok_for_sig().
    This avoids to use authentication tokens obtained through the function
    ecryptfs_keyring_auth_tok_for_sig which are not valid.

    Signed-off-by: Roberto Sassu
    Cc: Dustin Kirkland
    Cc: James Morris
    Signed-off-by: Tyler Hicks

    Roberto Sassu
     
  • This patch allows keys requested in the function
    ecryptfs_keyring_auth_tok_for_sig()to be released when they are no
    longer required. In particular keys are directly released in the same
    function if the obtained authentication token is not valid.

    Further, a new function parameter 'auth_tok_key' has been added to
    ecryptfs_find_auth_tok_for_sig() in order to provide callers the key
    pointer to be passed to key_put().

    Signed-off-by: Roberto Sassu
    Cc: Dustin Kirkland
    Cc: James Morris
    [Tyler: Initialize auth_tok_key to NULL in ecryptfs_parse_packet_set]
    Signed-off-by: Tyler Hicks

    Roberto Sassu
     
  • eCryptfs was passing the LOOKUP_OPEN flag through to the lower file
    system, even though ecryptfs_create() doesn't support the flag. A valid
    filp for the lower filesystem could be returned in the nameidata if the
    lower file system's create() function supported LOOKUP_OPEN, possibly
    resulting in unencrypted writes to the lower file.

    However, this is only a potential problem in filesystems (FUSE, NFS,
    CIFS, CEPH, 9p) that eCryptfs isn't known to support today.

    https://bugs.launchpad.net/ecryptfs/+bug/641703

    Reported-by: Kevin Buhr
    Cc: stable
    Signed-off-by: Tyler Hicks

    Tyler Hicks
     
  • Ecryptfs is a stackable filesystem which relies on lower filesystems the
    ability of setting/getting extended attributes.

    If there is a security module enabled on the system it updates the
    'security' field of inodes according to the owned extended attribute set
    with the function vfs_setxattr(). When this function is performed on a
    ecryptfs filesystem the 'security' field is not updated for the lower
    filesystem since the call security_inode_post_setxattr() is missing for
    the lower inode.
    Further, the call security_inode_setxattr() is missing for the lower inode,
    leading to policy violations in the security module because specific
    checks for this hook are not performed (i. e. filesystem
    'associate' permission on SELinux is not checked for the lower filesystem).

    This patch replaces the call of the setxattr() method of the lower inode
    in the function ecryptfs_setxattr() with vfs_setxattr().

    Signed-off-by: Roberto Sassu
    Cc: stable
    Cc: Dustin Kirkland
    Acked-by: James Morris
    Signed-off-by: Tyler Hicks

    Roberto Sassu
     
  • Signed-off-by: Al Viro

    Al Viro
     

25 Oct, 2010

1 commit

  • * 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial: (39 commits)
    Update broken web addresses in arch directory.
    Update broken web addresses in the kernel.
    Revert "drivers/usb: Remove unnecessary return's from void functions" for musb gadget
    Revert "Fix typo: configuation => configuration" partially
    ida: document IDA_BITMAP_LONGS calculation
    ext2: fix a typo on comment in ext2/inode.c
    drivers/scsi: Remove unnecessary casts of private_data
    drivers/s390: Remove unnecessary casts of private_data
    net/sunrpc/rpc_pipe.c: Remove unnecessary casts of private_data
    drivers/infiniband: Remove unnecessary casts of private_data
    drivers/gpu/drm: Remove unnecessary casts of private_data
    kernel/pm_qos_params.c: Remove unnecessary casts of private_data
    fs/ecryptfs: Remove unnecessary casts of private_data
    fs/seq_file.c: Remove unnecessary casts of private_data
    arm: uengine.c: remove C99 comments
    arm: scoop.c: remove C99 comments
    Fix typo configue => configure in comments
    Fix typo: configuation => configuration
    Fix typo interrest[ing|ed] => interest[ing|ed]
    Fix various typos of valid in comments
    ...

    Fix up trivial conflicts in:
    drivers/char/ipmi/ipmi_si_intf.c
    drivers/usb/gadget/rndis.c
    net/irda/irnet/irnet_ppp.c

    Linus Torvalds