13 Oct, 2016

1 commit

  • Remove the global file_list_lock to simplify cifs/smb3 locking and
    have spinlocks that more closely match the information they are
    protecting.

    Add new tcon->open_file_lock and file->file_info_lock spinlocks.
    Locks continue to follow a heirachy,
    cifs_socket --> cifs_ses --> cifs_tcon --> cifs_file
    where global tcp_ses_lock still protects socket and cifs_ses, while the
    the newer locks protect the lower level structure's information
    (tcon and cifs_file respectively).

    CC: Stable
    Signed-off-by: Steve French
    Signed-off-by: Pavel Shilovsky
    Reviewed-by: Aurelien Aptel
    Reviewed-by: Germano Percossi

    Steve French
     

15 Jan, 2016

1 commit


16 Apr, 2015

1 commit


08 Dec, 2014

1 commit

  • This patch converts custom dumper to use native print_hex_dump() instead. The
    cifs_dump_mem() will have an offsets per each line which differs it from the
    original code.

    In the dump_smb() we may use native print_hex_dump() as well. It will show
    slightly different output in ASCII part when character is unprintable,
    otherwise it keeps same structure.

    Signed-off-by: Andy Shevchenko
    Signed-off-by: Steve French

    Andy Shevchenko
     

11 Aug, 2014

1 commit

  • Commit 743162013d40 ("sched: Remove proliferation of wait_on_bit() action
    functions") has removed the call to cifs_oplock_break_wait, making this
    function unused; remove it.

    This fixes the following compilation warning:

    fs/cifs/misc.c:578:1: warning: ‘cifs_oplock_break_wait’ defined but not used [-Wunused-function]

    Signed-off-by: Vincent Stehlé
    Cc: Steve French
    Signed-off-by: Steve French

    Vincent Stehlé
     

10 Aug, 2014

1 commit

  • 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
     

03 Aug, 2014

1 commit


01 Aug, 2014

1 commit


16 Jul, 2014

1 commit

  • The current "wait_on_bit" interface requires an 'action'
    function to be provided which does the actual waiting.
    There are over 20 such functions, many of them identical.
    Most cases can be satisfied by one of just two functions, one
    which uses io_schedule() and one which just uses schedule().

    So:
    Rename wait_on_bit and wait_on_bit_lock to
    wait_on_bit_action and wait_on_bit_lock_action
    to make it explicit that they need an action function.

    Introduce new wait_on_bit{,_lock} and wait_on_bit{,_lock}_io
    which are *not* given an action function but implicitly use
    a standard one.
    The decision to error-out if a signal is pending is now made
    based on the 'mode' argument rather than being encoded in the action
    function.

    All instances of the old wait_on_bit and wait_on_bit_lock which
    can use the new version have been changed accordingly and their
    action functions have been discarded.
    wait_on_bit{_lock} does not return any specific error code in the
    event of a signal so the caller must check for non-zero and
    interpolate their own error code as appropriate.

    The wait_on_bit() call in __fscache_wait_on_invalidate() was
    ambiguous as it specified TASK_UNINTERRUPTIBLE but used
    fscache_wait_bit_interruptible as an action function.
    David Howells confirms this should be uniformly
    "uninterruptible"

    The main remaining user of wait_on_bit{,_lock}_action is NFS
    which needs to use a freezer-aware schedule() call.

    A comment in fs/gfs2/glock.c notes that having multiple 'action'
    functions is useful as they display differently in the 'wchan'
    field of 'ps'. (and /proc/$PID/wchan).
    As the new bit_wait{,_io} functions are tagged "__sched", they
    will not show up at all, but something higher in the stack. So
    the distinction will still be visible, only with different
    function names (gds2_glock_wait versus gfs2_glock_dq_wait in the
    gfs2/glock.c case).

    Since first version of this patch (against 3.15) two new action
    functions appeared, on in NFS and one in CIFS. CIFS also now
    uses an action function that makes the same freezer aware
    schedule call as NFS.

    Signed-off-by: NeilBrown
    Acked-by: David Howells (fscache, keys)
    Acked-by: Steven Whitehouse (gfs2)
    Acked-by: Peter Zijlstra
    Cc: Oleg Nesterov
    Cc: Steve French
    Cc: Linus Torvalds
    Link: http://lkml.kernel.org/r/20140707051603.28027.72349.stgit@notabene.brown
    Signed-off-by: Ingo Molnar

    NeilBrown
     

17 Apr, 2014

1 commit

  • Problem reported in Red Hat bz 1040329 for strict writes where we cache
    only when we hold oplock and write direct to the server when we don't.

    When we receive an oplock break, we first change the oplock value for
    the inode in cifsInodeInfo->oplock to indicate that we no longer hold
    the oplock before we enqueue a task to flush changes to the backing
    device. Once we have completed flushing the changes, we return the
    oplock to the server.

    There are 2 ways here where we can have data corruption
    1) While we flush changes to the backing device as part of the oplock
    break, we can have processes write to the file. These writes check for
    the oplock, find none and attempt to write directly to the server.
    These direct writes made while we are flushing from cache could be
    overwritten by data being flushed from the cache causing data
    corruption.
    2) While a thread runs in cifs_strict_writev, the machine could receive
    and process an oplock break after the thread has checked the oplock and
    found that it allows us to cache and before we have made changes to the
    cache. In that case, we end up with a dirty page in cache when we
    shouldn't have any. This will be flushed later and will overwrite all
    subsequent writes to the part of the file represented by this page.

    Before making any writes to the server, we need to confirm that we are
    not in the process of flushing data to the server and if we are, we
    should wait until the process is complete before we attempt the write.
    We should also wait for existing writes to complete before we process
    an oplock break request which changes oplock values.

    We add a version specific downgrade_oplock() operation to allow for
    differences in the oplock values set for the different smb versions.

    Cc: stable@vger.kernel.org
    Signed-off-by: Sachin Prabhu
    Reviewed-by: Jeff Layton
    Reviewed-by: Pavel Shilovsky
    Signed-off-by: Steve French

    Sachin Prabhu
     

