02 Feb, 2008

40 commits

  • Fix nlm_block leak for the case of supplied blocking lock info.

    Signed-off-by: Oleg Drokin
    Signed-off-by: J. Bruce Fields

    Oleg Drokin
     
  • Document these checks a little better and inline, as suggested by Neil
    Brown (note both functions have two callers). Remove an obviously bogus
    check while we're there (checking whether unsigned value is negative).

    Signed-off-by: J. Bruce Fields
    Cc: Neil Brown

    J. Bruce Fields
     
  • Make an obvious simplification that removes a few lines and some
    unnecessary indentation; no change in behavior.

    Signed-off-by: J. Bruce Fields

    J. Bruce Fields
     
  • nfs@lists.sourceforge.net is being decommissioned.

    Cc: Trond Myklebust
    Signed-off-by: Andrew Morton
    Signed-off-by: J. Bruce Fields

    Neil Brown
     
  • For some reason we haven't been put()'ing the reference count here.

    Signed-off-by: J. Bruce Fields

    J. Bruce Fields
     
  • The server silently ignores attempts to set the uid and gid on create.
    Based on the comment, this appears to have been done to prevent some
    overly-clever IRIX client from causing itself problems.

    Perhaps we should remove that hack completely. For now, at least, it
    makes sense to allow root (when no_root_squash is set) to set uid and
    gid.

    While we're there, since nfsd_create and nfsd_create_v3 share the same
    logic, pull that out into a separate function. And spell out the
    individual modifications of ia_valid instead of doing them both at once
    inside a conditional.

    Thanks to Roger Willcocks for the bug report
    and original patch on which this is based.

    Signed-off-by: J. Bruce Fields

    J. Bruce Fields
     
  • Without the patch, there is a leakage of nlmblock structure refcount
    that holds a reference nlmfile structure, that holds a reference to
    struct file, when async GETFL is used (-EINPROGRESS return from
    file_ops->lock()), and also in some error cases.

    Fix up a style nit while we're here.

    Signed-off-by: Oleg Drokin
    Signed-off-by: J. Bruce Fields

    Oleg Drokin
     
  • This patch addresses a compatibility issue with a Linux NFS server and
    AIX NFS client.

    I have exported /export as fsid=0 with sec=krb5:krb5i
    I have mount --bind /home onto /export/home
    I have exported /export/home with sec=krb5i

    The AIX client mounts / -o sec=krb5:krb5i onto /mnt

    If I do an ls /mnt, the AIX client gets a permission error. Looking at
    the network traceIwe see a READDIR looking for attributes
    FATTR4_RDATTR_ERROR and FATTR4_MOUNTED_ON_FILEID. The response gives a
    NFS4ERR_WRONGSEC which the AIX client is not expecting.

    Since the AIX client is only asking for an attribute that is an
    attribute of the parent file system (pseudo root in my example), it
    seems reasonable that there should not be an error.

    In discussing this issue with Bruce Fields, I initially proposed
    ignoring the error in nfsd4_encode_dirent_fattr() if all that was being
    asked for was FATTR4_RDATTR_ERROR and FATTR4_MOUNTED_ON_FILEID, however,
    Bruce suggested that we avoid calling cross_mnt() if only these
    attributes are requested.

    The following patch implements bypassing cross_mnt() if only
    FATTR4_RDATTR_ERROR and FATTR4_MOUNTED_ON_FILEID are called. Since there
    is some complexity in the code in nfsd4_encode_fattr(), I didn't want to
    duplicate code (and introduce a maintenance nightmare), so I added a
    parameter to nfsd4_encode_fattr() that indicates whether it should
    ignore cross mounts and simply fill in the attribute using the passed in
    dentry as opposed to it's parent.

    Signed-off-by: Frank Filz
    Signed-off-by: J. Bruce Fields

    Frank Filz
     
  • The failure to return a stateowner from nfs4_preprocess_seqid_op() means
    in the case where a lock request is of a type incompatible with an open
    (due to, e.g., an application attempting a write lock on a file open for
    read), means that fs/nfsd/nfs4xdr.c:ENCODE_SEQID_OP_TAIL() never bumps
    the seqid as it should. The client, attempting to close the file
    afterwards, then gets an (incorrect) bad sequence id error. Worse, this
    prevents the open file from ever being closed, so we leak state.

    Thanks to Benny Halevy and Trond Myklebust for analysis, and to Steven
    Wilton for the report and extensive data-gathering.

    Cc: Benny Halevy
    Cc: Steven Wilton
    Cc: Trond Myklebust
    Signed-off-by: J. Bruce Fields

    J. Bruce Fields
     
  • In a number of places where we wish only to translate nlm_drop_reply to
    rpc_drop_reply errors we instead return early with rpc_drop_reply,
    skipping some important end-of-function cleanup.

    This results in reference count leaks when lockd is doing posix locking
    on GFS2.

    Signed-off-by: Oleg Drokin
    Signed-off-by: J. Bruce Fields

    Oleg Drokin
     
  • When the callback channel fails, we inform the client of that by
    returning a cb_path_down error the next time it tries to renew its
    lease.

    If we wait most of a lease period before deciding that a callback has
    failed and that the callback channel is down, then we decrease the
    chances that the client will find out in time to do anything about it.

    So, mark the channel down as soon as we recognize that an rpc has
    failed. However, continue trying to recall delegations anyway, in hopes
    it will come back up. This will prevent more delegations from being
    given out, and ensure cb_path_down is returned to renew calls earlier,
    while still making the best effort to deliver recalls of existing
    delegations.

    Also fix a couple comments and remove a dprink that doesn't seem likely
    to be useful.

    Signed-off-by: J. Bruce Fields

    J. Bruce Fields
     
  • Fix various minor style violations.

    Signed-off-by: J. Bruce Fields

    J. Bruce Fields
     
  • Declare this variable in the one function where it's used, and clean up
    some minor style problems.

    Signed-off-by: J. Bruce Fields

    J. Bruce Fields
     
  • Fix bizarre indentation.

    Signed-off-by: J. Bruce Fields

    J. Bruce Fields
     
  • We generate a unique cl_confirm for every new client; so if we've
    already checked that this cl_confirm agrees with the cl_confirm of
    unconf, then we already know that it does not agree with the cl_confirm
    of conf.

    Signed-off-by: J. Bruce Fields

    J. Bruce Fields
     
  • Again, the only way conf and unconf can have the same clientid is if
    they were created in the "probable callback update" case of setclientid,
    in which case we already know that the cl_verifier fields must agree.

    Signed-off-by: J. Bruce Fields

    J. Bruce Fields
     
  • If conf and unconf are both found in the lookup by cl_clientid, then
    they share the same cl_clientid. We always create a unique new
    cl_clientid field when creating a new client--the only exception is the
    "probable callback update" case in setclientid, where we copy the old
    cl_clientid from another clientid with the same name.

    Therefore two clients with the same cl_client field also always share
    the same cl_name field, and a couple of the checks here are redundant.

    Thanks to Simon Holm Thøgersen for a compile fix.

    Signed-off-by: J. Bruce Fields
    Cc: Simon Holm Thøgersen

    J. Bruce Fields
     
  • Using a counter instead of the nanoseconds value seems more likely to
    produce a unique cl_confirm.

    Signed-off-by: J. Bruce Fields

    J. Bruce Fields
     
  • We're supposed to generate a different cl_confirm verifier for each new
    client, so these to cl_confirm values should never be the same.

    Signed-off-by: J. Bruce Fields

    J. Bruce Fields
     
  • Most of these comments just summarize the code.

    The matching of code to the cases described in the RFC may still be
    useful, though; add specific section references to make that easier to
    follow. Also update references to the outdated RFC 3010.

    Signed-off-by: J. Bruce Fields

    J. Bruce Fields
     
  • While we're here, let's remove the redundant (and now wrong) pathname in
    the comment, and the #ifdef __KERNEL__'s.

    Acked-by: NeilBrown
    Signed-off-by: J. Bruce Fields

    J. Bruce Fields
     
  • This header is used only in a few places in fs/nfsd, so there seems to
    be little point to having it in include/. (Thanks to Robert Day for
    pointing this out.)

    Cc: Robert P. J. Day
    Acked-by: NeilBrown
    Signed-off-by: J. Bruce Fields

    J. Bruce Fields
     
  • Newer server features such as nfsv4 and gss depend on proc to work, so a
    failure to initialize the proc files they need should be treated as
    fatal.

    Thanks to Andrew Morton for style fix and compile fix in case where
    CONFIG_NFSD_V4 is undefined.

    Cc: Andrew Morton
    Acked-by: NeilBrown
    Signed-off-by: J. Bruce Fields

    J. Bruce Fields
     
  • Just some minor cleanup.

    Also I don't see much point in trying to register further proc entries
    if initial entries fail; so just stop trying in that case.

    Acked-by: NeilBrown
    Signed-off-by: J. Bruce Fields

    J. Bruce Fields
     
  • I assume the reason failure of creation was ignored here was just to
    continue support embedded systems that want nfsd but not proc.

    However, in cases where proc is supported it would be clearer to fail
    entirely than to come up with some features disabled.

    Acked-by: NeilBrown
    Signed-off-by: J. Bruce Fields

    J. Bruce Fields
     
  • The server depends on upcalls under /proc to support nfsv4 and gss.

    Acked-by: NeilBrown
    Signed-off-by: J. Bruce Fields

    J. Bruce Fields
     
  • There's really nothing much the caller can do if cache unregistration
    fails. And indeed, all any caller does in this case is print an error
    and continue. So just return void and move the printk's inside
    cache_unregister.

    Acked-by: NeilBrown
    Signed-off-by: J. Bruce Fields

    J. Bruce Fields
     
  • If the reply cache initialization fails due to a kmalloc failure,
    currently we try to soldier on with a reduced (or nonexistant) reply
    cache.

    Better to just fail immediately: the failure is then much easier to
    understand and debug, and it could save us complexity in some later
    code. (But actually, it doesn't help currently because the cache is
    also turned off in some odd failure cases; we should probably find a
    better way to handle those failure cases some day.)

    Fix some minor style problems while we're at it, and rename
    nfsd_cache_init() to remove the need for a comment describing it.

    Acked-by: NeilBrown
    Signed-off-by: J. Bruce Fields

    J. Bruce Fields
     
  • Handle the failure case here with something closer to the standard
    kernel style.

    Doesn't really matter for now, but I'd like to add a few more failure
    cases, and then this'll help.

    Acked-by: NeilBrown
    Signed-off-by: J. Bruce Fields

    J. Bruce Fields
     
  • We forgot to shut down the nfs4 state and idmapping code in this case.

    Acked-by: NeilBrown
    Signed-off-by: J. Bruce Fields

    J. Bruce Fields
     
  • The length "nbytes" passed into read_buf should never be negative, but
    we check only for too-large values of "nbytes", not for too-small
    values. Make nbytes unsigned, so it's clear that the former tests are
    sufficient. (Despite this read_buf() currently correctly returns an xdr
    error in the case of a negative length, thanks to an unsigned
    comparison with size_of() and bounds-checking in kmalloc(). This seems
    very fragile, though.)

    Signed-off-by: J. Bruce Fields

    J. Bruce Fields
     
  • The path here must be left over from some earlier draft; fix it. And do
    some more minor cleanup while we're there.

    Signed-off-by: J. Bruce Fields

    J. Bruce Fields
     
  • Clean up: For consistency, store the length of path name strings in nfsd
    argument structures as unsigned integers.

    Signed-off-by: Chuck Lever
    Acked-By: NeilBrown
    Signed-off-by: J. Bruce Fields

    Chuck Lever
     
  • Signed-off-by: Chuck Lever
    Acked-By: NeilBrown
    Signed-off-by: J. Bruce Fields

    Chuck Lever
     
  • Clean up: path name lengths are unsigned on the wire, negative lengths
    are not meaningful natively either.

    Signed-off-by: Chuck Lever
    Acked-By: NeilBrown
    Signed-off-by: J. Bruce Fields

    Chuck Lever
     
  • Clean up: adjust the sign of the length argument of nfsd_lookup and
    nfsd_lookup_dentry, for consistency with recent changes. NFSD version
    4 callers already pass an unsigned file name length.

    Signed-off-by: Chuck Lever
    Acked-By: NeilBrown
    Signed-off-by: J. Bruce Fields

    Chuck Lever
     
  • Clean up: For consistency, store the length of file name strings in nfsd
    argument structures as unsigned integers. This matches the XDR routines
    and client argument structures for the same operation types.

    Signed-off-by: Chuck Lever
    Acked-By: NeilBrown
    Signed-off-by: J. Bruce Fields

    Chuck Lever
     
  • Clean up: file name lengths are unsigned on the wire, negative lengths
    are not meaningful natively either.

    Signed-off-by: Chuck Lever
    Acked-By: NeilBrown
    Signed-off-by: J. Bruce Fields

    Chuck Lever
     
  • According to The Open Group's NLM specification, NLM callers are variable
    length strings. XDR variable length strings use an unsigned 32 bit length.
    And internally, negative string lengths are not meaningful for the Linux
    NLM implementation.

    Clean up: Make nlm_lock.len and nlm_reboot.len unsigned integers. This
    makes the sign of NLM string lengths consistent with the sign of xdr_netobj
    lengths.

    Signed-off-by: Chuck Lever
    Acked-By: NeilBrown
    Signed-off-by: J. Bruce Fields

    Chuck Lever
     
  • XDR strings, opaques, and net objects should all use unsigned lengths.
    To wit, RFC 4506 says:

    4.2. Unsigned Integer

    An XDR unsigned integer is a 32-bit datum that encodes a non-negative
    integer in the range [0,4294967295].

    ...

    4.11. String

    The standard defines a string of n (numbered 0 through n-1) ASCII
    bytes to be the number n encoded as an unsigned integer (as described
    above), and followed by the n bytes of the string.

    After this patch, xdr_decode_string_inplace now matches the other XDR
    string and array helpers that take a string length argument. See:

    xdr_encode_opaque_fixed, xdr_encode_opaque, xdr_encode_array

    Signed-off-by: Chuck Lever
    Acked-By: NeilBrown
    Signed-off-by: J. Bruce Fields

    Chuck Lever