02 Jul, 2022

1 commit

  • commit bb49e9e730c2906a958eee273a7819f401543d6c upstream.

    Multiple places open-code the same check to determine whether a given
    mount is idmapped. Introduce a simple helper function that can be used
    instead. This allows us to get rid of the fragile open-coding. We will
    later change the check that is used to determine whether a given mount
    is idmapped. Introducing a helper allows us to do this in a single
    place instead of doing it for multiple places.

    Link: https://lore.kernel.org/r/20211123114227.3124056-2-brauner@kernel.org (v1)
    Link: https://lore.kernel.org/r/20211130121032.3753852-2-brauner@kernel.org (v2)
    Link: https://lore.kernel.org/r/20211203111707.3901969-2-brauner@kernel.org
    Cc: Seth Forshee
    Cc: Christoph Hellwig
    Cc: Al Viro
    CC: linux-fsdevel@vger.kernel.org
    Reviewed-by: Amir Goldstein
    Reviewed-by: Seth Forshee
    Signed-off-by: Christian Brauner
    Signed-off-by: Christian Brauner (Microsoft)
    Signed-off-by: Greg Kroah-Hartman

    Christian Brauner
     

30 Jun, 2021

1 commit

  • Remove the CONFIG_BLOCK default to __set_page_dirty_buffers and just wire
    that method up for the missing instances.

    [hch@lst.de: ecryptfs: add a ->set_page_dirty cludge]
    Link: https://lkml.kernel.org/r/20210624125250.536369-1-hch@lst.de

    Link: https://lkml.kernel.org/r/20210614061512.3966143-4-hch@lst.de
    Signed-off-by: Christoph Hellwig
    Reviewed-by: Greg Kroah-Hartman
    Reviewed-by: Jan Kara
    Cc: Al Viro
    Cc: Matthew Wilcox (Oracle)
    Cc: Tyler Hicks
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Christoph Hellwig
     

14 May, 2021

2 commits

  • crypt_stat memory itself is allocated when inode is created, in
    ecryptfs_alloc_inode, which returns NULL on failure and is handled
    by callers, which would prevent us getting to this point. It then
    calls ecryptfs_init_crypt_stat which allocates crypt_stat->tfm
    checking for and likewise handling allocation failure. Finally,
    crypt_stat->flags has ECRYPTFS_STRUCT_INITIALIZED merged into it
    in ecryptfs_init_crypt_stat as well.

    Simply put, the conditions that the BUG_ON checks for will never
    be triggered, as to even get to this function, the relevant conditions
    will have already been fulfilled (or the inode allocation would fail in
    the first place and thus no call to this function or those above it).

    Cc: Tyler Hicks
    Signed-off-by: Phillip Potter
    Link: https://lore.kernel.org/r/20210503115736.2104747-50-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman

    Phillip Potter
     
  • This reverts commit 2c2a7552dd6465e8fde6bc9cccf8d66ed1c1eb72.

    Because of recent interactions with developers from @umn.edu, all
    commits from them have been recently re-reviewed to ensure if they were
    correct or not.

    Upon review, this commit was found to be incorrect for the reasons
    below, so it must be reverted. It will be fixed up "correctly" in a
    later kernel change.

    The original commit log for this change was incorrect, no "error
    handling code" was added, things will blow up just as badly as before if
    any of these cases ever were true. As this BUG_ON() never fired, and
    most of these checks are "obviously" never going to be true, let's just
    revert to the original code for now until this gets unwound to be done
    correctly in the future.

    Cc: Aditya Pakki
    Fixes: 2c2a7552dd64 ("ecryptfs: replace BUG_ON with error handling code")
    Cc: stable
    Acked-by: Tyler Hicks
    Link: https://lore.kernel.org/r/20210503115736.2104747-49-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman

    Greg Kroah-Hartman
     

07 May, 2021

1 commit

  • …el/git/tyhicks/ecryptfs

    Pull ecryptfs updates from Tyler Hicks:
    "Code cleanups and a bug fix

    - W=1 compiler warning cleanups

    - Mutex initialization simplification

    - Protect against NULL pointer exception during mount"

    * tag 'ecryptfs-5.13-rc1-updates' of git://git.kernel.org/pub/scm/linux/kernel/git/tyhicks/ecryptfs:
    ecryptfs: fix kernel panic with null dev_name
    ecryptfs: remove unused helpers
    ecryptfs: Fix typo in message
    eCryptfs: Use DEFINE_MUTEX() for mutex lock
    ecryptfs: keystore: Fix some kernel-doc issues and demote non-conformant headers
    ecryptfs: inode: Help out nearly-there header and demote non-conformant ones
    ecryptfs: mmap: Help out one function header and demote other abuses
    ecryptfs: crypto: Supply some missing param descriptions and demote abuses
    ecryptfs: miscdev: File headers are not good kernel-doc candidates
    ecryptfs: main: Demote a bunch of non-conformant kernel-doc headers
    ecryptfs: messaging: Add missing param descriptions and demote abuses
    ecryptfs: super: Fix formatting, naming and kernel-doc abuses
    ecryptfs: file: Demote kernel-doc abuses
    ecryptfs: kthread: Demote file header and provide description for 'cred'
    ecryptfs: dentry: File headers are not good candidates for kernel-doc
    ecryptfs: debug: Demote a couple of kernel-doc abuses
    ecryptfs: read_write: File headers do not make good candidates for kernel-doc
    ecryptfs: use DEFINE_MUTEX() for mutex lock
    eCryptfs: add a semicolon

    Linus Torvalds
     

03 May, 2021

1 commit

  • Pull exryptfs updates from Al Viro:
    "The interesting part here is (ecryptfs) lock_parent() fixes - its
    treatment of ->d_parent had been very wrong.

    The rest is trivial cleanups"

    * 'work.ecryptfs' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
    ecryptfs: ecryptfs_dentry_info->crypt_stat is never used
    ecryptfs: get rid of unused accessors
    ecryptfs: saner API for lock_parent()
    ecryptfs: get rid of pointless dget/dput in ->symlink() and ->link()

    Linus Torvalds
     

