lkml.org 
[lkml]   [2005]   [Sep]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: [PATCH 1/2] miss-sync changes on attributes (Re: [PATCH 2/2][FAT] miss-sync issues on sync mount (miss-sync on utime))
Previous patch didn't export sync_inode_wodata(),  that had a
problem with modula ext2 fs. Bug-fixed version is attached here.

Machida, Hiroyuki wrote:
>
> I revise a previous patch. Now checking dirty flag is done
> at vfs layer, as OGAWA-san said. I realized ext2_sync_inode()
> is good for syncing inode without it's data. I moved it to vfs layer
> and rename it to sync_inode_wodata().
>
> The first patch attached here is changes on vfs layer.
> Second patch attached at the next mail is changes on ext2 fs.
>
>
> OGAWA Hirofumi wrote:
>
>> "Machida, Hiroyuki" <machida@sm.sony.co.jp> writes:
>>
>>
>>> + if ( (!error) && IS_SYNC(inode)) {
>>> + error = write_inode_now(inode, 1);
>>> + }
>>
>>
>>
>> We don't need to sync the data pages at all here. And I think it is
>> not right place for doing this. If we need this, since we need to see
>> O_SYNC for fchxxx() VFS would be right place to do it.
>>
>> But, personally, I'd like to kill the "-o sync" stuff for these
>> independent meta data rather. Then...
>
>
>
> ------------------------------------------------------------------------
>
>
> This patch adds inode-sync after attribute changes, if needed.
>
> * fs-sync-attr.patch for 2.6.13
>
> fs/fs-writeback.c | 19 +++++++++++++++++++
> fs/open.c | 12 ++++++++++++
> include/linux/fs.h | 1 +
> 4 files changed, 32 insertions(+)
>
> Signed-off-by: Hiroyuki Machida <machdia@sm.sony.co.jp>
:
--


This patch adds inode-sync after attribute changes, if needed.

* fs-sync-attr_2.patch for 2.6.13

fs/fs-writeback.c | 20 ++++++++++++++++++++
fs/open.c | 12 ++++++++++++
include/linux/fs.h | 1 +
3 files changed, 33 insertions(+)

Signed-off-by: Hiroyuki Machida <machdia@sm.sony.co.jp>


diff -upr linux-2.6.13/fs/fs-writeback.c linux-2.6.13-sync-attr/fs/fs-writeback.c
--- linux-2.6.13/fs/fs-writeback.c 2005-08-29 08:41:01.000000000 +0900
+++ linux-2.6.13-sync-attr/fs/fs-writeback.c 2005-09-30 04:07:27.000000000 +0900
@@ -593,6 +593,26 @@ int sync_inode(struct inode *inode, stru
EXPORT_SYMBOL(sync_inode);

/**
+ * sync_inode_wodata - sync(write and wait) inode to disk, without it's data.
+ * @inode: the inode to sync
+ *
+ * sync_inode_wodata() will write an inode then wait. It will also
+ * correctly update the inode on its superblock's dirty inode lists
+ * and will update inode->i_state.
+ *
+ * The caller must have a ref on the inode.
+ */
+int sync_inode_wodata(struct inode *inode)
+{
+ struct writeback_control wbc = {
+ .sync_mode = WB_SYNC_ALL, /* wait */
+ .nr_to_write = 0,/* no data to be written */
+ };
+ return sync_inode(inode, &wbc);
+}
+EXPORT_SYMBOL(sync_inode_wodata);
+
+/**
* generic_osync_inode - flush all dirty data for a given inode to disk
* @inode: inode to write
* @mapping: the address_space that should be flushed
diff -upr linux-2.6.13/fs/open.c linux-2.6.13-sync-attr/fs/open.c
--- linux-2.6.13/fs/open.c 2005-08-29 08:41:01.000000000 +0900
+++ linux-2.6.13-sync-attr/fs/open.c 2005-09-30 01:29:45.000000000 +0900
@@ -207,6 +207,8 @@ int do_truncate(struct dentry *dentry, l

down(&dentry->d_inode->i_sem);
err = notify_change(dentry, &newattrs);
+ if (!err && IS_SYNC(dentry->d_inode))
+ sync_inode_wodata(dentry->d_inode);
up(&dentry->d_inode->i_sem);
return err;
}
@@ -394,6 +396,8 @@ asmlinkage long sys_utime(char __user *
}
down(&inode->i_sem);
error = notify_change(nd.dentry, &newattrs);
+ if (!error && IS_SYNC(inode))
+ sync_inode_wodata(inode);
up(&inode->i_sem);
dput_and_out:
path_release(&nd);
@@ -447,6 +451,8 @@ long do_utimes(char __user * filename, s
}
down(&inode->i_sem);
error = notify_change(nd.dentry, &newattrs);
+ if (!error && IS_SYNC(inode))
+ sync_inode_wodata(inode);
up(&inode->i_sem);
dput_and_out:
path_release(&nd);
@@ -620,6 +626,8 @@ asmlinkage long sys_fchmod(unsigned int
newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
err = notify_change(dentry, &newattrs);
+ if (!err && IS_SYNC(inode))
+ sync_inode_wodata(inode);
up(&inode->i_sem);

out_putf:
@@ -654,6 +662,8 @@ asmlinkage long sys_chmod(const char __u
newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
error = notify_change(nd.dentry, &newattrs);
+ if (!error && IS_SYNC(inode))
+ sync_inode_wodata(inode);
up(&inode->i_sem);

dput_and_out:
@@ -692,6 +702,8 @@ static int chown_common(struct dentry *
newattrs.ia_valid |= ATTR_KILL_SUID|ATTR_KILL_SGID;
down(&inode->i_sem);
error = notify_change(dentry, &newattrs);
+ if (!error && IS_SYNC(inode))
+ sync_inode_wodata(inode);
up(&inode->i_sem);
out:
return error;
diff -upr linux-2.6.13/include/linux/fs.h linux-2.6.13-sync-attr/include/linux/fs.h
--- linux-2.6.13/include/linux/fs.h 2005-08-29 08:41:01.000000000 +0900
+++ linux-2.6.13-sync-attr/include/linux/fs.h 2005-09-30 01:29:06.000000000 +0900
@@ -1082,6 +1082,7 @@ static inline void file_accessed(struct
}

int sync_inode(struct inode *inode, struct writeback_control *wbc);
+int sync_inode_wodata(struct inode *inode);

/**
* struct export_operations - for nfsd to communicate with file systems
\
 
 \ /
  Last update: 2005-09-29 21:23    [W:0.061 / U:0.740 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site