[SCM] Samba Shared Repository - branch master updated

Stefan Metzmacher metze at samba.org
Mon Jun 18 09:47:02 UTC 2018


The branch, master has been updated
       via  721fbbf smbd: remove unused smbd_server_connection->ev_ctx
       via  894e500 smbd: add an effective {smb,smbd_smb2}_request->ev_ctx that holds the event context used for the request processing
       via  f2df8be smbd: add an effective connection_struct->user_ev_ctx that holds the event context used for the current user
       via  c835ffa smbd: use sconn->root_ev_ctx for smbd_sig_{term,hup}_handler()
       via  182991c smbd: use sconn->root_ev_ctx for brl_timeout_fn()
       via  1469382 smbd: add smbd_server_connection->{root,guest}_ev_ctx pointer
       via  f5f9b71 smbd: use raw_ev_ctx to clear the MSG_SMB_CONF_UPDATED registration
       via  dc517b2 smbd: explain that/why we use the raw tevent_context for linux_oplock_signal_handler()
       via  1d5210b smbd: explain that/why we use the raw tevent_context for do_break_to_none()
       via  e73eaa3 smbd: explain that/why we use the raw tevent_context for oplock_timeout_handler()
       via  52f098d smbd: explain that/why we use the raw tevent_context for lease_timeout_handler()
       via  7cfafaf smbd: explain that/why we use the raw tevent_context for update_write_time_handler()
       via  b0af571 vfs_glusterfs: explain that/why we use the raw tevent_context in init_gluster_aio()
       via  6114f95 smbd: add smbd_server_connection->raw_ev_ctx pointer
       via  c059f0a smbd: use req->xconn->client->raw_ev_ctx for schedule_deferred_open_message_smb()
       via  4d5d8d6 s3:smb2_server: use req->xconn->client->raw_ev_ctx for smbd_smb2_request_dispatch_immediate()
       via  051c321 s3:smb2_server: use req->xconn->client->raw_ev_ctx for smbd_smb2_request_pending_timer()
       via  934b375 smbd: remove unused tevent_context argument from notify_init
       via  d2adceb smbd: replace xconn->msg_ctx with xconn->client->msg_ctx
       via  d39f6ce smbd: replace xconn->ev_ctx with xconn->client->raw_ev_ctx
       via  19119a5 smbd: rename smbXsrv_client->ev_ctx into smbXsrv_client->raw_ev_ctx
       via  db83a8f vfs_default: maintain vfswrap_offload_write_state->{src_ev,dst_ev}
       via  506c9b3 vfs_default: make use of change_to_user_by_fsp() in order to switch between src and dst fsp
       via  2d75da9 vfs_btrfs: make use of become_user_by_fsp() in order to switch between src and dst fsp
       via  e4fb4c1 smbd: add {become,change_to}_user_by_fsp() helper functions
       via  4512b91 vfs_btrfs: don't keep state->subreq in btrfs_offload_write_send/recv()
       via  2317316 vfs_btrfs: update s/btrfs_cc_state/btrfs_offload_write_state/ s/cc_state/state/
       via  5ac91e4 vfs_btrfs: remove unused checks which are already caught by vfs_offload_token_check_handles()
       via  4af45b8 vfs_default: remove unused checks which are already caught by vfs_offload_token_check_handles()
       via  3194999 smbd: avoid calling set_current_user_info() twice with .need_tcon (SMB2)
       via  60dbaa4 smbd: avoid calling set_current_user_info() twice with AS_USER (SMB1)
       via  ff7efaf smbd: remove unused set_current_service()
       via  4a97448 smbd: let switch_message() only call chdir_current_service() for SMBtdis/SMBexit
       via  d1c8057 smbd: call chdir_current_service() in change_to_user_internal() and pop_conn_ctx()
       via  b27d885 smbd: remove set_current_service() from smbd_smb2_request_check_tcon()
       via  03f69e8 smbd: remove set_current_service() from defer_rename_done()
       via  58f4bbc smbd: call chdir_current_service() directly in smbXsrv_tcon_disconnect()
       via  1b86df9 smbd: remove useless set_current_service(NULL,0,True) from reload_services()
       via  a61d0aa smbd: use conn->lastused_count++ directly in process_blocking_lock_queue()
       via  f407a86 smbd: let create_conn_struct_as_root() fill in conn->origpath
       via  0e2786a smbd: make it possible to call vfs_ChDir(conn, conn->cwd_fname);
       via  ffe1918 smbd: call set_current_case_sensitive() before change_to_user() in switch_message()
       via  0186ff2 smbd: remember that the tcon completely setup connection_struct
       via  5472171 smbd: make it explicit that make_connection_snum() returns NT_STATUS_OK on success
       via  8cfe36e smbd: call set_current_user_info() in change_to_user_internal() and pop_conn_ctx()
       via  91a3796 smbd: move current_user caching to change_to_user_internal()
       via  35a12e7 smbd: simplify the logic in change_to_user()
       via  e469d6c smbd: let check_user_ok() construct ent->session_info in one coherent block
       via  0e7456d smbd: call set_current_case_sensitive() before chdir_current_service()
       via  8e81090 smbd: split out set_current_case_sensitive() and chdir_current_service() functions
       via  71d5809 smbd: remove xconn->client->last_session_id based set_current_user_info() caching
       via  df5e459 s3:lib: add caching to set_current_user_info()
      from  5d4f229 s4-dsdb: fix the build of audit_util.c

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 721fbbfa7001b2788602106101f0407483894322
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 22 10:54:41 2018 +0100

    smbd: remove unused smbd_server_connection->ev_ctx
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>
    
    Autobuild-User(master): Stefan Metzmacher <metze at samba.org>
    Autobuild-Date(master): Mon Jun 18 11:46:36 CEST 2018 on sn-devel-144

