27 Feb, 2018

1 commit

  • Currently newly created files belong to current user despite
    uid= / gid= mount options. This is confusing to users
    (as owner of the file will change after remount / eviction from cache)
    and also inconsistent with e.g. FAT with the same mount option. So apply
    uid= and gid= also to newly created inodes and similarly
    as FAT disallow to change owner of the file in this case.

    Reported-by: Steve Kenton
    Reviewed-by: Pali Rohár
    Signed-off-by: Jan Kara

    Jan Kara
     

14 Jun, 2017

2 commits

  • We don't hold inode_lock in udf_adinicb_writepage() so use i_size_read()
    to get i_size. This cannot cause real problems is i_size is guaranteed
    to be small but let's be careful.

    Signed-off-by: Jan Kara

    Jan Kara
     
  • __udf_adinicb_readpage() uses i_size several times. When truncate
    changes i_size while the function is running, it can observe several
    different values and thus e.g. expose uninitialized parts of page to
    userspace. Also use i_size_read() in the function since it does not hold
    inode_lock. Since i_size is guaranteed to be small, this cannot really
    cause any issues even on 32-bit archs but let's be careful.

    CC: stable@vger.kernel.org
    Fixes: 9c2fc0de1a6e638fe58c354a463f544f42a90a09
    Signed-off-by: Jan Kara

    Jan Kara
     

24 Apr, 2017

1 commit

  • Use temporary mapping for memory copying operations.

    To avoid any sleeping problem,

    mark_inode_dirty(inode) was moved after kunmap() in
    udf_adinicb_readpage()

    down_write(&iinfo->i_data_sem) set before kmap_atomic()
    in udf_expand_file_adinicb()

    Signed-off-by: Fabian Frederick
    Signed-off-by: Jan Kara

    Fabian Frederick
     

03 Feb, 2017

2 commits

  • "out" label was only returning error code.

    Signed-off-by: Fabian Frederick
    Signed-off-by: Jan Kara

    Fabian Frederick
     
  • Currently, lsattr for instance in udf directory gives
    "udf: Invalid argument While reading flags on ..."

    This patch returns -ENOIOCTLCMD
    when command is unknown to have more accurate message like this:
    "Inappropriate ioctl for device While reading flags on ..."

    Signed-off-by: Fabian Frederick
    Signed-off-by: Jan Kara

    Fabian Frederick
     

22 Sep, 2016

1 commit

  • inode_change_ok() will be resposible for clearing capabilities and IMA
    extended attributes and as such will need dentry. Give it as an argument
    to inode_change_ok() instead of an inode. Also rename inode_change_ok()
    to setattr_prepare() to better relect that it does also some
    modifications in addition to checks.

    Reviewed-by: Christoph Hellwig
    Signed-off-by: Jan Kara

    Jan Kara
     

19 Sep, 2016

1 commit


07 Sep, 2016

1 commit


02 May, 2016

3 commits


05 Apr, 2016

