diff options
| author | Jan Kara <jack@suse.cz> | 2009-08-18 11:51:23 -0400 |
|---|---|---|
| committer | Jan Kara <jack@suse.cz> | 2009-09-14 11:08:16 -0400 |
| commit | e367626b6164aeecb97fb7c20509ed8696babc26 (patch) | |
| tree | e69721734412f9373aea87297c4ff9450cf55308 /fs/ext3 | |
| parent | a2a735ad666a04306a708b5a0109cc1fe113f569 (diff) | |
ext3: Remove syncing logic from ext3_file_write
Syncing is now properly done by generic_file_aio_write() so no special logic is
needed in ext3.
CC: linux-ext4@vger.kernel.org
Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs/ext3')
| -rw-r--r-- | fs/ext3/file.c | 61 |
1 files changed, 1 insertions, 60 deletions
diff --git a/fs/ext3/file.c b/fs/ext3/file.c index 299253214789..388bbdfa0b4e 100644 --- a/fs/ext3/file.c +++ b/fs/ext3/file.c | |||
| @@ -51,71 +51,12 @@ static int ext3_release_file (struct inode * inode, struct file * filp) | |||
| 51 | return 0; | 51 | return 0; |
| 52 | } | 52 | } |
| 53 | 53 | ||
| 54 | static ssize_t | ||
| 55 | ext3_file_write(struct kiocb *iocb, const struct iovec *iov, | ||
| 56 | unsigned long nr_segs, loff_t pos) | ||
| 57 | { | ||
| 58 | struct file *file = iocb->ki_filp; | ||
| 59 | struct inode *inode = file->f_path.dentry->d_inode; | ||
| 60 | ssize_t ret; | ||
| 61 | int err; | ||
| 62 | |||
| 63 | ret = generic_file_aio_write(iocb, iov, nr_segs, pos); | ||
| 64 | |||
| 65 | /* | ||
| 66 | * Skip flushing if there was an error, or if nothing was written. | ||
| 67 | */ | ||
| 68 | if (ret <= 0) | ||
| 69 | return ret; | ||
| 70 | |||
| 71 | /* | ||
| 72 | * If the inode is IS_SYNC, or is O_SYNC and we are doing data | ||
| 73 | * journalling then we need to make sure that we force the transaction | ||
| 74 | * to disk to keep all metadata uptodate synchronously. | ||
| 75 | */ | ||
| 76 | if (file->f_flags & O_SYNC) { | ||
| 77 | /* | ||
| 78 | * If we are non-data-journaled, then the dirty data has | ||
| 79 | * already been flushed to backing store by generic_osync_inode, | ||
| 80 | * and the inode has been flushed too if there have been any | ||
| 81 | * modifications other than mere timestamp updates. | ||
| 82 | * | ||
| 83 | * Open question --- do we care about flushing timestamps too | ||
| 84 | * if the inode is IS_SYNC? | ||
| 85 | */ | ||
| 86 | if (!ext3_should_journal_data(inode)) | ||
| 87 | return ret; | ||
| 88 | |||
| 89 | goto force_commit; | ||
| 90 | } | ||
| 91 | |||
| 92 | /* | ||
| 93 | * So we know that there has been no forced data flush. If the inode | ||
| 94 | * is marked IS_SYNC, we need to force one ourselves. | ||
| 95 | */ | ||
| 96 | if (!IS_SYNC(inode)) | ||
| 97 | return ret; | ||
| 98 | |||
| 99 | /* | ||
| 100 | * Open question #2 --- should we force data to disk here too? If we | ||
| 101 | * don't, the only impact is that data=writeback filesystems won't | ||
| 102 | * flush data to disk automatically on IS_SYNC, only metadata (but | ||
| 103 | * historically, that is what ext2 has done.) | ||
| 104 | */ | ||
| 105 | |||
| 106 | force_commit: | ||
| 107 | err = ext3_force_commit(inode->i_sb); | ||
| 108 | if (err) | ||
| 109 | return err; | ||
| 110 | return ret; | ||
| 111 | } | ||
| 112 | |||
| 113 | const struct file_operations ext3_file_operations = { | 54 | const struct file_operations ext3_file_operations = { |
| 114 | .llseek = generic_file_llseek, | 55 | .llseek = generic_file_llseek, |
| 115 | .read = do_sync_read, | 56 | .read = do_sync_read, |
| 116 | .write = do_sync_write, | 57 | .write = do_sync_write, |
| 117 | .aio_read = generic_file_aio_read, | 58 | .aio_read = generic_file_aio_read, |
| 118 | .aio_write = ext3_file_write, | 59 | .aio_write = generic_file_aio_write, |
| 119 | .unlocked_ioctl = ext3_ioctl, | 60 | .unlocked_ioctl = ext3_ioctl, |
| 120 | #ifdef CONFIG_COMPAT | 61 | #ifdef CONFIG_COMPAT |
| 121 | .compat_ioctl = ext3_compat_ioctl, | 62 | .compat_ioctl = ext3_compat_ioctl, |
