Inotify 0.23 introduces a ONE_SHOT mechanism analogous to the dnotify
behaviour. This messed up the event bitmasks. Attached is a patch that
fixes the behaviour.

John
Index: server/local_inotify.h
===================================================================
RCS file: /cvs/gnome/gamin/server/local_inotify.h,v
retrieving revision 1.6
diff -u -r1.6 local_inotify.h
--- server/local_inotify.h      16 Mar 2005 22:04:15 -0000      1.6
+++ server/local_inotify.h      29 Apr 2005 17:34:22 -0000
@@ -8,7 +8,6 @@
 #define _LINUX_INOTIFY_H
 
 #include <linux/types.h>
-#include <linux/limits.h>
 
 /*
  * struct inotify_event - structure read from the inotify device for each event
@@ -20,7 +19,7 @@
        __s32           wd;             /* watch descriptor */
        __u32           mask;           /* watch mask */
        __u32           cookie;         /* cookie to synchronize two events */
-       size_t          len;            /* length (including nulls) of name */
+       __u32           len;            /* length (including nulls) of name */
        char            name[0];        /* stub for possible name */
 };
 
@@ -34,27 +33,42 @@
        __u32           mask;           /* event mask */
 };
 
-/* the following are legal, implemented events */
+/* the following are legal, implemented events that user-space can watch for */
 #define IN_ACCESS              0x00000001      /* File was accessed */
 #define IN_MODIFY              0x00000002      /* File was modified */
-#define IN_ATTRIB              0x00000004      /* File changed attributes */
+#define IN_ATTRIB              0x00000004      /* Metadata changed */
 #define IN_CLOSE_WRITE         0x00000008      /* Writtable file was closed */
 #define IN_CLOSE_NOWRITE       0x00000010      /* Unwrittable file closed */
 #define IN_OPEN                        0x00000020      /* File was opened */
 #define IN_MOVED_FROM          0x00000040      /* File was moved from X */
 #define IN_MOVED_TO            0x00000080      /* File was moved to Y */
-#define IN_DELETE_SUBDIR       0x00000100      /* Subdir was deleted */ 
+#define IN_DELETE_SUBDIR       0x00000100      /* Subdir was deleted */
 #define IN_DELETE_FILE         0x00000200      /* Subfile was deleted */
 #define IN_CREATE_SUBDIR       0x00000400      /* Subdir was created */
 #define IN_CREATE_FILE         0x00000800      /* Subfile was created */
 #define IN_DELETE_SELF         0x00001000      /* Self was deleted */
+
+/* the following are legal events.  they are sent as needed to any watch */
 #define IN_UNMOUNT             0x00002000      /* Backing fs was unmounted */
 #define IN_Q_OVERFLOW          0x00004000      /* Event queued overflowed */
 #define IN_IGNORED             0x00008000      /* File was ignored */
 
+/* helper events */
+#define IN_CLOSE               (IN_CLOSE_WRITE | IN_CLOSE_NOWRITE) /* close */
+#define IN_MOVE                        (IN_MOVED_FROM | IN_MOVED_TO) /* moves 
*/
+
 /* special flags */
-#define IN_ALL_EVENTS          0xffffffff      /* All the events */
-#define IN_CLOSE               (IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
+#define IN_ONESHOT             0x80000000      /* only send event once */
+
+/*
+ * All of the events - we build the list by hand so that we can add flags in
+ * the future and not break backward compatibility.  Apps will get only the
+ * events that they originally wanted.  Be sure to add new events here!
+ */
+#define IN_ALL_EVENTS  (IN_ACCESS | IN_MODIFY | IN_ATTRIB | IN_CLOSE_WRITE | \
+                        IN_CLOSE_NOWRITE | IN_OPEN | IN_MOVED_FROM | \
+                        IN_MOVED_TO | IN_DELETE_SUBDIR | IN_DELETE_FILE | \
+                        IN_CREATE_SUBDIR | IN_CREATE_FILE | IN_DELETE_SELF)
 
 #define INOTIFY_IOCTL_MAGIC    'Q'
 #define INOTIFY_IOCTL_MAXNR    2
@@ -67,7 +81,6 @@
 #include <linux/dcache.h>
 #include <linux/fs.h>
 #include <linux/config.h>
-#include <asm/atomic.h>
 
 #ifdef CONFIG_INOTIFY
 
@@ -75,7 +88,7 @@
                                      const char *);
 extern void inotify_dentry_parent_queue_event(struct dentry *, __u32, __u32,
                                              const char *);
-extern void inotify_super_block_umount(struct super_block *);
+extern void inotify_unmount_inodes(struct list_head *);
 extern void inotify_inode_is_dead(struct inode *);
 extern u32 inotify_get_cookie(void);
 
@@ -93,7 +106,7 @@
 {
 }
 
-static inline void inotify_super_block_umount(struct super_block *sb)
+static inline void inotify_unmount_inodes(struct list_head *list)
 {
 }
 
_______________________________________________
Gamin-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/gamin-list

Reply via email to