26 Jan, 2017

1 commit

  • commit 1cb51a15b576ee325d527726afff40947218fd5e upstream.

    When replaying the journal it can happen that a journal entry points to
    a garbage collected node.
    This is the case when a power-cut occurred between a garbage collect run
    and a commit. In such a case nodes have to be read using the failable
    read functions to detect whether the found node matches what we expect.

    One corner case was forgotten, when the journal contains an entry to
    remove an inode all xattrs have to be removed too. UBIFS models xattr
    like directory entries, so the TNC code iterates over
    all xattrs of the inode and removes them too. This code re-uses the
    functions for walking directories and calls ubifs_tnc_next_ent().
    ubifs_tnc_next_ent() expects to be used only after the journal and
    aborts when a node does not match the expected result. This behavior can
    render an UBIFS volume unmountable after a power-cut when xattrs are
    used.

    Fix this issue by using failable read functions in ubifs_tnc_next_ent()
    too when replaying the journal.
    Fixes: 1e51764a3c2ac05a ("UBIFS: add new flash file system")
    Reported-by: Rock Lee
    Reviewed-by: David Gstir
    Signed-off-by: Richard Weinberger
    Signed-off-by: Greg Kroah-Hartman

    Richard Weinberger
     

28 Oct, 2016

1 commit

  • Commit c83ed4c9dbb35 ("ubifs: Abort readdir upon error") broke
    overlayfs support because the fix exposed an internal error
    code to VFS.

    Reported-by: Peter Rosin
    Tested-by: Peter Rosin
    Reported-by: Ralph Sennhauser
    Tested-by: Ralph Sennhauser
    Fixes: c83ed4c9dbb35 ("ubifs: Abort readdir upon error")
    Cc: stable@vger.kernel.org
    Signed-off-by: Richard Weinberger

    Richard Weinberger
     

20 Oct, 2016

3 commits

  • If UBIFS is facing an error while walking a directory, it reports this
    error and ubifs_readdir() returns the error code. But the VFS readdir
    logic does not make the getdents system call fail in all cases. When the
    readdir cursor indicates that more entries are present, the system call
    will just return and the libc wrapper will try again since it also
    knows that more entries are present.
    This causes the libc wrapper to busy loop for ever when a directory is
    corrupted on UBIFS.
    A common approach do deal with corrupted directory entries is
    skipping them by setting the cursor to the next entry. On UBIFS this
    approach is not possible since we cannot compute the next directory
    entry cursor position without reading the current entry. So all we can
    do is setting the cursor to the "no more entries" position and make
    getdents exit.

    Cc: stable@vger.kernel.org
    Signed-off-by: Richard Weinberger

    Richard Weinberger
     
  • When the operation fails we also have to undo the changes
    we made to ->xattr_names. Otherwise listxattr() will report
    wrong lengths.

    Cc: stable@vger.kernel.org
    Signed-off-by: Richard Weinberger

    Richard Weinberger
     
  • Since ->rename2 is gone, rename ubifs_rename2() to ubifs_rename().

    Suggested-by: Linus Torvalds
    Signed-off-by: Richard Weinberger

    Richard Weinberger
     

12 Oct, 2016

1 commit

  • Pull UBI/UBIFS updates from Richard Weinberger:
    "This pull request contains:

    - Fixes for both UBI and UBIFS
    - overlayfs support (O_TMPFILE, RENAME_WHITEOUT/EXCHANGE)
    - Code refactoring for the upcoming MLC support"

    [ Ugh, we just got rid of the "rename2()" naming for the extended rename
    functionality. And this re-introduces it in ubifs with the cross-
    renaming and whiteout support.

    But rather than do any re-organizations in the merge itself, the
    naming can be cleaned up later ]

    * tag 'upstream-4.9-rc1' of git://git.infradead.org/linux-ubifs: (27 commits)
    UBIFS: improve function-level documentation
    ubifs: fix host xattr_len when changing xattr
    ubifs: Use move variable in ubifs_rename()
    ubifs: Implement RENAME_EXCHANGE
    ubifs: Implement RENAME_WHITEOUT
    ubifs: Implement O_TMPFILE
    ubi: Fix Fastmap's update_vol()
    ubi: Fix races around ubi_refill_pools()
    ubi: Deal with interrupted erasures in WL
    UBI: introduce the VID buffer concept
    UBI: hide EBA internals
    UBI: provide an helper to query LEB information
    UBI: provide an helper to check whether a LEB is mapped or not
    UBI: add an helper to check lnum validity
    UBI: simplify LEB write and atomic LEB change code
    UBI: simplify recover_peb() code
    UBI: move the global ech and vidh variables into struct ubi_attach_info
    UBI: provide helpers to allocate and free aeb elements
    UBI: fastmap: use ubi_io_{read, write}_data() instead of ubi_io_{read, write}()
    UBI: fastmap: use ubi_rb_for_each_entry() in unmap_peb()
    ...

    Linus Torvalds
     

