16 Aug, 2014

3 commits

  • Pull btrfs updates from Chris Mason:
    "These are all fixes I'd like to get out to a broader audience.

    The biggest of the bunch is Mark's quota fix, which is also in the
    SUSE kernel, and makes our subvolume quotas dramatically more
    accurate.

    I've been running xfstests with these against your current git
    overnight, but I'm queueing up longer tests as well"

    * 'for-linus2' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs:
    btrfs: disable strict file flushes for renames and truncates
    Btrfs: fix csum tree corruption, duplicate and outdated checksums
    Btrfs: Fix memory corruption by ulist_add_merge() on 32bit arch
    Btrfs: fix compressed write corruption on enospc
    btrfs: correctly handle return from ulist_add
    btrfs: qgroup: account shared subtrees during snapshot delete
    Btrfs: read lock extent buffer while walking backrefs
    Btrfs: __btrfs_mod_ref should always use no_quota
    btrfs: adjust statfs calculations according to raid profiles

    Linus Torvalds
     
  • Pull file locking bugfixes from Jeff Layton:
    "Most of these patches are to fix a long-standing regression that crept
    in when the BKL was removed from the file-locking code. The code was
    converted to use a conventional spinlock, but some fl_release_private
    ops can block and you can end up sleeping inside the lock.

    There's also a patch to make /proc/locks show delegations as 'DELEG'"

    * tag 'locks-v3.17-2' of git://git.samba.org/jlayton/linux:
    locks: update Locking documentation to clarify fl_release_private behavior
    locks: move locks_free_lock calls in do_fcntl_add_lease outside spinlock
    locks: defer freeing locks in locks_delete_lock until after i_lock has been dropped
    locks: don't reuse file_lock in __posix_lock_file
    locks: don't call locks_release_private from locks_copy_lock
    locks: show delegations as "DELEG" in /proc/locks

    Linus Torvalds
     
  • Pull aio updates from Ben LaHaise.

    * git://git.kvack.org/~bcrl/aio-next:
    aio: use iovec array rather than the single one
    aio: fix some comments
    aio: use the macro rather than the inline magic number
    aio: remove the needless registration of ring file's private_data
    aio: remove no longer needed preempt_disable()
    aio: kill the misleading rcu read locks in ioctx_add_table() and kill_ioctx()
    aio: change exit_aio() to load mm->ioctx_table once and avoid rcu_read_lock()

    Linus Torvalds
     

15 Aug, 2014

