diff options
author | Volker Lendecke <vl@samba.org> | 2012-04-04 14:51:43 +0200 |
---|---|---|
committer | Volker Lendecke <vl@samba.org> | 2012-04-17 10:21:02 +0200 |
commit | 843432d56f9114a4d0d3021a772953dc5a1193dd (patch) | |
tree | 2b180ce533bc337e56e09dee1e2fe8a5c7070f4c /source3/smbd/notify.c | |
parent | ae691cd9cc5f00a1d4465d233cdd9f5b580b2c39 (diff) | |
download | samba-843432d56f9114a4d0d3021a772953dc5a1193dd.tar.gz samba-843432d56f9114a4d0d3021a772953dc5a1193dd.tar.xz samba-843432d56f9114a4d0d3021a772953dc5a1193dd.zip |
s3: New notify implementation
From notify_internal.c:
/*
* The notify database is split up into two databases: One
* relatively static index db and the real notify db with the
* volatile entries.
*/
This change is necessary to make notify scale better in a cluster
Diffstat (limited to 'source3/smbd/notify.c')
-rw-r--r-- | source3/smbd/notify.c | 36 |
1 files changed, 7 insertions, 29 deletions
diff --git a/source3/smbd/notify.c b/source3/smbd/notify.c index fd9e5524a7..0401b65a6a 100644 --- a/source3/smbd/notify.c +++ b/source3/smbd/notify.c @@ -188,7 +188,7 @@ NTSTATUS change_notify_create(struct files_struct *fsp, uint32 filter, { char *fullpath; size_t len; - struct notify_entry e; + uint32_t subdir_filter; NTSTATUS status = NT_STATUS_NOT_IMPLEMENTED; if (fsp->notify != NULL) { @@ -220,22 +220,14 @@ NTSTATUS change_notify_create(struct files_struct *fsp, uint32 filter, fullpath[len-2] = '\0'; } - ZERO_STRUCT(e); - e.path = fullpath; - e.dir_fd = fsp->fh->fd; - e.dir_id = fsp->file_id; - e.filter = filter; - e.subdir_filter = 0; - if (recursive) { - e.subdir_filter = filter; - } + subdir_filter = recursive ? filter : 0; if (fsp->conn->sconn->sys_notify_ctx != NULL) { void *sys_notify_handle = NULL; status = SMB_VFS_NOTIFY_WATCH( fsp->conn, fsp->conn->sconn->sys_notify_ctx, - e.path, &e.filter, &e.subdir_filter, + fullpath, &filter, &subdir_filter, sys_notify_callback, fsp, &sys_notify_handle); if (NT_STATUS_IS_OK(status)) { @@ -243,9 +235,10 @@ NTSTATUS change_notify_create(struct files_struct *fsp, uint32 filter, } } - if ((e.filter != 0) || (e.subdir_filter != 0)) { - status = notify_add(fsp->conn->sconn->notify_ctx, fsp->conn, - &e, notify_callback, fsp); + if ((filter != 0) || (subdir_filter != 0)) { + status = notify_add(fsp->conn->sconn->notify_ctx, + fullpath, filter, subdir_filter, + notify_callback, fsp); } TALLOC_FREE(fullpath); return status; @@ -389,25 +382,10 @@ void notify_fname(connection_struct *conn, uint32 action, uint32 filter, { struct notify_context *notify_ctx = conn->sconn->notify_ctx; char *fullpath; - char *parent; - const char *name; if (path[0] == '.' && path[1] == '/') { path += 2; } - if (parent_dirname(talloc_tos(), path, &parent, &name)) { - struct smb_filename smb_fname_parent; - - ZERO_STRUCT(smb_fname_parent); - smb_fname_parent.base_name = parent; - - if (SMB_VFS_STAT(conn, &smb_fname_parent) != -1) { - notify_onelevel(notify_ctx, action, filter, - SMB_VFS_FILE_ID_CREATE(conn, &smb_fname_parent.st), - name); - } - } - fullpath = talloc_asprintf(talloc_tos(), "%s/%s", conn->connectpath, path); if (fullpath == NULL) { |