diff options
Diffstat (limited to 'fs/block_dev.c')
-rw-r--r-- | fs/block_dev.c | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/fs/block_dev.c b/fs/block_dev.c index f45dbc18dd17..3a6d4fb2a329 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/uio.h> | 25 | #include <linux/uio.h> |
26 | #include <linux/namei.h> | 26 | #include <linux/namei.h> |
27 | #include <linux/log2.h> | 27 | #include <linux/log2.h> |
28 | #include <linux/kmemleak.h> | ||
28 | #include <asm/uaccess.h> | 29 | #include <asm/uaccess.h> |
29 | #include "internal.h" | 30 | #include "internal.h" |
30 | 31 | ||
@@ -76,7 +77,7 @@ int set_blocksize(struct block_device *bdev, int size) | |||
76 | return -EINVAL; | 77 | return -EINVAL; |
77 | 78 | ||
78 | /* Size cannot be smaller than the size supported by the device */ | 79 | /* Size cannot be smaller than the size supported by the device */ |
79 | if (size < bdev_hardsect_size(bdev)) | 80 | if (size < bdev_logical_block_size(bdev)) |
80 | return -EINVAL; | 81 | return -EINVAL; |
81 | 82 | ||
82 | /* Don't change the size if it is same as current */ | 83 | /* Don't change the size if it is same as current */ |
@@ -106,7 +107,7 @@ EXPORT_SYMBOL(sb_set_blocksize); | |||
106 | 107 | ||
107 | int sb_min_blocksize(struct super_block *sb, int size) | 108 | int sb_min_blocksize(struct super_block *sb, int size) |
108 | { | 109 | { |
109 | int minsize = bdev_hardsect_size(sb->s_bdev); | 110 | int minsize = bdev_logical_block_size(sb->s_bdev); |
110 | if (size < minsize) | 111 | if (size < minsize) |
111 | size = minsize; | 112 | size = minsize; |
112 | return sb_set_blocksize(sb, size); | 113 | return sb_set_blocksize(sb, size); |
@@ -175,17 +176,22 @@ blkdev_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, | |||
175 | iov, offset, nr_segs, blkdev_get_blocks, NULL); | 176 | iov, offset, nr_segs, blkdev_get_blocks, NULL); |
176 | } | 177 | } |
177 | 178 | ||
179 | int __sync_blockdev(struct block_device *bdev, int wait) | ||
180 | { | ||
181 | if (!bdev) | ||
182 | return 0; | ||
183 | if (!wait) | ||
184 | return filemap_flush(bdev->bd_inode->i_mapping); | ||
185 | return filemap_write_and_wait(bdev->bd_inode->i_mapping); | ||
186 | } | ||
187 | |||
178 | /* | 188 | /* |
179 | * Write out and wait upon all the dirty data associated with a block | 189 | * Write out and wait upon all the dirty data associated with a block |
180 | * device via its mapping. Does not take the superblock lock. | 190 | * device via its mapping. Does not take the superblock lock. |
181 | */ | 191 | */ |
182 | int sync_blockdev(struct block_device *bdev) | 192 | int sync_blockdev(struct block_device *bdev) |
183 | { | 193 | { |
184 | int ret = 0; | 194 | return __sync_blockdev(bdev, 1); |
185 | |||
186 | if (bdev) | ||
187 | ret = filemap_write_and_wait(bdev->bd_inode->i_mapping); | ||
188 | return ret; | ||
189 | } | 195 | } |
190 | EXPORT_SYMBOL(sync_blockdev); | 196 | EXPORT_SYMBOL(sync_blockdev); |
191 | 197 | ||
@@ -198,7 +204,7 @@ int fsync_bdev(struct block_device *bdev) | |||
198 | { | 204 | { |
199 | struct super_block *sb = get_super(bdev); | 205 | struct super_block *sb = get_super(bdev); |
200 | if (sb) { | 206 | if (sb) { |
201 | int res = fsync_super(sb); | 207 | int res = sync_filesystem(sb); |
202 | drop_super(sb); | 208 | drop_super(sb); |
203 | return res; | 209 | return res; |
204 | } | 210 | } |
@@ -240,7 +246,7 @@ struct super_block *freeze_bdev(struct block_device *bdev) | |||
240 | sb->s_frozen = SB_FREEZE_WRITE; | 246 | sb->s_frozen = SB_FREEZE_WRITE; |
241 | smp_wmb(); | 247 | smp_wmb(); |
242 | 248 | ||
243 | __fsync_super(sb); | 249 | sync_filesystem(sb); |
244 | 250 | ||
245 | sb->s_frozen = SB_FREEZE_TRANS; | 251 | sb->s_frozen = SB_FREEZE_TRANS; |
246 | smp_wmb(); | 252 | smp_wmb(); |
@@ -492,6 +498,11 @@ void __init bdev_cache_init(void) | |||
492 | bd_mnt = kern_mount(&bd_type); | 498 | bd_mnt = kern_mount(&bd_type); |
493 | if (IS_ERR(bd_mnt)) | 499 | if (IS_ERR(bd_mnt)) |
494 | panic("Cannot create bdev pseudo-fs"); | 500 | panic("Cannot create bdev pseudo-fs"); |
501 | /* | ||
502 | * This vfsmount structure is only used to obtain the | ||
503 | * blockdev_superblock, so tell kmemleak not to report it. | ||
504 | */ | ||
505 | kmemleak_not_leak(bd_mnt); | ||
495 | blockdev_superblock = bd_mnt->mnt_sb; /* For writeback */ | 506 | blockdev_superblock = bd_mnt->mnt_sb; /* For writeback */ |
496 | } | 507 | } |
497 | 508 | ||
@@ -1111,7 +1122,7 @@ EXPORT_SYMBOL(check_disk_change); | |||
1111 | 1122 | ||
1112 | void bd_set_size(struct block_device *bdev, loff_t size) | 1123 | void bd_set_size(struct block_device *bdev, loff_t size) |
1113 | { | 1124 | { |
1114 | unsigned bsize = bdev_hardsect_size(bdev); | 1125 | unsigned bsize = bdev_logical_block_size(bdev); |
1115 | 1126 | ||
1116 | bdev->bd_inode->i_size = size; | 1127 | bdev->bd_inode->i_size = size; |
1117 | while (bsize < PAGE_CACHE_SIZE) { | 1128 | while (bsize < PAGE_CACHE_SIZE) { |