From fa6f61e83565f49fb4e75248cffaa1ef31567d20 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Mon, 26 Mar 2012 12:46:11 +0200 Subject: [PATCH] s3: Pass filters explicitly through vfs notify watch This removes a dependency on "struct notify_entry" and makes the nature of the API more explicit. We depend upon the VFS module to mask out elements from e->filter and e->subdir_filter that it took over to handle. Autobuild-User: Volker Lendecke Autobuild-Date: Mon Mar 26 17:45:44 CEST 2012 on sn-devel-104 --- examples/VFS/skel_opaque.c | 5 ++++- examples/VFS/skel_transparent.c | 6 ++++-- source3/include/vfs.h | 6 ++++-- source3/include/vfs_macros.h | 8 ++++---- source3/modules/vfs_default.c | 7 ++++--- source3/modules/vfs_full_audit.c | 6 ++++-- source3/modules/vfs_notify_fam.c | 9 +++++---- source3/modules/vfs_time_audit.c | 6 ++++-- source3/smbd/notify.c | 4 ++-- source3/smbd/notify_inotify.c | 15 ++++++++------- source3/smbd/proto.h | 3 ++- source3/smbd/vfs.c | 6 ++++-- 12 files changed, 49 insertions(+), 32 deletions(-) diff --git a/examples/VFS/skel_opaque.c b/examples/VFS/skel_opaque.c index 7b67e563522..5c97e2304e4 100644 --- a/examples/VFS/skel_opaque.c +++ b/examples/VFS/skel_opaque.c @@ -383,7 +383,10 @@ static char *skel_realpath(vfs_handle_struct *handle, const char *path) } static NTSTATUS skel_notify_watch(struct vfs_handle_struct *handle, - struct sys_notify_context *ctx, struct notify_entry *e, + struct sys_notify_context *ctx, + const char *path, + uint32_t *filter, + uint32_t *subdir_filter, void (*callback)(struct sys_notify_context *ctx, void *private_data, struct notify_event *ev), void *private_data, void *handle_p) { diff --git a/examples/VFS/skel_transparent.c b/examples/VFS/skel_transparent.c index 964ba6dc9ca..c57545c2e54 100644 --- a/examples/VFS/skel_transparent.c +++ b/examples/VFS/skel_transparent.c @@ -360,13 +360,15 @@ static char *skel_realpath(vfs_handle_struct *handle, const char *path) static NTSTATUS skel_notify_watch( struct vfs_handle_struct *handle, struct sys_notify_context *ctx, - struct notify_entry *e, const char *path, + uint32_t *filter, + uint32_t *subdir_filter, void (*callback)(struct sys_notify_context *ctx, void *private_data, struct notify_event *ev), void *private_data, void *handle_p) { - return SMB_VFS_NEXT_NOTIFY_WATCH(handle, ctx, e, path, callback, + return SMB_VFS_NEXT_NOTIFY_WATCH(handle, ctx, path, + filter, subdir_filter, callback, private_data, handle_p); } diff --git a/source3/include/vfs.h b/source3/include/vfs.h index c038c56f469..212da7e5140 100644 --- a/source3/include/vfs.h +++ b/source3/include/vfs.h @@ -284,8 +284,9 @@ struct vfs_fn_pointers { char *(*realpath_fn)(struct vfs_handle_struct *handle, const char *path); NTSTATUS (*notify_watch_fn)(struct vfs_handle_struct *handle, struct sys_notify_context *ctx, - struct notify_entry *e, const char *path, + uint32_t *filter, + uint32_t *subdir_filter, void (*callback)(struct sys_notify_context *ctx, void *private_data, struct notify_event *ev), @@ -676,8 +677,9 @@ int smb_vfs_call_mknod(struct vfs_handle_struct *handle, const char *path, char *smb_vfs_call_realpath(struct vfs_handle_struct *handle, const char *path); NTSTATUS smb_vfs_call_notify_watch(struct vfs_handle_struct *handle, struct sys_notify_context *ctx, - struct notify_entry *e, const char *name, + uint32_t *filter, + uint32_t *subdir_filter, void (*callback)(struct sys_notify_context *ctx, void *private_data, struct notify_event *ev), diff --git a/source3/include/vfs_macros.h b/source3/include/vfs_macros.h index 5e184e30093..68165fe092c 100644 --- a/source3/include/vfs_macros.h +++ b/source3/include/vfs_macros.h @@ -313,10 +313,10 @@ #define SMB_VFS_NEXT_REALPATH(handle, path) \ smb_vfs_call_realpath((handle)->next, (path)) -#define SMB_VFS_NOTIFY_WATCH(conn, ctx, e, path, callback, private_data, handle_p) \ - smb_vfs_call_notify_watch((conn)->vfs_handles, (ctx), (e), (path), (callback), (private_data), (handle_p)) -#define SMB_VFS_NEXT_NOTIFY_WATCH(conn, ctx, e, path, callback, private_data, handle_p) \ - smb_vfs_call_notify_watch((conn)->next, (ctx), (e), (path), (callback), (private_data), (handle_p)) +#define SMB_VFS_NOTIFY_WATCH(conn, ctx, path, filter, subdir_filter, callback, private_data, handle_p) \ + smb_vfs_call_notify_watch((conn)->vfs_handles, (ctx), (path), (filter), (subdir_filter), (callback), (private_data), (handle_p)) +#define SMB_VFS_NEXT_NOTIFY_WATCH(conn, ctx, path, filter, subdir_filter, callback, private_data, handle_p) \ + smb_vfs_call_notify_watch((conn)->next, (ctx), (path), (filter), (subdir_filter), (callback), (private_data), (handle_p)) #define SMB_VFS_CHFLAGS(conn, path, flags) \ smb_vfs_call_chflags((conn)->vfs_handles, (path), (flags)) diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c index 7b80df89043..568f3464520 100644 --- a/source3/modules/vfs_default.c +++ b/source3/modules/vfs_default.c @@ -1632,8 +1632,9 @@ static char *vfswrap_realpath(vfs_handle_struct *handle, const char *path) static NTSTATUS vfswrap_notify_watch(vfs_handle_struct *vfs_handle, struct sys_notify_context *ctx, - struct notify_entry *e, const char *path, + uint32_t *filter, + uint32_t *subdir_filter, void (*callback)(struct sys_notify_context *ctx, void *private_data, struct notify_event *ev), @@ -1649,8 +1650,8 @@ static NTSTATUS vfswrap_notify_watch(vfs_handle_struct *vfs_handle, */ #ifdef HAVE_INOTIFY if (lp_kernel_change_notify(vfs_handle->conn->params)) { - return inotify_watch(ctx, e, path, callback, private_data, - handle); + return inotify_watch(ctx, path, filter, subdir_filter, + callback, private_data, handle); } #endif /* diff --git a/source3/modules/vfs_full_audit.c b/source3/modules/vfs_full_audit.c index 24c2f8e3236..770d21f9efc 100644 --- a/source3/modules/vfs_full_audit.c +++ b/source3/modules/vfs_full_audit.c @@ -1379,8 +1379,9 @@ static char *smb_full_audit_realpath(vfs_handle_struct *handle, static NTSTATUS smb_full_audit_notify_watch(struct vfs_handle_struct *handle, struct sys_notify_context *ctx, - struct notify_entry *e, const char *path, + uint32_t *filter, + uint32_t *subdir_filter, void (*callback)(struct sys_notify_context *ctx, void *private_data, struct notify_event *ev), @@ -1388,7 +1389,8 @@ static NTSTATUS smb_full_audit_notify_watch(struct vfs_handle_struct *handle, { NTSTATUS result; - result = SMB_VFS_NEXT_NOTIFY_WATCH(handle, ctx, e, path, callback, + result = SMB_VFS_NEXT_NOTIFY_WATCH(handle, ctx, path, + filter, subdir_filter, callback, private_data, handle_p); do_log(SMB_VFS_OP_NOTIFY_WATCH, NT_STATUS_IS_OK(result), handle, ""); diff --git a/source3/modules/vfs_notify_fam.c b/source3/modules/vfs_notify_fam.c index 7ac6609c530..dcc843f6d8d 100644 --- a/source3/modules/vfs_notify_fam.c +++ b/source3/modules/vfs_notify_fam.c @@ -221,8 +221,9 @@ static int fam_watch_context_destructor(struct fam_watch_context *ctx) */ static NTSTATUS fam_watch(vfs_handle_struct *vfs_handle, struct sys_notify_context *ctx, - struct notify_entry *e, const char *path, + uint32_t *filter, + uint32_t *subdir_filter, void (*callback)(struct sys_notify_context *ctx, void *private_data, struct notify_event *ev), @@ -234,8 +235,8 @@ static NTSTATUS fam_watch(vfs_handle_struct *vfs_handle, struct fam_watch_context *watch; void **handle = (void **)handle_p; - if ((e->filter & fam_mask) == 0) { - DEBUG(10, ("filter = %u, ignoring in FAM\n", e->filter)); + if ((*filter & fam_mask) == 0) { + DEBUG(10, ("filter = %u, ignoring in FAM\n", *filter)); return NT_STATUS_OK; } @@ -274,7 +275,7 @@ static NTSTATUS fam_watch(vfs_handle_struct *vfs_handle, */ watch->filter = fam_mask; - e->filter &= ~fam_mask; + *filter &= ~fam_mask; DLIST_ADD(fam_notify_list, watch); talloc_set_destructor(watch, fam_watch_context_destructor); diff --git a/source3/modules/vfs_time_audit.c b/source3/modules/vfs_time_audit.c index 8ec434b5416..0066e075a22 100644 --- a/source3/modules/vfs_time_audit.c +++ b/source3/modules/vfs_time_audit.c @@ -1130,8 +1130,9 @@ static char *smb_time_audit_realpath(vfs_handle_struct *handle, static NTSTATUS smb_time_audit_notify_watch(struct vfs_handle_struct *handle, struct sys_notify_context *ctx, - struct notify_entry *e, const char *path, + uint32_t *filter, + uint32_t *subdir_filter, void (*callback)(struct sys_notify_context *ctx, void *private_data, struct notify_event *ev), @@ -1142,7 +1143,8 @@ static NTSTATUS smb_time_audit_notify_watch(struct vfs_handle_struct *handle, double timediff; clock_gettime_mono(&ts1); - result = SMB_VFS_NEXT_NOTIFY_WATCH(handle, ctx, e, path, callback, + result = SMB_VFS_NEXT_NOTIFY_WATCH(handle, ctx, path, + filter, subdir_filter, callback, private_data, handle_p); clock_gettime_mono(&ts2); timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9; diff --git a/source3/smbd/notify.c b/source3/smbd/notify.c index 53ae2d68e79..fd9e5524a7c 100644 --- a/source3/smbd/notify.c +++ b/source3/smbd/notify.c @@ -235,8 +235,8 @@ NTSTATUS change_notify_create(struct files_struct *fsp, uint32 filter, status = SMB_VFS_NOTIFY_WATCH( fsp->conn, fsp->conn->sconn->sys_notify_ctx, - &e, e.path, sys_notify_callback, fsp, - &sys_notify_handle); + e.path, &e.filter, &e.subdir_filter, + sys_notify_callback, fsp, &sys_notify_handle); if (NT_STATUS_IS_OK(status)) { talloc_steal(fsp->notify, sys_notify_handle); diff --git a/source3/smbd/notify_inotify.c b/source3/smbd/notify_inotify.c index 967c223adae..20f709831a7 100644 --- a/source3/smbd/notify_inotify.c +++ b/source3/smbd/notify_inotify.c @@ -371,8 +371,9 @@ static int watch_destructor(struct inotify_watch_context *w) talloc_free() on *handle */ NTSTATUS inotify_watch(struct sys_notify_context *ctx, - struct notify_entry *e, const char *path, + uint32_t *filter, + uint32_t *subdir_filter, void (*callback)(struct sys_notify_context *ctx, void *private_data, struct notify_event *ev), @@ -383,7 +384,7 @@ NTSTATUS inotify_watch(struct sys_notify_context *ctx, int wd; uint32_t mask; struct inotify_watch_context *w; - uint32_t orig_filter = e->filter; + uint32_t orig_filter = *filter; void **handle = (void **)handle_p; /* maybe setup the inotify fd */ @@ -395,7 +396,7 @@ NTSTATUS inotify_watch(struct sys_notify_context *ctx, in = talloc_get_type(ctx->private_data, struct inotify_private); - mask = inotify_map(&e->filter); + mask = inotify_map(filter); if (mask == 0) { /* this filter can't be handled by inotify */ return NT_STATUS_INVALID_PARAMETER; @@ -408,18 +409,18 @@ NTSTATUS inotify_watch(struct sys_notify_context *ctx, /* get a new watch descriptor for this path */ wd = inotify_add_watch(in->fd, path, mask); if (wd == -1) { - e->filter = orig_filter; + *filter = orig_filter; DEBUG(1, ("inotify_add_watch returned %s\n", strerror(errno))); return map_nt_error_from_unix(errno); } DEBUG(10, ("inotify_add_watch for %s mask %x returned wd %d\n", - e->path, mask, wd)); + path, mask, wd)); w = talloc(in, struct inotify_watch_context); if (w == NULL) { inotify_rm_watch(in->fd, wd); - e->filter = orig_filter; + *filter = orig_filter; return NT_STATUS_NO_MEMORY; } @@ -432,7 +433,7 @@ NTSTATUS inotify_watch(struct sys_notify_context *ctx, w->path = talloc_strdup(w, path); if (w->path == NULL) { inotify_rm_watch(in->fd, wd); - e->filter = orig_filter; + *filter = orig_filter; return NT_STATUS_NO_MEMORY; } diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h index 70c34ce35a3..4bb57c0d5c4 100644 --- a/source3/smbd/proto.h +++ b/source3/smbd/proto.h @@ -526,8 +526,9 @@ struct sys_notify_context *sys_notify_context_create(TALLOC_CTX *mem_ctx, /* The following definitions come from smbd/notify_inotify.c */ NTSTATUS inotify_watch(struct sys_notify_context *ctx, - struct notify_entry *e, const char *path, + uint32_t *filter, + uint32_t *subdir_filter, void (*callback)(struct sys_notify_context *ctx, void *private_data, struct notify_event *ev), diff --git a/source3/smbd/vfs.c b/source3/smbd/vfs.c index 6b7b8691aae..4c5e52be1ba 100644 --- a/source3/smbd/vfs.c +++ b/source3/smbd/vfs.c @@ -1833,15 +1833,17 @@ char *smb_vfs_call_realpath(struct vfs_handle_struct *handle, const char *path) NTSTATUS smb_vfs_call_notify_watch(struct vfs_handle_struct *handle, struct sys_notify_context *ctx, - struct notify_entry *e, const char *path, + uint32_t *filter, + uint32_t *subdir_filter, void (*callback)(struct sys_notify_context *ctx, void *private_data, struct notify_event *ev), void *private_data, void *handle_p) { VFS_FIND(notify_watch); - return handle->fns->notify_watch_fn(handle, ctx, e, path, callback, + return handle->fns->notify_watch_fn(handle, ctx, path, + filter, subdir_filter, callback, private_data, handle_p); } -- 2.11.4.GIT