[PATCH] inotify
inotify is intended to correct the deficiencies of dnotify, particularly its inability to scale and its terrible user interface: * dnotify requires the opening of one fd per each directory that you intend to watch. This quickly results in too many open files and pins removable media, preventing unmount. * dnotify is directory-based. You only learn about changes to directories. Sure, a change to a file in a directory affects the directory, but you are then forced to keep a cache of stat structures. * dnotify's interface to user-space is awful. Signals? inotify provides a more usable, simple, powerful solution to file change notification: * inotify's interface is a system call that returns a fd, not SIGIO. You get a single fd, which is select()-able. * inotify has an event that says "the filesystem that the item you were watching is on was unmounted." * inotify can watch directories or files. Inotify is currently used by Beagle (a desktop search infrastructure), Gamin (a FAM replacement), and other projects. See Documentation/filesystems/inotify.txt. Signed-off-by: Robert Love <rml@novell.com> Cc: John McCutchan <ttb@tentacle.dhs.org> Cc: Christoph Hellwig <hch@lst.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
bd4c625c06
commit
0eeca28300
33
fs/attr.c
33
fs/attr.c
@@ -10,7 +10,7 @@
|
||||
#include <linux/mm.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <linux/dnotify.h>
|
||||
#include <linux/fsnotify.h>
|
||||
#include <linux/fcntl.h>
|
||||
#include <linux/quotaops.h>
|
||||
#include <linux/security.h>
|
||||
@@ -107,31 +107,8 @@ int inode_setattr(struct inode * inode, struct iattr * attr)
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(inode_setattr);
|
||||
|
||||
int setattr_mask(unsigned int ia_valid)
|
||||
{
|
||||
unsigned long dn_mask = 0;
|
||||
|
||||
if (ia_valid & ATTR_UID)
|
||||
dn_mask |= DN_ATTRIB;
|
||||
if (ia_valid & ATTR_GID)
|
||||
dn_mask |= DN_ATTRIB;
|
||||
if (ia_valid & ATTR_SIZE)
|
||||
dn_mask |= DN_MODIFY;
|
||||
/* both times implies a utime(s) call */
|
||||
if ((ia_valid & (ATTR_ATIME|ATTR_MTIME)) == (ATTR_ATIME|ATTR_MTIME))
|
||||
dn_mask |= DN_ATTRIB;
|
||||
else if (ia_valid & ATTR_ATIME)
|
||||
dn_mask |= DN_ACCESS;
|
||||
else if (ia_valid & ATTR_MTIME)
|
||||
dn_mask |= DN_MODIFY;
|
||||
if (ia_valid & ATTR_MODE)
|
||||
dn_mask |= DN_ATTRIB;
|
||||
return dn_mask;
|
||||
}
|
||||
|
||||
int notify_change(struct dentry * dentry, struct iattr * attr)
|
||||
{
|
||||
struct inode *inode = dentry->d_inode;
|
||||
@@ -197,11 +174,9 @@ int notify_change(struct dentry * dentry, struct iattr * attr)
|
||||
if (ia_valid & ATTR_SIZE)
|
||||
up_write(&dentry->d_inode->i_alloc_sem);
|
||||
|
||||
if (!error) {
|
||||
unsigned long dn_mask = setattr_mask(ia_valid);
|
||||
if (dn_mask)
|
||||
dnotify_parent(dentry, dn_mask);
|
||||
}
|
||||
if (!error)
|
||||
fsnotify_change(dentry, ia_valid);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user