1 commit

  • PAGE_CACHE_{SIZE,SHIFT,MASK,ALIGN} macros were introduced *long* time
    ago with promise that one day it will be possible to implement page
    cache with bigger chunks than PAGE_SIZE.

    This promise never materialized. And unlikely will.

    We have many places where PAGE_CACHE_SIZE assumed to be equal to
    PAGE_SIZE. And it's constant source of confusion on whether
    PAGE_CACHE_* or PAGE_* constant should be used in a particular case,
    especially on the border between fs and mm.

    Global switching to PAGE_CACHE_SIZE != PAGE_SIZE would cause to much
    breakage to be doable.

    Let's stop pretending that pages in page cache are special. They are
    not.

    The changes are pretty straight-forward:

    - << (PAGE_CACHE_SHIFT - PAGE_SHIFT) -> ;

    - >> (PAGE_CACHE_SHIFT - PAGE_SHIFT) -> ;

    - PAGE_CACHE_{SIZE,SHIFT,MASK,ALIGN} -> PAGE_{SIZE,SHIFT,MASK,ALIGN};

    - page_cache_get() -> get_page();

    - page_cache_release() -> put_page();

    This patch contains automated changes generated with coccinelle using
    script below. For some reason, coccinelle doesn't patch header files.
    I've called spatch for them manually.

    The only adjustment after coccinelle is revert of changes to
    PAGE_CAHCE_ALIGN definition: we are going to drop it later.

    There are few places in the code where coccinelle didn't reach. I'll
    fix them manually in a separate patch. Comments and documentation also
    will be addressed with the separate patch.

    virtual patch

    @@
    expression E;
    @@
    - E << (PAGE_CACHE_SHIFT - PAGE_SHIFT)
    + E

    @@
    expression E;
    @@
    - E >> (PAGE_CACHE_SHIFT - PAGE_SHIFT)
    + E

    @@
    @@
    - PAGE_CACHE_SHIFT
    + PAGE_SHIFT

    @@
    @@
    - PAGE_CACHE_SIZE
    + PAGE_SIZE

    @@
    @@
    - PAGE_CACHE_MASK
    + PAGE_MASK

    @@
    expression E;
    @@
    - PAGE_CACHE_ALIGN(E)
    + PAGE_ALIGN(E)

    @@
    expression E;
    @@
    - page_cache_get(E)
    + get_page(E)

    @@
    expression E;
    @@
    - page_cache_release(E)
    + put_page(E)

    Signed-off-by: Kirill A. Shutemov
    Acked-by: Michal Hocko
    Signed-off-by: Linus Torvalds

    Kirill A. Shutemov
     

23 Jan, 2016

1 commit

  • parallel to mutex_{lock,unlock,trylock,is_locked,lock_nested},
    inode_foo(inode) being mutex_foo(&inode->i_mutex).

    Please, use those for access to ->i_mutex; over the coming cycle
    ->i_mutex will become rwsem, with ->lookup() done with it held
    only shared.

    Signed-off-by: Al Viro

    Al Viro
     

18 May, 2015

1 commit


27 Apr, 2015

1 commit

  • Pull fourth vfs update from Al Viro:
    "d_inode() annotations from David Howells (sat in for-next since before
    the beginning of merge window) + four assorted fixes"

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
    RCU pathwalk breakage when running into a symlink overmounting something
    fix I_DIO_WAKEUP definition
    direct-io: only inc/dec inode->i_dio_count for file systems
    fs/9p: fix readdir()
    VFS: assorted d_backing_inode() annotations
    VFS: fs/inode.c helpers: d_inode() annotations
    VFS: fs/cachefiles: d_backing_inode() annotations
    VFS: fs library helpers: d_inode() annotations
    VFS: assorted weird filesystems: d_inode() annotations
    VFS: normal filesystems (and lustre): d_inode() annotations
    VFS: security/: d_inode() annotations
    VFS: security/: d_backing_inode() annotations
    VFS: net/: d_inode() annotations
    VFS: net/unix: d_backing_inode() annotations
    VFS: kernel/: d_inode() annotations
    VFS: audit: d_backing_inode() annotations
    VFS: Fix up some ->d_inode accesses in the chelsio driver
    VFS: Cachefiles should perform fs modifications on the top layer only
    VFS: AF_UNIX sockets should call mknod on the top layer only

    Linus Torvalds
     

17 Apr, 2015

