diff options
| -rw-r--r-- | fs/ext4/ioctl.c | 24 | ||||
| -rw-r--r-- | fs/ext4/page-io.c | 4 | ||||
| -rw-r--r-- | fs/ext4/super.c | 9 | ||||
| -rw-r--r-- | fs/ioctl.c | 39 | ||||
| -rw-r--r-- | fs/jbd2/journal.c | 16 | ||||
| -rw-r--r-- | include/linux/fs.h | 1 |
6 files changed, 37 insertions, 56 deletions
diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c index bf5ae883b1bd..eb3bc2fe647e 100644 --- a/fs/ext4/ioctl.c +++ b/fs/ext4/ioctl.c | |||
| @@ -331,6 +331,30 @@ mext_out: | |||
| 331 | return err; | 331 | return err; |
| 332 | } | 332 | } |
| 333 | 333 | ||
| 334 | case FITRIM: | ||
| 335 | { | ||
| 336 | struct super_block *sb = inode->i_sb; | ||
| 337 | struct fstrim_range range; | ||
| 338 | int ret = 0; | ||
| 339 | |||
| 340 | if (!capable(CAP_SYS_ADMIN)) | ||
| 341 | return -EPERM; | ||
| 342 | |||
| 343 | if (copy_from_user(&range, (struct fstrim_range *)arg, | ||
| 344 | sizeof(range))) | ||
| 345 | return -EFAULT; | ||
| 346 | |||
| 347 | ret = ext4_trim_fs(sb, &range); | ||
| 348 | if (ret < 0) | ||
| 349 | return ret; | ||
| 350 | |||
| 351 | if (copy_to_user((struct fstrim_range *)arg, &range, | ||
| 352 | sizeof(range))) | ||
| 353 | return -EFAULT; | ||
| 354 | |||
| 355 | return 0; | ||
| 356 | } | ||
| 357 | |||
| 334 | default: | 358 | default: |
| 335 | return -ENOTTY; | 359 | return -ENOTTY; |
| 336 | } | 360 | } |
diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c index 7f5451cd1d38..beacce11ac50 100644 --- a/fs/ext4/page-io.c +++ b/fs/ext4/page-io.c | |||
| @@ -237,8 +237,6 @@ static void ext4_end_bio(struct bio *bio, int error) | |||
| 237 | } while (bh != head); | 237 | } while (bh != head); |
| 238 | } | 238 | } |
| 239 | 239 | ||
| 240 | put_io_page(io_end->pages[i]); | ||
| 241 | |||
| 242 | /* | 240 | /* |
| 243 | * If this is a partial write which happened to make | 241 | * If this is a partial write which happened to make |
| 244 | * all buffers uptodate then we can optimize away a | 242 | * all buffers uptodate then we can optimize away a |
| @@ -248,6 +246,8 @@ static void ext4_end_bio(struct bio *bio, int error) | |||
| 248 | */ | 246 | */ |
| 249 | if (!partial_write) | 247 | if (!partial_write) |
| 250 | SetPageUptodate(page); | 248 | SetPageUptodate(page); |
| 249 | |||
| 250 | put_io_page(io_end->pages[i]); | ||
| 251 | } | 251 | } |
| 252 | io_end->num_io_pages = 0; | 252 | io_end->num_io_pages = 0; |
| 253 | inode = io_end->inode; | 253 | inode = io_end->inode; |
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 61182fe6254e..e32195d6aac3 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
| @@ -1197,7 +1197,6 @@ static const struct super_operations ext4_sops = { | |||
| 1197 | .quota_write = ext4_quota_write, | 1197 | .quota_write = ext4_quota_write, |
| 1198 | #endif | 1198 | #endif |
| 1199 | .bdev_try_to_free_page = bdev_try_to_free_page, | 1199 | .bdev_try_to_free_page = bdev_try_to_free_page, |
| 1200 | .trim_fs = ext4_trim_fs | ||
| 1201 | }; | 1200 | }; |
| 1202 | 1201 | ||
| 1203 | static const struct super_operations ext4_nojournal_sops = { | 1202 | static const struct super_operations ext4_nojournal_sops = { |
| @@ -2799,9 +2798,6 @@ static void ext4_clear_request_list(void) | |||
| 2799 | struct ext4_li_request *elr; | 2798 | struct ext4_li_request *elr; |
| 2800 | 2799 | ||
| 2801 | mutex_lock(&ext4_li_info->li_list_mtx); | 2800 | mutex_lock(&ext4_li_info->li_list_mtx); |
| 2802 | if (list_empty(&ext4_li_info->li_request_list)) | ||
| 2803 | return; | ||
| 2804 | |||
| 2805 | list_for_each_safe(pos, n, &ext4_li_info->li_request_list) { | 2801 | list_for_each_safe(pos, n, &ext4_li_info->li_request_list) { |
| 2806 | elr = list_entry(pos, struct ext4_li_request, | 2802 | elr = list_entry(pos, struct ext4_li_request, |
| 2807 | lr_request); | 2803 | lr_request); |
| @@ -3268,13 +3264,14 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
| 3268 | * Test whether we have more sectors than will fit in sector_t, | 3264 | * Test whether we have more sectors than will fit in sector_t, |
| 3269 | * and whether the max offset is addressable by the page cache. | 3265 | * and whether the max offset is addressable by the page cache. |
| 3270 | */ | 3266 | */ |
| 3271 | ret = generic_check_addressable(sb->s_blocksize_bits, | 3267 | err = generic_check_addressable(sb->s_blocksize_bits, |
| 3272 | ext4_blocks_count(es)); | 3268 | ext4_blocks_count(es)); |
| 3273 | if (ret) { | 3269 | if (err) { |
| 3274 | ext4_msg(sb, KERN_ERR, "filesystem" | 3270 | ext4_msg(sb, KERN_ERR, "filesystem" |
| 3275 | " too large to mount safely on this system"); | 3271 | " too large to mount safely on this system"); |
| 3276 | if (sizeof(sector_t) < 8) | 3272 | if (sizeof(sector_t) < 8) |
| 3277 | ext4_msg(sb, KERN_WARNING, "CONFIG_LBDAF not enabled"); | 3273 | ext4_msg(sb, KERN_WARNING, "CONFIG_LBDAF not enabled"); |
| 3274 | ret = err; | ||
| 3278 | goto failed_mount; | 3275 | goto failed_mount; |
| 3279 | } | 3276 | } |
| 3280 | 3277 | ||
diff --git a/fs/ioctl.c b/fs/ioctl.c index 4f46752ce4f9..d6cc16476620 100644 --- a/fs/ioctl.c +++ b/fs/ioctl.c | |||
| @@ -529,41 +529,6 @@ static int ioctl_fsthaw(struct file *filp) | |||
| 529 | return thaw_super(sb); | 529 | return thaw_super(sb); |
| 530 | } | 530 | } |
| 531 | 531 | ||
| 532 | static int ioctl_fstrim(struct file *filp, void __user *argp) | ||
| 533 | { | ||
| 534 | struct super_block *sb = filp->f_path.dentry->d_inode->i_sb; | ||
| 535 | struct fstrim_range range; | ||
| 536 | int ret = 0; | ||
| 537 | |||
| 538 | if (!capable(CAP_SYS_ADMIN)) | ||
| 539 | return -EPERM; | ||
| 540 | |||
| 541 | /* If filesystem doesn't support trim feature, return. */ | ||
| 542 | if (sb->s_op->trim_fs == NULL) | ||
| 543 | return -EOPNOTSUPP; | ||
| 544 | |||
| 545 | /* If a blockdevice-backed filesystem isn't specified, return EINVAL. */ | ||
| 546 | if (sb->s_bdev == NULL) | ||
| 547 | return -EINVAL; | ||
| 548 | |||
| 549 | if (argp == NULL) { | ||
| 550 | range.start = 0; | ||
| 551 | range.len = ULLONG_MAX; | ||
| 552 | range.minlen = 0; | ||
| 553 | } else if (copy_from_user(&range, argp, sizeof(range))) | ||
| 554 | return -EFAULT; | ||
| 555 | |||
| 556 | ret = sb->s_op->trim_fs(sb, &range); | ||
| 557 | if (ret < 0) | ||
| 558 | return ret; | ||
| 559 | |||
| 560 | if ((argp != NULL) && | ||
| 561 | (copy_to_user(argp, &range, sizeof(range)))) | ||
| 562 | return -EFAULT; | ||
| 563 | |||
| 564 | return 0; | ||
| 565 | } | ||
| 566 | |||
| 567 | /* | 532 | /* |
| 568 | * When you add any new common ioctls to the switches above and below | 533 | * When you add any new common ioctls to the switches above and below |
| 569 | * please update compat_sys_ioctl() too. | 534 | * please update compat_sys_ioctl() too. |
| @@ -614,10 +579,6 @@ int do_vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd, | |||
| 614 | error = ioctl_fsthaw(filp); | 579 | error = ioctl_fsthaw(filp); |
| 615 | break; | 580 | break; |
| 616 | 581 | ||
| 617 | case FITRIM: | ||
| 618 | error = ioctl_fstrim(filp, argp); | ||
| 619 | break; | ||
| 620 | |||
| 621 | case FS_IOC_FIEMAP: | 582 | case FS_IOC_FIEMAP: |
| 622 | return ioctl_fiemap(filp, arg); | 583 | return ioctl_fiemap(filp, arg); |
| 623 | 584 | ||
diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index c590d155c095..f837ba953529 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c | |||
| @@ -899,6 +899,14 @@ journal_t * jbd2_journal_init_dev(struct block_device *bdev, | |||
| 899 | 899 | ||
| 900 | /* journal descriptor can store up to n blocks -bzzz */ | 900 | /* journal descriptor can store up to n blocks -bzzz */ |
| 901 | journal->j_blocksize = blocksize; | 901 | journal->j_blocksize = blocksize; |
| 902 | journal->j_dev = bdev; | ||
| 903 | journal->j_fs_dev = fs_dev; | ||
| 904 | journal->j_blk_offset = start; | ||
| 905 | journal->j_maxlen = len; | ||
| 906 | bdevname(journal->j_dev, journal->j_devname); | ||
| 907 | p = journal->j_devname; | ||
| 908 | while ((p = strchr(p, '/'))) | ||
| 909 | *p = '!'; | ||
| 902 | jbd2_stats_proc_init(journal); | 910 | jbd2_stats_proc_init(journal); |
| 903 | n = journal->j_blocksize / sizeof(journal_block_tag_t); | 911 | n = journal->j_blocksize / sizeof(journal_block_tag_t); |
| 904 | journal->j_wbufsize = n; | 912 | journal->j_wbufsize = n; |
| @@ -908,14 +916,6 @@ journal_t * jbd2_journal_init_dev(struct block_device *bdev, | |||
| 908 | __func__); | 916 | __func__); |
| 909 | goto out_err; | 917 | goto out_err; |
| 910 | } | 918 | } |
| 911 | journal->j_dev = bdev; | ||
| 912 | journal->j_fs_dev = fs_dev; | ||
| 913 | journal->j_blk_offset = start; | ||
| 914 | journal->j_maxlen = len; | ||
| 915 | bdevname(journal->j_dev, journal->j_devname); | ||
| 916 | p = journal->j_devname; | ||
| 917 | while ((p = strchr(p, '/'))) | ||
| 918 | *p = '!'; | ||
| 919 | 919 | ||
| 920 | bh = __getblk(journal->j_dev, start, journal->j_blocksize); | 920 | bh = __getblk(journal->j_dev, start, journal->j_blocksize); |
| 921 | if (!bh) { | 921 | if (!bh) { |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 334d68a17108..eedc00b7b1ee 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -1612,7 +1612,6 @@ struct super_operations { | |||
| 1612 | ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t); | 1612 | ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t); |
| 1613 | #endif | 1613 | #endif |
| 1614 | int (*bdev_try_to_free_page)(struct super_block*, struct page*, gfp_t); | 1614 | int (*bdev_try_to_free_page)(struct super_block*, struct page*, gfp_t); |
| 1615 | int (*trim_fs) (struct super_block *, struct fstrim_range *); | ||
| 1616 | }; | 1615 | }; |
| 1617 | 1616 | ||
| 1618 | /* | 1617 | /* |