03 Nov, 2013

1 commit

  • The multiplex identifier (MID) in the SMB header is only
    ever used by the client, in conjunction with PID, to match responses
    from the server. As such, the endianess of the MID is not important.
    However, When tracing packet sequences on the wire, protocol analyzers
    such as wireshark display MID as little endian. It is much more informative
    for the on-the-wire MID sequences to match debug information emitted by the
    CIFS driver. Therefore, one should write and read MID in the SMB header
    assuming it is always little endian.

    Observed from wireshark during the protocol negotiation
    and session setup:

    Multiplex ID: 256
    Multiplex ID: 256
    Multiplex ID: 512
    Multiplex ID: 512
    Multiplex ID: 768
    Multiplex ID: 768

    After this patch on-the-wire MID values begin at 1 and increase monotonically.

    Introduce get_next_mid64() for the internal consumers that use the full 64 bit
    multiplex identifier.

    Introduce the helpers get_mid() and compare_mid() to make the endian
    translation clear.

    Reviewed-by: Jeff Layton
    Signed-off-by: Tim Gardner
    Signed-off-by: Steve French

    Tim Gardner
     

28 Oct, 2013

1 commit


09 Sep, 2013

2 commits

  • that prepare the code to handle different types of SMB2 leases.

    Signed-off-by: Pavel Shilovsky
    Signed-off-by: Steve French

    Pavel Shilovsky
     
  • Move the post (successful) session setup code to respective dialect routines.

    For smb1, session key is per smb connection.
    For smb2/smb3, session key is per smb session.

    If client and server do not require signing, free session key for smb1/2/3.

    If client and server require signing
    smb1 - Copy (kmemdup) session key for the first session to connection.
    Free session key of that and subsequent sessions on this connection.
    smb2 - For every session, keep the session key and free it when the
    session is being shutdown.
    smb3 - For every session, generate the smb3 signing key using the session key
    and then free the session key.

    There are two unrelated line formatting changes as well.

    Reviewed-by: Jeff Layton
    Signed-off-by: Shirish Pargaonkar
    Signed-off-by: Steve French

    Shirish Pargaonkar
     