19 Apr, 2021

18 commits

  • When mounting eCryptfs, a null "dev_name" argument to ecryptfs_mount()
    causes a kernel panic if the parsed options are valid. The easiest way to
    reproduce this is to call mount() from userspace with an existing
    eCryptfs mount's options and a "source" argument of 0.

    Error out if "dev_name" is null in ecryptfs_mount()

    Fixes: 237fead61998 ("[PATCH] ecryptfs: fs/Makefile and fs/Kconfig")
    Cc: stable@vger.kernel.org
    Signed-off-by: Jeffrey Mitchell
    Signed-off-by: Tyler Hicks

    Jeffrey Mitchell
     
  • Remove two helpers that are unused.

    Cc: Amir Goldstein
    Cc: Tyler Hicks
    Cc: ecryptfs@vger.kernel.org
    Cc: linux-fsdevel@vger.kernel.org
    Signed-off-by: Christian Brauner
    Signed-off-by: Tyler Hicks

    Christian Brauner
     
  • ecryptfs_decrypt_page() issues a warning "Error encrypting extent". This
    should be "Error decrypting extent" instead.

    Fixes: 0216f7f79217 ("eCryptfs: replace encrypt, decrypt, and inode size write")
    Signed-off-by: Sascha Hauer
    Signed-off-by: Tyler Hicks

    Sascha Hauer
     
  • mutex lock can be initialized automatically with DEFINE_MUTEX()
    rather than explicitly calling mutex_init().

    Reported-by: Hulk Robot
    Signed-off-by: Ye Bin
    Signed-off-by: Tyler Hicks

    Ye Bin
     
  • Fixes the following W=1 kernel build warning(s):

    fs/ecryptfs/keystore.c:25: warning: Incorrect use of kernel-doc format: * request_key returned an error instead of a valid key address;
    fs/ecryptfs/keystore.c:30: warning: Function parameter or member 'err_code' not described in 'process_request_key_err'
    fs/ecryptfs/keystore.c:30: warning: expecting prototype for eCryptfs(). Prototype was for process_request_key_err() instead
    fs/ecryptfs/keystore.c:558: warning: Function parameter or member 'auth_tok_key' not described in 'ecryptfs_find_auth_tok_for_sig'
    fs/ecryptfs/keystore.c:558: warning: Function parameter or member 'mount_crypt_stat' not described in 'ecryptfs_find_auth_tok_for_sig'
    fs/ecryptfs/keystore.c:558: warning: Excess function parameter 'crypt_stat' description in 'ecryptfs_find_auth_tok_for_sig'
    fs/ecryptfs/keystore.c:584: warning: cannot understand function prototype: 'struct ecryptfs_write_tag_70_packet_silly_stack '
    fs/ecryptfs/keystore.c:622: warning: Function parameter or member 'dest' not described in 'ecryptfs_write_tag_70_packet'
    fs/ecryptfs/keystore.c:622: warning: Function parameter or member 'remaining_bytes' not described in 'ecryptfs_write_tag_70_packet'
    fs/ecryptfs/keystore.c:622: warning: Function parameter or member 'packet_size' not described in 'ecryptfs_write_tag_70_packet'
    fs/ecryptfs/keystore.c:622: warning: Function parameter or member 'mount_crypt_stat' not described in 'ecryptfs_write_tag_70_packet'
    fs/ecryptfs/keystore.c:622: warning: Function parameter or member 'filename_size' not described in 'ecryptfs_write_tag_70_packet'
    fs/ecryptfs/keystore.c:622: warning: expecting prototype for write_tag_70_packet(). Prototype was for ecryptfs_write_tag_70_packet() instead
    fs/ecryptfs/keystore.c:895: warning: expecting prototype for parse_tag_70_packet(). Prototype was for ecryptfs_parse_tag_70_packet() instead

    Cc: Tyler Hicks
    Cc: "Michael A. Halcrow"
    Cc: "Michael C. Thompson"
    Cc: "Trevor S. Highland"
    Cc: ecryptfs@vger.kernel.org
    Signed-off-by: Lee Jones
    Signed-off-by: Tyler Hicks

    Lee Jones
     
  • Fixes the following W=1 kernel build warning(s):

    fs/ecryptfs/inode.c:27: warning: Function parameter or member 'dentry' not described in 'lock_parent'
    fs/ecryptfs/inode.c:27: warning: Function parameter or member 'lower_dentry' not described in 'lock_parent'
    fs/ecryptfs/inode.c:27: warning: Function parameter or member 'lower_dir' not described in 'lock_parent'
    fs/ecryptfs/inode.c:27: warning: expecting prototype for eCryptfs(). Prototype was for lock_parent() instead
    fs/ecryptfs/inode.c:211: warning: Function parameter or member 'ecryptfs_dentry' not described in 'ecryptfs_initialize_file'
    fs/ecryptfs/inode.c:211: warning: Function parameter or member 'ecryptfs_inode' not described in 'ecryptfs_initialize_file'
    fs/ecryptfs/inode.c:258: warning: Function parameter or member 'mnt_userns' not described in 'ecryptfs_create'
    fs/ecryptfs/inode.c:258: warning: Function parameter or member 'directory_inode' not described in 'ecryptfs_create'
    fs/ecryptfs/inode.c:258: warning: Function parameter or member 'ecryptfs_dentry' not described in 'ecryptfs_create'
    fs/ecryptfs/inode.c:258: warning: Function parameter or member 'excl' not described in 'ecryptfs_create'
    fs/ecryptfs/inode.c:258: warning: Excess function parameter 'dir' description in 'ecryptfs_create'
    fs/ecryptfs/inode.c:258: warning: Excess function parameter 'dentry' description in 'ecryptfs_create'
    fs/ecryptfs/inode.c:320: warning: Function parameter or member 'dentry' not described in 'ecryptfs_lookup_interpose'
    fs/ecryptfs/inode.c:320: warning: Function parameter or member 'lower_dentry' not described in 'ecryptfs_lookup_interpose'
    fs/ecryptfs/inode.c:887: warning: Function parameter or member 'mnt_userns' not described in 'ecryptfs_setattr'

    Cc: Tyler Hicks
    Cc: "Michael A. Halcrow"
    Cc: "Michael C. Thompsion"
    Cc: ecryptfs@vger.kernel.org
    Signed-off-by: Lee Jones
    Signed-off-by: Tyler Hicks

    Lee Jones
     
  • Fixes the following W=1 kernel build warning(s):

    fs/ecryptfs/mmap.c:26: warning: Incorrect use of kernel-doc format: * ecryptfs_get_locked_page
    fs/ecryptfs/mmap.c:34: warning: Function parameter or member 'inode' not described in 'ecryptfs_get_locked_page'
    fs/ecryptfs/mmap.c:34: warning: Function parameter or member 'index' not described in 'ecryptfs_get_locked_page'
    fs/ecryptfs/mmap.c:34: warning: expecting prototype for eCryptfs(). Prototype was for ecryptfs_get_locked_page() instead
    fs/ecryptfs/mmap.c:52: warning: Function parameter or member 'wbc' not described in 'ecryptfs_writepage'
    fs/ecryptfs/mmap.c:98: warning: Incorrect use of kernel-doc format: * ecryptfs_copy_up_encrypted_with_header
    fs/ecryptfs/mmap.c:110: warning: Function parameter or member 'page' not described in 'ecryptfs_copy_up_encrypted_with_header'
    fs/ecryptfs/mmap.c:110: warning: Function parameter or member 'crypt_stat' not described in 'ecryptfs_copy_up_encrypted_with_header'
    fs/ecryptfs/mmap.c:110: warning: expecting prototype for Header Extent(). Prototype was for ecryptfs_copy_up_encrypted_with_header() instead
    fs/ecryptfs/mmap.c:233: warning: wrong kernel-doc identifier on line:
    fs/ecryptfs/mmap.c:379: warning: Function parameter or member 'ecryptfs_inode' not described in 'ecryptfs_write_inode_size_to_header'

    Cc: Tyler Hicks
    Cc: James Morris
    Cc: Tycho Andersen
    Cc: Christian Brauner
    Cc: "Michael A. Halcrow"
    Cc: ecryptfs@vger.kernel.org
    Signed-off-by: Lee Jones
    Signed-off-by: Tyler Hicks

    Lee Jones
     
  • Fixes the following W=1 kernel build warning(s):

    fs/ecryptfs/crypto.c:29: warning: expecting prototype for eCryptfs(). Prototype was for DECRYPT() instead
    fs/ecryptfs/crypto.c:360: warning: Function parameter or member 'crypt_stat' not described in 'lower_offset_for_page'
    fs/ecryptfs/crypto.c:360: warning: Function parameter or member 'page' not described in 'lower_offset_for_page'
    fs/ecryptfs/crypto.c:637: warning: Function parameter or member 'crypt_stat' not described in 'ecryptfs_compute_root_iv'
    fs/ecryptfs/crypto.c:1386: warning: Function parameter or member 'ecryptfs_dentry' not described in 'ecryptfs_read_metadata'
    fs/ecryptfs/crypto.c:1463: warning: Function parameter or member 'filename' not described in 'ecryptfs_encrypt_filename'
    fs/ecryptfs/crypto.c:1463: warning: Function parameter or member 'mount_crypt_stat' not described in 'ecryptfs_encrypt_filename'
    fs/ecryptfs/crypto.c:1897: warning: Function parameter or member 'encoded_name_size' not described in 'ecryptfs_encrypt_and_encode_filename'
    fs/ecryptfs/crypto.c:1897: warning: Function parameter or member 'mount_crypt_stat' not described in 'ecryptfs_encrypt_and_encode_filename'
    fs/ecryptfs/crypto.c:1897: warning: Function parameter or member 'name_size' not described in 'ecryptfs_encrypt_and_encode_filename'
    fs/ecryptfs/crypto.c:1897: warning: Excess function parameter 'crypt_stat' description in 'ecryptfs_encrypt_and_encode_filename'
    fs/ecryptfs/crypto.c:1897: warning: Excess function parameter 'length' description in 'ecryptfs_encrypt_and_encode_filename'
    fs/ecryptfs/crypto.c:2006: warning: Function parameter or member 'sb' not described in 'ecryptfs_decode_and_decrypt_filename'
    fs/ecryptfs/crypto.c:2006: warning: Excess function parameter 'ecryptfs_dir_dentry' description in 'ecryptfs_decode_and_decrypt_filename'

    Cc: Tyler Hicks
    Cc: Eric Biggers
    Cc: "Michael A. Halcrow"
    Cc: "Michael C. Thompson"
    Cc: ecryptfs@vger.kernel.org
    Signed-off-by: Lee Jones
    [tyhicks: Fix typo in ecryptfs_encrypt_and_encode_filename() func docs]
    Signed-off-by: Tyler Hicks

    Lee Jones
     
  • Supply description for the 'daemon' param too.

    Fixes the following W=1 kernel build warning(s):

    fs/ecryptfs/miscdev.c:19: warning: cannot understand function prototype: 'atomic_t ecryptfs_num_miscdev_opens; '
    fs/ecryptfs/miscdev.c:323: warning: Function parameter or member 'daemon' not described in 'ecryptfs_miscdev_response'

    Cc: Tyler Hicks
    Cc: "Michael A. Halcrow"
    Cc: ecryptfs@vger.kernel.org
    Signed-off-by: Lee Jones
    Signed-off-by: Tyler Hicks

    Lee Jones
     
  • Fixes the following W=1 kernel build warning(s):

    fs/ecryptfs/main.c:28: warning: Incorrect use of kernel-doc format: * Module parameter that defines the ecryptfs_verbosity level.
    fs/ecryptfs/main.c:30: warning: cannot understand function prototype: 'int ecryptfs_verbosity = 0; '
    fs/ecryptfs/main.c:40: warning: cannot understand function prototype: 'unsigned int ecryptfs_message_buf_len = ECRYPTFS_DEFAULT_MSG_CTX_ELEMS; '
    fs/ecryptfs/main.c:52: warning: cannot understand function prototype: 'signed long ecryptfs_message_wait_timeout = ECRYPTFS_MAX_MSG_CTX_TTL / HZ; '
    fs/ecryptfs/main.c:65: warning: cannot understand function prototype: 'unsigned int ecryptfs_number_of_users = ECRYPTFS_DEFAULT_NUM_USERS; '
    fs/ecryptfs/main.c:106: warning: Function parameter or member 'dentry' not described in 'ecryptfs_init_lower_file'
    fs/ecryptfs/main.c:106: warning: Function parameter or member 'lower_file' not described in 'ecryptfs_init_lower_file'
    fs/ecryptfs/main.c:106: warning: Excess function parameter 'ecryptfs_dentry' description in 'ecryptfs_init_lower_file'
    fs/ecryptfs/main.c:244: warning: Function parameter or member 'sbi' not described in 'ecryptfs_parse_options'
    fs/ecryptfs/main.c:244: warning: Excess function parameter 'sb' description in 'ecryptfs_parse_options'
    fs/ecryptfs/main.c:478: warning: Function parameter or member 'fs_type' not described in 'ecryptfs_mount'
    fs/ecryptfs/main.c:478: warning: Function parameter or member 'flags' not described in 'ecryptfs_mount'
    fs/ecryptfs/main.c:478: warning: expecting prototype for ecryptfs_get_sb(). Prototype was for ecryptfs_mount() instead
    fs/ecryptfs/main.c:645: warning: Function parameter or member 'vptr' not described in 'inode_info_init_once'

    Cc: Tyler Hicks
    Cc: Christian Brauner
    Cc: James Morris
    Cc: "Michael A. Halcrow"
    Cc: "Michael C. Thompson"
    Cc: ecryptfs@vger.kernel.org
    Signed-off-by: Lee Jones
    [tyhicks: Correct the function documentation for ecryptfs_mount()]
    Signed-off-by: Tyler Hicks

    Lee Jones
     
  • Fixes the following W=1 kernel build warning(s):

    fs/ecryptfs/messaging.c:15: warning: Function parameter or member 'ecryptfs_msg_ctx_free_list' not described in 'LIST_HEAD'
    fs/ecryptfs/messaging.c:15: warning: expecting prototype for eCryptfs(). Prototype was for LIST_HEAD() instead
    fs/ecryptfs/messaging.c:157: warning: Function parameter or member 'daemon' not described in 'ecryptfs_exorcise_daemon'
    fs/ecryptfs/messaging.c:207: warning: Function parameter or member 'daemon' not described in 'ecryptfs_process_response'
    fs/ecryptfs/messaging.c:207: warning: expecting prototype for ecryptfs_process_reponse(). Prototype was for ecryptfs_process_response() instead
    fs/ecryptfs/messaging.c:262: warning: Function parameter or member 'msg_type' not described in 'ecryptfs_send_message_locked'

    Cc: Tyler Hicks
    Cc: David Howells
    Cc: Johannes Weiner
    Cc: Waiman Long
    Cc: Michal Hocko
    Cc: Andrew Morton
    Cc: "Michael A. Halcrow"
    Cc: ecryptfs@vger.kernel.org
    Signed-off-by: Lee Jones
    Signed-off-by: Tyler Hicks

    Lee Jones
     
  • Fixes the following W=1 kernel build warning(s):

    fs/ecryptfs/super.c:22: warning: cannot understand function prototype: 'struct kmem_cache *ecryptfs_inode_info_cache; '
    fs/ecryptfs/super.c:91: warning: Function parameter or member 'dentry' not described in 'ecryptfs_statfs'
    fs/ecryptfs/super.c:91: warning: Excess function parameter 'sb' description in 'ecryptfs_statfs'
    fs/ecryptfs/super.c:120: warning: Function parameter or member 'inode' not described in 'ecryptfs_evict_inode'
    fs/ecryptfs/super.c:133: warning: Function parameter or member 'm' not described in 'ecryptfs_show_options'
    fs/ecryptfs/super.c:133: warning: Function parameter or member 'root' not described in 'ecryptfs_show_options'

    Cc: Tyler Hicks
    Cc: "Michael A. Halcrow"
    Cc: "Michael C. Thompson"
    Cc: ecryptfs@vger.kernel.org
    Signed-off-by: Lee Jones
    Signed-off-by: Tyler Hicks

    Lee Jones
     
  • Fixes the following W=1 kernel build warning(s):

    fs/ecryptfs/file.c:23: warning: Incorrect use of kernel-doc format: * ecryptfs_read_update_atime
    fs/ecryptfs/file.c:34: warning: Function parameter or member 'iocb' not described in 'ecryptfs_read_update_atime'
    fs/ecryptfs/file.c:34: warning: Function parameter or member 'to' not described in 'ecryptfs_read_update_atime'
    fs/ecryptfs/file.c:34: warning: expecting prototype for eCryptfs(). Prototype was for ecryptfs_read_update_atime() instead

    Cc: Tyler Hicks
    Cc: "Michael A. Halcrow"
    Cc: "Michael C. Thompson"
    Cc: ecryptfs@vger.kernel.org
    Signed-off-by: Lee Jones
    Signed-off-by: Tyler Hicks

    Lee Jones
     
  • Fixes the following W=1 kernel build warning(s):

    fs/ecryptfs/kthread.c:16: warning: cannot understand function prototype: 'struct ecryptfs_open_req '
    fs/ecryptfs/kthread.c:120: warning: Function parameter or member 'cred' not described in 'ecryptfs_privileged_open'

    Cc: Tyler Hicks
    Cc: "Michael A. Halcrow"
    Cc: ecryptfs@vger.kernel.org
    Signed-off-by: Lee Jones
    Signed-off-by: Tyler Hicks

    Lee Jones
     
  • Fixes the following W=1 kernel build warning(s):

    fs/ecryptfs/dentry.c:19: warning: Incorrect use of kernel-doc format: * ecryptfs_d_revalidate - revalidate an ecryptfs dentry
    fs/ecryptfs/dentry.c:32: warning: Function parameter or member 'dentry' not described in 'ecryptfs_d_revalidate'
    fs/ecryptfs/dentry.c:32: warning: Function parameter or member 'flags' not described in 'ecryptfs_d_revalidate'
    fs/ecryptfs/dentry.c:32: warning: expecting prototype for eCryptfs(). Prototype was for ecryptfs_d_revalidate() instead

    Cc: Tyler Hicks
    Cc: "Michael A. Halcrow"
    Cc: ecryptfs@vger.kernel.org
    Signed-off-by: Lee Jones
    Signed-off-by: Tyler Hicks

    Lee Jones
     
  • Fixes the following W=1 kernel build warning(s):

    fs/ecryptfs/debug.c:13: warning: Incorrect use of kernel-doc format: * ecryptfs_dump_auth_tok - debug function to print auth toks
    fs/ecryptfs/debug.c:19: warning: Function parameter or member 'auth_tok' not described in 'ecryptfs_dump_auth_tok'
    fs/ecryptfs/debug.c:19: warning: expecting prototype for eCryptfs(). Prototype was for ecryptfs_dump_auth_tok() instead

    Cc: Tyler Hicks
    Cc: "Michael A. Halcrow"
    Cc: ecryptfs@vger.kernel.org
    Signed-off-by: Lee Jones
    Signed-off-by: Tyler Hicks

    Lee Jones
     
  • Provide missing param description for 'page_index' too.

    Fixes the following W=1 kernel build warning(s):

    fs/ecryptfs/read_write.c:16: warning: Incorrect use of kernel-doc format: * ecryptfs_write_lower
    fs/ecryptfs/read_write.c:29: warning: Function parameter or member 'ecryptfs_inode' not described in 'ecryptfs_write_lower'
    fs/ecryptfs/read_write.c:29: warning: Function parameter or member 'data' not described in 'ecryptfs_write_lower'
    fs/ecryptfs/read_write.c:29: warning: Function parameter or member 'offset' not described in 'ecryptfs_write_lower'
    fs/ecryptfs/read_write.c:29: warning: Function parameter or member 'size' not described in 'ecryptfs_write_lower'
    fs/ecryptfs/read_write.c:29: warning: expecting prototype for eCryptfs(). Prototype was for ecryptfs_write_lower() instead
    fs/ecryptfs/read_write.c:248: warning: Function parameter or member 'page_index' not described in 'ecryptfs_read_lower_page_segment'

    Cc: Tyler Hicks
    Cc: "Michael A. Halcrow"
    Cc: ecryptfs@vger.kernel.org
    Signed-off-by: Lee Jones
    Signed-off-by: Tyler Hicks

    Lee Jones
     
  • Required to pick up idmapped mount changes which changed some function
    parameters.

    Tyler Hicks
     

