aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/fsnotify_backend.h
diff options
context:
space:
mode:
authorEric Paris <eparis@redhat.com>2009-12-17 21:24:33 -0500
committerEric Paris <eparis@redhat.com>2010-07-28 09:58:59 -0400
commit90b1e7a57880fb66437ab7db39e1e65ca0372822 (patch)
tree61b7195c84d9dfd057ed3dcb07c5fc831db6a3a9 /include/linux/fsnotify_backend.h
parent33d3dfff451a2ab6fe2f6aaabed9b24e91aad109 (diff)
fsnotify: allow marks to not pin inodes in core
inotify marks must pin inodes in core. dnotify doesn't technically need to since they are closed when the directory is closed. fanotify also need to pin inodes in core as it works today. But the next step is to introduce the concept of 'ignored masks' which is actually a mask of events for an inode of no interest. I claim that these should be liberally sent to the kernel and should not pin the inode in core. If the inode is brought back in the listener will get an event it may have thought excluded, but this is not a serious situation and one any listener should deal with. This patch lays the ground work for non-pinning inode marks by using lazy inode pinning. We do not pin a mark until it has a non-zero mask entry. If a listener new sets a mask we never pin the inode. Signed-off-by: Eric Paris <eparis@redhat.com>
Diffstat (limited to 'include/linux/fsnotify_backend.h')
-rw-r--r--include/linux/fsnotify_backend.h7
1 files changed, 5 insertions, 2 deletions
diff --git a/include/linux/fsnotify_backend.h b/include/linux/fsnotify_backend.h
index 2d2f015fb700..489c881ed4ec 100644
--- a/include/linux/fsnotify_backend.h
+++ b/include/linux/fsnotify_backend.h
@@ -267,8 +267,9 @@ struct fsnotify_mark {
267 struct fsnotify_vfsmount_mark m; 267 struct fsnotify_vfsmount_mark m;
268 }; 268 };
269 struct list_head free_g_list; /* tmp list used when freeing this mark */ 269 struct list_head free_g_list; /* tmp list used when freeing this mark */
270#define FSNOTIFY_MARK_FLAG_INODE 0x01 270#define FSNOTIFY_MARK_FLAG_INODE 0x01
271#define FSNOTIFY_MARK_FLAG_VFSMOUNT 0x02 271#define FSNOTIFY_MARK_FLAG_VFSMOUNT 0x02
272#define FSNOTIFY_MARK_FLAG_OBJECT_PINNED 0x04
272 unsigned int flags; /* vfsmount or inode mark? */ 273 unsigned int flags; /* vfsmount or inode mark? */
273 void (*free_mark)(struct fsnotify_mark *mark); /* called on final put+free */ 274 void (*free_mark)(struct fsnotify_mark *mark); /* called on final put+free */
274}; 275};
@@ -372,6 +373,8 @@ extern struct fsnotify_mark *fsnotify_find_inode_mark(struct fsnotify_group *gro
372extern struct fsnotify_mark *fsnotify_find_vfsmount_mark(struct fsnotify_group *group, struct vfsmount *mnt); 373extern struct fsnotify_mark *fsnotify_find_vfsmount_mark(struct fsnotify_group *group, struct vfsmount *mnt);
373/* copy the values from old into new */ 374/* copy the values from old into new */
374extern void fsnotify_duplicate_mark(struct fsnotify_mark *new, struct fsnotify_mark *old); 375extern void fsnotify_duplicate_mark(struct fsnotify_mark *new, struct fsnotify_mark *old);
376/* set the mask of a mark (might pin the object into memory */
377extern void fsnotify_set_mark_mask_locked(struct fsnotify_mark *mark, __u32 mask);
375/* attach the mark to both the group and the inode */ 378/* attach the mark to both the group and the inode */
376extern int fsnotify_add_mark(struct fsnotify_mark *mark, struct fsnotify_group *group, 379extern int fsnotify_add_mark(struct fsnotify_mark *mark, struct fsnotify_group *group,
377 struct inode *inode, struct vfsmount *mnt, int allow_dups); 380 struct inode *inode, struct vfsmount *mnt, int allow_dups);