splinter work on generic fs notification framework

Timothy R. Chavez tinytim at us.ibm.com
Tue Jul 12 20:02:43 UTC 2005


On Tuesday 12 July 2005 14:55, Greg KH wrote:
> On Tue, Jul 12, 2005 at 02:18:20PM -0500, Timothy R. Chavez wrote:
> > Hi,
> > 
> > I've CCed some folks that I thought might be interested in this update and may
> > not be on linux-audit.
> 
> Unfortunatly linux-audit is a closed list, so this post will probably
> bounce :(

I think that's unfortunate too.  I'm sorry about that.

> 
> > Based on recent discussion on LKML and some IRC conversations, a generic file 
> > system notification framework is being written to merge common functionality 
> > between the "auditfs" component of the audit framework and Inotify.  This 
> > framework will be mostly comprised of the watch logic implemented by the 
> > "auditfs" component (I_AUDIT, hash table, update hook, helper functions, etc) 
> > and the fsnotify hooks written by Robert Love.  User's of this framework will 
> > pass their own callback functions in when adding a watch via this framework 
> > which will effectively be stored on the watch and called from the watch hook 
> > that discovers it.
> > 
> > We introduce fs/watch.c and include/linux/watch.h
> 
> fswatch.h perhaps?

That's more descriptive (and consistent with the Kconfig entry).  Thanks.

> 
> > diff --exclude=.git -Nurp audit-2.6/include/linux/watch.h audit-2.6.git-fsnotify/include/linux/watch.h
> > --- audit-2.6/include/linux/watch.h	1969-12-31 18:00:00.000000000 -0600
> > +++ audit-2.6.git-fsnotify/include/linux/watch.h	2005-07-11 01:33:45.000000000 -0500
> > @@ -0,0 +1,57 @@
> > +#ifndef _WATCH_H
> > +#define _WATCH_H
> > +
> > +struct watch {
> > +	atomic_t                w_count;
> 
> Use a struct kref instead of rolling your own here.

Ok.

> 
> > +	struct hlist_node	w_node;		/* per-directory list         */
> > +	struct hlist_node	w_master;	/* Master watch list          */
> > +	struct hlist_node	w_watched;	/* Watches on inode           */
> > +	dev_t			w_dev;		/* Superblock device          */
> > +	__u32			w_perms;	/* Permissions filtering      */
> > +	char			*w_name;	/* Watch beneath parent       */
> > +	char			*w_path;	/* Insertion path             */
> > +	char			*w_filterkey;	/* An arbitrary filtering key */
> > +	void			(*w_func);	/* Callback function          */
> > +};
> > +
> > +struct watch_inode_data {
> > +        int			count;
> 
> same here.
> 
> > +        struct watch_inode_data *next_hash;	/* Watch data hash table      */
> 
> formatting issue.
> 
> > +	struct inode		*inode;		/* Inode to which it belongs  */
> > +	struct hlist_head	watches;	/* List of watches on inode   */
> > +	struct hlist_head	watchlist;	/* Watches for children       */
> > +};
> > +
> > +/* User */
> > +extern int watch_add(struct watch *, struct inode *);
> > +extern int watch_rem(struct watch *, struct inode *);
> > +extern struct watch *watch_alloc(void);
> > +extern struct watch *watch_get(struct watch *);
> > +extern void watch_free(struct watch *);
> > +extern void watch_put(struct watch *);
> 
> Why a difference?  The last watch_put should free the structure, right?

Good point.

> 
> > +
> > +/* Internals */
> > +
> > +extern int watch_init(void);
> > +extern void watch_inode_free(struct inode *);
> > +extern void watch_update(struct dentry *, int);
> > +
> > +/* Hooks */
> > +#ifdef CONFIG_FSWATCH
> > +extern const char *watch_notify_oldname_init(const char *);
> > +extern void watch_notify_oldname_free(const char *);
> > +extern void watch_notify_move(struct inode *, struct inode *, const char *, const char *, int);
> > +extern void watch_notify_unlink(struct dentry *, struct inode *);
> > +extern void watch_notify_rmdir(struct dentry *, struct inode *, struct inode *);
> > +extern void watch_notify_create(struct inode *, const char *);
> > +extern void watch_notify_mkdir(struct inode *, const char *);
> > +extern void watch_notify_access(struct dentry *dentry);
> > +extern void watch_notify_modify(struct dentry *dentry);
> > +extern void watch_notify_open(struct dentry *dentry, int mask);
> > +extern void watch_notify_close(struct file *file);
> > +extern void watch_notify_xattr(struct dentry *dentry);
> > +extern void watch_notify_change(struct dentry *dentry, unsigned int ia_valid);
> > +#endif /* CONFIG_FSWATCH */
> 
> No static inlines if !CONFIG_FSWATCH?

Oops!  And I remember making a mental note to myself last night to do that too.

-tim

> 
> thanks,
> 
> greg k-h
> 
> 




More information about the Linux-audit mailing list