2 commits

  • Pull third hunk of vfs changes from Al Viro:
    "This contains the ->direct_IO() changes from Omar + saner
    generic_write_checks() + dealing with fcntl()/{read,write}() races
    (mirroring O_APPEND/O_DIRECT into iocb->ki_flags and instead of
    repeatedly looking at ->f_flags, which can be changed by fcntl(2),
    check ->ki_flags - which cannot) + infrastructure bits for dhowells'
    d_inode annotations + Christophs switch of /dev/loop to
    vfs_iter_write()"

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (30 commits)
    block: loop: switch to VFS ITER_BVEC
    configfs: Fix inconsistent use of file_inode() vs file->f_path.dentry->d_inode
    VFS: Make pathwalk use d_is_reg() rather than S_ISREG()
    VFS: Fix up debugfs to use d_is_dir() in place of S_ISDIR()
    VFS: Combine inode checks with d_is_negative() and d_is_positive() in pathwalk
    NFS: Don't use d_inode as a variable name
    VFS: Impose ordering on accesses of d_inode and d_flags
    VFS: Add owner-filesystem positive/negative dentry checks
    nfs: generic_write_checks() shouldn't be done on swapout...
    ocfs2: use __generic_file_write_iter()
    mirror O_APPEND and O_DIRECT into iocb->ki_flags
    switch generic_write_checks() to iocb and iter
    ocfs2: move generic_write_checks() before the alignment checks
    ocfs2_file_write_iter: stop messing with ppos
    udf_file_write_iter: reorder and simplify
    fuse: ->direct_IO() doesn't need generic_write_checks()
    ext4_file_write_iter: move generic_write_checks() up
    xfs_file_aio_write_checks: switch to iocb/iov_iter
    generic_write_checks(): drop isblk argument
    blkdev_write_iter: expand generic_file_checks() call in there
    ...

    Linus Torvalds
     
  • Pull quota and udf updates from Jan Kara:
    "The pull contains quota changes which complete unification of XFS and
    VFS quota interfaces (so tools can use either interface to manipulate
    any filesystem). There's also a patch to support project quotas in
    VFS quota subsystem from Li Xi.

    Finally there's a bunch of UDF fixes and cleanups and tiny cleanup in
    reiserfs & ext3"

    * 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs: (21 commits)
    udf: Update ctime and mtime when directory is modified
    udf: return correct errno for udf_update_inode()
    ext3: Remove useless condition in if statement.
    vfs: Add general support to enforce project quota limits
    reiserfs: fix __RASSERT format string
    udf: use int for allocated blocks instead of sector_t
    udf: remove redundant buffer_head.h includes
    udf: remove else after return in __load_block_bitmap()
    udf: remove unused variable in udf_table_free_blocks()
    quota: Fix maximum quota limit settings
    quota: reorder flags in quota state
    quota: paranoia: check quota tree root
    quota: optimize i_dquot access
    quota: Hook up Q_XSETQLIM for id 0 to ->set_info
    xfs: Add support for Q_SETINFO
    quota: Make ->set_info use structure with neccesary info to VFS and XFS
    quota: Remove ->get_xstate and ->get_xstatev callbacks
    gfs2: Convert to using ->get_state callback
    xfs: Convert to using ->get_state callback
    quota: Wire up Q_GETXSTATE and Q_GETXSTATV calls to work with ->get_state
    ...

    Linus Torvalds
     

16 Apr, 2015

1 commit


12 Apr, 2015

6 commits


26 Mar, 2015

1 commit


14 Mar, 2015

1 commit


13 Mar, 2015

1 commit


28 Jan, 2015

1 commit

  • Commit 6fb1ca92a640 "udf: Fix race between write(2) and close(2)"
    changed the condition when preallocation is released. The idea was that
    we don't want to release the preallocation for an inode on close when
    there are other writeable file descriptors for the inode. However the
    condition was written in the opposite way so we released preallocation
    only if there were other writeable file descriptors. Fix the problem by
    changing the condition properly.

    CC: stable@vger.kernel.org
    Fixes: 6fb1ca92a6409a9d5b0696447cd4997bc9aaf5a2
    Reported-by: Fabian Frederick
    Signed-off-by: Jan Kara

    Jan Kara
     

17 Sep, 2014

1 commit

  • Currently write(2) updating i_size and close(2) of the file can race in
    such a way that udf_truncate_tail_extent() called from
    udf_file_release() sees old i_size but already new extents added by the
    running write call. This results in complaints like:
    UDF-fs: warning (device vdb2): udf_truncate_tail_extent: Too long extent
    after EOF in inode 877: i_size: 0 lbcount: 1073739776 extent 0+1073739776
    UDF-fs: error (device vdb2): udf_truncate_tail_extent: Extent after EOF
    in inode 877

    Fix the problem by grabbing i_mutex in udf_file_release() to be sure
    i_size is consistent with current state of extent list. Also avoid
    truncating tail extent unnecessarily when the file is still open for
    writing.

    Signed-off-by: Jan Kara

    Jan Kara
     

