kevent: fs/aio notifications.
Subsystems (5)
RFC 3/4 kevent: fs/aio notifications.
This patch includes asynchronous propagation of file's data into VFS cache and aio_sendfile() implementation.
Signed-off-by Evgeniy Polyakov <[email protected]>
fs/bio.c +1 -1
@@ -119,7 +119,7 @@ void bio_free(struct bio *bio, struct bi/* * default destructor for a bio allocated with bio_alloc_bioset() */ -static void bio_fs_destructor (struct bio *bio) +void bio_fs_destructor (struct bio *bio) {bio_free (bio, fs_bio_set); }
fs/ext2/inode.c +1 -0
@@ -685,6 +685,7 @@ ext2_writepages(struct address_space *ma }struct address_space_operations ext2_aops = { + .get_block = ext2_get_block, .readpage = ext2_readpage, .readpages = ext2_readpages, .writepage = ext2_writepage,
fs/ext3/inode.c +1 -0
@@ -1700,6 +1700,7 @@ static int ext3_journalled_set_page_dirt }static struct address_space_operations ext3_ordered_aops = { + .get_block = ext3_get_block, .readpage = ext3_readpage, .readpages = ext3_readpages, .writepage = ext3_ordered_writepage,
fs/file_table.c +6 -0
@@ -113,6 +113,9 @@ struct file *get_empty_filp(void)if (security_file_alloc (f)) goto fail_sec; +#ifdef CONFIG_KEVENT_POLL +kevent_storage_init (f, &f->st); +#endif tsk = current;INIT_LIST_HEAD (&f->f_u.fu_list);atomic_set (&f->f_count,1 );
@@ -160,6 +163,9 @@ void fastcall __fput(struct file *file)might_sleep ();fsnotify_close (file); +#ifdef CONFIG_KEVENT_POLL +kevent_storage_fini (&file->st); +#endif /* * The function eventpoll_release() should be the first called * in the file cleanup chain.
fs/inode.c +7 -0
@@ -22,6 +22,7 @@ #include <linux/pagemap.h>#include <linux/cdev.h> #include <linux/bootmem.h> #include <linux/inotify.h> +#include <linux/kevent.h> #include <linux/mount.h> /*
@@ -166,12 +167,18 @@ #endif }memset (&inode->u,0 ,sizeof (inode->u)); inode->i_mapping = mapping; +#if definedCONFIG_KEVENT +kevent_storage_init (inode, &inode->st); +#endif }return inode; }void destroy_inode (struct inode *inode) { +#if definedCONFIG_KEVENT_INODE || definedCONFIG_KEVENT_SOCKET +kevent_storage_fini (&inode->st); +#endif BUG_ON (inode_has_buffers (inode));security_inode_free (inode);if (inode->i_sb->s_op->destroy_inode)
fs/reiserfs/inode.c +1 -0
@@ -2997,6 +2997,7 @@ int reiserfs_setattr(struct dentry *dent }struct address_space_operations reiserfs_address_space_operations = { + .get_block = reiserfs_get_block, .writepage = reiserfs_writepage, .readpage = reiserfs_readpage, .readpages = reiserfs_readpages,
include/linux/fs.h +12 -0
@@ -236,6 +236,9 @@ #include <linux/mutex.h>#include <asm/atomic.h> #include <asm/semaphore.h> #include <asm/byteorder.h> +#ifdef CONFIG_KEVENT +#include <linux/kevent_storage.h> +#endif struct hd_geometry ;struct iovec ;
@@ -348,6 +351,8 @@ struct address_space;struct writeback_control ;struct address_space_operations { +int (*get_block)(struct inode *inode,sector_t iblock, +struct buffer_head *bh_result,int create);int (*writepage)(struct page *page,struct writeback_control *wbc);int (*readpage)(struct file *,struct page *);void (*sync_page)(struct page *);
@@ -526,6 +531,10 @@ #ifdef CONFIG_INOTIFYstruct mutex inotify_mutex;/* protects the watches list */ #endif +#ifdef CONFIG_KEVENT_INODE +struct kevent_storage st; +#endif +unsigned long i_state;unsigned long dirtied_when;/* jiffies of first dirtying */
@@ -659,6 +668,9 @@ #ifdef CONFIG_EPOLLstruct list_head f_ep_links;spinlock_t f_ep_lock;#endif /* #ifdef CONFIG_EPOLL */ +#ifdef CONFIG_KEVENT_POLL +struct kevent_storage st; +#endif struct address_space *f_mapping; };extern spinlock_t files_lock;
include/linux/fsnotify.h +5 -0
@@ -15,6 +15,7 @@ #ifdef __KERNEL__#include <linux/dnotify.h> #include <linux/inotify.h> +#include <linux/kevent.h> #include <linux/audit.h> /*
@@ -79,6 +80,7 @@ static inline void fsnotify_nameremove(s isdir =IN_ISDIR ;dnotify_parent (dentry,DN_DELETE );inotify_dentry_parent_queue_event (dentry,IN_DELETE |isdir,0 , dentry->d_name.name); +kevent_inode_notify_parent (dentry,KEVENT_INODE_REMOVE ); }/*
@@ -88,6 +90,7 @@ static inline void fsnotify_inoderemove( {inotify_inode_queue_event (inode,IN_DELETE_SELF ,0 ,NULL ,NULL );inotify_inode_is_dead (inode); +kevent_inode_remove (inode); }/*
@@ -96,6 +99,7 @@ static inline void fsnotify_inoderemove(static inline void fsnotify_create (struct inode *inode,struct dentry *dentry) {inode_dir_notify (inode,DN_CREATE ); +kevent_inode_notify (inode,KEVENT_INODE_CREATE );inotify_inode_queue_event (inode,IN_CREATE ,0 , dentry->d_name.name, dentry->d_inode);audit_inode_child (dentry->d_name.name, dentry->d_inode, inode->i_ino);
@@ -107,6 +111,7 @@ static inline void fsnotify_create(strucstatic inline void fsnotify_mkdir (struct inode *inode,struct dentry *dentry) {inode_dir_notify (inode,DN_CREATE ); +kevent_inode_notify (inode,KEVENT_INODE_CREATE );inotify_inode_queue_event (inode,IN_CREATE |IN_ISDIR ,0 , dentry->d_name.name, dentry->d_inode);audit_inode_child (dentry->d_name.name, dentry->d_inode, inode->i_ino);
kernel/kevent/kevent_aio.c new file +580 -0
580 lines not on this page · raw message
kernel/kevent/kevent_inode.c new file +110 -0
110 lines not on this page · raw message
Signature · 1 line
Evgeniy Polyakov