From 8a9338933c0e04f9d4f73dd1a7b482a2244af4e3 Mon Sep 17 00:00:00 2001 From: Ryusuke Konishi Date: Thu, 31 May 2012 16:26:11 -0700 Subject: [PATCH] --- yaml --- r: 309721 b: refs/heads/master c: 11475975dd3c0a8e639f1544ef6530373de5979e h: refs/heads/master i: 309719: f80a8ae48c9ad7efe0ca77352e0f1497edf7cf7a v: v3 --- [refs] | 2 +- trunk/fs/nilfs2/file.c | 24 ++++++++++++++---------- trunk/fs/nilfs2/ioctl.c | 8 +++++++- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/[refs] b/[refs] index 4bb7550cc567..2ef7b188e1c9 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a1d494495c69ef0810cd008f59310d2b9db28e36 +refs/heads/master: 11475975dd3c0a8e639f1544ef6530373de5979e diff --git a/trunk/fs/nilfs2/file.c b/trunk/fs/nilfs2/file.c index 26601529dc17..62cebc8e1a1f 100644 --- a/trunk/fs/nilfs2/file.c +++ b/trunk/fs/nilfs2/file.c @@ -37,6 +37,7 @@ int nilfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) * This function should be implemented when the writeback function * will be implemented. */ + struct the_nilfs *nilfs; struct inode *inode = file->f_mapping->host; int err; @@ -45,18 +46,21 @@ int nilfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) return err; mutex_lock(&inode->i_mutex); - if (!nilfs_inode_dirty(inode)) { - mutex_unlock(&inode->i_mutex); - return 0; + if (nilfs_inode_dirty(inode)) { + if (datasync) + err = nilfs_construct_dsync_segment(inode->i_sb, inode, + 0, LLONG_MAX); + else + err = nilfs_construct_segment(inode->i_sb); } - - if (datasync) - err = nilfs_construct_dsync_segment(inode->i_sb, inode, 0, - LLONG_MAX); - else - err = nilfs_construct_segment(inode->i_sb); - mutex_unlock(&inode->i_mutex); + + nilfs = inode->i_sb->s_fs_info; + if (!err && nilfs_test_opt(nilfs, BARRIER)) { + err = blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL, NULL); + if (err != -EIO) + err = 0; + } return err; } diff --git a/trunk/fs/nilfs2/ioctl.c b/trunk/fs/nilfs2/ioctl.c index 2a70fce70c65..06658caa18bd 100644 --- a/trunk/fs/nilfs2/ioctl.c +++ b/trunk/fs/nilfs2/ioctl.c @@ -692,8 +692,14 @@ static int nilfs_ioctl_sync(struct inode *inode, struct file *filp, if (ret < 0) return ret; + nilfs = inode->i_sb->s_fs_info; + if (nilfs_test_opt(nilfs, BARRIER)) { + ret = blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL, NULL); + if (ret == -EIO) + return ret; + } + if (argp != NULL) { - nilfs = inode->i_sb->s_fs_info; down_read(&nilfs->ns_segctor_sem); cno = nilfs->ns_cno - 1; up_read(&nilfs->ns_segctor_sem);