11 Oct, 2016

2 commits

  • Pull more vfs updates from Al Viro:
    ">rename2() work from Miklos + current_time() from Deepa"

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
    fs: Replace current_fs_time() with current_time()
    fs: Replace CURRENT_TIME_SEC with current_time() for inode timestamps
    fs: Replace CURRENT_TIME with current_time() for inode timestamps
    fs: proc: Delete inode time initializations in proc_alloc_inode()
    vfs: Add current_time() api
    vfs: add note about i_op->rename changes to porting
    fs: rename "rename2" i_op to "rename"
    vfs: remove unused i_op->rename
    fs: make remaining filesystems use .rename2
    libfs: support RENAME_NOREPLACE in simple_rename()
    fs: support RENAME_NOREPLACE for local filesystems
    ncpfs: fix unused variable warning

    Linus Torvalds
     
  • Pull vfs xattr updates from Al Viro:
    "xattr stuff from Andreas

    This completes the switch to xattr_handler ->get()/->set() from
    ->getxattr/->setxattr/->removexattr"

    * 'work.xattr' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
    vfs: Remove {get,set,remove}xattr inode operations
    xattr: Stop calling {get,set,remove}xattr inode operations
    vfs: Check for the IOP_XATTR flag in listxattr
    xattr: Add __vfs_{get,set,remove}xattr helpers
    libfs: Use IOP_XATTR flag for empty directory handling
    vfs: Use IOP_XATTR flag for bad-inode handling
    vfs: Add IOP_XATTR inode operations flag
    vfs: Move xattr_resolve_name to the front of fs/xattr.c
    ecryptfs: Switch to generic xattr handlers
    sockfs: Get rid of getxattr iop
    sockfs: getxattr: Fail with -EOPNOTSUPP for invalid attribute names
    kernfs: Switch to generic xattr handlers
    hfs: Switch to generic xattr handlers
    jffs2: Remove jffs2_{get,set,remove}xattr macros
    xattr: Remove unnecessary NULL attribute name check

    Linus Torvalds
     

08 Oct, 2016

2 commits


03 Oct, 2016

