diff options
Diffstat (limited to 'fs/ufs')
-rw-r--r-- | fs/ufs/dir.c | 2 | ||||
-rw-r--r-- | fs/ufs/file.c | 23 | ||||
-rw-r--r-- | fs/ufs/inode.c | 10 | ||||
-rw-r--r-- | fs/ufs/super.c | 65 | ||||
-rw-r--r-- | fs/ufs/ufs.h | 1 |
5 files changed, 56 insertions, 45 deletions
diff --git a/fs/ufs/dir.c b/fs/ufs/dir.c index 6321b797061b..6f671f1ac271 100644 --- a/fs/ufs/dir.c +++ b/fs/ufs/dir.c | |||
@@ -666,6 +666,6 @@ not_empty: | |||
666 | const struct file_operations ufs_dir_operations = { | 666 | const struct file_operations ufs_dir_operations = { |
667 | .read = generic_read_dir, | 667 | .read = generic_read_dir, |
668 | .readdir = ufs_readdir, | 668 | .readdir = ufs_readdir, |
669 | .fsync = ufs_sync_file, | 669 | .fsync = simple_fsync, |
670 | .llseek = generic_file_llseek, | 670 | .llseek = generic_file_llseek, |
671 | }; | 671 | }; |
diff --git a/fs/ufs/file.c b/fs/ufs/file.c index 2bd3a1615714..73655c61240a 100644 --- a/fs/ufs/file.c +++ b/fs/ufs/file.c | |||
@@ -24,31 +24,10 @@ | |||
24 | */ | 24 | */ |
25 | 25 | ||
26 | #include <linux/fs.h> | 26 | #include <linux/fs.h> |
27 | #include <linux/buffer_head.h> /* for sync_mapping_buffers() */ | ||
28 | 27 | ||
29 | #include "ufs_fs.h" | 28 | #include "ufs_fs.h" |
30 | #include "ufs.h" | 29 | #include "ufs.h" |
31 | 30 | ||
32 | |||
33 | int ufs_sync_file(struct file *file, struct dentry *dentry, int datasync) | ||
34 | { | ||
35 | struct inode *inode = dentry->d_inode; | ||
36 | int err; | ||
37 | int ret; | ||
38 | |||
39 | ret = sync_mapping_buffers(inode->i_mapping); | ||
40 | if (!(inode->i_state & I_DIRTY)) | ||
41 | return ret; | ||
42 | if (datasync && !(inode->i_state & I_DIRTY_DATASYNC)) | ||
43 | return ret; | ||
44 | |||
45 | err = ufs_sync_inode(inode); | ||
46 | if (ret == 0) | ||
47 | ret = err; | ||
48 | return ret; | ||
49 | } | ||
50 | |||
51 | |||
52 | /* | 31 | /* |
53 | * We have mostly NULL's here: the current defaults are ok for | 32 | * We have mostly NULL's here: the current defaults are ok for |
54 | * the ufs filesystem. | 33 | * the ufs filesystem. |
@@ -62,6 +41,6 @@ const struct file_operations ufs_file_operations = { | |||
62 | .aio_write = generic_file_aio_write, | 41 | .aio_write = generic_file_aio_write, |
63 | .mmap = generic_file_mmap, | 42 | .mmap = generic_file_mmap, |
64 | .open = generic_file_open, | 43 | .open = generic_file_open, |
65 | .fsync = ufs_sync_file, | 44 | .fsync = simple_fsync, |
66 | .splice_read = generic_file_splice_read, | 45 | .splice_read = generic_file_splice_read, |
67 | }; | 46 | }; |
diff --git a/fs/ufs/inode.c b/fs/ufs/inode.c index 3d2512c21f05..7cf33379fd46 100644 --- a/fs/ufs/inode.c +++ b/fs/ufs/inode.c | |||
@@ -56,9 +56,7 @@ static int ufs_block_to_path(struct inode *inode, sector_t i_block, sector_t off | |||
56 | 56 | ||
57 | 57 | ||
58 | UFSD("ptrs=uspi->s_apb = %d,double_blocks=%ld \n",ptrs,double_blocks); | 58 | UFSD("ptrs=uspi->s_apb = %d,double_blocks=%ld \n",ptrs,double_blocks); |
59 | if (i_block < 0) { | 59 | if (i_block < direct_blocks) { |
60 | ufs_warning(inode->i_sb, "ufs_block_to_path", "block < 0"); | ||
61 | } else if (i_block < direct_blocks) { | ||
62 | offsets[n++] = i_block; | 60 | offsets[n++] = i_block; |
63 | } else if ((i_block -= direct_blocks) < indirect_blocks) { | 61 | } else if ((i_block -= direct_blocks) < indirect_blocks) { |
64 | offsets[n++] = UFS_IND_BLOCK; | 62 | offsets[n++] = UFS_IND_BLOCK; |
@@ -440,8 +438,6 @@ int ufs_getfrag_block(struct inode *inode, sector_t fragment, struct buffer_head | |||
440 | lock_kernel(); | 438 | lock_kernel(); |
441 | 439 | ||
442 | UFSD("ENTER, ino %lu, fragment %llu\n", inode->i_ino, (unsigned long long)fragment); | 440 | UFSD("ENTER, ino %lu, fragment %llu\n", inode->i_ino, (unsigned long long)fragment); |
443 | if (fragment < 0) | ||
444 | goto abort_negative; | ||
445 | if (fragment > | 441 | if (fragment > |
446 | ((UFS_NDADDR + uspi->s_apb + uspi->s_2apb + uspi->s_3apb) | 442 | ((UFS_NDADDR + uspi->s_apb + uspi->s_2apb + uspi->s_3apb) |
447 | << uspi->s_fpbshift)) | 443 | << uspi->s_fpbshift)) |
@@ -504,10 +500,6 @@ abort: | |||
504 | unlock_kernel(); | 500 | unlock_kernel(); |
505 | return err; | 501 | return err; |
506 | 502 | ||
507 | abort_negative: | ||
508 | ufs_warning(sb, "ufs_get_block", "block < 0"); | ||
509 | goto abort; | ||
510 | |||
511 | abort_too_big: | 503 | abort_too_big: |
512 | ufs_warning(sb, "ufs_get_block", "block > big"); | 504 | ufs_warning(sb, "ufs_get_block", "block > big"); |
513 | goto abort; | 505 | goto abort; |
diff --git a/fs/ufs/super.c b/fs/ufs/super.c index 60359291761f..5faed7954d0a 100644 --- a/fs/ufs/super.c +++ b/fs/ufs/super.c | |||
@@ -263,6 +263,7 @@ void ufs_panic (struct super_block * sb, const char * function, | |||
263 | struct ufs_super_block_first * usb1; | 263 | struct ufs_super_block_first * usb1; |
264 | va_list args; | 264 | va_list args; |
265 | 265 | ||
266 | lock_kernel(); | ||
266 | uspi = UFS_SB(sb)->s_uspi; | 267 | uspi = UFS_SB(sb)->s_uspi; |
267 | usb1 = ubh_get_usb_first(uspi); | 268 | usb1 = ubh_get_usb_first(uspi); |
268 | 269 | ||
@@ -594,6 +595,9 @@ static void ufs_put_super_internal(struct super_block *sb) | |||
594 | 595 | ||
595 | 596 | ||
596 | UFSD("ENTER\n"); | 597 | UFSD("ENTER\n"); |
598 | |||
599 | lock_kernel(); | ||
600 | |||
597 | ufs_put_cstotal(sb); | 601 | ufs_put_cstotal(sb); |
598 | size = uspi->s_cssize; | 602 | size = uspi->s_cssize; |
599 | blks = (size + uspi->s_fsize - 1) >> uspi->s_fshift; | 603 | blks = (size + uspi->s_fsize - 1) >> uspi->s_fshift; |
@@ -621,6 +625,9 @@ static void ufs_put_super_internal(struct super_block *sb) | |||
621 | brelse (sbi->s_ucg[i]); | 625 | brelse (sbi->s_ucg[i]); |
622 | kfree (sbi->s_ucg); | 626 | kfree (sbi->s_ucg); |
623 | kfree (base); | 627 | kfree (base); |
628 | |||
629 | unlock_kernel(); | ||
630 | |||
624 | UFSD("EXIT\n"); | 631 | UFSD("EXIT\n"); |
625 | } | 632 | } |
626 | 633 | ||
@@ -1118,32 +1125,45 @@ failed_nomem: | |||
1118 | return -ENOMEM; | 1125 | return -ENOMEM; |
1119 | } | 1126 | } |
1120 | 1127 | ||
1121 | static void ufs_write_super(struct super_block *sb) | 1128 | static int ufs_sync_fs(struct super_block *sb, int wait) |
1122 | { | 1129 | { |
1123 | struct ufs_sb_private_info * uspi; | 1130 | struct ufs_sb_private_info * uspi; |
1124 | struct ufs_super_block_first * usb1; | 1131 | struct ufs_super_block_first * usb1; |
1125 | struct ufs_super_block_third * usb3; | 1132 | struct ufs_super_block_third * usb3; |
1126 | unsigned flags; | 1133 | unsigned flags; |
1127 | 1134 | ||
1135 | lock_super(sb); | ||
1128 | lock_kernel(); | 1136 | lock_kernel(); |
1137 | |||
1129 | UFSD("ENTER\n"); | 1138 | UFSD("ENTER\n"); |
1139 | |||
1130 | flags = UFS_SB(sb)->s_flags; | 1140 | flags = UFS_SB(sb)->s_flags; |
1131 | uspi = UFS_SB(sb)->s_uspi; | 1141 | uspi = UFS_SB(sb)->s_uspi; |
1132 | usb1 = ubh_get_usb_first(uspi); | 1142 | usb1 = ubh_get_usb_first(uspi); |
1133 | usb3 = ubh_get_usb_third(uspi); | 1143 | usb3 = ubh_get_usb_third(uspi); |
1134 | 1144 | ||
1135 | if (!(sb->s_flags & MS_RDONLY)) { | 1145 | usb1->fs_time = cpu_to_fs32(sb, get_seconds()); |
1136 | usb1->fs_time = cpu_to_fs32(sb, get_seconds()); | 1146 | if ((flags & UFS_ST_MASK) == UFS_ST_SUN || |
1137 | if ((flags & UFS_ST_MASK) == UFS_ST_SUN | 1147 | (flags & UFS_ST_MASK) == UFS_ST_SUNOS || |
1138 | || (flags & UFS_ST_MASK) == UFS_ST_SUNOS | 1148 | (flags & UFS_ST_MASK) == UFS_ST_SUNx86) |
1139 | || (flags & UFS_ST_MASK) == UFS_ST_SUNx86) | 1149 | ufs_set_fs_state(sb, usb1, usb3, |
1140 | ufs_set_fs_state(sb, usb1, usb3, | 1150 | UFS_FSOK - fs32_to_cpu(sb, usb1->fs_time)); |
1141 | UFS_FSOK - fs32_to_cpu(sb, usb1->fs_time)); | 1151 | ufs_put_cstotal(sb); |
1142 | ufs_put_cstotal(sb); | ||
1143 | } | ||
1144 | sb->s_dirt = 0; | 1152 | sb->s_dirt = 0; |
1153 | |||
1145 | UFSD("EXIT\n"); | 1154 | UFSD("EXIT\n"); |
1146 | unlock_kernel(); | 1155 | unlock_kernel(); |
1156 | unlock_super(sb); | ||
1157 | |||
1158 | return 0; | ||
1159 | } | ||
1160 | |||
1161 | static void ufs_write_super(struct super_block *sb) | ||
1162 | { | ||
1163 | if (!(sb->s_flags & MS_RDONLY)) | ||
1164 | ufs_sync_fs(sb, 1); | ||
1165 | else | ||
1166 | sb->s_dirt = 0; | ||
1147 | } | 1167 | } |
1148 | 1168 | ||
1149 | static void ufs_put_super(struct super_block *sb) | 1169 | static void ufs_put_super(struct super_block *sb) |
@@ -1152,6 +1172,9 @@ static void ufs_put_super(struct super_block *sb) | |||
1152 | 1172 | ||
1153 | UFSD("ENTER\n"); | 1173 | UFSD("ENTER\n"); |
1154 | 1174 | ||
1175 | if (sb->s_dirt) | ||
1176 | ufs_write_super(sb); | ||
1177 | |||
1155 | if (!(sb->s_flags & MS_RDONLY)) | 1178 | if (!(sb->s_flags & MS_RDONLY)) |
1156 | ufs_put_super_internal(sb); | 1179 | ufs_put_super_internal(sb); |
1157 | 1180 | ||
@@ -1171,7 +1194,9 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) | |||
1171 | struct ufs_super_block_third * usb3; | 1194 | struct ufs_super_block_third * usb3; |
1172 | unsigned new_mount_opt, ufstype; | 1195 | unsigned new_mount_opt, ufstype; |
1173 | unsigned flags; | 1196 | unsigned flags; |
1174 | 1197 | ||
1198 | lock_kernel(); | ||
1199 | lock_super(sb); | ||
1175 | uspi = UFS_SB(sb)->s_uspi; | 1200 | uspi = UFS_SB(sb)->s_uspi; |
1176 | flags = UFS_SB(sb)->s_flags; | 1201 | flags = UFS_SB(sb)->s_flags; |
1177 | usb1 = ubh_get_usb_first(uspi); | 1202 | usb1 = ubh_get_usb_first(uspi); |
@@ -1184,17 +1209,24 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) | |||
1184 | ufstype = UFS_SB(sb)->s_mount_opt & UFS_MOUNT_UFSTYPE; | 1209 | ufstype = UFS_SB(sb)->s_mount_opt & UFS_MOUNT_UFSTYPE; |
1185 | new_mount_opt = 0; | 1210 | new_mount_opt = 0; |
1186 | ufs_set_opt (new_mount_opt, ONERROR_LOCK); | 1211 | ufs_set_opt (new_mount_opt, ONERROR_LOCK); |
1187 | if (!ufs_parse_options (data, &new_mount_opt)) | 1212 | if (!ufs_parse_options (data, &new_mount_opt)) { |
1213 | unlock_super(sb); | ||
1214 | unlock_kernel(); | ||
1188 | return -EINVAL; | 1215 | return -EINVAL; |
1216 | } | ||
1189 | if (!(new_mount_opt & UFS_MOUNT_UFSTYPE)) { | 1217 | if (!(new_mount_opt & UFS_MOUNT_UFSTYPE)) { |
1190 | new_mount_opt |= ufstype; | 1218 | new_mount_opt |= ufstype; |
1191 | } else if ((new_mount_opt & UFS_MOUNT_UFSTYPE) != ufstype) { | 1219 | } else if ((new_mount_opt & UFS_MOUNT_UFSTYPE) != ufstype) { |
1192 | printk("ufstype can't be changed during remount\n"); | 1220 | printk("ufstype can't be changed during remount\n"); |
1221 | unlock_super(sb); | ||
1222 | unlock_kernel(); | ||
1193 | return -EINVAL; | 1223 | return -EINVAL; |
1194 | } | 1224 | } |
1195 | 1225 | ||
1196 | if ((*mount_flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) { | 1226 | if ((*mount_flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) { |
1197 | UFS_SB(sb)->s_mount_opt = new_mount_opt; | 1227 | UFS_SB(sb)->s_mount_opt = new_mount_opt; |
1228 | unlock_super(sb); | ||
1229 | unlock_kernel(); | ||
1198 | return 0; | 1230 | return 0; |
1199 | } | 1231 | } |
1200 | 1232 | ||
@@ -1219,6 +1251,8 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) | |||
1219 | #ifndef CONFIG_UFS_FS_WRITE | 1251 | #ifndef CONFIG_UFS_FS_WRITE |
1220 | printk("ufs was compiled with read-only support, " | 1252 | printk("ufs was compiled with read-only support, " |
1221 | "can't be mounted as read-write\n"); | 1253 | "can't be mounted as read-write\n"); |
1254 | unlock_super(sb); | ||
1255 | unlock_kernel(); | ||
1222 | return -EINVAL; | 1256 | return -EINVAL; |
1223 | #else | 1257 | #else |
1224 | if (ufstype != UFS_MOUNT_UFSTYPE_SUN && | 1258 | if (ufstype != UFS_MOUNT_UFSTYPE_SUN && |
@@ -1227,16 +1261,22 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) | |||
1227 | ufstype != UFS_MOUNT_UFSTYPE_SUNx86 && | 1261 | ufstype != UFS_MOUNT_UFSTYPE_SUNx86 && |
1228 | ufstype != UFS_MOUNT_UFSTYPE_UFS2) { | 1262 | ufstype != UFS_MOUNT_UFSTYPE_UFS2) { |
1229 | printk("this ufstype is read-only supported\n"); | 1263 | printk("this ufstype is read-only supported\n"); |
1264 | unlock_super(sb); | ||
1265 | unlock_kernel(); | ||
1230 | return -EINVAL; | 1266 | return -EINVAL; |
1231 | } | 1267 | } |
1232 | if (!ufs_read_cylinder_structures(sb)) { | 1268 | if (!ufs_read_cylinder_structures(sb)) { |
1233 | printk("failed during remounting\n"); | 1269 | printk("failed during remounting\n"); |
1270 | unlock_super(sb); | ||
1271 | unlock_kernel(); | ||
1234 | return -EPERM; | 1272 | return -EPERM; |
1235 | } | 1273 | } |
1236 | sb->s_flags &= ~MS_RDONLY; | 1274 | sb->s_flags &= ~MS_RDONLY; |
1237 | #endif | 1275 | #endif |
1238 | } | 1276 | } |
1239 | UFS_SB(sb)->s_mount_opt = new_mount_opt; | 1277 | UFS_SB(sb)->s_mount_opt = new_mount_opt; |
1278 | unlock_super(sb); | ||
1279 | unlock_kernel(); | ||
1240 | return 0; | 1280 | return 0; |
1241 | } | 1281 | } |
1242 | 1282 | ||
@@ -1352,6 +1392,7 @@ static const struct super_operations ufs_super_ops = { | |||
1352 | .delete_inode = ufs_delete_inode, | 1392 | .delete_inode = ufs_delete_inode, |
1353 | .put_super = ufs_put_super, | 1393 | .put_super = ufs_put_super, |
1354 | .write_super = ufs_write_super, | 1394 | .write_super = ufs_write_super, |
1395 | .sync_fs = ufs_sync_fs, | ||
1355 | .statfs = ufs_statfs, | 1396 | .statfs = ufs_statfs, |
1356 | .remount_fs = ufs_remount, | 1397 | .remount_fs = ufs_remount, |
1357 | .show_options = ufs_show_options, | 1398 | .show_options = ufs_show_options, |
diff --git a/fs/ufs/ufs.h b/fs/ufs/ufs.h index d0c4acd4f1f3..644e77e13599 100644 --- a/fs/ufs/ufs.h +++ b/fs/ufs/ufs.h | |||
@@ -99,7 +99,6 @@ extern void ufs_set_link(struct inode *dir, struct ufs_dir_entry *de, | |||
99 | extern const struct inode_operations ufs_file_inode_operations; | 99 | extern const struct inode_operations ufs_file_inode_operations; |
100 | extern const struct file_operations ufs_file_operations; | 100 | extern const struct file_operations ufs_file_operations; |
101 | extern const struct address_space_operations ufs_aops; | 101 | extern const struct address_space_operations ufs_aops; |
102 | extern int ufs_sync_file(struct file *, struct dentry *, int); | ||
103 | 102 | ||
104 | /* ialloc.c */ | 103 | /* ialloc.c */ |
105 | extern void ufs_free_inode (struct inode *inode); | 104 | extern void ufs_free_inode (struct inode *inode); |