diff options
Diffstat (limited to 'include/linux/fs.h')
-rw-r--r-- | include/linux/fs.h | 70 |
1 files changed, 31 insertions, 39 deletions
diff --git a/include/linux/fs.h b/include/linux/fs.h index 35530b777..c10d1793b 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -251,6 +251,7 @@ extern void set_bh_page(struct buffer_head *bh, struct page *page, unsigned long #define touch_buffer(bh) set_bit(PG_referenced, &bh->b_page->flags) + #include <linux/pipe_fs_i.h> #include <linux/minix_fs_i.h> #include <linux/ext2_fs_i.h> @@ -332,10 +333,23 @@ struct iattr { * oh the beauties of C type declarations. */ struct page; +struct address_space; + +struct address_space_operations { + int (*writepage) (struct dentry *, struct page *); + int (*readpage)(struct dentry *, struct page *); + int (*prepare_write)(struct page *, unsigned, unsigned); + int (*commit_write)(struct file *, struct page *, unsigned, unsigned); + /* Unfortunately this kludge is needed for FIBMAP. Don't use it */ + int (*bmap)(struct address_space *, long); +}; struct address_space { - struct list_head pages; - unsigned long nrpages; + struct list_head pages; /* list of pages */ + unsigned long nrpages; /* number of pages */ + struct address_space_operations *a_ops; /* methods */ + void *host; /* owner: inode, block_device */ + void *private; /* private data */ }; struct block_device { @@ -374,6 +388,7 @@ struct inode { wait_queue_head_t i_wait; struct file_lock *i_flock; struct vm_area_struct *i_mmap; + struct address_space *i_mapping; struct address_space i_data; spinlock_t i_shared_lock; struct dquot *i_dquot[MAXQUOTAS]; @@ -655,24 +670,6 @@ struct inode_operations { struct inode *, struct dentry *); int (*readlink) (struct dentry *, char *,int); struct dentry * (*follow_link) (struct dentry *, struct dentry *, unsigned int); - /* - * the order of these functions within the VFS template has been - * changed because SMP locking has changed: from now on all get_block, - * readpage and writepage functions are supposed to do - * whatever locking they need to get proper SMP operation - for - * now in most cases this means a lock/unlock_kernel at entry/exit. - * [The new order is also slightly more logical :)] - */ - /* - * Generic block allocator exported by the lowlevel fs. All metadata - * details are handled by the lowlevel fs, all 'logical data content' - * details are handled by the highlevel block layer. - */ - int (*get_block) (struct inode *, long, struct buffer_head *, int); - - int (*readpage) (struct dentry *, struct page *); - int (*writepage) (struct dentry *, struct page *); - void (*truncate) (struct inode *); int (*permission) (struct inode *, int); int (*revalidate) (struct dentry *); @@ -779,7 +776,6 @@ extern int blkdev_put(struct block_device *, int); extern int register_chrdev(unsigned int, const char *, struct file_operations *); extern int unregister_chrdev(unsigned int, const char *); extern int chrdev_open(struct inode *, struct file *); -extern struct file_operations def_chr_fops; extern const char * bdevname(kdev_t); extern const char * cdevname(kdev_t); extern const char * kdevname(kdev_t); @@ -852,20 +848,17 @@ extern inline void mark_buffer_protected(struct buffer_head * bh) } extern void FASTCALL(__mark_buffer_dirty(struct buffer_head *bh, int flag)); +extern void FASTCALL(mark_buffer_dirty(struct buffer_head *bh, int flag)); #define atomic_set_buffer_dirty(bh) test_and_set_bit(BH_Dirty, &(bh)->b_state) -extern inline void mark_buffer_dirty(struct buffer_head * bh, int flag) -{ - if (!atomic_set_buffer_dirty(bh)) - __mark_buffer_dirty(bh, flag); -} - extern void balance_dirty(kdev_t); extern int check_disk_change(kdev_t); extern int invalidate_inodes(struct super_block *); extern void invalidate_inode_pages(struct inode *); -extern void invalidate_buffers(kdev_t); +#define invalidate_buffers(dev) __invalidate_buffers((dev), 0) +#define destroy_buffers(dev) __invalidate_buffers((dev), 1) +extern void __invalidate_buffers(kdev_t dev, int); extern int floppy_is_wp(int); extern void sync_inodes(kdev_t); extern void write_inode_now(struct inode *); @@ -978,30 +971,29 @@ extern void wakeup_bdflush(int wait); extern int brw_page(int, struct page *, kdev_t, int [], int); typedef int (*writepage_t)(struct file *, struct page *, unsigned long, unsigned long, const char *); +typedef int (get_block_t)(struct inode*,long,struct buffer_head*,int); /* Generic buffer handling for block filesystems.. */ -extern int block_read_full_page(struct dentry *, struct page *); -extern int block_write_full_page (struct dentry *, struct page *); -extern int block_write_partial_page (struct file *, struct page *, unsigned long, unsigned long, const char *); -extern int block_write_cont_page (struct file *, struct page *, unsigned long, unsigned long, const char *); -extern int block_write_zero_range(struct inode *, struct page *, unsigned, unsigned, unsigned, const char *); -extern inline int block_write_range(struct inode *inode, struct page *page, - unsigned from, unsigned len,const char *buf) -{ - return block_write_zero_range(inode, page, from, from, from+len, buf); -} extern int block_flushpage(struct page *, unsigned long); extern int block_symlink(struct inode *, const char *, int); +extern int block_write_full_page(struct page*, get_block_t*); +extern int block_read_full_page(struct page*, get_block_t*); +extern int block_prepare_write(struct page*, unsigned, unsigned, get_block_t*); +extern int cont_prepare_write(struct page*, unsigned, unsigned, get_block_t*, + unsigned long *); +int generic_block_bmap(struct address_space *, long, get_block_t *); +int generic_commit_write(struct file *, struct page *, unsigned, unsigned); extern int generic_file_mmap(struct file *, struct vm_area_struct *); extern ssize_t generic_file_read(struct file *, char *, size_t, loff_t *); -extern ssize_t generic_file_write(struct file *, const char *, size_t, loff_t *, writepage_t); +extern ssize_t generic_file_write(struct file *, const char *, size_t, loff_t *); extern void do_generic_file_read(struct file *, loff_t *, read_descriptor_t *, read_actor_t); extern int vfs_readlink(struct dentry *, char *, int, const char *); extern struct dentry *vfs_follow_link(struct dentry *, struct dentry *, unsigned, const char *); extern int page_readlink(struct dentry *, char *, int); extern struct dentry *page_follow_link(struct dentry *, struct dentry *, unsigned); +struct inode_operations page_symlink_inode_operations; extern struct super_block *get_super(kdev_t); struct super_block *get_empty_super(void); |