6 commits

  • Fix various inconsistencies in the documentation associated with various
    functions.

    In the case of fs/ubifs/lprops.c, the second parameter of
    ubifs_get_lp_stats was renamed from st to lst in commit 84abf972ccff
    ("UBIFS: add re-mount debugging checks")

    In the case of fs/ubifs/lpt_commit.c, the excess variables have never
    existed in the associated functions since the code was introduced into the
    kernel.

    The others appear to be straightforward typos.

    Issues detected using Coccinelle (http://coccinelle.lip6.fr/)

    Signed-off-by: Julia Lawall
    Signed-off-by: Richard Weinberger

    Julia Lawall
     
  • When an extended attribute is changed, xattr_len of host inode is
    recalculated. ui->data_len is updated before computation and result
    is wrong. This patch adds a temporary variable to fix computation.

    To reproduce the issue:

    ~# > a.txt
    ~# attr -s an-attr -V a-value a.txt
    ~# attr -s an-attr -V a-bit-bigger-value a.txt

    Now host inode xattr_len is wrong. Forcing dbg_check_filesystem()
    generates the following error:

    [ 130.620140] UBIFS (ubi0:2): background thread "ubifs_bgt0_2" started, PID 565
    [ 131.470790] UBIFS error (ubi0:2 pid 564): check_inodes: inode 646 has xattr size 240, but calculated size is 256
    [ 131.481697] UBIFS (ubi0:2): dump of the inode 646 sitting in LEB 29:114688
    [ 131.488953] magic 0x6101831
    [ 131.492876] crc 0x9fce9091
    [ 131.496836] node_type 0 (inode node)
    [ 131.501193] group_type 1 (in node group)
    [ 131.505788] sqnum 9278
    [ 131.509191] len 160
    [ 131.512549] key (646, inode)
    [ 131.516688] creat_sqnum 9270
    [ 131.520133] size 0
    [ 131.523264] nlink 1
    [ 131.526398] atime 1053025857.0
    [ 131.530574] mtime 1053025857.0
    [ 131.534714] ctime 1053025906.0
    [ 131.538849] uid 0
    [ 131.542009] gid 0
    [ 131.545140] mode 33188
    [ 131.548636] flags 0x1
    [ 131.551977] xattr_cnt 1
    [ 131.555108] xattr_size 240
    [ 131.558420] xattr_names 12
    [ 131.561670] compr_type 0x1
    [ 131.564983] data len 0
    [ 131.568125] UBIFS error (ubi0:2 pid 564): dbg_check_filesystem: file-system check failed with error -22
    [ 131.578074] CPU: 0 PID: 564 Comm: mount Not tainted 4.4.12-g3639bea54a #24
    [ 131.585352] Hardware name: Generic AM33XX (Flattened Device Tree)
    [ 131.591918] [] (unwind_backtrace) from [] (show_stack+0x10/0x14)
    [ 131.600177] [] (show_stack) from [] (dbg_check_filesystem+0x464/0x4d0)
    [ 131.608934] [] (dbg_check_filesystem) from [] (ubifs_mount+0x14f8/0x2130)
    [ 131.617991] [] (ubifs_mount) from [] (mount_fs+0x14/0x98)
    [ 131.625572] [] (mount_fs) from [] (vfs_kern_mount+0x4c/0xd4)
    [ 131.633435] [] (vfs_kern_mount) from [] (do_mount+0x988/0xb50)
    [ 131.641471] [] (do_mount) from [] (SyS_mount+0x74/0xa0)
    [ 131.648837] [] (SyS_mount) from [] (ret_fast_syscall+0x0/0x3c)
    [ 131.665315] UBIFS (ubi0:2): background thread "ubifs_bgt0_2" stops

    Signed-off-by: Pascal Eberhard
    Signed-off-by: Richard Weinberger

    Pascal Eberhard
     
  • ...to make the code more consistent since we use
    move already in other places.

    Signed-off-by: Richard Weinberger

    Richard Weinberger
     
  • Adds RENAME_EXCHANGE to UBIFS, the operation itself
    is completely disjunct from a regular rename() that's
    why we dispatch very early in ubifs_reaname().

    RENAME_EXCHANGE used by the renameat2() system call
    allows the caller to exchange two paths atomically.
    Both paths have to exist and have to be on the same
    filesystem.

    Signed-off-by: Richard Weinberger

    Richard Weinberger
     
  • Adds RENAME_WHITEOUT support to UBIFS, we implement
    it in the same way as ext4 and xfs do.
    For an overview of other ways to implement it please
    refere to commit 7dcf5c3e4527 ("xfs: add RENAME_WHITEOUT support").

    Signed-off-by: Richard Weinberger

    Richard Weinberger
     
  • This patchs adds O_TMPFILE support to UBIFS.
    A temp file is a reference to an unlinked inode, a user
    holding the reference can use it. As soon it is being closed
    all data vanishes.

    Signed-off-by: Richard Weinberger

    Richard Weinberger
     

27 Sep, 2016

2 commits

  • Generated patch:

    sed -i "s/\.rename2\t/\.rename\t\t/" `git grep -wl rename2`
    sed -i "s/\brename2\b/rename/g" `git grep -wl rename2`

    Signed-off-by: Miklos Szeredi

    Miklos Szeredi
     
  • This is trivial to do:

    - add flags argument to foo_rename()
    - check if flags doesn't have any other than RENAME_NOREPLACE
    - assign foo_rename() to .rename2 instead of .rename

    Filesystems converted:

    affs, bfs, exofs, ext2, hfs, hfsplus, jffs2, jfs, logfs, minix, msdos,
    nilfs2, omfs, reiserfs, sysvfs, ubifs, udf, ufs, vfat.

    Signed-off-by: Miklos Szeredi
    Acked-by: Boaz Harrosh
    Acked-by: Richard Weinberger
    Acked-by: Bob Copeland
    Acked-by: Jan Kara
    Cc: Theodore Ts'o
    Cc: Jaegeuk Kim
    Cc: OGAWA Hirofumi
    Cc: Mikulas Patocka
    Cc: David Woodhouse
    Cc: Dave Kleikamp
    Cc: Ryusuke Konishi
    Cc: Christoph Hellwig

    Miklos Szeredi
     

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
     

24 Aug, 2016

2 commits

  • UBIFS uses full names to work with xattrs, therefore we have to use
    xattr_full_name() to obtain the xattr prefix as string.

    Cc:
    Cc: Andreas Gruenbacher
    Fixes: 2b88fc21ca ("ubifs: Switch to generic xattr handlers")
    Signed-off-by: Richard Weinberger
    Reviewed-by: Andreas Gruenbacher
    Tested-by: Dongsheng Yang

    Richard Weinberger
     
  • An assertion in layout_in_gaps() verifies that the gap_lebs pointer is
    below the maximum bound. When computing this maximum bound the idx_lebs
    count is multiplied by sizeof(int), while C pointers arithmetic does take
    into account the size of the pointed elements implicitly already. Remove
    the multiplication to fix the assertion.

    Fixes: 1e51764a3c2ac05a ("UBIFS: add new flash file system")
    Cc:
    Signed-off-by: Vincent Stehlé
    Cc: Artem Bityutskiy
    Signed-off-by: Artem Bityutskiy
    Signed-off-by: Richard Weinberger

    Vincent Stehlé
     

30 Jul, 2016

3 commits


29 Jul, 2016

2 commits

  • Fix sparse warnings from the use of "struct xattr_handler"
    structures that are not exported by making them static. Fixes
    the following sparse warnings:

    /fs/ubifs/xattr.c:595:28: warning: symbol 'ubifs_user_xattr_handler' was not declared. Should it be static?
    /fs/ubifs/xattr.c:601:28: warning: symbol 'ubifs_trusted_xattr_handler' was not declared. Should it be static?
    /fs/ubifs/xattr.c:607:28: warning: symbol 'ubifs_security_xattr_handler' was not declared. Should it be static?

    Signed-off-by: Ben Dooks
    Signed-off-by: Richard Weinberger

    Ben Dooks
     
  • This change completes commit
    90bea5a3f0 ("UBIFS: respect MS_SILENT mount flag")
    which already implements support for MS_SILENT except for that one
    error message which is still being displayed despite MS_SILENT being
    set. Suppress that error message as well in case MS_SILENT is set.

    Signed-off-by: Daniel Golle
    [rw: massaged commit message]
    Signed-off-by: Richard Weinberger

    Daniel Golle
     

23 Jun, 2016

1 commit

  • During page migrations UBIFS might get confused
    and the following assert triggers:
    [ 213.480000] UBIFS assert failed in ubifs_set_page_dirty at 1451 (pid 436)
    [ 213.490000] CPU: 0 PID: 436 Comm: drm-stress-test Not tainted 4.4.4-00176-geaa802524636-dirty #1008
    [ 213.490000] Hardware name: Allwinner sun4i/sun5i Families
    [ 213.490000] [] (unwind_backtrace) from [] (show_stack+0x10/0x14)
    [ 213.490000] [] (show_stack) from [] (dump_stack+0x8c/0xa0)
    [ 213.490000] [] (dump_stack) from [] (ubifs_set_page_dirty+0x44/0x50)
    [ 213.490000] [] (ubifs_set_page_dirty) from [] (try_to_unmap_one+0x10c/0x3a8)
    [ 213.490000] [] (try_to_unmap_one) from [] (rmap_walk+0xb4/0x290)
    [ 213.490000] [] (rmap_walk) from [] (try_to_unmap+0x64/0x80)
    [ 213.490000] [] (try_to_unmap) from [] (migrate_pages+0x328/0x7a0)
    [ 213.490000] [] (migrate_pages) from [] (alloc_contig_range+0x168/0x2f4)
    [ 213.490000] [] (alloc_contig_range) from [] (cma_alloc+0x170/0x2c0)
    [ 213.490000] [] (cma_alloc) from [] (__alloc_from_contiguous+0x38/0xd8)
    [ 213.490000] [] (__alloc_from_contiguous) from [] (__dma_alloc+0x23c/0x274)
    [ 213.490000] [] (__dma_alloc) from [] (arm_dma_alloc+0x54/0x5c)
    [ 213.490000] [] (arm_dma_alloc) from [] (drm_gem_cma_create+0xb8/0xf0)
    [ 213.490000] [] (drm_gem_cma_create) from [] (drm_gem_cma_create_with_handle+0x1c/0xe8)
    [ 213.490000] [] (drm_gem_cma_create_with_handle) from [] (drm_gem_cma_dumb_create+0x3c/0x48)
    [ 213.490000] [] (drm_gem_cma_dumb_create) from [] (drm_ioctl+0x12c/0x444)
    [ 213.490000] [] (drm_ioctl) from [] (do_vfs_ioctl+0x3f4/0x614)
    [ 213.490000] [] (do_vfs_ioctl) from [] (SyS_ioctl+0x34/0x5c)
    [ 213.490000] [] (SyS_ioctl) from [] (ret_fast_syscall+0x0/0x34)

    UBIFS is using PagePrivate() which can have different meanings across
    filesystems. Therefore the generic page migration code cannot handle this
    case correctly.
    We have to implement our own migration function which basically does a
    plain copy but also duplicates the page private flag.
    UBIFS is not a block device filesystem and cannot use buffer_migrate_page().

    Cc: stable@vger.kernel.org
    Signed-off-by: Kirill A. Shutemov
    [rw: Massaged changelog, build fixes, etc...]
    Signed-off-by: Richard Weinberger
    Acked-by: Christoph Hellwig

    Kirill A. Shutemov
     

28 May, 2016

2 commits


24 May, 2016

1 commit


21 May, 2016

1 commit

  • Let's gather the UUID related functions under one hood.

    Signed-off-by: Andy Shevchenko
    Reviewed-by: Matt Fleming
    Cc: Dmitry Kasatkin
    Cc: Mimi Zohar
    Cc: Rasmus Villemoes
    Cc: Arnd Bergmann
    Cc: "Theodore Ts'o"
    Cc: Al Viro
    Cc: Jens Axboe
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Andy Shevchenko
     

19 May, 2016

1 commit

  • Pull remaining vfs xattr work from Al Viro:
    "The rest of work.xattr (non-cifs conversions)"

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
    btrfs: Switch to generic xattr handlers
    ubifs: Switch to generic xattr handlers
    jfs: Switch to generic xattr handlers
    jfs: Clean up xattr name mapping
    gfs2: Switch to generic xattr handlers
    ceph: kill __ceph_removexattr()
    ceph: Switch to generic xattr handlers
    ceph: Get rid of d_find_alias in ceph_set_acl

    Linus Torvalds
     

18 May, 2016

1 commit

  • Ubifs internally uses special inodes for storing xattrs. Those inodes
    had NULL {get,set,remove}xattr inode operations before this change, so
    xattr operations on them would fail. The super block's s_xattr field
    would also apply to those special inodes. However, the inodes are not
    visible outside of ubifs, and so no xattr operations will ever be
    carried out on them anyway.

    Signed-off-by: Andreas Gruenbacher
    Reviewed-by: Richard Weinberger
    Signed-off-by: Al Viro

    Andreas Gruenbacher
     

09 May, 2016

1 commit


03 May, 2016

1 commit


11 Apr, 2016

1 commit


05 Apr, 2016

2 commits

  • Mostly direct substitution with occasional adjustment or removing
    outdated comments.

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

    Kirill A. Shutemov
     
  • 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
     

21 Mar, 2016

2 commits

  • UBIFS does not support POSIX ACLs, so there is no need for including any
    POSIX ACL hesders.

    Signed-off-by: Andreas Gruenbacher
    Signed-off-by: Richard Weinberger

    Andreas Gruenbacher
     
  • The existing logging macros are fairly large and converting the
    macros to functions make the object code smaller.

    Use %pV and __builtin_return_address(0) as appropriate.

    $ size fs/ubifs/built-in.o*
    text data bss dec hex filename
    575831 309688 161312 1046831 ff92f fs/ubifs/built-in.o.allyesconfig.new
    622457 312872 161120 1096449 10bb01 fs/ubifs/built-in.o.allyesconfig.old
    223785 640 644 225069 36f2d fs/ubifs/built-in.o.defconfig.new
    251873 640 644 253157 3dce5 fs/ubifs/built-in.o.defconfig.old

    Signed-off-by: Joe Perches
    Signed-off-by: Richard Weinberger

    Joe Perches