diff options
Diffstat (limited to 'fs/ocfs2/file.c')
-rw-r--r-- | fs/ocfs2/file.c | 61 |
1 files changed, 7 insertions, 54 deletions
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index eaf33caa0a1f..8a4048b55fdc 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c | |||
@@ -933,9 +933,6 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb, | |||
933 | struct file *filp = iocb->ki_filp; | 933 | struct file *filp = iocb->ki_filp; |
934 | struct inode *inode = filp->f_dentry->d_inode; | 934 | struct inode *inode = filp->f_dentry->d_inode; |
935 | loff_t newsize, saved_pos; | 935 | loff_t newsize, saved_pos; |
936 | #ifdef OCFS2_ORACORE_WORKAROUNDS | ||
937 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); | ||
938 | #endif | ||
939 | 936 | ||
940 | mlog_entry("(0x%p, 0x%p, %u, '%.*s')\n", filp, buf, | 937 | mlog_entry("(0x%p, 0x%p, %u, '%.*s')\n", filp, buf, |
941 | (unsigned int)count, | 938 | (unsigned int)count, |
@@ -951,14 +948,6 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb, | |||
951 | return -EIO; | 948 | return -EIO; |
952 | } | 949 | } |
953 | 950 | ||
954 | #ifdef OCFS2_ORACORE_WORKAROUNDS | ||
955 | /* ugh, work around some applications which open everything O_DIRECT + | ||
956 | * O_APPEND and really don't mean to use O_DIRECT. */ | ||
957 | if (osb->s_mount_opt & OCFS2_MOUNT_COMPAT_OCFS && | ||
958 | (filp->f_flags & O_APPEND) && (filp->f_flags & O_DIRECT)) | ||
959 | filp->f_flags &= ~O_DIRECT; | ||
960 | #endif | ||
961 | |||
962 | mutex_lock(&inode->i_mutex); | 951 | mutex_lock(&inode->i_mutex); |
963 | /* to match setattr's i_mutex -> i_alloc_sem -> rw_lock ordering */ | 952 | /* to match setattr's i_mutex -> i_alloc_sem -> rw_lock ordering */ |
964 | if (filp->f_flags & O_DIRECT) { | 953 | if (filp->f_flags & O_DIRECT) { |
@@ -1022,8 +1011,9 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb, | |||
1022 | } | 1011 | } |
1023 | newsize = count + saved_pos; | 1012 | newsize = count + saved_pos; |
1024 | 1013 | ||
1025 | mlog(0, "pos=%lld newsize=%"MLFu64" cursize=%lld\n", | 1014 | mlog(0, "pos=%lld newsize=%lld cursize=%lld\n", |
1026 | saved_pos, newsize, i_size_read(inode)); | 1015 | (long long) saved_pos, (long long) newsize, |
1016 | (long long) i_size_read(inode)); | ||
1027 | 1017 | ||
1028 | /* No need for a higher level metadata lock if we're | 1018 | /* No need for a higher level metadata lock if we're |
1029 | * never going past i_size. */ | 1019 | * never going past i_size. */ |
@@ -1042,8 +1032,9 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb, | |||
1042 | spin_unlock(&OCFS2_I(inode)->ip_lock); | 1032 | spin_unlock(&OCFS2_I(inode)->ip_lock); |
1043 | 1033 | ||
1044 | mlog(0, "Writing at EOF, may need more allocation: " | 1034 | mlog(0, "Writing at EOF, may need more allocation: " |
1045 | "i_size = %lld, newsize = %"MLFu64", need %u clusters\n", | 1035 | "i_size = %lld, newsize = %lld, need %u clusters\n", |
1046 | i_size_read(inode), newsize, clusters); | 1036 | (long long) i_size_read(inode), (long long) newsize, |
1037 | clusters); | ||
1047 | 1038 | ||
1048 | /* We only want to continue the rest of this loop if | 1039 | /* We only want to continue the rest of this loop if |
1049 | * our extend will actually require more | 1040 | * our extend will actually require more |
@@ -1077,27 +1068,7 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb, | |||
1077 | /* communicate with ocfs2_dio_end_io */ | 1068 | /* communicate with ocfs2_dio_end_io */ |
1078 | ocfs2_iocb_set_rw_locked(iocb); | 1069 | ocfs2_iocb_set_rw_locked(iocb); |
1079 | 1070 | ||
1080 | #ifdef OCFS2_ORACORE_WORKAROUNDS | 1071 | ret = generic_file_aio_write_nolock(iocb, &local_iov, 1, &iocb->ki_pos); |
1081 | if (osb->s_mount_opt & OCFS2_MOUNT_COMPAT_OCFS && | ||
1082 | filp->f_flags & O_DIRECT) { | ||
1083 | unsigned int saved_flags = filp->f_flags; | ||
1084 | int sector_size = 1 << osb->s_sectsize_bits; | ||
1085 | |||
1086 | if ((saved_pos & (sector_size - 1)) || | ||
1087 | (count & (sector_size - 1)) || | ||
1088 | ((unsigned long)buf & (sector_size - 1))) { | ||
1089 | filp->f_flags |= O_SYNC; | ||
1090 | filp->f_flags &= ~O_DIRECT; | ||
1091 | } | ||
1092 | |||
1093 | ret = generic_file_aio_write_nolock(iocb, &local_iov, 1, | ||
1094 | &iocb->ki_pos); | ||
1095 | |||
1096 | filp->f_flags = saved_flags; | ||
1097 | } else | ||
1098 | #endif | ||
1099 | ret = generic_file_aio_write_nolock(iocb, &local_iov, 1, | ||
1100 | &iocb->ki_pos); | ||
1101 | 1072 | ||
1102 | /* buffered aio wouldn't have proper lock coverage today */ | 1073 | /* buffered aio wouldn't have proper lock coverage today */ |
1103 | BUG_ON(ret == -EIOCBQUEUED && !(filp->f_flags & O_DIRECT)); | 1074 | BUG_ON(ret == -EIOCBQUEUED && !(filp->f_flags & O_DIRECT)); |
@@ -1138,9 +1109,6 @@ static ssize_t ocfs2_file_aio_read(struct kiocb *iocb, | |||
1138 | int ret = 0, rw_level = -1, have_alloc_sem = 0; | 1109 | int ret = 0, rw_level = -1, have_alloc_sem = 0; |
1139 | struct file *filp = iocb->ki_filp; | 1110 | struct file *filp = iocb->ki_filp; |
1140 | struct inode *inode = filp->f_dentry->d_inode; | 1111 | struct inode *inode = filp->f_dentry->d_inode; |
1141 | #ifdef OCFS2_ORACORE_WORKAROUNDS | ||
1142 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); | ||
1143 | #endif | ||
1144 | 1112 | ||
1145 | mlog_entry("(0x%p, 0x%p, %u, '%.*s')\n", filp, buf, | 1113 | mlog_entry("(0x%p, 0x%p, %u, '%.*s')\n", filp, buf, |
1146 | (unsigned int)count, | 1114 | (unsigned int)count, |
@@ -1153,21 +1121,6 @@ static ssize_t ocfs2_file_aio_read(struct kiocb *iocb, | |||
1153 | goto bail; | 1121 | goto bail; |
1154 | } | 1122 | } |
1155 | 1123 | ||
1156 | #ifdef OCFS2_ORACORE_WORKAROUNDS | ||
1157 | if (osb->s_mount_opt & OCFS2_MOUNT_COMPAT_OCFS) { | ||
1158 | if (filp->f_flags & O_DIRECT) { | ||
1159 | int sector_size = 1 << osb->s_sectsize_bits; | ||
1160 | |||
1161 | if ((pos & (sector_size - 1)) || | ||
1162 | (count & (sector_size - 1)) || | ||
1163 | ((unsigned long)buf & (sector_size - 1)) || | ||
1164 | (i_size_read(inode) & (sector_size -1))) { | ||
1165 | filp->f_flags &= ~O_DIRECT; | ||
1166 | } | ||
1167 | } | ||
1168 | } | ||
1169 | #endif | ||
1170 | |||
1171 | /* | 1124 | /* |
1172 | * buffered reads protect themselves in ->readpage(). O_DIRECT reads | 1125 | * buffered reads protect themselves in ->readpage(). O_DIRECT reads |
1173 | * need locks to protect pending reads from racing with truncate. | 1126 | * need locks to protect pending reads from racing with truncate. |