13 Jan, 2019

1 commit

  • commit b8eee0e90f9797b747113638bc75e739b192ad38 upstream.

    Commit 9d5b86ac13c5 ("fs/locks: Remove fl_nspid and use fs-specific l_pid
    for remote locks") specified that the l_pid returned for F_GETLK on a local
    file that has a remote lock should be the pid of the lock manager process.
    That commit, while updating other filesystems, failed to update lockd, such
    that locks created by lockd had their fl_pid set to that of the remote
    process holding the lock. Fix that here to be the pid of lockd.

    Also, fix the client case so that the returned lock pid is negative, which
    indicates a remote lock on a remote file.

    Fixes: 9d5b86ac13c5 ("fs/locks: Remove fl_nspid and use fs-specific...")
    Cc: stable@vger.kernel.org

    Signed-off-by: Benjamin Coddington
    Signed-off-by: J. Bruce Fields
    Signed-off-by: Greg Kroah-Hartman

    Benjamin Coddington
     

14 Nov, 2018

1 commit


04 Feb, 2018

1 commit

  • [ Upstream commit 6b18dd1c03e07262ea0866084856b2a3c5ba8d09 ]

    lockd_inet[6]addr_event use nlmsvc_rqst without taken nlmsvc_mutex,
    nlmsvc_rqst can be changed during execution of notifiers and crash the host.

    Patch enables access to nlmsvc_rqst only when it was correctly initialized
    and delays its cleanup until notifiers are no longer in use.

    Note that nlmsvc_rqst can be temporally set to ERR_PTR, so the "if
    (nlmsvc_rqst)" check in notifiers is insufficient on its own.

    Signed-off-by: Vasily Averin
    Tested-by: Scott Mayhew
    Signed-off-by: J. Bruce Fields
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Vasily Averin
     

05 Dec, 2017

1 commit

  • commit 3a2b19d1ee5633f76ae8a88da7bc039a5d1732aa upstream.

    Commit efda760fe95ea ("lockd: fix lockd shutdown race") is incorrect,
    it removes lockd_manager and disarm grace_period_end for init_net only.

    If nfsd was started from another net namespace lockd_up_net() calls
    set_grace_period() that adds lockd_manager into per-netns list
    and queues grace_period_end delayed work.

    These action should be reverted in lockd_down_net().
    Otherwise it can lead to double list_add on after restart nfsd in netns,
    and to use-after-free if non-disarmed delayed work will be executed after netns destroy.

    Fixes: efda760fe95e ("lockd: fix lockd shutdown race")
    Signed-off-by: Vasily Averin
    Signed-off-by: J. Bruce Fields
    Signed-off-by: Greg Kroah-Hartman

    Vasily Averin
     

30 Nov, 2017

1 commit

  • commit dc3033e16c59a2c4e62b31341258a5786cbcee56 upstream.

    lockd_up() can call lockd_unregister_notifiers twice:
    inside lockd_start_svc() when it calls lockd_svc_exit_thread()
    and then in error path of lockd_up()

    Patch forces lockd_start_svc() to unregister notifiers in all error cases
    and removes extra unregister in error path of lockd_up().

    Fixes: cb7d224f82e4 "lockd: unregister notifier blocks if the service ..."
    Signed-off-by: Vasily Averin
    Reviewed-by: Jeff Layton
    Signed-off-by: J. Bruce Fields
    Signed-off-by: Greg Kroah-Hartman

    Vasily Averin
     

02 Nov, 2017

1 commit

  • Many source files in the tree are missing licensing information, which
    makes it harder for compliance tools to determine the correct license.

    By default all files without license information are under the default
    license of the kernel, which is GPL version 2.

    Update the files which contain no license information with the 'GPL-2.0'
    SPDX license identifier. The SPDX identifier is a legally binding
    shorthand, which can be used instead of the full boiler plate text.

    This patch is based on work done by Thomas Gleixner and Kate Stewart and
    Philippe Ombredanne.

    How this work was done:

    Patches were generated and checked against linux-4.14-rc6 for a subset of
    the use cases:
    - file had no licensing information it it.
    - file was a */uapi/* one with no licensing information in it,
    - file was a */uapi/* one with existing licensing information,

    Further patches will be generated in subsequent months to fix up cases
    where non-standard license headers were used, and references to license
    had to be inferred by heuristics based on keywords.

    The analysis to determine which SPDX License Identifier to be applied to
    a file was done in a spreadsheet of side by side results from of the
    output of two independent scanners (ScanCode & Windriver) producing SPDX
    tag:value files created by Philippe Ombredanne. Philippe prepared the
    base worksheet, and did an initial spot review of a few 1000 files.

    The 4.13 kernel was the starting point of the analysis with 60,537 files
    assessed. Kate Stewart did a file by file comparison of the scanner
    results in the spreadsheet to determine which SPDX license identifier(s)
    to be applied to the file. She confirmed any determination that was not
    immediately clear with lawyers working with the Linux Foundation.

    Criteria used to select files for SPDX license identifier tagging was:
    - Files considered eligible had to be source code files.
    - Make and config files were included as candidates if they contained >5
    lines of source
    - File already had some variant of a license header in it (even if
    Reviewed-by: Philippe Ombredanne
    Reviewed-by: Thomas Gleixner
    Signed-off-by: Greg Kroah-Hartman

    Greg Kroah-Hartman
     

12 Sep, 2017

1 commit

  • Pull NFS client updates from Trond Myklebust:
    "Hightlights include:

    Stable bugfixes:
    - Fix mirror allocation in the writeback code to avoid a use after
    free
    - Fix the O_DSYNC writes to use the correct byte range
    - Fix 2 use after free issues in the I/O code

    Features:
    - Writeback fixes to split up the inode->i_lock in order to reduce
    contention
    - RPC client receive fixes to reduce the amount of time the
    xprt->transport_lock is held when receiving data from a socket into
    am XDR buffer.
    - Ditto fixes to reduce contention between call side users of the
    rdma rb_lock, and its use in rpcrdma_reply_handler.
    - Re-arrange rdma stats to reduce false cacheline sharing.
    - Various rdma cleanups and optimisations.
    - Refactor the NFSv4.1 exchange id code and clean up the code.
    - Const-ify all instances of struct rpc_xprt_ops

    Bugfixes:
    - Fix the NFSv2 'sec=' mount option.
    - NFSv4.1: don't use machine credentials for CLOSE when using
    'sec=sys'
    - Fix the NFSv3 GRANT callback when the port changes on the server.
    - Fix livelock issues with COMMIT
    - NFSv4: Use correct inode in _nfs4_opendata_to_nfs4_state() when
    doing and NFSv4.1 open by filehandle"

    * tag 'nfs-for-4.14-1' of git://git.linux-nfs.org/projects/trondmy/linux-nfs: (69 commits)
    NFS: Count the bytes of skipped subrequests in nfs_lock_and_join_requests()
    NFS: Don't hold the group lock when calling nfs_release_request()
    NFS: Remove pnfs_generic_transfer_commit_list()
    NFS: nfs_lock_and_join_requests and nfs_scan_commit_list can deadlock
    NFS: Fix 2 use after free issues in the I/O code
    NFS: Sync the correct byte range during synchronous writes
    lockd: Delete an error message for a failed memory allocation in reclaimer()
    NFS: remove jiffies field from access cache
    NFS: flush data when locking a file to ensure cache coherence for mmap.
    SUNRPC: remove some dead code.
    NFS: don't expect errors from mempool_alloc().
    xprtrdma: Use xprt_pin_rqst in rpcrdma_reply_handler
    xprtrdma: Re-arrange struct rx_stats
    NFS: Fix NFSv2 security settings
    NFSv4.1: don't use machine credentials for CLOSE when using 'sec=sys'
    SUNRPC: ECONNREFUSED should cause a rebind.
    NFS: Remove unused parameter gfp_flags from nfs_pageio_init()
    NFSv4: Fix up mirror allocation
    SUNRPC: Add a separate spinlock to protect the RPC request receive list
    SUNRPC: Cleanup xs_tcp_read_common()
    ...

    Linus Torvalds
     

07 Sep, 2017

1 commit


25 Aug, 2017

1 commit


15 May, 2017

11 commits


11 May, 2017

1 commit

  • Pull nfsd updates from Bruce Fields:
    "Another RDMA update from Chuck Lever, and a bunch of miscellaneous
    bugfixes"

    * tag 'nfsd-4.12' of git://linux-nfs.org/~bfields/linux: (26 commits)
    nfsd: Fix up the "supattr_exclcreat" attributes
    nfsd: encoders mustn't use unitialized values in error cases
    nfsd: fix undefined behavior in nfsd4_layout_verify
    lockd: fix lockd shutdown race
    NFSv4: Fix callback server shutdown
    SUNRPC: Refactor svc_set_num_threads()
    NFSv4.x/callback: Create the callback service through svc_create_pooled
    lockd: remove redundant check on block
    svcrdma: Clean out old XDR encoders
    svcrdma: Remove the req_map cache
    svcrdma: Remove unused RDMA Write completion handler
    svcrdma: Reduce size of sge array in struct svc_rdma_op_ctxt
    svcrdma: Clean up RPC-over-RDMA backchannel reply processing
    svcrdma: Report Write/Reply chunk overruns
    svcrdma: Clean up RDMA_ERROR path
    svcrdma: Use rdma_rw API in RPC reply path
    svcrdma: Introduce local rdma_rw API helpers
    svcrdma: Clean up svc_rdma_get_inv_rkey()
    svcrdma: Add helper to save pages under I/O
    svcrdma: Eliminate RPCRDMA_SQ_DEPTH_MULT
    ...

    Linus Torvalds
     

09 May, 2017

1 commit

  • As reported by David Jeffery: "a signal was sent to lockd while lockd
    was shutting down from a request to stop nfs. The signal causes lockd
    to call restart_grace() which puts the lockd_net structure on the grace
    list. If this signal is received at the wrong time, it will occur after
    lockd_down_net() has called locks_end_grace() but before
    lockd_down_net() stops the lockd thread. This leads to lockd putting
    the lockd_net structure back on the grace list, then exiting without
    anything removing it from the list."

    So, perform the final locks_end_grace() from the the lockd thread; this
    ensures it's serialized with respect to restart_grace().

    Reported-by: David Jeffery
    Signed-off-by: J. Bruce Fields

    J. Bruce Fields
     

26 Apr, 2017

1 commit

  • A null check followed by a return is being performed already, so block
    is always non-null at the second check on block, hence we can remove
    this redundant null-check (Detected by PVS-Studio). Also re-work
    comment to clean up a check-patch warning.

    Signed-off-by: Colin Ian King
    Signed-off-by: J. Bruce Fields

    Colin Ian King
     

21 Apr, 2017

1 commit

  • NFS would enjoy the ability to modify the behavior of the NLM client's
    unlock RPC task in order to delay the transmission of the unlock until IO
    that was submitted under that lock has completed. This ability can ensure
    that the NLM client will always complete the transmission of an unlock even
    if the waiting caller has been interrupted with fatal signal.

    For this purpose, a pointer to a struct nlmclnt_operations can be assigned
    in a nfs_module's nfs_rpc_ops that will install those nlmclnt_operations on
    the nlm_host. The struct nlmclnt_operations defines three callback
    operations that will be used in a following patch:

    nlmclnt_alloc_call - used to call back after a successful allocation of
    a struct nlm_rqst in nlmclnt_proc().

    nlmclnt_unlock_prepare - used to call back during NLM unlock's
    rpc_call_prepare. The NLM client defers calling rpc_call_start()
    until this callback returns false.

    nlmclnt_release_call - used to call back when the NLM client's struct
    nlm_rqst is freed.

    Signed-off-by: Benjamin Coddington
    Reviewed-by: Jeff Layton
    Signed-off-by: Trond Myklebust

    Benjamin Coddington
     

02 Mar, 2017

1 commit


01 Feb, 2017

1 commit


18 Nov, 2016

1 commit

  • Make struct pernet_operations::id unsigned.

    There are 2 reasons to do so:

    1)
    This field is really an index into an zero based array and
    thus is unsigned entity. Using negative value is out-of-bound
    access by definition.

    2)
    On x86_64 unsigned 32-bit data which are mixed with pointers
    via array indexing or offsets added or subtracted to pointers
    are preffered to signed 32-bit data.

    "int" being used as an array index needs to be sign-extended
    to 64-bit before being used.

    void f(long *p, int i)
    {
    g(p[i]);
    }

    roughly translates to

    movsx rsi, esi
    mov rdi, [rsi+...]
    call g

    MOVSX is 3 byte instruction which isn't necessary if the variable is
    unsigned because x86_64 is zero extending by default.

    Now, there is net_generic() function which, you guessed it right, uses
    "int" as an array index:

    static inline void *net_generic(const struct net *net, int id)
    {
    ...
    ptr = ng->ptr[id - 1];
    ...
    }

    And this function is used a lot, so those sign extensions add up.

    Patch snipes ~1730 bytes on allyesconfig kernel (without all junk
    messing with code generation):

    add/remove: 0/0 grow/shrink: 70/598 up/down: 396/-2126 (-1730)

    Unfortunately some functions actually grow bigger.
    This is a semmingly random artefact of code generation with register
    allocator being used differently. gcc decides that some variable
    needs to live in new r8+ registers and every access now requires REX
    prefix. Or it is shifted into r12, so [r12+0] addressing mode has to be
    used which is longer than [r8]

    However, overall balance is in negative direction:

    add/remove: 0/0 grow/shrink: 70/598 up/down: 396/-2126 (-1730)
    function old new delta
    nfsd4_lock 3886 3959 +73
    tipc_link_build_proto_msg 1096 1140 +44
    mac80211_hwsim_new_radio 2776 2808 +32
    tipc_mon_rcv 1032 1058 +26
    svcauth_gss_legacy_init 1413 1429 +16
    tipc_bcbase_select_primary 379 392 +13
    nfsd4_exchange_id 1247 1260 +13
    nfsd4_setclientid_confirm 782 793 +11
    ...
    put_client_renew_locked 494 480 -14
    ip_set_sockfn_get 730 716 -14
    geneve_sock_add 829 813 -16
    nfsd4_sequence_done 721 703 -18
    nlmclnt_lookup_host 708 686 -22
    nfsd4_lockt 1085 1063 -22
    nfs_get_client 1077 1050 -27
    tcf_bpf_init 1106 1076 -30
    nfsd4_encode_fattr 5997 5930 -67
    Total: Before=154856051, After=154854321, chg -0.00%

    Signed-off-by: Alexey Dobriyan
    Signed-off-by: David S. Miller

    Alexey Dobriyan
     

12 Oct, 2016

1 commit

  • Kernel source files need not include explicitly
    because the top Makefile forces to include it with:

    -include $(srctree)/include/linux/kconfig.h

    This commit removes explicit includes except the following:

    * arch/s390/include/asm/facilities_src.h
    * tools/testing/radix-tree/linux/kernel.h

    These two are used for host programs.

    Link: http://lkml.kernel.org/r/1473656164-11929-1-git-send-email-yamada.masahiro@socionext.com
    Signed-off-by: Masahiro Yamada
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Masahiro Yamada
     

29 Jul, 2016

1 commit

  • Pull vfs updates from Al Viro:
    "Assorted cleanups and fixes.

    Probably the most interesting part long-term is ->d_init() - that will
    have a bunch of followups in (at least) ceph and lustre, but we'll
    need to sort the barrier-related rules before it can get used for
    really non-trivial stuff.

    Another fun thing is the merge of ->d_iput() callers (dentry_iput()
    and dentry_unlink_inode()) and a bunch of ->d_compare() ones (all
    except the one in __d_lookup_lru())"

    * 'work.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (26 commits)
    fs/dcache.c: avoid soft-lockup in dput()
    vfs: new d_init method
    vfs: Update lookup_dcache() comment
    bdev: get rid of ->bd_inodes
    Remove last traces of ->sync_page
    new helper: d_same_name()
    dentry_cmp(): use lockless_dereference() instead of smp_read_barrier_depends()
    vfs: clean up documentation
    vfs: document ->d_real()
    vfs: merge .d_select_inode() into .d_real()
    unify dentry_iput() and dentry_unlink_inode()
    binfmt_misc: ->s_root is not going anywhere
    drop redundant ->owner initializations
    ufs: get rid of redundant checks
    orangefs: constify inode_operations
    missed comment updates from ->direct_IO() prototype change
    file_inode(f)->i_mapping is f->f_mapping
    trim fsnotify hooks a bit
    9p: new helper - v9fs_parent_fid()
    debugfs: ->d_parent is never NULL or negative
    ...

    Linus Torvalds
     

01 Jul, 2016

1 commit

  • If the lockd service fails to start up then we need to be sure that the
    notifier blocks are not registered, otherwise a subsequent start of the
    service could cause the same notifier to be registered twice, leading to
    soft lockups.

    Signed-off-by: Scott Mayhew
    Cc: stable@vger.kernel.org
    Fixes: 0751ddf77b6a "lockd: Register callbacks on the inetaddr_chain..."
    Signed-off-by: J. Bruce Fields

    Scott Mayhew
     

30 May, 2016

1 commit


07 Jan, 2016

2 commits


23 Dec, 2015

1 commit


12 Nov, 2015

1 commit

  • Pull nfsd updates from Bruce Fields:
    "Apologies for coming a little late in the merge window. Fortunately
    this is another fairly quiet one:

    Mainly smaller bugfixes and cleanup. We're still finding some bugs
    from the breakup of the big NFSv4 state lock in 3.17 -- thanks
    especially to Andrew Elble and Jeff Layton for tracking down some of
    the remaining races"

    * tag 'nfsd-4.4' of git://linux-nfs.org/~bfields/linux:
    svcrpc: document lack of some memory barriers
    nfsd: fix race with open / open upgrade stateids
    nfsd: eliminate sending duplicate and repeated delegations
    nfsd: remove recurring workqueue job to clean DRC
    SUNRPC: drop stale comment in svc_setup_socket()
    nfsd: ensure that seqid morphing operations are atomic wrt to copies
    nfsd: serialize layout stateid morphing operations
    nfsd: improve client_has_state to check for unused openowners
    nfsd: fix clid_inuse on mount with security change
    sunrpc/cache: make cache flushing more reliable.
    nfsd: move include of state.h from trace.c to trace.h
    sunrpc: avoid warning in gss_key_timeout
    lockd: get rid of reference-counted NSM RPC clients
    SUNRPC: Use MSG_SENDPAGE_NOTLAST when calling sendpage()
    lockd: create NSM handles per net namespace
    nfsd: switch unsigned char flags in svc_fh to bools
    nfsd: move svc_fh->fh_maxsize to just after fh_handle
    nfsd: drop null test before destroy functions
    nfsd: serialize state seqid morphing operations

    Linus Torvalds
     

24 Oct, 2015

1 commit

  • Currently we have reference-counted per-net NSM RPC client
    which created on the first monitor request and destroyed
    after the last unmonitor request. It's needed because
    RPC client need to know 'utsname()->nodename', but utsname()
    might be NULL when nsm_unmonitor() called.

    So instead of holding the rpc client we could just save nodename
    in struct nlm_host and pass it to the rpc_create().
    Thus ther is no need in keeping rpc client until last
    unmonitor request. We could create separate RPC clients
    for each monitor/unmonitor requests.

    Signed-off-by: Andrey Ryabinin
    Signed-off-by: J. Bruce Fields

    Andrey Ryabinin
     

23 Oct, 2015

1 commit


13 Oct, 2015

1 commit

  • Commit cb7323fffa85 ("lockd: create and use per-net NSM
    RPC clients on MON/UNMON requests") introduced per-net
    NSM RPC clients. Unfortunately this doesn't make any sense
    without per-net nsm_handle.

    E.g. the following scenario could happen
    Two hosts (X and Y) in different namespaces (A and B) share
    the same nsm struct.

    1. nsm_monitor(host_X) called => NSM rpc client created,
    nsm->sm_monitored bit set.
    2. nsm_mointor(host-Y) called => nsm->sm_monitored already set,
    we just exit. Thus in namespace B ln->nsm_clnt == NULL.
    3. host X destroyed => nsm->sm_count decremented to 1
    4. host Y destroyed => nsm_unmonitor() => nsm_mon_unmon() => NULL-ptr
    dereference of *ln->nsm_clnt

    So this could be fixed by making per-net nsm_handles list,
    instead of global. Thus different net namespaces will not be able
    share the same nsm_handle.

    Signed-off-by: Andrey Ryabinin
    Cc:
    Signed-off-by: J. Bruce Fields

    Andrey Ryabinin
     

13 Aug, 2015

1 commit


11 Aug, 2015

1 commit