Messages in this thread Patch in this message | | | Date | Wed, 24 Nov 2004 16:02:51 +0100 | From | Colin Leroy <> | Subject | Re: [PATCH] let fat handle MS_SYNCHRONOUS flag |
| |
On 24 Nov 2004 at 23h11, OGAWA Hirofumi wrote:
Hi,
> Aren't you forgetting to update the inode and various metadata (e.g. FAT)?
Don't really know what to do about this one; where should I look ?
this second patch seems a step in the right direction to me, based off your previous comments:
Signed-off-by: Colin Leroy <colin@colino.net> diff -ur /tmp/linux-2.6.9/fs/fat/dir.c fs/fat/dir.c --- /tmp/linux-2.6.9/fs/fat/dir.c 2004-11-24 15:57:17.776119552 +0100 +++ fs/fat/dir.c 2004-11-24 15:58:41.664366600 +0100 @@ -760,10 +760,14 @@ de[1].start = cpu_to_le16(MSDOS_I(parent)->i_logstart); de[1].starthi = cpu_to_le16(MSDOS_I(parent)->i_logstart>>16); mark_buffer_dirty(bh); - brelse(bh); dir->i_atime = dir->i_ctime = dir->i_mtime = CURRENT_TIME; mark_inode_dirty(dir); + if (dir->i_sb->s_flags & MS_SYNCHRONOUS) + sync_dirty_buffer(bh); + + brelse(bh); + return 0; } diff -ur /tmp/linux-2.6.9/fs/fat/file.c fs/fat/file.c --- /tmp/linux-2.6.9/fs/fat/file.c 2004-10-18 23:53:44.000000000 +0200 +++ fs/fat/file.c 2004-11-24 15:49:22.375391448 +0100 @@ -74,18 +74,30 @@ { struct inode *inode = filp->f_dentry->d_inode; int retval; + struct super_block *sb = inode->i_sb; retval = generic_file_write(filp, buf, count, ppos); if (retval > 0) { inode->i_mtime = inode->i_ctime = CURRENT_TIME; MSDOS_I(inode)->i_attrs |= ATTR_ARCH; mark_inode_dirty(inode); + if (sb->s_flags & MS_SYNCHRONOUS) { + struct buffer_head *bh; + loff_t i_pos = MSDOS_I(inode)->i_pos; + bh = sb_bread(sb, + i_pos >> MSDOS_SB(sb)->dir_per_block_bits); + if (!bh) + return -EIO; + sync_dirty_buffer(bh); + brelse(bh); + } } return retval; } void fat_truncate(struct inode *inode) { + struct super_block *sb = inode->i_sb; struct msdos_sb_info *sbi = MSDOS_SB(inode->i_sb); const unsigned int cluster_size = sbi->cluster_size; int nr_clusters; @@ -105,4 +117,13 @@ unlock_kernel(); inode->i_ctime = inode->i_mtime = CURRENT_TIME; mark_inode_dirty(inode); + if (sb->s_flags & MS_SYNCHRONOUS) { + struct buffer_head *bh; + loff_t i_pos = MSDOS_I(inode)->i_pos; + bh = sb_bread(sb, i_pos >> MSDOS_SB(sb)->dir_per_block_bits); + if (!bh) + return; + sync_dirty_buffer(bh); + brelse(bh); + } } diff -ur /tmp/linux-2.6.9/fs/fat/inode.c fs/fat/inode.c --- /tmp/linux-2.6.9/fs/fat/inode.c 2004-11-24 15:57:17.783118488 +0100 +++ fs/fat/inode.c 2004-11-18 15:00:55.000000000 +0100 @@ -1273,8 +1273,12 @@ } spin_unlock(&sbi->inode_hash_lock); mark_buffer_dirty(bh); - brelse(bh); unlock_kernel(); + + if (sb->s_flags & MS_SYNCHRONOUS) + sync_dirty_buffer(bh); + brelse(bh); + return 0; } - 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/
| |