12 Apr, 2021

1 commit


21 Mar, 2021

3 commits

  • ... and never had anything non-NULL stored into it.

    Signed-off-by: Al Viro

    Al Viro
     
  • Signed-off-by: Al Viro

    Al Viro
     
  • Switch all users of lock_parent() to the approach used by ->unlink()
    and ->rmdir() - instead of playing with dget_parent() of underlying
    dentry of child,
    * start with ecryptfs dentry of child.
    * find underlying dentries for that dentry and its parent
    (which is stable, since the parent directory in upper layer is
    held at least shared). No need to pin them, they are already pinned
    by ecryptfs dentries.
    * lock the inode of undelying directory of parent
    * check if it's the parent of underlying dentry of child.
    ->d_parent of underlying dentry of child might be unstable. However,
    result of its comparison with underlying dentry of parent *is* stable now.

    Turn that into replacement of lock_parent(), convert the existing callers
    of lock_parent() to that, along with ecryptfs_unlink() and ecryptfs_rmdir().

    Callers need only the underlying dentry of child and inode of underlying
    dentry of parent, so lock_parent() passes those to the caller now.
    Note that underlying directory is locked in any case, success or failure.

    That approach does not need a primitive for unlocking - we hadn't grabbed
    any dentry references, so all we need is to unlock the underlying directory
    inode.

    Signed-off-by: Al Viro

    Al Viro
     

