diff -Nurp devel-2.4.18/fs/jffs2/file.c linux/fs/jffs2/file.c --- devel-2.4.18/fs/jffs2/file.c 2007-06-07 13:01:11.000000000 -0500 +++ linux/fs/jffs2/file.c 2007-06-08 10:12:54.000000000 -0500 @@ -333,21 +333,19 @@ int jffs2_do_readpage_nolock (struct ino int jffs2_do_readpage_unlock(struct inode *inode, struct page *pg) { + struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); + + down(&f->sem); int ret = jffs2_do_readpage_nolock(inode, pg); UnlockPage(pg); + up(&f->sem); return ret; } int jffs2_readpage (struct file *filp, struct page *pg) { - struct jffs2_inode_info *f = JFFS2_INODE_INFO(filp->f_dentry->d_inode); - int ret; - - down(&f->sem); - ret = jffs2_do_readpage_unlock(filp->f_dentry->d_inode, pg); - up(&f->sem); - return ret; + return jffs2_do_readpage_unlock(filp->f_dentry->d_inode, pg); } int jffs2_prepare_write (struct file *filp, struct page *pg, unsigned start, unsigned end) diff -Nurp devel-2.4.18/fs/jffs2/gc.c linux/fs/jffs2/gc.c --- devel-2.4.18/fs/jffs2/gc.c 2007-06-07 13:01:09.000000000 -0500 +++ linux/fs/jffs2/gc.c 2007-06-08 10:12:54.000000000 -0500 @@ -703,7 +703,9 @@ static int jffs2_garbage_collect_dnode(s * page OK. We'll actually write it out again in commit_write, which is a little * suboptimal, but at least we're correct. */ + up(f->sem); pg = read_cache_page(inode->i_mapping, start >> PAGE_CACHE_SHIFT, (void *)jffs2_do_readpage_unlock, inode); + down(f->sem); if (IS_ERR(pg)) { printk(KERN_WARNING "read_cache_page() returned error: %ld\n", PTR_ERR(pg));