24 Jun, 2013

1 commit

  • Currently, we determine this according to flags in the sec_mode, flags
    in the global_secflags and via other methods. That makes the semantics
    very hard to follow and there are corner cases where we don't handle
    this correctly.

    Add a new bool to the TCP_Server_Info that acts as a simple flag to tell
    us whether signing is enabled on this connection or not, and fix up the
    places that need to determine this to use that flag.

    This is a bit weird for the SMB2 case, where signing is per-session.
    SMB2 needs work in this area already though. The existing SMB2 code has
    similar logic to what we're using here, so there should be no real
    change in behavior. These changes should make it easier to implement
    per-session signing in the future though.

    Signed-off-by: Jeff Layton
    Reviewed-by: Pavel Shilovsky
    Signed-off-by: Steve French

    Jeff Layton
     

05 May, 2013

1 commit

  • It's not obvious from reading the macro names that these macros
    are for debugging. Convert the names to a single more typical
    kernel style cifs_dbg macro.

    cERROR(1, ...) -> cifs_dbg(VFS, ...)
    cFYI(1, ...) -> cifs_dbg(FYI, ...)
    cFYI(DBG2, ...) -> cifs_dbg(NOISY, ...)

    Move the terminating format newline from the macro to the call site.

    Add CONFIG_CIFS_DEBUG function cifs_vfs_err to emit the
    "CIFS VFS: " prefix for VFS messages.

    Size is reduced ~ 1% when CONFIG_CIFS_DEBUG is set (default y)

    $ size fs/cifs/cifs.ko*
    text data bss dec hex filename
    265245 2525 132 267902 4167e fs/cifs/cifs.ko.new
    268359 2525 132 271016 422a8 fs/cifs/cifs.ko.old

    Other miscellaneous changes around these conversions:

    o Miscellaneous typo fixes
    o Add terminating \n's to almost all formats and remove them
    from the macros to be more kernel style like. A few formats
    previously had defective \n's
    o Remove unnecessary OOM messages as kmalloc() calls dump_stack
    o Coalesce formats to make grep easier,
    added missing spaces when coalescing formats
    o Use %s, __func__ instead of embedded function name
    o Removed unnecessary "cifs: " prefixes
    o Convert kzalloc with multiply to kcalloc
    o Remove unused cifswarn macro

    Signed-off-by: Joe Perches
    Signed-off-by: Jeff Layton
    Signed-off-by: Steve French

    Joe Perches
     

13 Feb, 2013

1 commit


25 Sep, 2012

2 commits

  • Now we walk though cifsFileInfo's list for every incoming lease
    break and look for an equivalent there. That approach misses lease
    breaks that come just after an open response - we don't have time
    to populate new cifsFileInfo structure to the list. Fix this by
    adding new list of pending opens and look for a lease there if we
    didn't find it in the list of cifsFileInfo structures.

    Signed-off-by: Pavel Shilovsky
    Signed-off-by: Steve French

    Pavel Shilovsky
     
  • This is help us to extend the code for future protocols that can use
    another fid mechanism (as SMB2 that has it divided into two parts:
    persistent and violatile).

    Also rename variables and refactor the code around the changes.

    Reviewed-by: Jeff Layton
    Signed-off-by: Pavel Shilovsky
    Signed-off-by: Steve French

    Pavel Shilovsky
     

25 Jul, 2012

2 commits


24 Jul, 2012

1 commit


02 Jun, 2012

1 commit


23 May, 2012

1 commit


17 May, 2012

1 commit


24 Mar, 2012

5 commits


22 Mar, 2012

1 commit


13 Oct, 2011