commit 894e5001c747ce765dad5517778dda55d7d1f4d9
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 22 10:54:41 2018 +0100

    smbd: add an effective {smb,smbd_smb2}_request->ev_ctx that holds the event context used for the request processing
    
    In future this will an impersonation wrapper tevent_context based on the
    user session.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit f2df8be16be9dccd3d10ec060f1efbe5007a28c6
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 22 10:54:41 2018 +0100

    smbd: add an effective connection_struct->user_ev_ctx that holds the event context used for the current user
    
    This will be filled with an impersonation wrapper in the next commits.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit c835ffa72ddfd2431d22909148913b50f0d829d1
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 22 10:54:41 2018 +0100

    smbd: use sconn->root_ev_ctx for smbd_sig_{term,hup}_handler()
    
    They already call change_to_root_user(), which can be removed
    later.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 182991c26c8149c79b13a277b9822efc49fd1df0
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 22 10:54:41 2018 +0100

    smbd: use sconn->root_ev_ctx for brl_timeout_fn()
    
    This already calls change_to_root_user(), which can be removed
    later.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 146938217ed1ab9a7a9f38c055fec5513cbd5c4d
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 22 10:54:41 2018 +0100

    smbd: add smbd_server_connection->{root,guest}_ev_ctx pointer
    
    For now these are just the same as smbd_server_connection->ev_ctx,
    but this will change in future and we'll use impersonation wrappers.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit f5f9b719741465c7be3de20a6a69ec106ecc4568
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 22 10:54:41 2018 +0100

    smbd: use raw_ev_ctx to clear the MSG_SMB_CONF_UPDATED registration
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit dc517b20f60a156d73fdd551557eb1d4366dfdeb
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 22 10:54:41 2018 +0100

    smbd: explain that/why we use the raw tevent_context for linux_oplock_signal_handler()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 1d5210b615035e46b90758ac7aa4ceec9174bee5
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 22 10:54:41 2018 +0100

    smbd: explain that/why we use the raw tevent_context for do_break_to_none()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit e73eaa3c8004d3d8aff316cdb26b0bef85eceaca
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 22 10:54:41 2018 +0100

    smbd: explain that/why we use the raw tevent_context for oplock_timeout_handler()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 52f098d38da72d6eff3c4cac61487da897a8651c
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 22 10:54:41 2018 +0100

    smbd: explain that/why we use the raw tevent_context for lease_timeout_handler()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 7cfafaf190643eb28fc95d21a02a4e5e529e16d1
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 22 10:54:41 2018 +0100

    smbd: explain that/why we use the raw tevent_context for update_write_time_handler()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit b0af5715b0a7592a9728e0b76f653b9ab6228708
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 22 10:54:41 2018 +0100

    vfs_glusterfs: explain that/why we use the raw tevent_context in init_gluster_aio()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 6114f9545fa856717220658e87f2a60f6767b7f4
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 22 10:54:41 2018 +0100

    smbd: add smbd_server_connection->raw_ev_ctx pointer
    
    This will replace smbd_server_connection->ev_ctx in the next commits.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit c059f0ae729a47883362a1ba01b530b3d743bc45
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 22 10:54:41 2018 +0100

    smbd: use req->xconn->client->raw_ev_ctx for schedule_deferred_open_message_smb()
    
    process_smb() will redo the impersonation anyway.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 4d5d8d62e4454ceb22884a69f511ae60ac3af698
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 22 10:54:41 2018 +0100

    s3:smb2_server: use req->xconn->client->raw_ev_ctx for smbd_smb2_request_dispatch_immediate()
    
    smbd_smb2_request_dispatch() will redo the impersonation anyway,
    so we don't use req->ev_ctx.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 051c32167ce4a8395daa4ff1eb72eb805da9feab
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 22 10:54:41 2018 +0100

    s3:smb2_server: use req->xconn->client->raw_ev_ctx for smbd_smb2_request_pending_timer()
    
    There's no need to use req->ev_ctx here just to do some network io.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 934b375639c3c0ea17854e870c3458af619cc1da
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu May 24 07:18:10 2018 +0200

    smbd: remove unused tevent_context argument from notify_init
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit d2adcebda12943b7b4af1b8fca35a2c7aa1524e9
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 22 10:54:41 2018 +0100

    smbd: replace xconn->msg_ctx with xconn->client->msg_ctx
    
    This is the same pointer and we don't have a lot of callers,
    so we can just use one pointer.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit d39f6ce3b1ac9f70040e8140937280f445d2d861
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 22 10:54:41 2018 +0100

    smbd: replace xconn->ev_ctx with xconn->client->raw_ev_ctx
    
    This is the same pointer and we don't have a lot of callers,
    so we can just use one pointer.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 19119a55490bcfacbc7d4be340f650e9eaf212f2
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 22 10:54:41 2018 +0100

    smbd: rename smbXsrv_client->ev_ctx into smbXsrv_client->raw_ev_ctx
    
    That makes it clearer that no tevent_context wrapper is used here
    and the related code should really run without any (active) impersonation
    as before.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit db83a8f7c86946d478a55b611779b9666a47cabc
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 22 10:54:41 2018 +0100

    vfs_default: maintain vfswrap_offload_write_state->{src_ev,dst_ev}
    
    These get filled with impersonation wrappers in the following commits.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 506c9b37df1de784fecc6e01cd30f2b3b693a9fd
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed May 23 12:03:02 2018 +0200

    vfs_default: make use of change_to_user_by_fsp() in order to switch between src and dst fsp
    
    This may matter if at least one share uses "force user".
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 2d75da9f61f16eac3c137e16f98e16f4022b79b0
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed May 23 12:03:02 2018 +0200

    vfs_btrfs: make use of become_user_by_fsp() in order to switch between src and dst fsp
    
    We can use become_user_by_fsp()/unbecome_user() as it spans only parts of
    the btrfs_offload_write_send() function and never goes async in between.
    
    This may matter if at least one share uses "force user".
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit e4fb4c1d0efe0f9f1c31eac4e57d60f4bcbc7149
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed May 23 11:54:58 2018 +0200

    smbd: add {become,change_to}_user_by_fsp() helper functions
    
    This can be used if a request operates on two fsp's,
    e.g. the offload_write_send/recv code.
    This is important if (at least) one of
    the shares uses "force user".
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 4512b91897fa1bba60005cc4378ffb5879be28f1
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed May 23 12:40:21 2018 +0200

    vfs_btrfs: don't keep state->subreq in btrfs_offload_write_send/recv()
    
    This can be a local variable as used in most of our tevent_req based
    code.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 231731623392cdcf117ed5febe178b5d7c1fb9c0
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed May 23 12:40:21 2018 +0200

    vfs_btrfs: update s/btrfs_cc_state/btrfs_offload_write_state/ s/cc_state/state/
    
    This matches our naming conventions used for tevent_req based functions.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 5ac91e487db935d508eb22cc81702c74029a5ad4
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed May 23 11:37:52 2018 +0200

    vfs_btrfs: remove unused checks which are already caught by vfs_offload_token_check_handles()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 4af45b8ff6c32bfdfb2eca07fe1b9f158d50fe87
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed May 23 11:37:52 2018 +0200

    vfs_default: remove unused checks which are already caught by vfs_offload_token_check_handles()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 3194999f0bf13d7d7c1f2b91bd8c1ec885158666
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri May 25 16:30:13 2018 +0200

    smbd: avoid calling set_current_user_info() twice with .need_tcon (SMB2)
    
    It's already called via change_to_user().
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 60dbaa490c2b11047f5d7043ed48363164804d6f
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri May 25 16:30:13 2018 +0200

    smbd: avoid calling set_current_user_info() twice with AS_USER (SMB1)
    
    It will be called via change_to_user().
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit ff7efafe73369ec27ab07307102807818ea48c39
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jun 14 11:22:31 2018 +0200

    smbd: remove unused set_current_service()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 4a97448cc9433a4a8e03f8efbe00a404d72c3616
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jun 14 11:18:13 2018 +0200

    smbd: let switch_message() only call chdir_current_service() for SMBtdis/SMBexit
    
    These are the two opcodes with DO_CHDIR, we don't want the
    set_current_case_sensitive() logic for them,
    so we don't need the full set_current_service() anymore.
    
    The AS_USER case is already handled before, set_current_case_sensitive()
    is called directly before change_to_user(), which already
    calls chdir_current_service().
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit d1c8057997f97c6cd537496611dfae4e8b4af520
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Jun 13 13:30:33 2018 +0200

    smbd: call chdir_current_service() in change_to_user_internal() and pop_conn_ctx()
    
    change_to_user() should be the one and only function for the whole
    impersonation processing. So we also need to stack the
    chdir_current_service() behaviour for become_user/unbecome_user,
    so we may need to call vfs_ChDir(ctx_p->conn, ctx_p->conn->cwd_fname);
    in pop_conn_ctx().
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit b27d885478245d8bd56ab4f5459908b6c574d15d
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jun 14 08:29:45 2018 +0200

    smbd: remove set_current_service() from smbd_smb2_request_check_tcon()
    
    The change_to_user() above already called chdir_current_service().
    And for smb2 we don't have per packet conn->case_sensitive anyway.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 03f69e82fc81f61d21def4465afa7f4a1b493c8b
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jun 14 08:29:45 2018 +0200

    smbd: remove set_current_service() from defer_rename_done()
    
    The change_to_user() above already called chdir_current_service().
    And for smb2 we don't have per packet conn->case_sensitive anyway.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 58f4bbc103a420a44234a7c12c8a9b11dea4d8d6
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jun 14 08:27:50 2018 +0200

    smbd: call chdir_current_service() directly in smbXsrv_tcon_disconnect()
    
    There's no need to worry about conn->case_sensitive here.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 1b86df90d27557fb8eefb182809c2f78cdb9f0fa
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jun 14 08:23:56 2018 +0200

    smbd: remove useless set_current_service(NULL,0,True) from reload_services()
    
    All this does is 'return false' as conn is NULL...
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit a61d0aa35b766f4df4d4f9e6891c3a7516e81100
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jun 14 08:21:21 2018 +0200

    smbd: use conn->lastused_count++ directly in process_blocking_lock_queue()
    
    This avoids using set_current_service(), which will be removed shortly.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit f407a86b743937d51192bc23917d4c819a9b722a
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Jun 15 18:40:11 2018 +0200

    smbd: let create_conn_struct_as_root() fill in conn->origpath
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 0e2786a91fb9e3be2248d60b3c32d88fef2d0772
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Jun 15 11:49:57 2018 +0200

    smbd: make it possible to call vfs_ChDir(conn, conn->cwd_fname);
    
    We should only TALLOC_FREE(old_cwd) at the successful end.
    This also avoids calling cp_smb_filename() on the old value.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit ffe1918e8153f5bf429e3d9ebed975c6127f1553
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jun 14 11:15:10 2018 +0200

    smbd: call set_current_case_sensitive() before change_to_user() in switch_message()
    
    change_to_user() will soon call chdir_current_service() and we should
    make sure conn->case_sensitive is prepared before calling vfs_ChDir().
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 0186ff23246cd5332729a80118d87d6a47488259
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jun 14 07:27:43 2018 +0200

    smbd: remember that the tcon completely setup connection_struct
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 5472171bdb46f1dcb0a4eae61b1d1b6af6373ee5
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jun 14 07:26:14 2018 +0200

    smbd: make it explicit that make_connection_snum() returns NT_STATUS_OK on success
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 8cfe36eee92255509e61e591761db594de46cdb8
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri May 25 14:22:43 2018 +0200

    smbd: call set_current_user_info() in change_to_user_internal() and pop_conn_ctx()
    
    change_to_user() should be the one and only function for the whole
    impersonation processing. So we also need to stack the
    set_current_user_info() information for become_user/unbecome_user.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 91a37964814828020ec718bc6b802216f3425a70
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Jun 12 15:39:51 2018 +0200

    smbd: move current_user caching to change_to_user_internal()
    
    Note that (current_user.vuid == vuid) also works with
    UID_FIELD_INVALID.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 35a12e7009d9f1e2eeab06c02ac8227f5b59c778
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Jun 12 15:39:51 2018 +0200

    smbd: simplify the logic in change_to_user()
    
    We can return early if (vuser == NULL).
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit e469d6c73059d53dd10d590db7ab3118e66f731a
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu May 3 15:04:30 2018 +0200

    smbd: let check_user_ok() construct ent->session_info in one coherent block
    
    We should finish manipulating ent->session_info before filling
    conn->session_info. And conn->session_info should be not be changed.
    
    Use git show -U15.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 0e7456d28655fda118ad3d432e9baf8398206bbe
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Jun 13 11:23:42 2018 +0200

    smbd: call set_current_case_sensitive() before chdir_current_service()
    
    I guess we better setup conn->case_sensitive before doing the
    vfs_ChDir() calls, so we have a consistent result everytime.
    Otherwise vfs_Chdir() would get conn->case_sensitive from
    last request.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 8e81090789e4cc3ba9e5aa792d4e52971909c894
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Jun 13 11:03:01 2018 +0200

    smbd: split out set_current_case_sensitive() and chdir_current_service() functions
    
    We'll soon use them independend from set_current_service().
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 71d5809188e416aeb3e9c67214eae32b4225c2d7
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri May 25 13:58:04 2018 +0200

    smbd: remove xconn->client->last_session_id based set_current_user_info() caching
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit df5e459299d1eb61879a4bdaf6f600acaab90b6a
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri May 25 13:40:12 2018 +0200

    s3:lib: add caching to set_current_user_info()
    
    Currently we do that in the caller, but we use global
    cache anyway, so we can simplify the callers.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 source3/include/smb.h                |   2 +
 source3/include/vfs.h                |   5 ++
 source3/lib/substitute.c             |  15 ++++
 source3/librpc/idl/smbXsrv.idl       |   3 +-
 source3/modules/vfs_aio_pthread.c    |   2 +-
 source3/modules/vfs_btrfs.c          | 138 ++++++++++++++++++++++-------------
 source3/modules/vfs_default.c        |  65 +++++++++++++----
 source3/modules/vfs_glusterfs.c      |  11 ++-
 source3/modules/vfs_readonly.c       |   1 +
 source3/smbd/aio.c                   |   8 +-
 source3/smbd/blocking.c              |  15 ++--
 source3/smbd/conn.c                  |   7 ++
 source3/smbd/fileio.c                |  12 ++-
 source3/smbd/globals.h               |  14 ++--
 source3/smbd/ipc.c                   |   4 +-
 source3/smbd/msdfs.c                 |  16 +++-
 source3/smbd/notify.c                |   2 +-
 source3/smbd/notify_msg.c            |   1 -
 source3/smbd/open.c                  |   8 +-
 source3/smbd/oplock.c                |  44 ++++++++++-
 source3/smbd/oplock_linux.c          |  14 +++-
 source3/smbd/pipes.c                 |   8 +-
 source3/smbd/process.c               |  82 ++++++++++++++-------
 source3/smbd/proto.h                 |   6 +-
 source3/smbd/reply.c                 |   2 +-
 source3/smbd/server_reload.c         |   3 -
 source3/smbd/service.c               |  65 ++++++++++-------
 source3/smbd/smb2_break.c            |   4 +-
 source3/smbd/smb2_close.c            |   2 +-
 source3/smbd/smb2_create.c           |   6 +-
 source3/smbd/smb2_flush.c            |   2 +-
 source3/smbd/smb2_getinfo.c          |   2 +-
 source3/smbd/smb2_glue.c             |   1 +
 source3/smbd/smb2_ioctl.c            |   2 +-
 source3/smbd/smb2_ioctl_named_pipe.c |   2 +-
 source3/smbd/smb2_lock.c             |  10 ++-
 source3/smbd/smb2_notify.c           |   4 +-
 source3/smbd/smb2_query_directory.c  |   2 +-
 source3/smbd/smb2_read.c             |   2 +-
 source3/smbd/smb2_server.c           |  53 +++++++++-----
 source3/smbd/smb2_sesssetup.c        |   4 +-
 source3/smbd/smb2_setinfo.c          |   8 +-
 source3/smbd/smb2_tcon.c             |   4 +-
 source3/smbd/smb2_write.c            |   2 +-
 source3/smbd/smbXsrv_client.c        |  20 +++--
 source3/smbd/smbXsrv_open.c          |   4 +-
 source3/smbd/smbXsrv_session.c       |  14 ++--
 source3/smbd/smbXsrv_tcon.c          |   6 +-
 source3/smbd/uid.c                   | 119 ++++++++++++++++++++++--------
 source3/smbd/vfs.c                   |  27 ++-----
 source3/utils/status.c               |   1 -
 51 files changed, 572 insertions(+), 282 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/include/smb.h b/source3/include/smb.h
