mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-09 23:00:21 +00:00
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
This commit is contained in:
commit
b86db47442
@ -331,6 +331,30 @@ mext_out:
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case FITRIM:
|
||||||
|
{
|
||||||
|
struct super_block *sb = inode->i_sb;
|
||||||
|
struct fstrim_range range;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
if (!capable(CAP_SYS_ADMIN))
|
||||||
|
return -EPERM;
|
||||||
|
|
||||||
|
if (copy_from_user(&range, (struct fstrim_range *)arg,
|
||||||
|
sizeof(range)))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
ret = ext4_trim_fs(sb, &range);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if (copy_to_user((struct fstrim_range *)arg, &range,
|
||||||
|
sizeof(range)))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return -ENOTTY;
|
return -ENOTTY;
|
||||||
}
|
}
|
||||||
|
@ -237,8 +237,6 @@ static void ext4_end_bio(struct bio *bio, int error)
|
|||||||
} while (bh != head);
|
} while (bh != head);
|
||||||
}
|
}
|
||||||
|
|
||||||
put_io_page(io_end->pages[i]);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If this is a partial write which happened to make
|
* If this is a partial write which happened to make
|
||||||
* all buffers uptodate then we can optimize away a
|
* all buffers uptodate then we can optimize away a
|
||||||
@ -248,6 +246,8 @@ static void ext4_end_bio(struct bio *bio, int error)
|
|||||||
*/
|
*/
|
||||||
if (!partial_write)
|
if (!partial_write)
|
||||||
SetPageUptodate(page);
|
SetPageUptodate(page);
|
||||||
|
|
||||||
|
put_io_page(io_end->pages[i]);
|
||||||
}
|
}
|
||||||
io_end->num_io_pages = 0;
|
io_end->num_io_pages = 0;
|
||||||
inode = io_end->inode;
|
inode = io_end->inode;
|
||||||
|
@ -1197,7 +1197,6 @@ static const struct super_operations ext4_sops = {
|
|||||||
.quota_write = ext4_quota_write,
|
.quota_write = ext4_quota_write,
|
||||||
#endif
|
#endif
|
||||||
.bdev_try_to_free_page = bdev_try_to_free_page,
|
.bdev_try_to_free_page = bdev_try_to_free_page,
|
||||||
.trim_fs = ext4_trim_fs
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct super_operations ext4_nojournal_sops = {
|
static const struct super_operations ext4_nojournal_sops = {
|
||||||
@ -2799,9 +2798,6 @@ static void ext4_clear_request_list(void)
|
|||||||
struct ext4_li_request *elr;
|
struct ext4_li_request *elr;
|
||||||
|
|
||||||
mutex_lock(&ext4_li_info->li_list_mtx);
|
mutex_lock(&ext4_li_info->li_list_mtx);
|
||||||
if (list_empty(&ext4_li_info->li_request_list))
|
|
||||||
return;
|
|
||||||
|
|
||||||
list_for_each_safe(pos, n, &ext4_li_info->li_request_list) {
|
list_for_each_safe(pos, n, &ext4_li_info->li_request_list) {
|
||||||
elr = list_entry(pos, struct ext4_li_request,
|
elr = list_entry(pos, struct ext4_li_request,
|
||||||
lr_request);
|
lr_request);
|
||||||
@ -3268,13 +3264,14 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
|
|||||||
* Test whether we have more sectors than will fit in sector_t,
|
* Test whether we have more sectors than will fit in sector_t,
|
||||||
* and whether the max offset is addressable by the page cache.
|
* and whether the max offset is addressable by the page cache.
|
||||||
*/
|
*/
|
||||||
ret = generic_check_addressable(sb->s_blocksize_bits,
|
err = generic_check_addressable(sb->s_blocksize_bits,
|
||||||
ext4_blocks_count(es));
|
ext4_blocks_count(es));
|
||||||
if (ret) {
|
if (err) {
|
||||||
ext4_msg(sb, KERN_ERR, "filesystem"
|
ext4_msg(sb, KERN_ERR, "filesystem"
|
||||||
" too large to mount safely on this system");
|
" too large to mount safely on this system");
|
||||||
if (sizeof(sector_t) < 8)
|
if (sizeof(sector_t) < 8)
|
||||||
ext4_msg(sb, KERN_WARNING, "CONFIG_LBDAF not enabled");
|
ext4_msg(sb, KERN_WARNING, "CONFIG_LBDAF not enabled");
|
||||||
|
ret = err;
|
||||||
goto failed_mount;
|
goto failed_mount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
39
fs/ioctl.c
39
fs/ioctl.c
@ -529,41 +529,6 @@ static int ioctl_fsthaw(struct file *filp)
|
|||||||
return thaw_super(sb);
|
return thaw_super(sb);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ioctl_fstrim(struct file *filp, void __user *argp)
|
|
||||||
{
|
|
||||||
struct super_block *sb = filp->f_path.dentry->d_inode->i_sb;
|
|
||||||
struct fstrim_range range;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
if (!capable(CAP_SYS_ADMIN))
|
|
||||||
return -EPERM;
|
|
||||||
|
|
||||||
/* If filesystem doesn't support trim feature, return. */
|
|
||||||
if (sb->s_op->trim_fs == NULL)
|
|
||||||
return -EOPNOTSUPP;
|
|
||||||
|
|
||||||
/* If a blockdevice-backed filesystem isn't specified, return EINVAL. */
|
|
||||||
if (sb->s_bdev == NULL)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
if (argp == NULL) {
|
|
||||||
range.start = 0;
|
|
||||||
range.len = ULLONG_MAX;
|
|
||||||
range.minlen = 0;
|
|
||||||
} else if (copy_from_user(&range, argp, sizeof(range)))
|
|
||||||
return -EFAULT;
|
|
||||||
|
|
||||||
ret = sb->s_op->trim_fs(sb, &range);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
if ((argp != NULL) &&
|
|
||||||
(copy_to_user(argp, &range, sizeof(range))))
|
|
||||||
return -EFAULT;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* When you add any new common ioctls to the switches above and below
|
* When you add any new common ioctls to the switches above and below
|
||||||
* please update compat_sys_ioctl() too.
|
* please update compat_sys_ioctl() too.
|
||||||
@ -614,10 +579,6 @@ int do_vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd,
|
|||||||
error = ioctl_fsthaw(filp);
|
error = ioctl_fsthaw(filp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FITRIM:
|
|
||||||
error = ioctl_fstrim(filp, argp);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FS_IOC_FIEMAP:
|
case FS_IOC_FIEMAP:
|
||||||
return ioctl_fiemap(filp, arg);
|
return ioctl_fiemap(filp, arg);
|
||||||
|
|
||||||
|
@ -899,6 +899,14 @@ journal_t * jbd2_journal_init_dev(struct block_device *bdev,
|
|||||||
|
|
||||||
/* journal descriptor can store up to n blocks -bzzz */
|
/* journal descriptor can store up to n blocks -bzzz */
|
||||||
journal->j_blocksize = blocksize;
|
journal->j_blocksize = blocksize;
|
||||||
|
journal->j_dev = bdev;
|
||||||
|
journal->j_fs_dev = fs_dev;
|
||||||
|
journal->j_blk_offset = start;
|
||||||
|
journal->j_maxlen = len;
|
||||||
|
bdevname(journal->j_dev, journal->j_devname);
|
||||||
|
p = journal->j_devname;
|
||||||
|
while ((p = strchr(p, '/')))
|
||||||
|
*p = '!';
|
||||||
jbd2_stats_proc_init(journal);
|
jbd2_stats_proc_init(journal);
|
||||||
n = journal->j_blocksize / sizeof(journal_block_tag_t);
|
n = journal->j_blocksize / sizeof(journal_block_tag_t);
|
||||||
journal->j_wbufsize = n;
|
journal->j_wbufsize = n;
|
||||||
@ -908,14 +916,6 @@ journal_t * jbd2_journal_init_dev(struct block_device *bdev,
|
|||||||
__func__);
|
__func__);
|
||||||
goto out_err;
|
goto out_err;
|
||||||
}
|
}
|
||||||
journal->j_dev = bdev;
|
|
||||||
journal->j_fs_dev = fs_dev;
|
|
||||||
journal->j_blk_offset = start;
|
|
||||||
journal->j_maxlen = len;
|
|
||||||
bdevname(journal->j_dev, journal->j_devname);
|
|
||||||
p = journal->j_devname;
|
|
||||||
while ((p = strchr(p, '/')))
|
|
||||||
*p = '!';
|
|
||||||
|
|
||||||
bh = __getblk(journal->j_dev, start, journal->j_blocksize);
|
bh = __getblk(journal->j_dev, start, journal->j_blocksize);
|
||||||
if (!bh) {
|
if (!bh) {
|
||||||
|
@ -1612,7 +1612,6 @@ struct super_operations {
|
|||||||
ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t);
|
ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t);
|
||||||
#endif
|
#endif
|
||||||
int (*bdev_try_to_free_page)(struct super_block*, struct page*, gfp_t);
|
int (*bdev_try_to_free_page)(struct super_block*, struct page*, gfp_t);
|
||||||
int (*trim_fs) (struct super_block *, struct fstrim_range *);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user