lkml.org 
[lkml]   [2002]   [Mar]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patches in this message
/
Date
From
Subject[bkpatch] fs/inode.c sync fix and fs/ext2/inode.c tidy
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/
\
 
 \ /
  Last update: 2005-03-22 13:24    [W:0.043 / U:14.716 seconds]
©2003-2018 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site