index 5e83ee9..9ec6543 100644
--- a/source3/include/smb.h
+++ b/source3/include/smb.h
@@ -156,6 +156,8 @@ struct sys_notify_context {
 struct current_user {
 	struct connection_struct *conn;
 	uint64_t vuid; /* SMB2 compat */
+	bool need_chdir;
+	bool done_chdir;
 	struct security_unix_token ut;
 	struct security_token *nt_user_token;
 };
diff --git a/source3/include/vfs.h b/source3/include/vfs.h
index 81fb6c1..4e5b787 100644
--- a/source3/include/vfs.h
+++ b/source3/include/vfs.h
@@ -398,6 +398,7 @@ typedef struct files_struct {
 
 struct vuid_cache_entry {
 	struct auth_session_info *session_info;
+	struct tevent_context *user_ev_ctx;
 	uint64_t vuid; /* SMB2 compat */
 	bool read_only;
 	uint32_t share_access;
@@ -436,6 +437,7 @@ typedef struct connection_struct {
 	char *connectpath;
 	char *origpath;
 	struct smb_filename *cwd_fname; /* Working directory. */
+	bool tcon_done;
 
 	struct vfs_handle_struct *vfs_handles;		/* for the new plugins */
 
@@ -444,6 +446,7 @@ typedef struct connection_struct {
 	 * on the vuid using this tid, this might change per SMB request.
 	 */
 	struct auth_session_info *session_info;
+	struct tevent_context *user_ev_ctx;
 
 	/*
 	 * If the "force group" parameter is set, this is the primary gid that
@@ -511,6 +514,8 @@ struct smb_request {
 
 	size_t unread_bytes;
 	bool encrypted;
+	/* the tevent_context (wrapper) the request operates on */
+	struct tevent_context *ev_ctx;
 	connection_struct *conn;
 	struct smbd_server_connection *sconn;
 	struct smbXsrv_connection *xconn;
diff --git a/source3/lib/substitute.c b/source3/lib/substitute.c
index 9fdc5ca..ea227c5 100644
--- a/source3/lib/substitute.c
+++ b/source3/lib/substitute.c
@@ -247,6 +247,17 @@ static const char *get_smb_user_name(void)
 void set_current_user_info(const char *smb_name, const char *unix_name,
 			   const char *domain)
 {
+	static const void *last_smb_name;
+	static const void *last_unix_name;
+	static const void *last_domain;
+
+	if (likely(last_smb_name == smb_name &&
+	    last_unix_name == unix_name &&
+	    last_domain == domain))
+	{
+		return;
+	}
+
 	fstrcpy(current_user_info.smb_name, smb_name);
 	fstrcpy(current_user_info.unix_name, unix_name);
 	fstrcpy(current_user_info.domain, domain);
@@ -255,6 +266,10 @@ void set_current_user_info(const char *smb_name, const char *unix_name,
 	 * has already been sanitised in register_existing_vuid. */
 
 	sub_set_smb_name(current_user_info.smb_name);
+
+	last_smb_name = smb_name;
+	last_unix_name = unix_name;
+	last_domain = domain;
 }
 
 /*******************************************************************
diff --git a/source3/librpc/idl/smbXsrv.idl b/source3/librpc/idl/smbXsrv.idl
index d3f8d30..935c408 100644
--- a/source3/librpc/idl/smbXsrv.idl
+++ b/source3/librpc/idl/smbXsrv.idl
@@ -107,7 +107,7 @@ interface smbXsrv
 
 	typedef [public] struct {
 		[ignore] smbXsrv_client_table		*table;
-		[ignore] struct tevent_context		*ev_ctx;
+		[ignore] struct tevent_context		*raw_ev_ctx;
 		[ignore] struct messaging_context	*msg_ctx;
 
 		[ref] smbXsrv_client_global0		*global;
@@ -123,7 +123,6 @@ interface smbXsrv
 		 * this session_table is used for SMB1 and SMB2,
 		 */
 		[ignore] struct smbXsrv_session_table	*session_table;
-		[ignore] hyper				last_session_id;
 		/*
 		 * this tcon_table is only used for SMB1.
 		 */
diff --git a/source3/modules/vfs_aio_pthread.c b/source3/modules/vfs_aio_pthread.c
index 88794bb..a9e2b09 100644
--- a/source3/modules/vfs_aio_pthread.c
+++ b/source3/modules/vfs_aio_pthread.c
@@ -276,7 +276,7 @@ static int open_async(const files_struct *fsp,
 	}
 
 	subreq = pthreadpool_tevent_job_send(opd,
-					     fsp->conn->sconn->ev_ctx,
+					     fsp->conn->user_ev_ctx,
 					     fsp->conn->sconn->pool,
 					     aio_open_worker, opd);
 	if (subreq == NULL) {
diff --git a/source3/modules/vfs_btrfs.c b/source3/modules/vfs_btrfs.c
index 775e5f0..a11cb66 100644
--- a/source3/modules/vfs_btrfs.c
+++ b/source3/modules/vfs_btrfs.c
@@ -196,11 +196,29 @@ static NTSTATUS btrfs_offload_read_recv(struct tevent_req *req,
 	return NT_STATUS_OK;
 }
 
-struct btrfs_cc_state {
+struct btrfs_offload_write_state {
 	struct vfs_handle_struct *handle;
 	off_t copied;
-	struct tevent_req *subreq;	/* non-null if passed to next VFS fn */
+	bool need_unbecome_user;
 };
+
+static void btrfs_offload_write_cleanup(struct tevent_req *req,
+					enum tevent_req_state req_state)
+{
+	struct btrfs_offload_write_state *state =
+		tevent_req_data(req,
+		struct btrfs_offload_write_state);
+	bool ok;
+
+	if (!state->need_unbecome_user) {
+		return;
+	}
+
+	ok = unbecome_user();
+	SMB_ASSERT(ok);
+	state->need_unbecome_user = false;
+}
+
 static void btrfs_offload_write_done(struct tevent_req *subreq);
 
 static struct tevent_req *btrfs_offload_write_send(struct vfs_handle_struct *handle,
@@ -213,8 +231,9 @@ static struct tevent_req *btrfs_offload_write_send(struct vfs_handle_struct *han
 						off_t dest_off,
 						off_t num)
 {
-	struct tevent_req *req;
-	struct btrfs_cc_state *cc_state;
+	struct tevent_req *req = NULL;
+	struct btrfs_offload_write_state *state = NULL;
+	struct tevent_req *subreq = NULL;
 	struct btrfs_ioctl_clone_range_args cr_args;
 	struct lock_struct src_lck;
 	struct lock_struct dest_lck;
@@ -224,13 +243,17 @@ static struct tevent_req *btrfs_offload_write_send(struct vfs_handle_struct *han
 	bool handle_offload_write = true;
 	bool do_locking = false;
 	NTSTATUS status;
+	bool ok;
 
-	req = tevent_req_create(mem_ctx, &cc_state, struct btrfs_cc_state);
+	req = tevent_req_create(mem_ctx, &state,
+				struct btrfs_offload_write_state);
 	if (req == NULL) {
 		return NULL;
 	}
 
-	cc_state->handle = handle;
+	state->handle = handle;
+
+	tevent_req_set_cleanup_fn(req, btrfs_offload_write_cleanup);
 
 	status = vfs_offload_token_db_fetch_fsp(btrfs_offload_ctx,
 						token, &src_fsp);
@@ -263,18 +286,19 @@ static struct tevent_req *btrfs_offload_write_send(struct vfs_handle_struct *han
 	}
 
 	if (!handle_offload_write) {
-		cc_state->subreq = SMB_VFS_NEXT_OFFLOAD_WRITE_SEND(handle,
-								cc_state, ev,
-								fsctl,
-								token,
-								transfer_offset,
-								dest_fsp,
-								dest_off,
-								num);
-		if (tevent_req_nomem(cc_state->subreq, req)) {
+		subreq = SMB_VFS_NEXT_OFFLOAD_WRITE_SEND(handle,
+							 state,
+							 ev,
+							 fsctl,
+							 token,
+							 transfer_offset,
+							 dest_fsp,
+							 dest_off,
+							 num);
+		if (tevent_req_nomem(subreq, req)) {
 			return tevent_req_post(req, ev);
 		}
-		tevent_req_set_callback(cc_state->subreq,
+		tevent_req_set_callback(subreq,
 					btrfs_offload_write_done,
 					req);
 		return req;
@@ -287,6 +311,13 @@ static struct tevent_req *btrfs_offload_write_send(struct vfs_handle_struct *han
 		return tevent_req_post(req, ev);
 	}
 
+	ok = become_user_by_fsp(src_fsp);
+	if (!ok) {
+		tevent_req_nterror(req, NT_STATUS_ACCESS_DENIED);
+		return tevent_req_post(req, ev);
+	}
+	state->need_unbecome_user = true;
+
 	status = vfs_stat_fsp(src_fsp);
 	if (tevent_req_nterror(req, status)) {
 		return tevent_req_post(req, ev);
@@ -298,11 +329,6 @@ static struct tevent_req *btrfs_offload_write_send(struct vfs_handle_struct *han
 		return tevent_req_post(req, ev);
 	}
 
-	if (src_fsp->op == NULL || dest_fsp->op == NULL) {
-		tevent_req_nterror(req, NT_STATUS_INTERNAL_ERROR);
-		return tevent_req_post(req, ev);
-	}
-
 	if (do_locking) {
 		init_strict_lock_struct(src_fsp,
 					src_fsp->op->global->open_persistent_id,
@@ -310,17 +336,24 @@ static struct tevent_req *btrfs_offload_write_send(struct vfs_handle_struct *han
 					num,
 					READ_LOCK,
 					&src_lck);
+		if (!SMB_VFS_STRICT_LOCK_CHECK(src_fsp->conn, src_fsp, &src_lck)) {
+			tevent_req_nterror(req, NT_STATUS_FILE_LOCK_CONFLICT);
+			return tevent_req_post(req, ev);
+		}
+	}
+
+	ok = unbecome_user();
+	SMB_ASSERT(ok);
+	state->need_unbecome_user = false;
+
+	if (do_locking) {
 		init_strict_lock_struct(dest_fsp,
-				       dest_fsp->op->global->open_persistent_id,
+					dest_fsp->op->global->open_persistent_id,
 					dest_off,
 					num,
 					WRITE_LOCK,
 					&dest_lck);
 
-		if (!SMB_VFS_STRICT_LOCK_CHECK(src_fsp->conn, src_fsp, &src_lck)) {
-			tevent_req_nterror(req, NT_STATUS_FILE_LOCK_CONFLICT);
-			return tevent_req_post(req, ev);
-		}
 		if (!SMB_VFS_STRICT_LOCK_CHECK(dest_fsp->conn, dest_fsp, &dest_lck)) {
 			tevent_req_nterror(req, NT_STATUS_FILE_LOCK_CONFLICT);
 			return tevent_req_post(req, ev);
@@ -348,19 +381,20 @@ static struct tevent_req *btrfs_offload_write_send(struct vfs_handle_struct *han
 			  (unsigned long long)cr_args.src_offset,
 			  dest_fsp->fh->fd,
 			  (unsigned long long)cr_args.dest_offset));
-		cc_state->subreq = SMB_VFS_NEXT_OFFLOAD_WRITE_SEND(handle,
-								cc_state, ev,
-								fsctl,
-								token,
-								transfer_offset,
-								dest_fsp,
-								dest_off,
-								num);
-		if (tevent_req_nomem(cc_state->subreq, req)) {
+		subreq = SMB_VFS_NEXT_OFFLOAD_WRITE_SEND(handle,
+							 state,
+							 ev,
+							 fsctl,
+							 token,
+							 transfer_offset,
+							 dest_fsp,
+							 dest_off,
+							 num);
+		if (tevent_req_nomem(subreq, req)) {
 			return tevent_req_post(req, ev);
 		}
 		/* wait for subreq completion */
-		tevent_req_set_callback(cc_state->subreq,
+		tevent_req_set_callback(subreq,
 					btrfs_offload_write_done,
 					req);
 		return req;
@@ -368,7 +402,7 @@ static struct tevent_req *btrfs_offload_write_send(struct vfs_handle_struct *han
 
 	DEBUG(5, ("BTRFS_IOC_CLONE_RANGE returned %d\n", ret));
 	/* BTRFS_IOC_CLONE_RANGE is all or nothing */
-	cc_state->copied = num;
+	state->copied = num;
 	tevent_req_done(req);
 	return tevent_req_post(req, ev);
 }
@@ -376,15 +410,18 @@ static struct tevent_req *btrfs_offload_write_send(struct vfs_handle_struct *han
 /* only used if the request is passed through to next VFS module */
 static void btrfs_offload_write_done(struct tevent_req *subreq)
 {
-	struct tevent_req *req = tevent_req_callback_data(
-		subreq, struct tevent_req);
-	struct btrfs_cc_state *cc_state = tevent_req_data(req,
-							struct btrfs_cc_state);
+	struct tevent_req *req =
+		tevent_req_callback_data(subreq,
+		struct tevent_req);
+	struct btrfs_offload_write_state *state =
+		tevent_req_data(req,
+		struct btrfs_offload_write_state);
 	NTSTATUS status;
 
-	status = SMB_VFS_NEXT_OFFLOAD_WRITE_RECV(cc_state->handle,
-					      cc_state->subreq,
-					      &cc_state->copied);
+	status = SMB_VFS_NEXT_OFFLOAD_WRITE_RECV(state->handle,
+						 subreq,
+						 &state->copied);
+	TALLOC_FREE(subreq);
 	if (tevent_req_nterror(req, status)) {
 		return;
 	}
@@ -392,12 +429,13 @@ static void btrfs_offload_write_done(struct tevent_req *subreq)
 }
 
 static NTSTATUS btrfs_offload_write_recv(struct vfs_handle_struct *handle,
-				      struct tevent_req *req,
-				      off_t *copied)
+					 struct tevent_req *req,
+					 off_t *copied)
 {
+	struct btrfs_offload_write_state *state =
+		tevent_req_data(req,
+		struct btrfs_offload_write_state);
 	NTSTATUS status;
-	struct btrfs_cc_state *cc_state = tevent_req_data(req,
-							struct btrfs_cc_state);
 
 	if (tevent_req_is_nterror(req, &status)) {
 		DEBUG(4, ("server side copy chunk failed: %s\n",
@@ -407,8 +445,8 @@ static NTSTATUS btrfs_offload_write_recv(struct vfs_handle_struct *handle,
 	}
 
 	DEBUG(10, ("server side copy chunk copied %llu\n",
-		   (unsigned long long)cc_state->copied));
-	*copied = cc_state->copied;
+		   (unsigned long long)state->copied));
+	*copied = state->copied;
 	tevent_req_received(req);
 	return NT_STATUS_OK;
 }
diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c
index 82afb05..082b70f 100644
--- a/source3/modules/vfs_default.c
+++ b/source3/modules/vfs_default.c
@@ -1584,13 +1584,14 @@ static NTSTATUS vfswrap_offload_read_recv(struct tevent_req *req,
 }
 
 struct vfswrap_offload_write_state {
-	struct tevent_context *ev;
 	uint8_t *buf;
 	bool read_lck_locked;
 	bool write_lck_locked;
 	DATA_BLOB *token;
+	struct tevent_context *src_ev;
 	struct files_struct *src_fsp;
 	off_t src_off;
+	struct tevent_context *dst_ev;
 	struct files_struct *dst_fsp;
 	off_t dst_off;
 	off_t to_copy;
@@ -1598,6 +1599,22 @@ struct vfswrap_offload_write_state {
 	size_t next_io_size;
 };
 
+static void vfswrap_offload_write_cleanup(struct tevent_req *req,
+					  enum tevent_req_state req_state)
+{
+	struct vfswrap_offload_write_state *state = tevent_req_data(
+		req, struct vfswrap_offload_write_state);
+	bool ok;
+
+	if (state->dst_fsp == NULL) {
+		return;
+	}
+
+	ok = change_to_user_by_fsp(state->dst_fsp);
+	SMB_ASSERT(ok);
+	state->dst_fsp = NULL;
+}
+
 static NTSTATUS vfswrap_offload_write_loop(struct tevent_req *req);
 
 static struct tevent_req *vfswrap_offload_write_send(
@@ -1616,6 +1633,7 @@ static struct tevent_req *vfswrap_offload_write_send(
 	size_t num = MIN(to_copy, COPYCHUNK_MAX_TOTAL_LEN);
 	files_struct *src_fsp = NULL;
 	NTSTATUS status;
+	bool ok;
 
 	req = tevent_req_create(mem_ctx, &state,
 				struct vfswrap_offload_write_state);
@@ -1624,15 +1642,17 @@ static struct tevent_req *vfswrap_offload_write_send(
 	}
 
 	*state = (struct vfswrap_offload_write_state) {
-		.ev = ev,
 		.token = token,
 		.src_off = transfer_offset,
+		.dst_ev = ev,
 		.dst_fsp = dest_fsp,
 		.dst_off = dest_off,
 		.to_copy = to_copy,
 		.remaining = to_copy,
 	};
 
+	tevent_req_set_cleanup_fn(req, vfswrap_offload_write_cleanup);
+
 	switch (fsctl) {
 	case FSCTL_SRV_COPYCHUNK:
 	case FSCTL_SRV_COPYCHUNK_WRITE:
@@ -1666,7 +1686,6 @@ static struct tevent_req *vfswrap_offload_write_send(
 	if (tevent_req_nterror(req, status)) {
 		return tevent_req_post(req, ev);
 	}
-	state->src_fsp = src_fsp;
 
 	DBG_DEBUG("server side copy chunk of length %" PRIu64 "\n", to_copy);
 
@@ -1676,6 +1695,15 @@ static struct tevent_req *vfswrap_offload_write_send(
 		return tevent_req_post(req, ev);
 	}
 
+	ok = change_to_user_by_fsp(src_fsp);
+	if (!ok) {
+		tevent_req_nterror(req, NT_STATUS_ACCESS_DENIED);
+		return tevent_req_post(req, ev);
+	}
+
+	state->src_ev = src_fsp->conn->user_ev_ctx;
+	state->src_fsp = src_fsp;
+
 	state->buf = talloc_array(state, uint8_t, num);
 	if (tevent_req_nomem(state->buf, req)) {
 		return tevent_req_post(req, ev);
@@ -1700,16 +1728,6 @@ static struct tevent_req *vfswrap_offload_write_send(
 		return tevent_req_post(req, ev);
 	}
 
-	if (src_fsp->op == NULL) {
-		tevent_req_nterror(req, NT_STATUS_INTERNAL_ERROR);
-		return tevent_req_post(req, ev);
-	}
-
-	if (dest_fsp->op == NULL) {
-		tevent_req_nterror(req, NT_STATUS_INTERNAL_ERROR);
-		return tevent_req_post(req, ev);
-	}
-
 	status = vfswrap_offload_write_loop(req);
 	if (!NT_STATUS_IS_OK(status)) {
 		tevent_req_nterror(req, status);
@@ -1729,6 +1747,10 @@ static NTSTATUS vfswrap_offload_write_loop(struct tevent_req *req)
 	struct lock_struct read_lck;
 	bool ok;
 
+	/*
+	 * This is called under the context of state->src_fsp.
+	 */
+
 	state->next_io_size = MIN(state->remaining, talloc_array_length(state->buf));
 
 	init_strict_lock_struct(state->src_fsp,
@@ -1746,7 +1768,7 @@ static NTSTATUS vfswrap_offload_write_loop(struct tevent_req *req)
 	}
 
 	subreq = SMB_VFS_PREAD_SEND(state,
-				    state->src_fsp->conn->sconn->ev_ctx,
+				    state->src_ev,
 				    state->src_fsp,
 				    state->buf,
 				    state->next_io_size,
@@ -1788,6 +1810,12 @@ static void vfswrap_offload_write_read_done(struct tevent_req *subreq)
 
 	state->src_off += nread;


-- 
Samba Shared Repository



More information about the samba-cvs mailing list