Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 218885
b: refs/heads/master
c: 367a51a
h: refs/heads/master
i:
  218883: dacda17
v: v3
  • Loading branch information
Lukas Czerner authored and Theodore Ts'o committed Oct 28, 2010
1 parent 1779047 commit b30af2d
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 77ca6cdf0ab8a42f481ec997911bc89e79138723
refs/heads/master: 367a51a339020ba4d9edb0ce0f21d65bd50b00c9
39 changes: 39 additions & 0 deletions trunk/fs/ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -530,6 +530,41 @@ static int ioctl_fsthaw(struct file *filp)
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
* please update compat_sys_ioctl() too.
Expand Down Expand Up @@ -580,6 +615,10 @@ int do_vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd,
error = ioctl_fsthaw(filp);
break;

case FITRIM:
error = ioctl_fstrim(filp, argp);
break;

case FS_IOC_FIEMAP:
return ioctl_fiemap(filp, arg);

Expand Down
8 changes: 8 additions & 0 deletions trunk/include/linux/fs.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,12 @@
#define SEEK_END 2 /* seek relative to end of file */
#define SEEK_MAX SEEK_END

struct fstrim_range {
uint64_t start;
uint64_t len;
uint64_t minlen;
};

/* And dynamically-tunable limits and defaults: */
struct files_stat_struct {
int nr_files; /* read only */
Expand Down Expand Up @@ -316,6 +322,7 @@ struct inodes_stat_t {
#define FIGETBSZ _IO(0x00,2) /* get the block size used for bmap */
#define FIFREEZE _IOWR('X', 119, int) /* Freeze */
#define FITHAW _IOWR('X', 120, int) /* Thaw */
#define FITRIM _IOWR('X', 121, struct fstrim_range) /* Trim */

#define FS_IOC_GETFLAGS _IOR('f', 1, long)
#define FS_IOC_SETFLAGS _IOW('f', 2, long)
Expand Down Expand Up @@ -1581,6 +1588,7 @@ struct super_operations {
ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t);
#endif
int (*bdev_try_to_free_page)(struct super_block*, struct page*, gfp_t);
int (*trim_fs) (struct super_block *, struct fstrim_range *);
};

/*
Expand Down

0 comments on commit b30af2d

Please sign in to comment.