2 commits

  • Add mount options backupuid and backugid.

    It allows an authenticated user to access files with the intent to back them
    up including their ACLs, who may not have access permission but has
    "Backup files and directories user right" on them (by virtue of being part
    of the built-in group Backup Operators.

    When mount options backupuid is specified, cifs client restricts the
    use of backup intents to the user whose effective user id is specified
    along with the mount option.

    When mount options backupgid is specified, cifs client restricts the
    use of backup intents to the users whose effective user id belongs to the
    group id specified along with the mount option.

    If an authenticated user is not part of the built-in group Backup Operators
    at the server, access to such files is denied, even if allowed by the client.

    Signed-off-by: Shirish Pargaonkar
    Reviewed-by: Jeff Layton
    Signed-off-by: Steve French

    Shirish Pargaonkar
     
  • The variable names in this function are so ambiguous that it's very
    difficult to know what it's doing. Rename them to make it a bit more
    clear.

    Also, remove a redundant length check. cifsd checks to make sure that
    the rfclen isn't larger than the maximum frame size when it does the
    receive.

    Finally, change checkSMB to return a real error code (-EIO) when
    it finds an error. That will help simplify some coming changes in the
    callers.

    Signed-off-by: Jeff Layton
    Signed-off-by: Steve French

    Jeff Layton
     

01 Aug, 2011

1 commit

  • Currently, we take a sb->s_active reference and a cifsFileInfo reference
    when an oplock break workqueue job is queued. This is unnecessary and
    more complicated than it needs to be. Also as Al points out,
    deactivate_super has non-trivial locking implications so it's best to
    avoid that if we can.

    Instead, just cancel any pending oplock breaks for this filehandle
    synchronously in cifsFileInfo_put after taking it off the lists.
    That should ensure that this job doesn't outlive the structures it
    depends on.

    Reported-by: Al Viro
    Signed-off-by: Jeff Layton
    Signed-off-by: Steve French

    Jeff Layton
     

27 May, 2011

1 commit


19 May, 2011

2 commits

  • This is the same patch as originally posted, just with some merge
    conflicts fixed up...

    Currently, the ByteCount is usually converted to host-endian on receive.
    This is confusing however, as we need to keep two sets of routines for
    accessing it, and keep track of when to use each routine. Munging
    received packets like this also limits when the signature can be
    calulated.

    Simplify the code by keeping the received ByteCount in little-endian
    format. This allows us to eliminate a set of routines for accessing it
    and we can now drop the *_le suffixes from the accessor functions since
    that's now implied.

    While we're at it, switch all of the places that read the ByteCount
    directly to use the get_bcc inline which should also clean up some
    unaligned accesses.

    Signed-off-by: Jeff Layton
    Signed-off-by: Steve French

    Jeff Layton
     
  • There is one big endian field in the cifs protocol, the RFC1001
    length, which cifs code (unlike in the smb2 code) had been handling as
    u32 until the last possible moment, when it was converted to be32 (its
    native form) before sending on the wire. To remove the last sparse
    endian warning, and to make this consistent with the smb2
    implementation (which always treats the fields in their
    native size and endianness), convert all uses of smb_buf_length to
    be32.

    This version incorporates Christoph's comment about
    using be32_add_cpu, and fixes a typo in the second
    version of the patch.

    Signed-off-by: Steve French
    Signed-off-by: Pavel Shilovsky
    Signed-off-by: Steve French

    Steve French
     

12 Apr, 2011

2 commits


01 Feb, 2011

1 commit

  • The cERROR message in checkSMB when the calculated length doesn't match
    the RFC1001 length is incorrect in many cases. It always says that the
    RFC1001 length is bigger than the SMB, even when it's actually the
    reverse.

    Fix the error message to say the reverse of what it does now when the
    SMB length goes beyond the end of the received data. Also, clarify the
    error message when the RFC length is too big. Finally, clarify the
    comments to show that the 512 byte limit on extra data at the end of
    the packet is arbitrary.

    Signed-off-by: Jeff Layton
    Signed-off-by: Steve French

    Jeff Layton