From 7a24f1a6d522cce1e319f434a202f7d6944924bc Mon Sep 17 00:00:00 2001 From: Jan Harkes Date: Sun, 19 May 2002 19:24:57 -0700 Subject: [PATCH] iget_locked [1/6] Fix a race in iget4. The fs specific data that is used to find an inode should be initialized while still holding the inode lock. It adds a 'set' callback function that should be a non-blocking FS provided function which initializes the private parts of the inode so that the 'test' callback function can correctly match new inodes. Touches all filesystems that use iget4 (Coda/NFS/ReiserFS). --- include/linux/fs.h | 5 ++--- include/linux/reiserfs_fs.h | 2 ++ 2 files changed, 4 insertions(+), 3 deletions(-) (limited to 'include/linux') diff --git a/include/linux/fs.h b/include/linux/fs.h index 5534da65ff74..4b551cb0326a 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1207,11 +1207,10 @@ extern void force_delete(struct inode *); extern struct inode * igrab(struct inode *); extern ino_t iunique(struct super_block *, ino_t); -typedef int (*find_inode_t)(struct inode *, unsigned long, void *); -extern struct inode * iget4(struct super_block *, unsigned long, find_inode_t, void *); +extern struct inode * iget4(struct super_block *, unsigned long, int (*test)(struct inode *, void *), int (*set)(struct inode *, void *), void *); static inline struct inode *iget(struct super_block *sb, unsigned long ino) { - return iget4(sb, ino, NULL, NULL); + return iget4(sb, ino, NULL, NULL, NULL); } extern void __iget(struct inode * inode); diff --git a/include/linux/reiserfs_fs.h b/include/linux/reiserfs_fs.h index a64b5bc5e7de..22c5547e86bc 100644 --- a/include/linux/reiserfs_fs.h +++ b/include/linux/reiserfs_fs.h @@ -1820,6 +1820,8 @@ void padd_item (char * item, int total_length, int length); void reiserfs_read_inode (struct inode * inode) ; void reiserfs_read_inode2(struct inode * inode, void *p) ; +int reiserfs_find_actor(struct inode * inode, void *p) ; +int reiserfs_init_locked_inode(struct inode * inode, void *p) ; void reiserfs_delete_inode (struct inode * inode); void reiserfs_write_inode (struct inode * inode, int) ; struct dentry *reiserfs_get_dentry(struct super_block *, void *) ; -- cgit v1.2.3