9 commits

  • Truncates and renames are often used to replace old versions of a file
    with new versions. Applications often expect this to be an atomic
    replacement, even if they haven't done anything to make sure the new
    version is fully on disk.

    Btrfs has strict flushing in place to make sure that renaming over an
    old file with a new file will fully flush out the new file before
    allowing the transaction commit with the rename to complete.

    This ordering means the commit code needs to be able to lock file pages,
    and there are a few paths in the filesystem where we will try to end a
    transaction with the page lock held. It's rare, but these things can
    deadlock.

    This patch removes the ordered flushes and switches to a best effort
    filemap_flush like ext4 uses. It's not perfect, but it should fix the
    deadlocks.

    Signed-off-by: Chris Mason

    Chris Mason
     
  • Under rare circumstances we can end up leaving 2 versions of a checksum
    for the same file extent range.

    The reason for this is that after calling btrfs_next_leaf we process
    slot 0 of the leaf it returns, instead of processing the slot set in
    path->slots[0]. Most of the time (by far) path->slots[0] is 0, but after
    btrfs_next_leaf() releases the path and before it searches for the next
    leaf, another task might cause a split of the next leaf, which migrates
    some of its keys to the leaf we were processing before calling
    btrfs_next_leaf(). In this case btrfs_next_leaf() returns again the
    same leaf but with path->slots[0] having a slot number corresponding
    to the first new key it got, that is, a slot number that didn't exist
    before calling btrfs_next_leaf(), as the leaf now has more keys than
    it had before. So we must really process the returned leaf starting at
    path->slots[0] always, as it isn't always 0, and the key at slot 0 can
    have an offset much lower than our search offset/bytenr.

    For example, consider the following scenario, where we have:

    sums->bytenr: 40157184, sums->len: 16384, sums end: 40173568
    four 4kb file data blocks with offsets 40157184, 40161280, 40165376, 40169472

    Leaf N:

    slot = 0 slot = btrfs_header_nritems() - 1
    |-------------------------------------------------------------------|
    | [(CSUM CSUM 39239680), size 8] ... [(CSUM CSUM 40116224), size 4] |
    |-------------------------------------------------------------------|

    Leaf N + 1:

    slot = 0 slot = btrfs_header_nritems() - 1
    |--------------------------------------------------------------------|
    | [(CSUM CSUM 40161280), size 32] ... [((CSUM CSUM 40615936), size 8 |
    |--------------------------------------------------------------------|

    Because we are at the last slot of leaf N, we call btrfs_next_leaf() to
    find the next highest key, which releases the current path and then searches
    for that next key. However after releasing the path and before finding that
    next key, the item at slot 0 of leaf N + 1 gets moved to leaf N, due to a call
    to ctree.c:push_leaf_left() (via ctree.c:split_leaf()), and therefore
    btrfs_next_leaf() will returns us a path again with leaf N but with the slot
    pointing to its new last key (CSUM CSUM 40161280). This new version of leaf N
    is then:

    slot = 0 slot = btrfs_header_nritems() - 2 slot = btrfs_header_nritems() - 1
    |----------------------------------------------------------------------------------------------------|
    | [(CSUM CSUM 39239680), size 8] ... [(CSUM CSUM 40116224), size 4] [(CSUM CSUM 40161280), size 32] |
    |----------------------------------------------------------------------------------------------------|

    And incorrecly using slot 0, makes us set next_offset to 39239680 and we jump
    into the "insert:" label, which will set tmp to:

    tmp = min((sums->len - total_bytes) >> blocksize_bits,
    (next_offset - file_key.offset) >> blocksize_bits) =
    min((16384 - 0) >> 12, (39239680 - 40157184) >> 12) =
    min(4, (u64)-917504 = 18446744073708634112 >> 12) = 4

    and

    ins_size = csum_size * tmp = 4 * 4 = 16 bytes.

    In other words, we insert a new csum item in the tree with key
    (CSUM_OBJECTID CSUM_KEY 40157184 = sums->bytenr) that contains the checksums
    for all the data (4 blocks of 4096 bytes each = sums->len). Which is wrong,
    because the item with key (CSUM CSUM 40161280) (the one that was moved from
    leaf N + 1 to the end of leaf N) contains the old checksums of the last 12288
    bytes of our data and won't get those old checksums removed.

    So this leaves us 2 different checksums for 3 4kb blocks of data in the tree,
    and breaks the logical rule:

    Key_N+1.offset >= Key_N.offset + length_of_data_its_checksums_cover

    An obvious bad effect of this is that a subsequent csum tree lookup to get
    the checksum of any of the blocks with logical offset of 40161280, 40165376
    or 40169472 (the last 3 4kb blocks of file data), will get the old checksums.

    Cc: stable@vger.kernel.org
    Signed-off-by: Filipe Manana
    Signed-off-by: Chris Mason

    Filipe Manana
     
  • We've got bug reports that btrfs crashes when quota is enabled on
    32bit kernel, typically with the Oops like below:
    BUG: unable to handle kernel NULL pointer dereference at 00000004
    IP: [] find_parent_nodes+0x360/0x1380 [btrfs]
    *pde = 00000000
    Oops: 0000 [#1] SMP
    CPU: 0 PID: 151 Comm: kworker/u8:2 Tainted: G S W 3.15.2-1.gd43d97e-default #1
    Workqueue: btrfs-qgroup-rescan normal_work_helper [btrfs]
    task: f1478130 ti: f147c000 task.ti: f147c000
    EIP: 0060:[] EFLAGS: 00010213 CPU: 0
    EIP is at find_parent_nodes+0x360/0x1380 [btrfs]
    EAX: f147dda8 EBX: f147ddb0 ECX: 00000011 EDX: 00000000
    ESI: 00000000 EDI: f147dda4 EBP: f147ddf8 ESP: f147dd38
    DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
    CR0: 8005003b CR2: 00000004 CR3: 00bf3000 CR4: 00000690
    Stack:
    00000000 00000000 f147dda4 00000050 00000001 00000000 00000001 00000050
    00000001 00000000 d3059000 00000001 00000022 000000a8 00000000 00000000
    00000000 000000a1 00000000 00000000 00000001 00000000 00000000 11800000
    Call Trace:
    [] __btrfs_find_all_roots+0x9d/0xf0 [btrfs]
    [] btrfs_qgroup_rescan_worker+0x401/0x760 [btrfs]
    [] normal_work_helper+0xc8/0x270 [btrfs]
    [] process_one_work+0x11b/0x390
    [] worker_thread+0x101/0x340
    [] kthread+0x9b/0xb0
    [] ret_from_kernel_thread+0x21/0x30
    [] kthread_create_on_node+0x110/0x110

    This indicates a NULL corruption in prefs_delayed list. The further
    investigation and bisection pointed that the call of ulist_add_merge()
    results in the corruption.

    ulist_add_merge() takes u64 as aux and writes a 64bit value into
    old_aux. The callers of this function in backref.c, however, pass a
    pointer of a pointer to old_aux. That is, the function overwrites
    64bit value on 32bit pointer. This caused a NULL in the adjacent
    variable, in this case, prefs_delayed.

    Here is a quick attempt to band-aid over this: a new function,
    ulist_add_merge_ptr() is introduced to pass/store properly a pointer
    value instead of u64. There are still ugly void ** cast remaining
    in the callers because void ** cannot be taken implicitly. But, it's
    safer than explicit cast to u64, anyway.

    Bugzilla: https://bugzilla.novell.com/show_bug.cgi?id=887046
    Cc: [v3.11+]
    Signed-off-by: Takashi Iwai
    Signed-off-by: Chris Mason

    Takashi Iwai
     
  • When failing to allocate space for the whole compressed extent, we'll
    fallback to uncompressed IO, but we've forgotten to redirty the pages
    which belong to this compressed extent, and these 'clean' pages will
    simply skip 'submit' part and go to endio directly, at last we got data
    corruption as we write nothing.

    Signed-off-by: Liu Bo
    Tested-By: Martin Steigerwald
    Signed-off-by: Chris Mason

    Liu Bo
     
  • ulist_add() can return '1' on sucess, which qgroup_subtree_accounting()
    doesn't take into account. As a result, that value can be bubbled up to
    callers, causing an error to be printed. Fix this by only returning the
    value of ulist_add() when it indicates an error.

    Signed-off-by: Mark Fasheh
    Signed-off-by: Chris Mason

    Mark Fasheh
     
  • During its tree walk, btrfs_drop_snapshot() will skip any shared
    subtrees it encounters. This is incorrect when we have qgroups
    turned on as those subtrees need to have their contents
    accounted. In particular, the case we're concerned with is when
    removing our snapshot root leaves the subtree with only one root
    reference.

    In those cases we need to find the last remaining root and add
    each extent in the subtree to the corresponding qgroup exclusive
    counts.

    This patch implements the shared subtree walk and a new qgroup
    operation, BTRFS_QGROUP_OPER_SUB_SUBTREE. When an operation of
    this type is encountered during qgroup accounting, we search for
    any root references to that extent and in the case that we find
    only one reference left, we go ahead and do the math on it's
    exclusive counts.

    Signed-off-by: Mark Fasheh
    Reviewed-by: Josef Bacik
    Signed-off-by: Chris Mason

    Mark Fasheh
     
  • Before processing the extent buffer, acquire a read lock on it, so
    that we're safe against concurrent updates on the extent buffer.

    Signed-off-by: Filipe Manana
    Signed-off-by: Chris Mason

    Filipe Manana
     
  • Before I extended the no_quota arg to btrfs_dec/inc_ref because I didn't
    understand how snapshot delete was using it and assumed that we needed the
    quota operations there. With Mark's work this has turned out to be not the
    case, we _always_ need to use no_quota for btrfs_dec/inc_ref, so just drop the
    argument and make __btrfs_mod_ref call it's process function with no_quota set
    always. Thanks,

    Signed-off-by: Josef Bacik
    Signed-off-by: Chris Mason

    Josef Bacik
     
  • This has been discussed in thread:
    http://thread.gmane.org/gmane.comp.file-systems.btrfs/32528

    and this patch implements this proposal:
    http://thread.gmane.org/gmane.comp.file-systems.btrfs/32536

    Works fine for "clean" raid profiles where the raid factor correction
    does the right job. Otherwise it's pessimistic and may show low space
    although there's still some left.

    The df nubmers are lightly wrong in case of mixed block groups, but this
    is not a major usecase and can be addressed later.

    The RAID56 numbers are wrong almost the same way as before and will be
    addressed separately.

    CC: Hugo Mills
    CC: cwillu
    CC: Josef Bacik
    Signed-off-by: David Sterba
    Signed-off-by: Chris Mason

    David Sterba
     

14 Aug, 2014

8 commits

  • There's no need to call locks_free_lock here while still holding the
    i_lock. Defer that until the lock has been dropped.

    Acked-by: J. Bruce Fields
    Signed-off-by: Jeff Layton

    Jeff Layton
     
  • In commit 72f98e72551fa (locks: turn lock_flocks into a spinlock), we
    moved from using the BKL to a global spinlock. With this change, we lost
    the ability to block in the fl_release_private operation.

    This is problematic for NFS (and probably some other filesystems as
    well). Add a new list_head argument to locks_delete_lock. If that
    argument is non-NULL, then queue any locks that we want to free to the
    list instead of freeing them.

    Then, add a new locks_dispose_list function that will walk such a list
    and call locks_free_lock on them after the i_lock has been dropped.

    Finally, change all of the callers of locks_delete_lock to pass in a
    list_head, except for lease_modify. That function can be called long
    after the i_lock has been acquired. Deferring the freeing of a lease
    after unlocking it in that function is non-trivial until we overhaul
    some of the spinlocking in the lease code.

    Currently though, no filesystem that sets fl_release_private supports
    leases, so this is not currently a problem. We'll eventually want to
    make the same change in the lease code, but it needs a lot more work
    before we can reasonably do so.

    Acked-by: J. Bruce Fields
    Signed-off-by: Jeff Layton

    Jeff Layton
     
  • Currently in the case where a new file lock completely replaces the old
    one, we end up overwriting the existing lock with the new info. This
    means that we have to call fl_release_private inside i_lock. Change the
    code to instead copy the info to new_fl, insert that lock into the
    correct spot and then delete the old lock. In a later patch, we'll defer
    the freeing of the old lock until after the i_lock has been dropped.

    Acked-by: J. Bruce Fields
    Signed-off-by: Jeff Layton

    Jeff Layton
     
  • Pull NFS client updates from Trond Myklebust:
    "Highlights include:

    - stable fix for a bug in nfs3_list_one_acl()
    - speed up NFS path walks by supporting LOOKUP_RCU
    - more read/write code cleanups
    - pNFS fixes for layout return on close
    - fixes for the RCU handling in the rpcsec_gss code
    - more NFS/RDMA fixes"

    * tag 'nfs-for-3.17-1' of git://git.linux-nfs.org/projects/trondmy/linux-nfs: (79 commits)
    nfs: reject changes to resvport and sharecache during remount
    NFS: Avoid infinite loop when RELEASE_LOCKOWNER getting expired error
    SUNRPC: remove all refcounting of groupinfo from rpcauth_lookupcred
    NFS: fix two problems in lookup_revalidate in RCU-walk
    NFS: allow lockless access to access_cache
    NFS: teach nfs_lookup_verify_inode to handle LOOKUP_RCU
    NFS: teach nfs_neg_need_reval to understand LOOKUP_RCU
    NFS: support RCU_WALK in nfs_permission()
    sunrpc/auth: allow lockless (rcu) lookup of credential cache.
    NFS: prepare for RCU-walk support but pushing tests later in code.
    NFS: nfs4_lookup_revalidate: only evaluate parent if it will be used.
    NFS: add checks for returned value of try_module_get()
    nfs: clear_request_commit while holding i_lock
    pnfs: add pnfs_put_lseg_async
    pnfs: find swapped pages on pnfs commit lists too
    nfs: fix comment and add warn_on for PG_INODE_REF
    nfs: check wait_on_bit_lock err in page_group_lock
    sunrpc: remove "ec" argument from encrypt_v2 operation
    sunrpc: clean up sparse endianness warnings in gss_krb5_wrap.c
    sunrpc: clean up sparse endianness warnings in gss_krb5_seal.c
    ...

    Linus Torvalds
     
  • Pull xfs update from Dave Chinner:
    "This update contains:
    - conversion of the XFS core to pass negative error numbers
    - restructing of core XFS code that is shared with userspace to
    fs/xfs/libxfs
    - introduction of sysfs interface for XFS
    - bulkstat refactoring
    - demand driven speculative preallocation removal
    - XFS now always requires 64 bit sectors to be configured
    - metadata verifier changes to ensure CRCs are calculated during log
    recovery
    - various minor code cleanups
    - miscellaneous bug fixes

    The diffstat is kind of noisy because of the restructuring of the code
    to make kernel/userspace code sharing simpler, along with the XFS wide
    change to use the standard negative error return convention (at last!)"

    * tag 'xfs-for-linus-3.17-rc1' of git://oss.sgi.com/xfs/xfs: (45 commits)
    xfs: fix coccinelle warnings
    xfs: flush both inodes in xfs_swap_extents
    xfs: fix swapext ilock deadlock
    xfs: kill xfs_vnode.h
    xfs: kill VN_MAPPED
    xfs: kill VN_CACHED
    xfs: kill VN_DIRTY()
    xfs: dquot recovery needs verifiers
    xfs: quotacheck leaves dquot buffers without verifiers
    xfs: ensure verifiers are attached to recovered buffers
    xfs: catch buffers written without verifiers attached
    xfs: avoid false quotacheck after unclean shutdown
    xfs: fix rounding error of fiemap length parameter
    xfs: introduce xfs_bulkstat_ag_ichunk
    xfs: require 64-bit sector_t
    xfs: fix uflags detection at xfs_fs_rm_xquota
    xfs: remove XFS_IS_OQUOTA_ON macros
    xfs: tidy up xfs_set_inode32
    xfs: allow inode allocations in post-growfs disk space
    xfs: mark xfs_qm_quotacheck as static
    ...

    Linus Torvalds
     
  • Pull quota, reiserfs, UDF updates from Jan Kara:
    "Scalability improvements for quota, a few reiserfs fixes, and couple
    of misc cleanups (udf, ext2)"

    * 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs:
    reiserfs: Fix use after free in journal teardown
    reiserfs: fix corruption introduced by balance_leaf refactor
    udf: avoid redundant memcpy when writing data in ICB
    fs/udf: re-use hex_asc_upper_{hi,lo} macros
    fs/quota: kernel-doc warning fixes
    udf: use linux/uaccess.h
    fs/ext2/super.c: Drop memory allocation cast
    quota: remove dqptr_sem
    quota: simplify remove_inode_dquot_ref()
    quota: avoid unnecessary dqget()/dqput() calls
    quota: protect Q_GETFMT by dqonoff_mutex

    Linus Torvalds
     
  • Pull Ceph updates from Sage Weil:
    "There is a lot of refactoring and hardening of the libceph and rbd
    code here from Ilya that fix various smaller bugs, and a few more
    important fixes with clone overlap. The main fix is a critical change
    to the request_fn handling to not sleep that was exposed by the recent
    mutex changes (which will also go to the 3.16 stable series).

    Yan Zheng has several fixes in here for CephFS fixing ACL handling,
    time stamps, and request resends when the MDS restarts.

    Finally, there are a few cleanups from Himangi Saraogi based on
    Coccinelle"

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client: (39 commits)
    libceph: set last_piece in ceph_msg_data_pages_cursor_init() correctly
    rbd: remove extra newlines from rbd_warn() messages
    rbd: allocate img_request with GFP_NOIO instead GFP_ATOMIC
    rbd: rework rbd_request_fn()
    ceph: fix kick_requests()
    ceph: fix append mode write
    ceph: fix sizeof(struct tYpO *) typo
    ceph: remove redundant memset(0)
    rbd: take snap_id into account when reading in parent info
    rbd: do not read in parent info before snap context
    rbd: update mapping size only on refresh
    rbd: harden rbd_dev_refresh() and callers a bit
    rbd: split rbd_dev_spec_update() into two functions
    rbd: remove unnecessary asserts in rbd_dev_image_probe()
    rbd: introduce rbd_dev_header_info()
    rbd: show the entire chain of parent images
    ceph: replace comma with a semicolon
    rbd: use rbd_segment_name_free() instead of kfree()
    ceph: check zero length in ceph_sync_read()
    ceph: reset r_resend_mds after receiving -ESTALE
    ...

    Linus Torvalds
     
  • Pull UBI/UBIFS changes from Artem Bityutskiy:
    "No significant changes, mostly small fixes here and there. The more
    important fixes are:

    - UBI deleted list items while iterating the list with
    'list_for_each_entry'
    - The UBI block driver did not work properly with very large UBI
    volumes"

    * tag 'upstream-3.17-rc1' of git://git.infradead.org/linux-ubifs: (21 commits)
    UBIFS: Add log overlap assertions
    Revert "UBIFS: add a log overlap assertion"
    UBI: bugfix in ubi_wl_flush()
    UBI: block: Avoid disk size integer overflow
    UBI: block: Set disk_capacity out of the mutex
    UBI: block: Make ubiblock_resize return something
    UBIFS: add a log overlap assertion
    UBIFS: remove unnecessary check
    UBIFS: remove mst_mutex
    UBIFS: kernel-doc warning fix
    UBI: init_volumes: Ignore volumes with no LEBs
    UBIFS: replace seq_printf by seq_puts
    UBIFS: replace count*size kzalloc by kcalloc
    UBIFS: kernel-doc warning fix
    UBIFS: fix error path in create_default_filesystem()
    UBIFS: fix spelling of "scanned"
    UBIFS: fix some comments
    UBIFS: remove useless @ecc in struct ubifs_scan_leb
    UBIFS: remove useless statements
    UBIFS: Add missing break statements in dbg_chk_pnode()
    ...

    Linus Torvalds
     

12 Aug, 2014

5 commits

  • If do_journal_release() races with do_journal_end() which requeues
    delayed works for transaction flushing, we can leave work items for
    flushing outstanding transactions queued while freeing them. That
    results in use after free and possible crash in run_timers_softirq().

    Fix the problem by not requeueing works if superblock is being shut down
    (MS_ACTIVE not set) and using cancel_delayed_work_sync() in
    do_journal_release().

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

    Jan Kara
     
  • Pull vfs updates from Al Viro:
    "Stuff in here:

    - acct.c fixes and general rework of mnt_pin mechanism. That allows
    to go for delayed-mntput stuff, which will permit mntput() on deep
    stack without worrying about stack overflows - fs shutdown will
    happen on shallow stack. IOW, we can do Eric's umount-on-rmdir
    series without introducing tons of stack overflows on new mntput()
    call chains it introduces.
    - Bruce's d_splice_alias() patches
    - more Miklos' rename() stuff.
    - a couple of regression fixes (stable fodder, in the end of branch)
    and a fix for API idiocy in iov_iter.c.

    There definitely will be another pile, maybe even two. I'd like to
    get Eric's series in this time, but even if we miss it, it'll go right
    in the beginning of for-next in the next cycle - the tricky part of
    prereqs is in this pile"

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (40 commits)
    fix copy_tree() regression
    __generic_file_write_iter(): fix handling of sync error after DIO
    switch iov_iter_get_pages() to passing maximal number of pages
    fs: mark __d_obtain_alias static
    dcache: d_splice_alias should detect loops
    exportfs: update Exporting documentation
    dcache: d_find_alias needn't recheck IS_ROOT && DCACHE_DISCONNECTED
    dcache: remove unused d_find_alias parameter
    dcache: d_obtain_alias callers don't all want DISCONNECTED
    dcache: d_splice_alias should ignore DCACHE_DISCONNECTED
    dcache: d_splice_alias mustn't create directory aliases
    dcache: close d_move race in d_splice_alias
    dcache: move d_splice_alias
    namei: trivial fix to vfs_rename_dir comment
    VFS: allow ->d_manage() to declare -EISDIR in rcu_walk mode.
    cifs: support RENAME_NOREPLACE
    hostfs: support rename flags
    shmem: support RENAME_EXCHANGE
    shmem: support RENAME_NOREPLACE
    btrfs: add RENAME_NOREPLACE
    ...

    Linus Torvalds
     
  • All callers of locks_copy_lock pass in a brand new file_lock struct, so
    there's no need to call locks_release_private on it. Replace that with
    a warning that fires in the event that we receive a target lock that
    doesn't look like it's properly initialized.

    Acked-by: J. Bruce Fields
    Signed-off-by: Jeff Layton

    Jeff Layton
     
  • Now that they are a distinct lease type, show them as such.

    Cc: J. Bruce Fields
    Signed-off-by: Jeff Layton

    Jeff Layton
     
  • Since 3.14 we had copy_tree() get the shadowing wrong - if we had one
    vfsmount shadowing another (i.e. if A is a slave of B, C is mounted
    on A/foo, then D got mounted on B/foo creating D' on A/foo shadowed
    by C), copy_tree() of A would make a copy of D' shadow the the copy of
    C, not the other way around.

    It's easy to fix, fortunately - just make sure that mount follows
    the one that shadows it in mnt_child as well as in mnt_hash, and when
    copy_tree() decides to attach a new mount, check if the last child
    it has added to the same parent should be shadowing the new one.
    And if it should, just use the same logics commit_tree() has - put the
    new mount into the hash and children lists right after the one that
    should shadow it.

    Cc: stable@vger.kernel.org [3.14 and later]
    Signed-off-by: Al Viro

    Al Viro
     

11 Aug, 2014

1 commit

  • … of /proc/self/{mounts,net}"

    This reverts commits 344470cac42e and e81324407269.

    It turns out that the exact path in the symlink matters, if for somewhat
    unfortunate reasons: some apparmor configurations don't allow dhclient
    access to the per-thread /proc files. As reported by Jörg Otte:

    audit: type=1400 audit(1407684227.003:28): apparmor="DENIED"
    operation="open" profile="/sbin/dhclient"
    name="/proc/1540/task/1540/net/dev" pid=1540 comm="dhclient"
    requested_mask="r" denied_mask="r" fsuid=0 ouid=0

    so we had better revert this for now. We might be able to work around
    this in practice by only using the per-thread symlinks if the thread
    isn't the thread group leader, and if the namespaces differ between
    threads (which basically never happens).

    We'll see. In the meantime, the revert was made to be intentionally easy.

    Reported-by: Jörg Otte <jrg.otte@gmail.com>
    Acked-by: Eric W. Biederman <ebiederm@xmission.com>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

    Linus Torvalds
     

10 Aug, 2014

3 commits

  • Pull namespace updates from Eric Biederman:
    "This is a bunch of small changes built against 3.16-rc6. The most
    significant change for users is the first patch which makes setns
    drmatically faster by removing unneded rcu handling.

    The next chunk of changes are so that "mount -o remount,.." will not
    allow the user namespace root to drop flags on a mount set by the
    system wide root. Aks this forces read-only mounts to stay read-only,
    no-dev mounts to stay no-dev, no-suid mounts to stay no-suid, no-exec
    mounts to stay no exec and it prevents unprivileged users from messing
    with a mounts atime settings. I have included my test case as the
    last patch in this series so people performing backports can verify
    this change works correctly.

    The next change fixes a bug in NFS that was discovered while auditing
    nsproxy users for the first optimization. Today you can oops the
    kernel by reading /proc/fs/nfsfs/{servers,volumes} if you are clever
    with pid namespaces. I rebased and fixed the build of the
    !CONFIG_NFS_FS case yesterday when a build bot caught my typo. Given
    that no one to my knowledge bases anything on my tree fixing the typo
    in place seems more responsible that requiring a typo-fix to be
    backported as well.

    The last change is a small semantic cleanup introducing
    /proc/thread-self and pointing /proc/mounts and /proc/net at it. This
    prevents several kinds of problemantic corner cases. It is a
    user-visible change so it has a minute chance of causing regressions
    so the change to /proc/mounts and /proc/net are individual one line
    commits that can be trivially reverted. Unfortunately I lost and
    could not find the email of the original reporter so he is not
    credited. From at least one perspective this change to /proc/net is a
    refgression fix to allow pthread /proc/net uses that were broken by
    the introduction of the network namespace"

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace:
    proc: Point /proc/mounts at /proc/thread-self/mounts instead of /proc/self/mounts
    proc: Point /proc/net at /proc/thread-self/net instead of /proc/self/net
    proc: Implement /proc/thread-self to point at the directory of the current thread
    proc: Have net show up under /proc//task/
    NFS: Fix /proc/fs/nfsfs/servers and /proc/fs/nfsfs/volumes
    mnt: Add tests for unprivileged remount cases that have found to be faulty
    mnt: Change the default remount atime from relatime to the existing value
    mnt: Correct permission checks in do_remount
    mnt: Move the test for MNT_LOCK_READONLY from change_mount_flags into do_remount
    mnt: Only change user settable mount flags in remount
    namespaces: Use task_lock and not rcu to protect nsproxy

    Linus Torvalds
     
  • Pull nfsd updates from Bruce Fields:
    "This includes a major rewrite of the NFSv4 state code, which has
    always depended on a single mutex. As an example, open creates are no
    longer serialized, fixing a performance regression on NFSv3->NFSv4
    upgrades. Thanks to Jeff, Trond, and Benny, and to Christoph for
    review.

    Also some RDMA fixes from Chuck Lever and Steve Wise, and
    miscellaneous fixes from Kinglong Mee and others"

    * 'for-3.17' of git://linux-nfs.org/~bfields/linux: (167 commits)
    svcrdma: remove rdma_create_qp() failure recovery logic
    nfsd: add some comments to the nfsd4 object definitions
    nfsd: remove the client_mutex and the nfs4_lock/unlock_state wrappers
    nfsd: remove nfs4_lock_state: nfs4_state_shutdown_net
    nfsd: remove nfs4_lock_state: nfs4_laundromat
    nfsd: Remove nfs4_lock_state(): reclaim_complete()
    nfsd: Remove nfs4_lock_state(): setclientid, setclientid_confirm, renew
    nfsd: Remove nfs4_lock_state(): exchange_id, create/destroy_session()
    nfsd: Remove nfs4_lock_state(): nfsd4_open and nfsd4_open_confirm
    nfsd: Remove nfs4_lock_state(): nfsd4_delegreturn()
    nfsd: Remove nfs4_lock_state(): nfsd4_open_downgrade + nfsd4_close
    nfsd: Remove nfs4_lock_state(): nfsd4_lock/locku/lockt()
    nfsd: Remove nfs4_lock_state(): nfsd4_release_lockowner
    nfsd: Remove nfs4_lock_state(): nfsd4_test_stateid/nfsd4_free_stateid
    nfsd: Remove nfs4_lock_state(): nfs4_preprocess_stateid_op()
    nfsd: remove old fault injection infrastructure
    nfsd: add more granular locking to *_delegations fault injectors
    nfsd: add more granular locking to forget_openowners fault injector
    nfsd: add more granular locking to forget_locks fault injector
    nfsd: add a list_head arg to nfsd_foreach_client_lock
    ...

    Linus Torvalds
     
  • Pull CIFS updates from Steve French:
    "The most visible change in this set is the additional of multi-credit
    support for SMB2/SMB3 which dramatically improves the large file i/o
    performance for these dialects and significantly increases the maximum
    i/o size used on the wire for SMB2/SMB3.

    Also reconnection behavior after network failure is improved"

    * 'for-next' of git://git.samba.org/sfrench/cifs-2.6: (35 commits)
    Add worker function to set allocation size
    [CIFS] Fix incorrect hex vs. decimal in some debug print statements
    update CIFS TODO list
    Add Pavel to contributor list in cifs AUTHORS file
    Update cifs version
    CIFS: Fix STATUS_CANNOT_DELETE error mapping for SMB2
    CIFS: Optimize readpages in a short read case on reconnects
    CIFS: Optimize cifs_user_read() in a short read case on reconnects
    CIFS: Improve indentation in cifs_user_read()
    CIFS: Fix possible buffer corruption in cifs_user_read()
    CIFS: Count got bytes in read_into_pages()
    CIFS: Use separate var for the number of bytes got in async read
    CIFS: Indicate reconnect with ECONNABORTED error code
    CIFS: Use multicredits for SMB 2.1/3 reads
    CIFS: Fix rsize usage for sync read
    CIFS: Fix rsize usage in user read
    CIFS: Separate page reading from user read
    CIFS: Fix rsize usage in readpages
    CIFS: Separate page search from readpages
    CIFS: Use multicredits for SMB 2.1/3 writes
    ...

    Linus Torvalds
     

09 Aug, 2014

11 commits

  • Pull MTD updates from Brian Norris:
    "AMD-compatible CFI driver:
    - Support OTP programming for Micron M29EW family
    - Increase buffer write timeout, according to detected flash
    parameter info

    NAND
    - Add helpers for retrieving ONFI timing modes
    - GPMI: provide option to disable bad block marker swapping (required
    for Ka-On electronics platforms)

    SPI NOR
    - EON EN25QH128 support
    - Support new Flag Status Register (FSR) on a few Micron flash

    Common
    - New sysfs entries for bad block and ECC stats

    And a few miscellaneous refactorings, cleanups, and driver
    improvements"

    * tag 'for-linus-20140808' of git://git.infradead.org/linux-mtd: (31 commits)
    mtd: gpmi: make blockmark swapping optional
    mtd: gpmi: remove line breaks from error messages and improve wording
    mtd: gpmi: remove useless (void *) type casts and spaces between type casts and variables
    mtd: atmel_nand: NFC: support multiple interrupt handling
    mtd: atmel_nand: implement the nfc_device_ready() by checking the R/B bit
    mtd: atmel_nand: add NFC status error check
    mtd: atmel_nand: make ecc parameters same as definition
    mtd: nand: add ONFI timing mode to nand_timings converter
    mtd: nand: define struct nand_timings
    mtd: cfi_cmdset_0002: fix do_write_buffer() timeout error
    mtd: denali: use 8 bytes for READID command
    mtd/ftl: fix the double free of the buffers allocated in build_maps()
    mtd: phram: Fix whitespace issues
    mtd: spi-nor: add support for EON EN25QH128
    mtd: cfi_cmdset_0002: Add support for locking OTP memory
    mtd: cfi_cmdset_0002: Add support for writing OTP memory
    mtd: cfi_cmdset_0002: Invalidate cache after entering/exiting OTP memory
    mtd: cfi_cmdset_0002: Add support for reading OTP
    mtd: spi-nor: add support for flag status register on Micron chips
    mtd: Account for BBT blocks when a partition is being allocated
    ...

    Linus Torvalds
     
  • If two processes share a common memory region, they usually want some
    guarantees to allow safe access. This often includes:
    - one side cannot overwrite data while the other reads it
    - one side cannot shrink the buffer while the other accesses it
    - one side cannot grow the buffer beyond previously set boundaries

    If there is a trust-relationship between both parties, there is no need
    for policy enforcement. However, if there's no trust relationship (eg.,
    for general-purpose IPC) sharing memory-regions is highly fragile and
    often not possible without local copies. Look at the following two
    use-cases:

    1) A graphics client wants to share its rendering-buffer with a
    graphics-server. The memory-region is allocated by the client for
    read/write access and a second FD is passed to the server. While
    scanning out from the memory region, the server has no guarantee that
    the client doesn't shrink the buffer at any time, requiring rather
    cumbersome SIGBUS handling.
    2) A process wants to perform an RPC on another process. To avoid huge
    bandwidth consumption, zero-copy is preferred. After a message is
    assembled in-memory and a FD is passed to the remote side, both sides
    want to be sure that neither modifies this shared copy, anymore. The
    source may have put sensible data into the message without a separate
    copy and the target may want to parse the message inline, to avoid a
    local copy.

    While SIGBUS handling, POSIX mandatory locking and MAP_DENYWRITE provide
    ways to achieve most of this, the first one is unproportionally ugly to
    use in libraries and the latter two are broken/racy or even disabled due
    to denial of service attacks.

    This patch introduces the concept of SEALING. If you seal a file, a
    specific set of operations is blocked on that file forever. Unlike locks,
    seals can only be set, never removed. Hence, once you verified a specific
    set of seals is set, you're guaranteed that no-one can perform the blocked
    operations on this file, anymore.

    An initial set of SEALS is introduced by this patch:
    - SHRINK: If SEAL_SHRINK is set, the file in question cannot be reduced
    in size. This affects ftruncate() and open(O_TRUNC).
    - GROW: If SEAL_GROW is set, the file in question cannot be increased
    in size. This affects ftruncate(), fallocate() and write().
    - WRITE: If SEAL_WRITE is set, no write operations (besides resizing)
    are possible. This affects fallocate(PUNCH_HOLE), mmap() and
    write().
    - SEAL: If SEAL_SEAL is set, no further seals can be added to a file.
    This basically prevents the F_ADD_SEAL operation on a file and
    can be set to prevent others from adding further seals that you
    don't want.

    The described use-cases can easily use these seals to provide safe use
    without any trust-relationship:

    1) The graphics server can verify that a passed file-descriptor has
    SEAL_SHRINK set. This allows safe scanout, while the client is
    allowed to increase buffer size for window-resizing on-the-fly.
    Concurrent writes are explicitly allowed.
    2) For general-purpose IPC, both processes can verify that SEAL_SHRINK,
    SEAL_GROW and SEAL_WRITE are set. This guarantees that neither
    process can modify the data while the other side parses it.
    Furthermore, it guarantees that even with writable FDs passed to the
    peer, it cannot increase the size to hit memory-limits of the source
    process (in case the file-storage is accounted to the source).

    The new API is an extension to fcntl(), adding two new commands:
    F_GET_SEALS: Return a bitset describing the seals on the file. This
    can be called on any FD if the underlying file supports
    sealing.
    F_ADD_SEALS: Change the seals of a given file. This requires WRITE
    access to the file and F_SEAL_SEAL may not already be set.
    Furthermore, the underlying file must support sealing and
    there may not be any existing shared mapping of that file.
    Otherwise, EBADF/EPERM is returned.
    The given seals are _added_ to the existing set of seals
    on the file. You cannot remove seals again.

    The fcntl() handler is currently specific to shmem and disabled on all
    files. A file needs to explicitly support sealing for this interface to
    work. A separate syscall is added in a follow-up, which creates files that
    support sealing. There is no intention to support this on other
    file-systems. Semantics are unclear for non-volatile files and we lack any
    use-case right now. Therefore, the implementation is specific to shmem.

    Signed-off-by: David Herrmann
    Acked-by: Hugh Dickins
    Cc: Michael Kerrisk
    Cc: Ryan Lortie
    Cc: Lennart Poettering
    Cc: Daniel Mack
    Cc: Andy Lutomirski
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    David Herrmann
     
  • This patch (of 6):

    The i_mmap_writable field counts existing writable mappings of an
    address_space. To allow drivers to prevent new writable mappings, make
    this counter signed and prevent new writable mappings if it is negative.
    This is modelled after i_writecount and DENYWRITE.

    This will be required by the shmem-sealing infrastructure to prevent any
    new writable mappings after the WRITE seal has been set. In case there
    exists a writable mapping, this operation will fail with EBUSY.

    Note that we rely on the fact that iff you already own a writable mapping,
    you can increase the counter without using the helpers. This is the same
    that we do for i_writecount.

    Signed-off-by: David Herrmann
    Acked-by: Hugh Dickins
    Cc: Michael Kerrisk
    Cc: Ryan Lortie
    Cc: Lennart Poettering
    Cc: Daniel Mack
    Cc: Andy Lutomirski
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    David Herrmann
     
  • This fixes checkpatch warning:

    WARNING: debugfs_remove(NULL) is safe this check is probably not required

    Signed-off-by: Fabian Frederick
    Cc: Christine Caulfield
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Fabian Frederick
     
  • Now with 64bit bzImage and kexec tools, we support ramdisk that size is
    bigger than 2g, as we could put it above 4G.

    Found compressed initramfs image could not be decompressed properly. It
    turns out that image length is int during decompress detection, and it
    will become < 0 when length is more than 2G. Furthermore, during
    decompressing len as int is used for inbuf count, that has problem too.

    Change len to long, that should be ok as on 32 bit platform long is
    32bits.

    Tested with following compressed initramfs image as root with kexec.
    gzip, bzip2, xz, lzma, lzop, lz4.
    run time for populate_rootfs():
    size name Nehalem-EX Westmere-EX Ivybridge-EX
    9034400256 root_img : 26s 24s 30s
    3561095057 root_img.lz4 : 28s 27s 27s
    3459554629 root_img.lzo : 29s 29s 28s
    3219399480 root_img.gz : 64s 62s 49s
    2251594592 root_img.xz : 262s 260s 183s
    2226366598 root_img.lzma: 386s 376s 277s
    2901482513 root_img.bz2 : 635s 599s

    Signed-off-by: Yinghai Lu
    Cc: "H. Peter Anvin"
    Cc: Ingo Molnar
    Cc: Rashika Kheria
    Cc: Josh Triplett
    Cc: Kyungsik Lee
    Cc: P J P
    Cc: Al Viro
    Cc: Tetsuo Handa
    Cc: "Daniel M. Weeks"
    Cc: Alexandre Courbot
    Cc: Jan Beulich
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Yinghai Lu
     
  • Add DDEBUG in Makefile when CONFIG_QNX6FS_DEBUG is set. All QNX6DEBUG
    messages are replaced by pr_debug which means debugging will be emitted in
    debug level only and no more in error and info levels. debug uses now
    pr_fmt and __func__

    QNX6DEBUG definition has been removed.

    Signed-off-by: Fabian Frederick
    Cc: Joe Perches
    Cc: Kai Bankett
    Cc: Al Viro
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Fabian Frederick
     
  • Remove "qnx6:" and "qnx6: " from each logging instruction.

    Signed-off-by: Fabian Frederick
    Cc: Joe Perches
    Cc: Kai Bankett
    Cc: Al Viro
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Fabian Frederick
     
  • Use current logging functions.

    Coalesce formats.

    Signed-off-by: Fabian Frederick
    Cc: Joe Perches
    Cc: Kai Bankett
    Cc: Al Viro
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Fabian Frederick
     
  • Fix checkpatch warning:

    WARNING: Missing a blank line after declarations

    Signed-off-by: Fabian Frederick
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Fabian Frederick
     
  • - Remove "Error" in format logging (already in pr_ level)

    - Use modulename in pr_fmt instead of ROMFS: in each pr_ callsites.

    Signed-off-by: Fabian Frederick
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Fabian Frederick
     
  • Use current logging functions. Coalesce formats.

    Signed-off-by: Fabian Frederick
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Fabian Frederick