diff options
| author | OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> | 2005-09-16 19:28:13 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-09-17 11:50:02 -0700 | 
| commit | ef402268f7c9ab1872cafa1e638eb78a75b7c18f (patch) | |
| tree | a3734b16fed370c17349fd45dbb2a0d5798db2fa | |
| parent | 4fb3a53860cee2aaaf81186c451b7da0b95b45c1 (diff) | |
[PATCH] FAT: miss-sync issues on sync mount (miss-sync on write)
This patch fixes miss-sync issue on write() system call.  This updates
inode attrs flags, mtime and ctime on every comit_write call, due to
locking.
Signed-off-by: Hiroyuki Machida <machida@sm.sony.co.jp>
Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
| -rw-r--r-- | fs/fat/file.c | 37 | ||||
| -rw-r--r-- | fs/fat/inode.c | 15 | 
2 files changed, 16 insertions, 36 deletions
| diff --git a/fs/fat/file.c b/fs/fat/file.c index 62ffa9139400..7134403d5be2 100644 --- a/fs/fat/file.c +++ b/fs/fat/file.c @@ -12,39 +12,6 @@  #include <linux/smp_lock.h>  #include <linux/buffer_head.h> -static ssize_t fat_file_aio_write(struct kiocb *iocb, const char __user *buf, -				  size_t count, loff_t pos) -{ -	struct inode *inode = iocb->ki_filp->f_dentry->d_inode; -	int retval; - -	retval = generic_file_aio_write(iocb, buf, count, pos); -	if (retval > 0) { -		inode->i_mtime = inode->i_ctime = CURRENT_TIME_SEC; -		MSDOS_I(inode)->i_attrs |= ATTR_ARCH; -		mark_inode_dirty(inode); -//		check the locking rules -//		if (IS_SYNC(inode)) -//			fat_sync_inode(inode); -	} -	return retval; -} - -static ssize_t fat_file_writev(struct file *filp, const struct iovec *iov, -			       unsigned long nr_segs, loff_t *ppos) -{ -	struct inode *inode = filp->f_dentry->d_inode; -	int retval; - -	retval = generic_file_writev(filp, iov, nr_segs, ppos); -	if (retval > 0) { -		inode->i_mtime = inode->i_ctime = CURRENT_TIME_SEC; -		MSDOS_I(inode)->i_attrs |= ATTR_ARCH; -		mark_inode_dirty(inode); -	} -	return retval; -} -  int fat_generic_ioctl(struct inode *inode, struct file *filp,  		      unsigned int cmd, unsigned long arg)  { @@ -148,9 +115,9 @@ struct file_operations fat_file_operations = {  	.read		= do_sync_read,  	.write		= do_sync_write,  	.readv		= generic_file_readv, -	.writev		= fat_file_writev, +	.writev		= generic_file_writev,  	.aio_read	= generic_file_aio_read, -	.aio_write	= fat_file_aio_write, +	.aio_write	= generic_file_aio_write,  	.mmap		= generic_file_mmap,  	.ioctl		= fat_generic_ioctl,  	.fsync		= file_fsync, diff --git a/fs/fat/inode.c b/fs/fat/inode.c index a7cbe68e2259..51b1d15d9d5c 100644 --- a/fs/fat/inode.c +++ b/fs/fat/inode.c @@ -102,6 +102,19 @@ static int fat_prepare_write(struct file *file, struct page *page,  				  &MSDOS_I(page->mapping->host)->mmu_private);  } +static int fat_commit_write(struct file *file, struct page *page, +			    unsigned from, unsigned to) +{ +	struct inode *inode = page->mapping->host; +	int err = generic_commit_write(file, page, from, to); +	if (!err && !(MSDOS_I(inode)->i_attrs & ATTR_ARCH)) { +		inode->i_mtime = inode->i_ctime = CURRENT_TIME_SEC; +		MSDOS_I(inode)->i_attrs |= ATTR_ARCH; +		mark_inode_dirty(inode); +	} +	return err; +} +  static sector_t _fat_bmap(struct address_space *mapping, sector_t block)  {  	return generic_block_bmap(mapping, block, fat_get_block); @@ -112,7 +125,7 @@ static struct address_space_operations fat_aops = {  	.writepage	= fat_writepage,  	.sync_page	= block_sync_page,  	.prepare_write	= fat_prepare_write, -	.commit_write	= generic_commit_write, +	.commit_write	= fat_commit_write,  	.bmap		= _fat_bmap  }; | 
