diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-11-19 22:46:45 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-11-19 22:46:45 -0500 |
| commit | b86db4744230c94e480de56f1b7f31117edbf193 (patch) | |
| tree | e94240a428f525c11c8758ebdd50398cec95e7be /fs/ext4 | |
| parent | 76db8ac45fc738f7d7664fe9b56d15c594a45228 (diff) | |
| parent | e681c047e47c0abe67bf95857f23814372793cb0 (diff) | |
Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4
* 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4:
ext4: Add EXT4_IOC_TRIM ioctl to handle batched discard
fs: Do not dispatch FITRIM through separate super_operation
ext4: ext4_fill_super shouldn't return 0 on corruption
jbd2: fix /proc/fs/jbd2/<dev> when using an external journal
ext4: missing unlock in ext4_clear_request_list()
ext4: fix setting random pages PageUptodate
Diffstat (limited to 'fs/ext4')
| -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 |
3 files changed, 29 insertions, 8 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 | ||
