diff options
author | Volker Lendecke <vl@samba.org> | 2012-03-21 12:18:09 +0100 |
---|---|---|
committer | Volker Lendecke <vl@samba.org> | 2012-03-21 14:26:06 +0100 |
commit | f3fe53668f5f42123ab4d91de23ac4f16bf12733 (patch) | |
tree | 4a8d95b4c44e5424f20558669895ea1745e69f26 | |
parent | 7dcc2bf7af10c6bf5f714b43ca81083fa1bea0b9 (diff) | |
download | samba-f3fe53668f5f42123ab4d91de23ac4f16bf12733.tar.gz samba-f3fe53668f5f42123ab4d91de23ac4f16bf12733.tar.xz samba-f3fe53668f5f42123ab4d91de23ac4f16bf12733.zip |
s3: Move the notify_ctx to the smbd_server_connection
We only need one notify_ctx per smbd. The notify_array can become quite large.
It's based on absolute paths, so there's no point in having a copy of the
complete array in memory multiple times.
Autobuild-User: Volker Lendecke <vl@samba.org>
Autobuild-Date: Wed Mar 21 14:26:07 CET 2012 on sn-devel-104
-rw-r--r-- | source3/include/smb.h | 1 | ||||
-rw-r--r-- | source3/smbd/files.c | 6 | ||||
-rw-r--r-- | source3/smbd/globals.h | 1 | ||||
-rw-r--r-- | source3/smbd/notify.c | 7 | ||||
-rw-r--r-- | source3/smbd/service.c | 9 |
5 files changed, 14 insertions, 10 deletions
diff --git a/source3/include/smb.h b/source3/include/smb.h index 86f69b4a066..a12ca54d202 100644 --- a/source3/include/smb.h +++ b/source3/include/smb.h @@ -427,7 +427,6 @@ typedef struct connection_struct { name_compare_entry *aio_write_behind_list; /* Per-share list of files to use aio write behind on. */ struct dfree_cached_info *dfree_info; struct trans_state *pending_trans; - struct notify_context *notify_ctx; struct rpc_pipe_client *spoolss_pipe; diff --git a/source3/smbd/files.c b/source3/smbd/files.c index 10a0b8169d0..6499a810ffc 100644 --- a/source3/smbd/files.c +++ b/source3/smbd/files.c @@ -447,11 +447,13 @@ void file_free(struct smb_request *req, files_struct *fsp) } if (fsp->notify) { + struct notify_context *notify_ctx = + fsp->conn->sconn->notify_ctx; if (fsp->is_directory) { - notify_remove_onelevel(fsp->conn->notify_ctx, + notify_remove_onelevel(notify_ctx, &fsp->file_id, fsp); } - notify_remove(fsp->conn->notify_ctx, fsp); + notify_remove(notify_ctx, fsp); TALLOC_FREE(fsp->notify); } diff --git a/source3/smbd/globals.h b/source3/smbd/globals.h index caf7357df43..3973855b7e2 100644 --- a/source3/smbd/globals.h +++ b/source3/smbd/globals.h @@ -449,6 +449,7 @@ struct smbd_server_connection { const char *remote_hostname; struct tevent_context *ev_ctx; struct messaging_context *msg_ctx; + struct notify_context *notify_ctx; struct { bool got_session; } nbt; diff --git a/source3/smbd/notify.c b/source3/smbd/notify.c index 88e838ee178..8228c7597ef 100644 --- a/source3/smbd/notify.c +++ b/source3/smbd/notify.c @@ -221,7 +221,7 @@ NTSTATUS change_notify_create(struct files_struct *fsp, uint32 filter, e.subdir_filter = filter; } - status = notify_add(fsp->conn->notify_ctx, fsp->conn, &e, + status = notify_add(fsp->conn->sconn->notify_ctx, fsp->conn, &e, notify_callback, fsp); TALLOC_FREE(fullpath); @@ -364,6 +364,7 @@ void remove_pending_change_notify_requests_by_fid(files_struct *fsp, void notify_fname(connection_struct *conn, uint32 action, uint32 filter, const char *path) { + struct notify_context *notify_ctx = conn->sconn->notify_ctx; char *fullpath; char *parent; const char *name; @@ -378,7 +379,7 @@ void notify_fname(connection_struct *conn, uint32 action, uint32 filter, smb_fname_parent.base_name = parent; if (SMB_VFS_STAT(conn, &smb_fname_parent) != -1) { - notify_onelevel(conn->notify_ctx, action, filter, + notify_onelevel(notify_ctx, action, filter, SMB_VFS_FILE_ID_CREATE(conn, &smb_fname_parent.st), name); } @@ -390,7 +391,7 @@ void notify_fname(connection_struct *conn, uint32 action, uint32 filter, DEBUG(0, ("asprintf failed\n")); return; } - notify_trigger(conn->notify_ctx, action, filter, fullpath); + notify_trigger(notify_ctx, action, filter, fullpath); TALLOC_FREE(fullpath); } diff --git a/source3/smbd/service.c b/source3/smbd/service.c index 79e935d5d2d..d28a51a9a72 100644 --- a/source3/smbd/service.c +++ b/source3/smbd/service.c @@ -698,10 +698,11 @@ static NTSTATUS make_connection_snum(struct smbd_server_connection *sconn, on_err_call_dis_hook = true; if ((!conn->printer) && (!conn->ipc) && - lp_change_notify(conn->params)) { - conn->notify_ctx = notify_init(conn, - sconn->msg_ctx, - sconn->ev_ctx); + lp_change_notify(conn->params) && + sconn->notify_ctx == NULL) { + sconn->notify_ctx = notify_init(sconn, + sconn->msg_ctx, + sconn->ev_ctx); } /* |