1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Inode based directory notification for Linux
3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Copyright (C) 2005 John McCutchan
5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef _LINUX_INOTIFY_H
8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define _LINUX_INOTIFY_H
9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/types.h>
11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * struct inotify_event - structure read from the inotify device for each event
14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * When you are watching a directory, you will receive the filename for events
16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * such as IN_CREATE, IN_DELETE, IN_OPEN, IN_CLOSE, ..., relative to the wd.
17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct inotify_event {
19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__s32		wd;		/* watch descriptor */
20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u32		mask;		/* watch mask */
21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u32		cookie;		/* cookie to synchronize two events */
22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u32		len;		/* length (including nulls) of name */
23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	char		name[0];	/* stub for possible name */
24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* the following are legal, implemented events that user-space can watch for */
27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IN_ACCESS		0x00000001	/* File was accessed */
28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IN_MODIFY		0x00000002	/* File was modified */
29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IN_ATTRIB		0x00000004	/* Metadata changed */
30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IN_CLOSE_WRITE		0x00000008	/* Writtable file was closed */
31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IN_CLOSE_NOWRITE	0x00000010	/* Unwrittable file closed */
32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IN_OPEN			0x00000020	/* File was opened */
33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IN_MOVED_FROM		0x00000040	/* File was moved from X */
34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IN_MOVED_TO		0x00000080	/* File was moved to Y */
35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IN_CREATE		0x00000100	/* Subfile was created */
36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IN_DELETE		0x00000200	/* Subfile was deleted */
37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IN_DELETE_SELF		0x00000400	/* Self was deleted */
38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IN_MOVE_SELF		0x00000800	/* Self was moved */
39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* the following are legal events.  they are sent as needed to any watch */
41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IN_UNMOUNT		0x00002000	/* Backing fs was unmounted */
42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IN_Q_OVERFLOW		0x00004000	/* Event queued overflowed */
43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IN_IGNORED		0x00008000	/* File was ignored */
44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* helper events */
46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IN_CLOSE		(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE) /* close */
47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IN_MOVE			(IN_MOVED_FROM | IN_MOVED_TO) /* moves */
48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* special flags */
50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IN_ONLYDIR		0x01000000	/* only watch the path if it is a directory */
51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IN_DONT_FOLLOW		0x02000000	/* don't follow a sym link */
52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IN_MASK_ADD		0x20000000	/* add to the mask of an already existing watch */
53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IN_ISDIR		0x40000000	/* event occurred against dir */
54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IN_ONESHOT		0x80000000	/* only send event once */
55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * All of the events - we build the list by hand so that we can add flags in
58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * the future and not break backward compatibility.  Apps will get only the
59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * events that they originally wanted.  Be sure to add new events here!
60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IN_ALL_EVENTS	(IN_ACCESS | IN_MODIFY | IN_ATTRIB | IN_CLOSE_WRITE | \
62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			 IN_CLOSE_NOWRITE | IN_OPEN | IN_MOVED_FROM | \
63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			 IN_MOVED_TO | IN_DELETE | IN_CREATE | IN_DELETE_SELF | \
64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			 IN_MOVE_SELF)
65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef __KERNEL__
67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/dcache.h>
69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/fs.h>
70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * struct inotify_watch - represents a watch request on a specific inode
73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * h_list is protected by ih->mutex of the associated inotify_handle.
75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * i_list, mask are protected by inode->inotify_mutex of the associated inode.
76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * ih, inode, and wd are never written to once the watch is created.
77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Callers must use the established inotify interfaces to access inotify_watch
79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * contents.  The content of this structure is private to the inotify
80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * implementation.
81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct inotify_watch {
83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct list_head	h_list;	/* entry in inotify_handle's list */
84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct list_head	i_list;	/* entry in inode's list */
85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	atomic_t		count;	/* reference count */
86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct inotify_handle	*ih;	/* associated inotify handle */
87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct inode		*inode;	/* associated inode */
88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__s32			wd;	/* watch descriptor */
89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__u32			mask;	/* event mask for this watch */
90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct inotify_operations {
93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	void (*handle_event)(struct inotify_watch *, u32, u32, u32,
94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			     const char *, struct inode *);
95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	void (*destroy_watch)(struct inotify_watch *);
96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_INOTIFY
99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Kernel API for producing events */
101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void inotify_d_instantiate(struct dentry *, struct inode *);
103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void inotify_d_move(struct dentry *);
104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void inotify_inode_queue_event(struct inode *, __u32, __u32,
105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				      const char *, struct inode *);
106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void inotify_dentry_parent_queue_event(struct dentry *, __u32, __u32,
107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru					      const char *);
108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void inotify_unmount_inodes(struct list_head *);
109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void inotify_inode_is_dead(struct inode *);
110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern u32 inotify_get_cookie(void);
111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Kernel Consumer API */
113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct inotify_handle *inotify_init(const struct inotify_operations *);
115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void inotify_init_watch(struct inotify_watch *);
116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void inotify_destroy(struct inotify_handle *);
117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern __s32 inotify_find_watch(struct inotify_handle *, struct inode *,
118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				struct inotify_watch **);
119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern __s32 inotify_find_update_watch(struct inotify_handle *, struct inode *,
120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				       u32);
121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern __s32 inotify_add_watch(struct inotify_handle *, struct inotify_watch *,
122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			       struct inode *, __u32);
123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int inotify_rm_watch(struct inotify_handle *, struct inotify_watch *);
124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int inotify_rm_wd(struct inotify_handle *, __u32);
125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void inotify_remove_watch_locked(struct inotify_handle *,
126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru					struct inotify_watch *);
127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void get_inotify_watch(struct inotify_watch *);
128c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void put_inotify_watch(struct inotify_watch *);
129c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
130c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else
131c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
132c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void inotify_d_instantiate(struct dentry *dentry,
133c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru					struct inode *inode)
134c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
135c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
136c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
137c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void inotify_d_move(struct dentry *dentry)
138c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
139c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
140c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
141c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void inotify_inode_queue_event(struct inode *inode,
142c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru					     __u32 mask, __u32 cookie,
143c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru					     const char *filename,
144c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru					     struct inode *n_inode)
145c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
146c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
147c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
148c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void inotify_dentry_parent_queue_event(struct dentry *dentry,
149c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru						     __u32 mask, __u32 cookie,
150c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru						     const char *filename)
151c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
152c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
153c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
154c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void inotify_unmount_inodes(struct list_head *list)
155c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
156c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
157c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
158c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void inotify_inode_is_dead(struct inode *inode)
159c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
160c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
161c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
162c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline u32 inotify_get_cookie(void)
163c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
164c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return 0;
165c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
166c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
167c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline struct inotify_handle *inotify_init(const struct inotify_operations *ops)
168c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
169c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return ERR_PTR(-EOPNOTSUPP);
170c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
171c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
172c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void inotify_init_watch(struct inotify_watch *watch)
173c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
174c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
175c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
176c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void inotify_destroy(struct inotify_handle *ih)
177c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
178c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
179c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
180c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline __s32 inotify_find_watch(struct inotify_handle *ih, struct inode *inode,
181c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				       struct inotify_watch **watchp)
182c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
183c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return -EOPNOTSUPP;
184c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
185c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
186c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline __s32 inotify_find_update_watch(struct inotify_handle *ih,
187c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru					      struct inode *inode, u32 mask)
188c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
189c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return -EOPNOTSUPP;
190c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
191c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
192c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline __s32 inotify_add_watch(struct inotify_handle *ih,
193c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				      struct inotify_watch *watch,
194c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				      struct inode *inode, __u32 mask)
195c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
196c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return -EOPNOTSUPP;
197c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
198c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
199c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int inotify_rm_watch(struct inotify_handle *ih,
200c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				   struct inotify_watch *watch)
201c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
202c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return -EOPNOTSUPP;
203c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
204c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
205c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int inotify_rm_wd(struct inotify_handle *ih, __u32 wd)
206c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
207c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return -EOPNOTSUPP;
208c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
209c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
210c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void inotify_remove_watch_locked(struct inotify_handle *ih,
211c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru					       struct inotify_watch *watch)
212c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
213c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
214c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
215c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void get_inotify_watch(struct inotify_watch *watch)
216c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
217c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
218c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
219c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void put_inotify_watch(struct inotify_watch *watch)
220c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
221c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
222c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
223c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif	/* CONFIG_INOTIFY */
224c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
225c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif	/* __KERNEL __ */
226c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
227c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif	/* _LINUX_INOTIFY_H */
228