diff options
| author | Jan Harkes <jaharkes@cs.cmu.edu> | 2002-05-19 19:24:57 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.transmeta.com> | 2002-05-19 19:24:57 -0700 |
| commit | 7a24f1a6d522cce1e319f434a202f7d6944924bc (patch) | |
| tree | 721c18041fdb99868f0baabf989b46b1df80ed3e /include/linux | |
| parent | fa82a1dad8713f50233150710637981776dcdf3a (diff) | |
[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).
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/fs.h | 5 | ||||
| -rw-r--r-- | include/linux/reiserfs_fs.h | 2 |
2 files changed, 4 insertions, 3 deletions
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 *) ; |
