14 Sep, 2011

1 commit

  • For IPv6 local address, lockd can not callback to client for
    missing scope id when binding address at inet6_bind:

    324 if (addr_type & IPV6_ADDR_LINKLOCAL) {
    325 if (addr_len >= sizeof(struct sockaddr_in6) &&
    326 addr->sin6_scope_id) {
    327 /* Override any existing binding, if another one
    328 * is supplied by user.
    329 */
    330 sk->sk_bound_dev_if = addr->sin6_scope_id;
    331 }
    332
    333 /* Binding to link-local address requires an interface */
    334 if (!sk->sk_bound_dev_if) {
    335 err = -EINVAL;
    336 goto out_unlock;
    337 }

    Replacing svc_addr_u by sockaddr_storage, let rqstp->rq_daddr contains more info
    besides address.

    Reviewed-by: Jeff Layton
    Reviewed-by: Chuck Lever
    Signed-off-by: Mi Jinlong
    Signed-off-by: J. Bruce Fields

    Mi Jinlong
     

26 Jan, 2011

1 commit

  • Nick Bowler reports:

    > We were just having some NFS server troubles, and my client machine
    > running 2.6.38-rc1+ (specifically, commit 2b1caf6ed7b888c95) crashed
    > hard (syslog output appended to this mail).
    >
    > I'm not sure what the exact timeline was or how to reproduce this,
    > but the server was rebooted during all this. Since I've never seen
    > this happen before, it is possibly a regression from previous kernel
    > releases. However, I recently updated my nfs-utils (on the client) to
    > version 1.2.3, so that might be related as well.

    [ BUG output redacted ]

    When done searching, the for_each_host loop in next_host_state() falls
    through and returns the final host on the host chain without bumping
    it's reference count.

    Since the host's ref count is only one at that point, releasing the
    host in nlm_host_rebooted() attempts to destroy the host prematurely,
    and therefore hits a BUG().

    Likely, the original intent of the for_each_host behavior in
    next_host_state() was to handle the case when the host chain is empty.
    Searching the chain and finding no suitable host to return needs to be
    handled as well.

    Defensively restructure next_host_state() always to return NULL when
    the loop falls through.

    Introduced by commit b10e30f6 "lockd: reorganize nlm_host_rebooted".

    Cc: J. Bruce Fields
    Signed-off-by: Chuck Lever
    Signed-off-by: Trond Myklebust

    Chuck Lever
     

05 Jan, 2011

1 commit


17 Dec, 2010

10 commits

  • Clean up.

    The contents of the src_sap field is not used in nlm_alloc_host().

    Signed-off-by: Chuck Lever
    Signed-off-by: Trond Myklebust

    Chuck Lever
     
  • Clean up.

    Remove the now unused helper nlm_lookup_host().

    Signed-off-by: Chuck Lever
    Signed-off-by: Trond Myklebust

    Chuck Lever
     
  • Clean up.

    Signed-off-by: Chuck Lever
    Signed-off-by: Trond Myklebust

    Chuck Lever
     
  • Clean up.

    nlm_hosts now contains only server-side entries. Rename it to match
    convention of client side cache.

    Signed-off-by: Chuck Lever
    Signed-off-by: Trond Myklebust

    Chuck Lever
     
  • Clean up.

    Change nlmsvc_lookup_host() to be purpose-built for server-side
    nlm_host management. This replaces the generic nlm_lookup_host()
    helper function, just like on the client side. The lookup logic is
    specialized for server host lookups.

    The server side cache also gets its own specialized equivalent of the
    nlm_release_host() function.

    Signed-off-by: Chuck Lever
    Signed-off-by: Trond Myklebust

    Chuck Lever
     
  • NFS clients don't need the garbage collection processing that is
    performed on nlm_host structures. The client picks up an nlm_host at
    mount time and holds a reference to it until the file system is
    unmounted.

    Servers, on the other hand, don't have a precise way to tell when an
    nlm_host is no longer being used, so zero refcount nlm_host entries
    are left to expire in the cache after a time.

    Basically there's nothing holding a reference to an nlm_host between
    individual server-side NLM requests, but we can't afford the expense
    of recreating them for every new NLM request from a client. The
    nlm_host cache adds some lifetime hysteresis to entries in the cache
    so the next time a particular nlm_host is needed, it's likely to be
    discovered by a lookup rather than created from whole cloth.

    With the new implementation, client nlm_host cache items are no longer
    garbage collected, and are destroyed directly by a new release
    function specialized for client entries, nlmclnt_release_host(). They
    are cached in their own data structure, and have their own lookup
    logic, simplified and specialized for client nlm_host entries.

    However, the client nlm_host cache still shares reboot recovery logic
    with the server nlm_host cache. The NSM "peer rebooted" downcall for
    clients and servers still come through the same RPC call. This is a
    legacy formal API that would be difficult to alter, and besides, the
    user space NSM implementation can't tell the difference between peers
    that are clients or servers.

    For this reason, the client cache continues to share the
    nlm_host_mutex (and reboot recovery logic) with the server cache.

    Signed-off-by: Chuck Lever
    Signed-off-by: Trond Myklebust

    Chuck Lever
     
  • Refactor the tail of nlm_gc_hosts() into nlm_destroy_host() so that
    this logic can be used separately from garbage collection.

    Rename it _locked() to document that it must be called with the hosts
    cache mutex held.

    Signed-off-by: Chuck Lever
    Signed-off-by: Trond Myklebust

    Chuck Lever
     
  • Refactor nlm_host allocation and initialization into a separate
    function. This will be the common piece of server and client nlm_host
    lookup logic after the nlm_host cache is split.

    Small change: use kmalloc() instead of kzalloc(), as we're overwriting
    almost all fields in the new nlm_host struct with non-zero values
    immediately after it is allocated. An added benefit is we now have an
    explicit reference to each field name where it is initialized (for all
    you cscope fans out there).

    Signed-off-by: Chuck Lever
    Signed-off-by: Trond Myklebust

    Chuck Lever
     
  • Minor reorganization; no change in behavior. This will save some
    duplicated code after we split the client and server host caches.

    Signed-off-by: J. Bruce Fields
    [ cel: Forward-ported to 2.6.37 ]
    Signed-off-by: Chuck Lever
    Signed-off-by: Trond Myklebust

    J. Bruce Fields
     
  • We've got a lot of loops like this, and I find them a little easier to
    read with the macros. More such loops are coming.

    Signed-off-by: J. Bruce Fields
    [ cel: Forward-ported to 2.6.37 ]
    Signed-off-by: Chuck Lever
    Signed-off-by: Trond Myklebust

    J. Bruce Fields
     

16 Nov, 2010

1 commit

  • Nick Bowler reports:
    There are no unusual messages on the client... but I just logged into
    the server and I see lots of messages of the following form:

    nfsd: request from insecure port (192.168.8.199:35766)!
    nfsd: request from insecure port (192.168.8.199:35766)!
    nfsd: request from insecure port (192.168.8.199:35766)!
    nfsd: request from insecure port (192.168.8.199:35766)!
    nfsd: request from insecure port (192.168.8.199:35766)!

    Bisected to commit 9247685088398cf21bcb513bd2832b4cd42516c4 (SUNRPC:
    Properly initialize sock_xprt.srcaddr in all cases)

    Apparently, removing the 'transport->srcaddr.ss_family = family' from
    xs_create_sock() triggers this due to nlmclnt_lookup_host() incorrectly
    initialising the srcaddr family to AF_UNSPEC.

    Reported-by: Nick Bowler
    Signed-off-by: Trond Myklebust

    Trond Myklebust
     

02 Oct, 2010

1 commit


09 Feb, 2010

1 commit


21 Aug, 2009

1 commit


10 Aug, 2009

1 commit


07 Jan, 2009

11 commits

  • Clean up: The include/linux/lockd/sm_inter.h header is nearly empty
    now. Remove it.

    Signed-off-by: Chuck Lever
    Signed-off-by: J. Bruce Fields

    Chuck Lever
     
  • Clean up: nsm_find() now has only one caller, and that caller
    unconditionally sets the @create argument. Thus the @create
    argument is no longer needed.

    Since nsm_find() now has a more specific purpose, pick a more
    appropriate name for it.

    Signed-off-by: Chuck Lever
    Signed-off-by: J. Bruce Fields

    Chuck Lever
     
  • Invoke the newly introduced nsm_reboot_lookup() function in
    nlm_host_rebooted() instead of nsm_find().

    This introduces just one behavioral change: debugging messages
    produced during reboot notification will now appear when the
    NLMDBG_MONITOR flag is set, but not when the NLMDBG_HOSTCACHE flag
    is set.

    Signed-off-by: Chuck Lever
    Signed-off-by: J. Bruce Fields

    Chuck Lever
     
  • The NLM XDR decoders for the NLMPROC_SM_NOTIFY procedure should treat
    their "priv" argument truly as an opaque, as defined by the protocol,
    and let the upper layers figure out what is in it.

    This will make it easier to modify the contents and interpretation of
    the "priv" argument, and keep knowledge about what's in "priv" local
    to fs/lockd/mon.c.

    For now, the NLM and NSM implementations should behave exactly as they
    did before.

    The formation of the address of the rebooted host in
    nlm_host_rebooted() may look a little strange, but it is the inverse
    of how nsm_init_private() forms the private cookie. Plus, it's
    going away soon anyway.

    Signed-off-by: Chuck Lever
    Signed-off-by: J. Bruce Fields

    Chuck Lever
     
  • Pass the nlm_reboot data structure directly from the NLMPROC_SM_NOTIFY
    XDR decoders to nlm_host_rebooted(). This eliminates some packing and
    unpacking of the NLMPROC_SM_NOTIFY results, and prepares for passing
    these results, including the "priv" cookie, directly to a lookup
    routine in fs/lockd/mon.c.

    This patch changes code organization but should not cause any
    behavioral change.

    Signed-off-by: Chuck Lever
    Signed-off-by: J. Bruce Fields

    Chuck Lever
     
  • The nsm_find() function sets up fresh nsm_handle entries. This is
    where we will store the "priv" cookie used to lookup nsm_handles during
    reboot recovery. The cookie will be constructed when nsm_find()
    creates a new nsm_handle.

    As much as possible, I would like to keep everything that handles a
    "priv" cookie in fs/lockd/mon.c so that all the smarts are in one
    source file. That organization should make it pretty simple to see how
    all this works.

    To me, it makes more sense than the current arrangement to keep
    nsm_find() with nsm_monitor() and nsm_unmonitor().

    So, start reorganizing by moving nsm_find() into fs/lockd/mon.c. The
    nsm_release() function comes along too, since it shares the nsm_lock
    global variable.

    Signed-off-by: Chuck Lever
    Signed-off-by: J. Bruce Fields

    Chuck Lever
     
  • The nsm_handle's reference count is bumped in nlm_lookup_host(). It
    should be decremented in nlm_destroy_host() to make it easier to see
    the balance of these two operations.

    Move the nsm_release() call to fs/lockd/host.c.

    The h_nsmhandle pointer is set in nlm_lookup_host(), and never cleared.
    The nlm_destroy_host() function is never called for the same nlm_host
    twice, so h_nsmhandle won't ever be NULL when nsm_unmonitor() is
    called.

    All references to the nlm_host are gone before it is freed. We can
    skip making h_nsmhandle NULL just before the nlm_host is deallocated.

    It's also likely we can remove the h_nsmhandle NULL check in
    nlmsvc_is_client() as well, but we can do that later when rearchitect-
    ing the nlm_host cache.

    Signed-off-by: Chuck Lever
    Signed-off-by: J. Bruce Fields

    Chuck Lever
     
  • Clean up: introduce a helper function to generate IPv4 addresses using
    the same style as the IPv6 helper function we just added.

    Signed-off-by: Chuck Lever
    Signed-off-by: J. Bruce Fields

    Chuck Lever
     
  • Scope ID support is needed since the kernel's NSM implementation is
    about to use these displayed addresses as a mon_name in some cases.

    When nsm_use_hostnames is zero, without scope ID support NSM will fail
    to handle peers that contact us via a link-local address. Link-local
    addresses do not work without an interface ID, which is stored in the
    sockaddr's sin6_scope_id field.

    Signed-off-by: Chuck Lever
    Signed-off-by: J. Bruce Fields

    Chuck Lever
     
  • AF_UNSPEC support is no longer needed in nlm_display_address() now
    that a presentation address is no longer generated for the h_srcaddr
    field.

    Signed-off-by: Chuck Lever
    Signed-off-by: J. Bruce Fields

    Chuck Lever
     
  • The h_name field in struct nlm_host is a just copy of
    h_nsmhandle->sm_name. Likewise, the contents of the h_addrbuf field
    should be identical to the sm_addrbuf field.

    The h_srcaddrbuf field is used only in one place for debugging. We can
    live without this until we get %pI formatting for printk().

    Currently these buffers are 48 bytes, but we need to support scope IDs
    in IPv6 presentation addresses, which means making the buffers even
    larger. Instead, let's find ways to eliminate them to save space.

    Signed-off-by: Chuck Lever
    Signed-off-by: J. Bruce Fields

    Chuck Lever
     

31 Dec, 2008

1 commit


24 Dec, 2008

1 commit

  • If the admin has specified the "noresvport" option for an NFS mount
    point, the kernel's NFS client uses an unprivileged source port for
    the main NFS transport. The kernel's lockd client should use an
    unprivileged port in this case as well.

    Signed-off-by: Chuck Lever
    Signed-off-by: Trond Myklebust

    Chuck Lever
     

16 Dec, 2008

1 commit


25 Nov, 2008

1 commit

  • Since commit c98451bd, the loop in nlm_lookup_host() unconditionally
    compares the host's h_srcaddr field to the incoming source address.
    For client-side nlm_host entries, both are always AF_UNSPEC, so this
    check is unnecessary.

    Since commit 781b61a6, which added support for AF_INET6 addresses to
    nlm_cmp_addr(), nlm_cmp_addr() now returns FALSE for AF_UNSPEC
    addresses, which causes nlm_lookup_host() to create a fresh nlm_host
    entry every time it is called on the client.

    These extra entries will eventually expire once the server is
    unmounted, so the impact of this regression, introduced with lockd
    IPv6 support in 2.6.28, should be minor.

    We could fix this by adding an arm in nlm_cmp_addr() for AF_UNSPEC
    addresses, but really, nlm_lookup_host() shouldn't be matching on the
    srcaddr field for client-side nlm_host lookups.

    Signed-off-by: Chuck Lever
    Signed-off-by: J. Bruce Fields

    Chuck Lever
     

31 Oct, 2008

1 commit


30 Oct, 2008

1 commit


29 Oct, 2008

1 commit

  • The iscsi_ibft.c changes are almost certainly a bugfix as the
    pointer 'ip' is a u8 *, so they never print the last 8 bytes
    of the IPv6 address, and the eight bytes they do print have
    a zero byte with them in each 16-bit word.

    Other than that, this should cause no difference in functionality.

    Signed-off-by: Harvey Harrison
    Signed-off-by: David S. Miller

    Harvey Harrison
     

04 Oct, 2008

4 commits