16 Jul, 2014

2 commits

  • Valid data within i_size in page cache will be copied to ICB cache when we
    writeback the page by invoking udf_adinicb_writepage, so the copy in
    udf_adinicb_write_end is redundant.

    After we remove the copy, it's better to use simple_write_end directly in
    udf_adinicb_aops instead of udf_adinicb_write_end.

    Signed-off-by: Chao Yu
    Signed-off-by: Jan Kara

    Chao Yu
     
  • Fix checkpatch warning
    WARNING: Use #include instead of

    Cc: Jan Kara
    Signed-off-by: Fabian Frederick
    Signed-off-by: Jan Kara

    Fabian Frederick
     

07 May, 2014

3 commits


02 Apr, 2014

1 commit


21 Feb, 2014

1 commit

  • UDF has two types of files - files with data stored in inode (ICB in
    UDF terminology) and files with data stored in external data blocks. We
    convert file from in-inode format to external format in
    udf_file_aio_write() when we find out data won't fit into inode any
    longer. However the following race between two O_APPEND writes can happen:

    CPU1 CPU2
    udf_file_aio_write() udf_file_aio_write()
    down_write(&iinfo->i_data_sem);
    checks that i_size + count1 fits within inode
    => no need to convert
    up_write(&iinfo->i_data_sem);
    down_write(&iinfo->i_data_sem);
    checks that i_size + count2 fits
    within inode => no need to convert
    up_write(&iinfo->i_data_sem);
    generic_file_aio_write()
    - extends file by count1 bytes
    generic_file_aio_write()
    - extends file by count2 bytes

    Clearly if count1 + count2 doesn't fit into the inode, we overwrite
    kernel buffers beyond inode, possibly corrupting the filesystem as well.

    Fix the problem by acquiring i_mutex before checking whether write fits
    into the inode and using __generic_file_aio_write() afterwards which
    puts check and write into one critical section.

    Reported-by: Al Viro
    Signed-off-by: Jan Kara

    Jan Kara
     

30 Jul, 2013

1 commit

  • This code doesn't serve any purpose anymore, since the aio retry
    infrastructure has been removed.

    This change should be safe because aio_read/write are also used for
    synchronous IO, and called from do_sync_read()/do_sync_write() - and
    there's no looping done in the sync case (the read and write syscalls).

    Signed-off-by: Kent Overstreet
    Cc: Zach Brown
    Cc: Felipe Balbi
    Cc: Greg Kroah-Hartman
    Cc: Mark Fasheh
    Cc: Joel Becker
    Cc: Rusty Russell
    Cc: Jens Axboe
    Cc: Asai Thambi S P
    Cc: Selvan Mani
    Cc: Sam Bradshaw
    Cc: Jeff Moyer
    Cc: Al Viro
    Cc: Benjamin LaHaise
    Signed-off-by: Benjamin LaHaise

    Kent Overstreet
     

26 Feb, 2013

1 commit

  • According to SUSv3:

    [EACCES] Permission denied. An attempt was made to access a file in a way
    forbidden by its file access permissions.

    [EPERM] Operation not permitted. An attempt was made to perform an operation
    limited to processes with appropriate privileges or to the owner of a file
    or other resource.

    So -EPERM should be returned if capability checks fails.

    Strictly speaking this is an API change since the error code user sees is
    altered.

    Signed-off-by: Zhao Hongjiang
    Acked-by: Jan Kara
    Acked-by: Steven Whitehouse
    Acked-by: Ian Kent
    Cc: Al Viro
    Signed-off-by: Andrew Morton
    Signed-off-by: Al Viro

    Zhao Hongjiang
     

23 Feb, 2013

1 commit