notify_inotify: Slightly simplify inotify_watch
authorVolker Lendecke <vl@samba.org>
Mon, 27 Oct 2014 13:15:12 +0000 (13:15 +0000)
committerJeremy Allison <jra@samba.org>
Tue, 9 Dec 2014 03:12:09 +0000 (04:12 +0100)
tallocing first avoids having to call inotify_rm_watch

This even fixes a real error: We share inotifies between different instances,
so the rm_watch in the error paths destroys other legitimate watches

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/smbd/notify_inotify.c

index 613b0387d72fb7f34799554a1f943ee29cabbfca..b141b9211681e00ba7208bc0c7bad54b4f6b6e04 100644 (file)
@@ -355,7 +355,6 @@ NTSTATUS inotify_watch(struct sys_notify_context *ctx,
                       void *handle_p)
 {
        struct inotify_private *in;
-       int wd;
        uint32_t mask;
        struct inotify_watch_context *w;
        uint32_t orig_filter = *filter;
@@ -382,38 +381,37 @@ NTSTATUS inotify_watch(struct sys_notify_context *ctx,
           watch descriptor for multiple watches on the same path */
        mask |= (IN_MASK_ADD | IN_ONLYDIR);
 
-       /* get a new watch descriptor for this path */
-       wd = inotify_add_watch(in->fd, path, mask);
-       if (wd == -1) {
-               *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",
-                  path, mask, wd));
-
        w = talloc(in, struct inotify_watch_context);
        if (w == NULL) {
-               inotify_rm_watch(in->fd, wd);
                *filter = orig_filter;
                return NT_STATUS_NO_MEMORY;
        }
 
        w->in = in;
-       w->wd = wd;
        w->callback = callback;
        w->private_data = private_data;
        w->mask = mask;
        w->filter = orig_filter;
        w->path = talloc_strdup(w, path);
        if (w->path == NULL) {
-               inotify_rm_watch(in->fd, wd);
                *filter = orig_filter;
                TALLOC_FREE(w);
                return NT_STATUS_NO_MEMORY;
        }
 
+       /* get a new watch descriptor for this path */
+       w->wd = inotify_add_watch(in->fd, path, mask);
+       if (w->wd == -1) {
+               int err = errno;
+               *filter = orig_filter;
+               TALLOC_FREE(w);
+               DEBUG(1, ("inotify_add_watch returned %s\n", strerror(err)));
+               return map_nt_error_from_unix(err);
+       }
+
+       DEBUG(10, ("inotify_add_watch for %s mask %x returned wd %d\n",
+                  path, mask, w->wd));
+
        (*handle) = w;
 
        DLIST_ADD(in->watches, w);