08 Mar, 2021

1 commit


24 Feb, 2021

1 commit

  • Pull idmapped mounts from Christian Brauner:
    "This introduces idmapped mounts which has been in the making for some
    time. Simply put, different mounts can expose the same file or
    directory with different ownership. This initial implementation comes
    with ports for fat, ext4 and with Christoph's port for xfs with more
    filesystems being actively worked on by independent people and
    maintainers.

    Idmapping mounts handle a wide range of long standing use-cases. Here
    are just a few:

    - Idmapped mounts make it possible to easily share files between
    multiple users or multiple machines especially in complex
    scenarios. For example, idmapped mounts will be used in the
    implementation of portable home directories in
    systemd-homed.service(8) where they allow users to move their home
    directory to an external storage device and use it on multiple
    computers where they are assigned different uids and gids. This
    effectively makes it possible to assign random uids and gids at
    login time.

    - It is possible to share files from the host with unprivileged
    containers without having to change ownership permanently through
    chown(2).

    - It is possible to idmap a container's rootfs and without having to
    mangle every file. For example, Chromebooks use it to share the
    user's Download folder with their unprivileged containers in their
    Linux subsystem.

    - It is possible to share files between containers with
    non-overlapping idmappings.

    - Filesystem that lack a proper concept of ownership such as fat can
    use idmapped mounts to implement discretionary access (DAC)
    permission checking.

    - They allow users to efficiently changing ownership on a per-mount
    basis without having to (recursively) chown(2) all files. In
    contrast to chown (2) changing ownership of large sets of files is
    instantenous with idmapped mounts. This is especially useful when
    ownership of a whole root filesystem of a virtual machine or
    container is changed. With idmapped mounts a single syscall
    mount_setattr syscall will be sufficient to change the ownership of
    all files.

    - Idmapped mounts always take the current ownership into account as
    idmappings specify what a given uid or gid is supposed to be mapped
    to. This contrasts with the chown(2) syscall which cannot by itself
    take the current ownership of the files it changes into account. It
    simply changes the ownership to the specified uid and gid. This is
    especially problematic when recursively chown(2)ing a large set of
    files which is commong with the aforementioned portable home
    directory and container and vm scenario.

    - Idmapped mounts allow to change ownership locally, restricting it
    to specific mounts, and temporarily as the ownership changes only
    apply as long as the mount exists.

    Several userspace projects have either already put up patches and
    pull-requests for this feature or will do so should you decide to pull
    this:

    - systemd: In a wide variety of scenarios but especially right away
    in their implementation of portable home directories.

    https://systemd.io/HOME_DIRECTORY/

    - container runtimes: containerd, runC, LXD:To share data between
    host and unprivileged containers, unprivileged and privileged
    containers, etc. The pull request for idmapped mounts support in
    containerd, the default Kubernetes runtime is already up for quite
    a while now: https://github.com/containerd/containerd/pull/4734

    - The virtio-fs developers and several users have expressed interest
    in using this feature with virtual machines once virtio-fs is
    ported.

    - ChromeOS: Sharing host-directories with unprivileged containers.

    I've tightly synced with all those projects and all of those listed
    here have also expressed their need/desire for this feature on the
    mailing list. For more info on how people use this there's a bunch of
    talks about this too. Here's just two recent ones:

    https://www.cncf.io/wp-content/uploads/2020/12/Rootless-Containers-in-Gitpod.pdf
    https://fosdem.org/2021/schedule/event/containers_idmap/

    This comes with an extensive xfstests suite covering both ext4 and
    xfs:

    https://git.kernel.org/brauner/xfstests-dev/h/idmapped_mounts

    It covers truncation, creation, opening, xattrs, vfscaps, setid
    execution, setgid inheritance and more both with idmapped and
    non-idmapped mounts. It already helped to discover an unrelated xfs
    setgid inheritance bug which has since been fixed in mainline. It will
    be sent for inclusion with the xfstests project should you decide to
    merge this.

    In order to support per-mount idmappings vfsmounts are marked with
    user namespaces. The idmapping of the user namespace will be used to
    map the ids of vfs objects when they are accessed through that mount.
    By default all vfsmounts are marked with the initial user namespace.
    The initial user namespace is used to indicate that a mount is not
    idmapped. All operations behave as before and this is verified in the
    testsuite.

    Based on prior discussions we want to attach the whole user namespace
    and not just a dedicated idmapping struct. This allows us to reuse all
    the helpers that already exist for dealing with idmappings instead of
    introducing a whole new range of helpers. In addition, if we decide in
    the future that we are confident enough to enable unprivileged users
    to setup idmapped mounts the permission checking can take into account
    whether the caller is privileged in the user namespace the mount is
    currently marked with.

    The user namespace the mount will be marked with can be specified by
    passing a file descriptor refering to the user namespace as an
    argument to the new mount_setattr() syscall together with the new
    MOUNT_ATTR_IDMAP flag. The system call follows the openat2() pattern
    of extensibility.

    The following conditions must be met in order to create an idmapped
    mount:

    - The caller must currently have the CAP_SYS_ADMIN capability in the
    user namespace the underlying filesystem has been mounted in.

    - The underlying filesystem must support idmapped mounts.

    - The mount must not already be idmapped. This also implies that the
    idmapping of a mount cannot be altered once it has been idmapped.

    - The mount must be a detached/anonymous mount, i.e. it must have
    been created by calling open_tree() with the OPEN_TREE_CLONE flag
    and it must not already have been visible in the filesystem.

    The last two points guarantee easier semantics for userspace and the
    kernel and make the implementation significantly simpler.

    By default vfsmounts are marked with the initial user namespace and no
    behavioral or performance changes are observed.

    The manpage with a detailed description can be found here:

    https://git.kernel.org/brauner/man-pages/c/1d7b902e2875a1ff342e036a9f866a995640aea8

    In order to support idmapped mounts, filesystems need to be changed
    and mark themselves with the FS_ALLOW_IDMAP flag in fs_flags. The
    patches to convert individual filesystem are not very large or
    complicated overall as can be seen from the included fat, ext4, and
    xfs ports. Patches for other filesystems are actively worked on and
    will be sent out separately. The xfstestsuite can be used to verify
    that port has been done correctly.

    The mount_setattr() syscall is motivated independent of the idmapped
    mounts patches and it's been around since July 2019. One of the most
    valuable features of the new mount api is the ability to perform
    mounts based on file descriptors only.

    Together with the lookup restrictions available in the openat2()
    RESOLVE_* flag namespace which we added in v5.6 this is the first time
    we are close to hardened and race-free (e.g. symlinks) mounting and
    path resolution.

    While userspace has started porting to the new mount api to mount
    proper filesystems and create new bind-mounts it is currently not
    possible to change mount options of an already existing bind mount in
    the new mount api since the mount_setattr() syscall is missing.

    With the addition of the mount_setattr() syscall we remove this last
    restriction and userspace can now fully port to the new mount api,
    covering every use-case the old mount api could. We also add the
    crucial ability to recursively change mount options for a whole mount
    tree, both removing and adding mount options at the same time. This
    syscall has been requested multiple times by various people and
    projects.

    There is a simple tool available at

    https://github.com/brauner/mount-idmapped

    that allows to create idmapped mounts so people can play with this
    patch series. I'll add support for the regular mount binary should you
    decide to pull this in the following weeks:

    Here's an example to a simple idmapped mount of another user's home
    directory:

    u1001@f2-vm:/$ sudo ./mount --idmap both:1000:1001:1 /home/ubuntu/ /mnt

    u1001@f2-vm:/$ ls -al /home/ubuntu/
    total 28
    drwxr-xr-x 2 ubuntu ubuntu 4096 Oct 28 22:07 .
    drwxr-xr-x 4 root root 4096 Oct 28 04:00 ..
    -rw------- 1 ubuntu ubuntu 3154 Oct 28 22:12 .bash_history
    -rw-r--r-- 1 ubuntu ubuntu 220 Feb 25 2020 .bash_logout
    -rw-r--r-- 1 ubuntu ubuntu 3771 Feb 25 2020 .bashrc
    -rw-r--r-- 1 ubuntu ubuntu 807 Feb 25 2020 .profile
    -rw-r--r-- 1 ubuntu ubuntu 0 Oct 16 16:11 .sudo_as_admin_successful
    -rw------- 1 ubuntu ubuntu 1144 Oct 28 00:43 .viminfo

    u1001@f2-vm:/$ ls -al /mnt/
    total 28
    drwxr-xr-x 2 u1001 u1001 4096 Oct 28 22:07 .
    drwxr-xr-x 29 root root 4096 Oct 28 22:01 ..
    -rw------- 1 u1001 u1001 3154 Oct 28 22:12 .bash_history
    -rw-r--r-- 1 u1001 u1001 220 Feb 25 2020 .bash_logout
    -rw-r--r-- 1 u1001 u1001 3771 Feb 25 2020 .bashrc
    -rw-r--r-- 1 u1001 u1001 807 Feb 25 2020 .profile
    -rw-r--r-- 1 u1001 u1001 0 Oct 16 16:11 .sudo_as_admin_successful
    -rw------- 1 u1001 u1001 1144 Oct 28 00:43 .viminfo

    u1001@f2-vm:/$ touch /mnt/my-file

    u1001@f2-vm:/$ setfacl -m u:1001:rwx /mnt/my-file

    u1001@f2-vm:/$ sudo setcap -n 1001 cap_net_raw+ep /mnt/my-file

    u1001@f2-vm:/$ ls -al /mnt/my-file
    -rw-rwxr--+ 1 u1001 u1001 0 Oct 28 22:14 /mnt/my-file

    u1001@f2-vm:/$ ls -al /home/ubuntu/my-file
    -rw-rwxr--+ 1 ubuntu ubuntu 0 Oct 28 22:14 /home/ubuntu/my-file

    u1001@f2-vm:/$ getfacl /mnt/my-file
    getfacl: Removing leading '/' from absolute path names
    # file: mnt/my-file
    # owner: u1001
    # group: u1001
    user::rw-
    user:u1001:rwx
    group::rw-
    mask::rwx
    other::r--

    u1001@f2-vm:/$ getfacl /home/ubuntu/my-file
    getfacl: Removing leading '/' from absolute path names
    # file: home/ubuntu/my-file
    # owner: ubuntu
    # group: ubuntu
    user::rw-
    user:ubuntu:rwx
    group::rw-
    mask::rwx
    other::r--"

    * tag 'idmapped-mounts-v5.12' of git://git.kernel.org/pub/scm/linux/kernel/git/brauner/linux: (41 commits)
    xfs: remove the possibly unused mp variable in xfs_file_compat_ioctl
    xfs: support idmapped mounts
    ext4: support idmapped mounts
    fat: handle idmapped mounts
    tests: add mount_setattr() selftests
    fs: introduce MOUNT_ATTR_IDMAP
    fs: add mount_setattr()
    fs: add attr_flags_to_mnt_flags helper
    fs: split out functions to hold writers
    namespace: only take read lock in do_reconfigure_mnt()
    mount: make {lock,unlock}_mount_hash() static
    namespace: take lock_mount_hash() directly when changing flags
    nfs: do not export idmapped mounts
    overlayfs: do not mount on top of idmapped mounts
    ecryptfs: do not mount on top of idmapped mounts
    ima: handle idmapped mounts
    apparmor: handle idmapped mounts
    fs: make helpers idmap mount aware
    exec: handle idmapped mounts
    would_dump: handle idmapped mounts
    ...

    Linus Torvalds
     

