[bkpatch] fs/inode.c sync fix and fs/ext2/inode.c tidy

From: Benjamin LaHaise (bcrl@redhat.com)
Date: Thu Mar 07 2002 - 16:11:40 EST


These patches can be pulled from bk://bcrlbits.bkbits.net/linux-2.5
First one: in fs/ext2/inode.c merge ext2_fsync_inode into ext2_sync_file
as that's the only place it can be called from.

Second one only touches fs/inode.c:sync_one to replace the if I_LOCK
check with a while. Basically, the inode sync could end up deferring
to writeback if the inode is already locked. This breaks things like
O_SYNC which assume the inode sync is synchronous and only returns
when the data is safely on disk. This patch will need to go into 2.4
after a bit of testing for unexpected interactions.

Patches are included below for reading.

                -ben

-- 
"A man with a bass just walked in,
 and he's putting it down
 on the floor."

diff -Nru a/fs/ext2/ext2.h b/fs/ext2/ext2.h --- a/fs/ext2/ext2.h Thu Mar 7 16:02:59 2002 +++ b/fs/ext2/ext2.h Thu Mar 7 16:02:59 2002 @@ -63,7 +63,6 @@ /* fsync.c */ extern int ext2_sync_file (struct file *, struct dentry *, int); -extern int ext2_fsync_inode (struct inode *, int); /* ialloc.c */ extern struct inode * ext2_new_inode (struct inode *, int); diff -Nru a/fs/ext2/fsync.c b/fs/ext2/fsync.c --- a/fs/ext2/fsync.c Thu Mar 7 16:02:59 2002 +++ b/fs/ext2/fsync.c Thu Mar 7 16:02:59 2002 @@ -35,11 +35,6 @@ int ext2_sync_file(struct file * file, struct dentry *dentry, int datasync) { struct inode *inode = dentry->d_inode; - return ext2_fsync_inode(inode, datasync); -} - -int ext2_fsync_inode(struct inode *inode, int datasync) -{ int err; err = fsync_inode_buffers(inode);

diff -Nru a/fs/inode.c b/fs/inode.c --- a/fs/inode.c Thu Mar 7 16:02:59 2002 +++ b/fs/inode.c Thu Mar 7 16:02:59 2002 @@ -291,15 +291,15 @@ static inline void sync_one(struct inode *inode, int sync) { - if (inode->i_state & I_LOCK) { + while (inode->i_state & I_LOCK) { __iget(inode); spin_unlock(&inode_lock); __wait_on_inode(inode); iput(inode); spin_lock(&inode_lock); - } else { - __sync_one(inode, sync); } + + __sync_one(inode, sync); } static inline void sync_list(struct list_head *head) - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Thu Mar 07 2002 - 21:01:08 EST