diff options
| author | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
|---|---|---|
| committer | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
| commit | ada47b5fe13d89735805b566185f4885f5a3f750 (patch) | |
| tree | 644b88f8a71896307d71438e9b3af49126ffb22b /fs/block_dev.c | |
| parent | 43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff) | |
| parent | 3280f21d43ee541f97f8cda5792150d2dbec20d5 (diff) | |
Merge branch 'wip-2.6.34' into old-private-masterarchived-private-master
Diffstat (limited to 'fs/block_dev.c')
| -rw-r--r-- | fs/block_dev.c | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/fs/block_dev.c b/fs/block_dev.c index 8bed0557d88c..6dcee88c2e5d 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c | |||
| @@ -246,7 +246,8 @@ struct super_block *freeze_bdev(struct block_device *bdev) | |||
| 246 | if (!sb) | 246 | if (!sb) |
| 247 | goto out; | 247 | goto out; |
| 248 | if (sb->s_flags & MS_RDONLY) { | 248 | if (sb->s_flags & MS_RDONLY) { |
| 249 | deactivate_locked_super(sb); | 249 | sb->s_frozen = SB_FREEZE_TRANS; |
| 250 | up_write(&sb->s_umount); | ||
| 250 | mutex_unlock(&bdev->bd_fsfreeze_mutex); | 251 | mutex_unlock(&bdev->bd_fsfreeze_mutex); |
| 251 | return sb; | 252 | return sb; |
| 252 | } | 253 | } |
| @@ -307,7 +308,7 @@ int thaw_bdev(struct block_device *bdev, struct super_block *sb) | |||
| 307 | BUG_ON(sb->s_bdev != bdev); | 308 | BUG_ON(sb->s_bdev != bdev); |
| 308 | down_write(&sb->s_umount); | 309 | down_write(&sb->s_umount); |
| 309 | if (sb->s_flags & MS_RDONLY) | 310 | if (sb->s_flags & MS_RDONLY) |
| 310 | goto out_deactivate; | 311 | goto out_unfrozen; |
| 311 | 312 | ||
| 312 | if (sb->s_op->unfreeze_fs) { | 313 | if (sb->s_op->unfreeze_fs) { |
| 313 | error = sb->s_op->unfreeze_fs(sb); | 314 | error = sb->s_op->unfreeze_fs(sb); |
| @@ -321,11 +322,11 @@ int thaw_bdev(struct block_device *bdev, struct super_block *sb) | |||
| 321 | } | 322 | } |
| 322 | } | 323 | } |
| 323 | 324 | ||
| 325 | out_unfrozen: | ||
| 324 | sb->s_frozen = SB_UNFROZEN; | 326 | sb->s_frozen = SB_UNFROZEN; |
| 325 | smp_wmb(); | 327 | smp_wmb(); |
| 326 | wake_up(&sb->s_wait_unfrozen); | 328 | wake_up(&sb->s_wait_unfrozen); |
| 327 | 329 | ||
| 328 | out_deactivate: | ||
| 329 | if (sb) | 330 | if (sb) |
| 330 | deactivate_locked_super(sb); | 331 | deactivate_locked_super(sb); |
| 331 | out_unlock: | 332 | out_unlock: |
| @@ -403,10 +404,28 @@ static loff_t block_llseek(struct file *file, loff_t offset, int origin) | |||
| 403 | * NULL first argument is nfsd_sync_dir() and that's not a directory. | 404 | * NULL first argument is nfsd_sync_dir() and that's not a directory. |
| 404 | */ | 405 | */ |
| 405 | 406 | ||
| 406 | static int block_fsync(struct file *filp, struct dentry *dentry, int datasync) | 407 | int blkdev_fsync(struct file *filp, struct dentry *dentry, int datasync) |
| 407 | { | 408 | { |
| 408 | return sync_blockdev(I_BDEV(filp->f_mapping->host)); | 409 | struct inode *bd_inode = filp->f_mapping->host; |
| 410 | struct block_device *bdev = I_BDEV(bd_inode); | ||
| 411 | int error; | ||
| 412 | |||
| 413 | /* | ||
| 414 | * There is no need to serialise calls to blkdev_issue_flush with | ||
| 415 | * i_mutex and doing so causes performance issues with concurrent | ||
| 416 | * O_SYNC writers to a block device. | ||
| 417 | */ | ||
| 418 | mutex_unlock(&bd_inode->i_mutex); | ||
| 419 | |||
| 420 | error = blkdev_issue_flush(bdev, NULL); | ||
| 421 | if (error == -EOPNOTSUPP) | ||
| 422 | error = 0; | ||
| 423 | |||
| 424 | mutex_lock(&bd_inode->i_mutex); | ||
| 425 | |||
| 426 | return error; | ||
| 409 | } | 427 | } |
| 428 | EXPORT_SYMBOL(blkdev_fsync); | ||
| 410 | 429 | ||
| 411 | /* | 430 | /* |
| 412 | * pseudo-fs | 431 | * pseudo-fs |
| @@ -1470,7 +1489,7 @@ const struct file_operations def_blk_fops = { | |||
| 1470 | .aio_read = generic_file_aio_read, | 1489 | .aio_read = generic_file_aio_read, |
| 1471 | .aio_write = blkdev_aio_write, | 1490 | .aio_write = blkdev_aio_write, |
| 1472 | .mmap = generic_file_mmap, | 1491 | .mmap = generic_file_mmap, |
| 1473 | .fsync = block_fsync, | 1492 | .fsync = blkdev_fsync, |
| 1474 | .unlocked_ioctl = block_ioctl, | 1493 | .unlocked_ioctl = block_ioctl, |
| 1475 | #ifdef CONFIG_COMPAT | 1494 | #ifdef CONFIG_COMPAT |
| 1476 | .compat_ioctl = compat_blkdev_ioctl, | 1495 | .compat_ioctl = compat_blkdev_ioctl, |
