diff options
-rw-r--r-- | fs/hfsplus/hfsplus_fs.h | 1 | ||||
-rw-r--r-- | fs/hfsplus/inode.c | 4 | ||||
-rw-r--r-- | fs/hfsplus/options.c | 11 | ||||
-rw-r--r-- | fs/hfsplus/super.c | 5 |
4 files changed, 21 insertions, 0 deletions
diff --git a/fs/hfsplus/hfsplus_fs.h b/fs/hfsplus/hfsplus_fs.h index 65c698f78ef7..17ac254e72cb 100644 --- a/fs/hfsplus/hfsplus_fs.h +++ b/fs/hfsplus/hfsplus_fs.h | |||
@@ -156,6 +156,7 @@ struct hfsplus_sb_info { | |||
156 | #define HFSPLUS_SB_FORCE 2 | 156 | #define HFSPLUS_SB_FORCE 2 |
157 | #define HFSPLUS_SB_HFSX 3 | 157 | #define HFSPLUS_SB_HFSX 3 |
158 | #define HFSPLUS_SB_CASEFOLD 4 | 158 | #define HFSPLUS_SB_CASEFOLD 4 |
159 | #define HFSPLUS_SB_NOBARRIER 5 | ||
159 | 160 | ||
160 | static inline struct hfsplus_sb_info *HFSPLUS_SB(struct super_block *sb) | 161 | static inline struct hfsplus_sb_info *HFSPLUS_SB(struct super_block *sb) |
161 | { | 162 | { |
diff --git a/fs/hfsplus/inode.c b/fs/hfsplus/inode.c index bf6535b73261..bda7464c205d 100644 --- a/fs/hfsplus/inode.c +++ b/fs/hfsplus/inode.c | |||
@@ -8,6 +8,7 @@ | |||
8 | * Inode handling routines | 8 | * Inode handling routines |
9 | */ | 9 | */ |
10 | 10 | ||
11 | #include <linux/blkdev.h> | ||
11 | #include <linux/mm.h> | 12 | #include <linux/mm.h> |
12 | #include <linux/fs.h> | 13 | #include <linux/fs.h> |
13 | #include <linux/pagemap.h> | 14 | #include <linux/pagemap.h> |
@@ -334,6 +335,9 @@ int hfsplus_file_fsync(struct file *file, int datasync) | |||
334 | error = error2; | 335 | error = error2; |
335 | } | 336 | } |
336 | 337 | ||
338 | if (!test_bit(HFSPLUS_SB_NOBARRIER, &sbi->flags)) | ||
339 | blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL, NULL); | ||
340 | |||
337 | return error; | 341 | return error; |
338 | } | 342 | } |
339 | 343 | ||
diff --git a/fs/hfsplus/options.c b/fs/hfsplus/options.c index 43b02b5525eb..dbd9d0c426cb 100644 --- a/fs/hfsplus/options.c +++ b/fs/hfsplus/options.c | |||
@@ -23,6 +23,7 @@ enum { | |||
23 | opt_umask, opt_uid, opt_gid, | 23 | opt_umask, opt_uid, opt_gid, |
24 | opt_part, opt_session, opt_nls, | 24 | opt_part, opt_session, opt_nls, |
25 | opt_nodecompose, opt_decompose, | 25 | opt_nodecompose, opt_decompose, |
26 | opt_barrier, opt_nobarrier, | ||
26 | opt_force, opt_err | 27 | opt_force, opt_err |
27 | }; | 28 | }; |
28 | 29 | ||
@@ -37,6 +38,8 @@ static const match_table_t tokens = { | |||
37 | { opt_nls, "nls=%s" }, | 38 | { opt_nls, "nls=%s" }, |
38 | { opt_decompose, "decompose" }, | 39 | { opt_decompose, "decompose" }, |
39 | { opt_nodecompose, "nodecompose" }, | 40 | { opt_nodecompose, "nodecompose" }, |
41 | { opt_barrier, "barrier" }, | ||
42 | { opt_nobarrier, "nobarrier" }, | ||
40 | { opt_force, "force" }, | 43 | { opt_force, "force" }, |
41 | { opt_err, NULL } | 44 | { opt_err, NULL } |
42 | }; | 45 | }; |
@@ -174,6 +177,12 @@ int hfsplus_parse_options(char *input, struct hfsplus_sb_info *sbi) | |||
174 | case opt_nodecompose: | 177 | case opt_nodecompose: |
175 | set_bit(HFSPLUS_SB_NODECOMPOSE, &sbi->flags); | 178 | set_bit(HFSPLUS_SB_NODECOMPOSE, &sbi->flags); |
176 | break; | 179 | break; |
180 | case opt_barrier: | ||
181 | clear_bit(HFSPLUS_SB_NOBARRIER, &sbi->flags); | ||
182 | break; | ||
183 | case opt_nobarrier: | ||
184 | set_bit(HFSPLUS_SB_NOBARRIER, &sbi->flags); | ||
185 | break; | ||
177 | case opt_force: | 186 | case opt_force: |
178 | set_bit(HFSPLUS_SB_FORCE, &sbi->flags); | 187 | set_bit(HFSPLUS_SB_FORCE, &sbi->flags); |
179 | break; | 188 | break; |
@@ -212,5 +221,7 @@ int hfsplus_show_options(struct seq_file *seq, struct vfsmount *mnt) | |||
212 | seq_printf(seq, ",nls=%s", sbi->nls->charset); | 221 | seq_printf(seq, ",nls=%s", sbi->nls->charset); |
213 | if (test_bit(HFSPLUS_SB_NODECOMPOSE, &sbi->flags)) | 222 | if (test_bit(HFSPLUS_SB_NODECOMPOSE, &sbi->flags)) |
214 | seq_printf(seq, ",nodecompose"); | 223 | seq_printf(seq, ",nodecompose"); |
224 | if (test_bit(HFSPLUS_SB_NOBARRIER, &sbi->flags)) | ||
225 | seq_printf(seq, ",nobarrier"); | ||
215 | return 0; | 226 | return 0; |
216 | } | 227 | } |
diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c index 036650123c4c..154478c71f25 100644 --- a/fs/hfsplus/super.c +++ b/fs/hfsplus/super.c | |||
@@ -10,6 +10,7 @@ | |||
10 | #include <linux/module.h> | 10 | #include <linux/module.h> |
11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
12 | #include <linux/pagemap.h> | 12 | #include <linux/pagemap.h> |
13 | #include <linux/blkdev.h> | ||
13 | #include <linux/fs.h> | 14 | #include <linux/fs.h> |
14 | #include <linux/slab.h> | 15 | #include <linux/slab.h> |
15 | #include <linux/vfs.h> | 16 | #include <linux/vfs.h> |
@@ -212,6 +213,10 @@ int hfsplus_sync_fs(struct super_block *sb, int wait) | |||
212 | out: | 213 | out: |
213 | mutex_unlock(&sbi->alloc_mutex); | 214 | mutex_unlock(&sbi->alloc_mutex); |
214 | mutex_unlock(&sbi->vh_mutex); | 215 | mutex_unlock(&sbi->vh_mutex); |
216 | |||
217 | if (!test_bit(HFSPLUS_SB_NOBARRIER, &sbi->flags)) | ||
218 | blkdev_issue_flush(sb->s_bdev, GFP_KERNEL, NULL); | ||
219 | |||
215 | return error; | 220 | return error; |
216 | } | 221 | } |
217 | 222 | ||