31 Jan, 2021

2 commits


26 Jan, 2021

1 commit

  • Prior to commit 7c03e2cda4a5 ("vfs: move cap_convert_nscap() call into
    vfs_setxattr()") the translation of nscap->rootid did not take stacked
    filesystems (overlayfs and ecryptfs) into account.

    That patch fixed the overlay case, but made the ecryptfs case worse.

    Restore old the behavior for ecryptfs that existed before the overlayfs
    fix. This does not fix ecryptfs's handling of complex user namespace
    setups, but it does make sure existing setups don't regress.

    Reported-by: Eric W. Biederman
    Cc: Tyler Hicks
    Fixes: 7c03e2cda4a5 ("vfs: move cap_convert_nscap() call into vfs_setxattr()")
    Signed-off-by: Miklos Szeredi
    Signed-off-by: Tyler Hicks

    Miklos Szeredi
     

24 Jan, 2021

7 commits

  • Prevent ecryptfs from being mounted on top of idmapped mounts.
    Stacking filesystems need to be prevented from being mounted on top of
    idmapped mounts until they have have been converted to handle this.

    Link: https://lore.kernel.org/r/20210121131959.646623-28-christian.brauner@ubuntu.com
    Cc: Christoph Hellwig
    Cc: David Howells
    Cc: Al Viro
    Cc: linux-fsdevel@vger.kernel.org
    Reviewed-by: James Morris
    Signed-off-by: Christian Brauner

    Christian Brauner
     
  • Extend some inode methods with an additional user namespace argument. A
    filesystem that is aware of idmapped mounts will receive the user
    namespace the mount has been marked with. This can be used for
    additional permission checking and also to enable filesystems to
    translate between uids and gids if they need to. We have implemented all
    relevant helpers in earlier patches.

    As requested we simply extend the exisiting inode method instead of
    introducing new ones. This is a little more code churn but it's mostly
    mechanical and doesnt't leave us with additional inode methods.

    Link: https://lore.kernel.org/r/20210121131959.646623-25-christian.brauner@ubuntu.com
    Cc: Christoph Hellwig
    Cc: David Howells
    Cc: Al Viro
    Cc: linux-fsdevel@vger.kernel.org
    Reviewed-by: Christoph Hellwig
    Signed-off-by: Christian Brauner

    Christian Brauner
     
  • The various vfs_*() helpers are called by filesystems or by the vfs
    itself to perform core operations such as create, link, mkdir, mknod, rename,
    rmdir, tmpfile and unlink. Enable them to handle idmapped mounts. If the
    inode is accessed through an idmapped mount map it into the
    mount's user namespace and pass it down. Afterwards the checks and
    operations are identical to non-idmapped mounts. If the initial user
    namespace is passed nothing changes so non-idmapped mounts will see
    identical behavior as before.

    Link: https://lore.kernel.org/r/20210121131959.646623-15-christian.brauner@ubuntu.com
    Cc: Christoph Hellwig
    Cc: David Howells
    Cc: Al Viro
    Cc: linux-fsdevel@vger.kernel.org
    Reviewed-by: Christoph Hellwig
    Signed-off-by: Christian Brauner

    Christian Brauner
     
  • In order to handle idmapped mounts we will extend the vfs rename helper
    to take two new arguments in follow up patches. Since this operations
    already takes a bunch of arguments add a simple struct renamedata and
    make the current helper use it before we extend it.

    Link: https://lore.kernel.org/r/20210121131959.646623-14-christian.brauner@ubuntu.com
    Cc: Christoph Hellwig
    Cc: David Howells
    Cc: Al Viro
    Cc: linux-fsdevel@vger.kernel.org
    Reviewed-by: Christoph Hellwig
    Signed-off-by: Christian Brauner

    Christian Brauner
     
  • The generic_fillattr() helper fills in the basic attributes associated
    with an inode. Enable it to handle idmapped mounts. If the inode is
    accessed through an idmapped mount map it into the mount's user
    namespace before we store the uid and gid. If the initial user namespace
    is passed nothing changes so non-idmapped mounts will see identical
    behavior as before.

    Link: https://lore.kernel.org/r/20210121131959.646623-12-christian.brauner@ubuntu.com
    Cc: Christoph Hellwig
    Cc: David Howells
    Cc: Al Viro
    Cc: linux-fsdevel@vger.kernel.org
    Reviewed-by: Christoph Hellwig
    Reviewed-by: James Morris
    Signed-off-by: Christian Brauner

    Christian Brauner
     
  • When interacting with extended attributes the vfs verifies that the
    caller is privileged over the inode with which the extended attribute is
    associated. For posix access and posix default extended attributes a uid
    or gid can be stored on-disk. Let the functions handle posix extended
    attributes on idmapped mounts. If the inode is accessed through an
    idmapped mount we need to map it according to the mount's user
    namespace. Afterwards the checks are identical to non-idmapped mounts.
    This has no effect for e.g. security xattrs since they don't store uids
    or gids and don't perform permission checks on them like posix acls do.

    Link: https://lore.kernel.org/r/20210121131959.646623-10-christian.brauner@ubuntu.com
    Cc: Christoph Hellwig
    Cc: David Howells
    Cc: Al Viro
    Cc: linux-fsdevel@vger.kernel.org
    Reviewed-by: Christoph Hellwig
    Reviewed-by: James Morris
    Signed-off-by: Tycho Andersen
    Signed-off-by: Christian Brauner

    Tycho Andersen
     
  • The posix acl permission checking helpers determine whether a caller is
    privileged over an inode according to the acls associated with the
    inode. Add helpers that make it possible to handle acls on idmapped
    mounts.

    The vfs and the filesystems targeted by this first iteration make use of
    posix_acl_fix_xattr_from_user() and posix_acl_fix_xattr_to_user() to
    translate basic posix access and default permissions such as the
    ACL_USER and ACL_GROUP type according to the initial user namespace (or
    the superblock's user namespace) to and from the caller's current user
    namespace. Adapt these two helpers to handle idmapped mounts whereby we
    either map from or into the mount's user namespace depending on in which
    direction we're translating.
    Similarly, cap_convert_nscap() is used by the vfs to translate user
    namespace and non-user namespace aware filesystem capabilities from the
    superblock's user namespace to the caller's user namespace. Enable it to
    handle idmapped mounts by accounting for the mount's user namespace.

    In addition the fileystems targeted in the first iteration of this patch
    series make use of the posix_acl_chmod() and, posix_acl_update_mode()
    helpers. Both helpers perform permission checks on the target inode. Let
    them handle idmapped mounts. These two helpers are called when posix
    acls are set by the respective filesystems to handle this case we extend
    the ->set() method to take an additional user namespace argument to pass
    the mount's user namespace down.

    Link: https://lore.kernel.org/r/20210121131959.646623-9-christian.brauner@ubuntu.com
    Cc: Christoph Hellwig
    Cc: David Howells
    Cc: Al Viro
    Cc: linux-fsdevel@vger.kernel.org
    Reviewed-by: Christoph Hellwig
    Signed-off-by: Christian Brauner

    Christian Brauner