diff options
Diffstat (limited to 'fs/nilfs2/ioctl.c')
-rw-r--r-- | fs/nilfs2/ioctl.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/fs/nilfs2/ioctl.c b/fs/nilfs2/ioctl.c index f2469ba6246b..6f617773a7f7 100644 --- a/fs/nilfs2/ioctl.c +++ b/fs/nilfs2/ioctl.c | |||
@@ -698,6 +698,38 @@ static int nilfs_ioctl_sync(struct inode *inode, struct file *filp, | |||
698 | return 0; | 698 | return 0; |
699 | } | 699 | } |
700 | 700 | ||
701 | static int nilfs_ioctl_set_alloc_range(struct inode *inode, void __user *argp) | ||
702 | { | ||
703 | struct the_nilfs *nilfs = inode->i_sb->s_fs_info; | ||
704 | __u64 range[2]; | ||
705 | __u64 minseg, maxseg; | ||
706 | unsigned long segbytes; | ||
707 | int ret = -EPERM; | ||
708 | |||
709 | if (!capable(CAP_SYS_ADMIN)) | ||
710 | goto out; | ||
711 | |||
712 | ret = -EFAULT; | ||
713 | if (copy_from_user(range, argp, sizeof(__u64[2]))) | ||
714 | goto out; | ||
715 | |||
716 | ret = -ERANGE; | ||
717 | if (range[1] > i_size_read(inode->i_sb->s_bdev->bd_inode)) | ||
718 | goto out; | ||
719 | |||
720 | segbytes = nilfs->ns_blocks_per_segment * nilfs->ns_blocksize; | ||
721 | |||
722 | minseg = range[0] + segbytes - 1; | ||
723 | do_div(minseg, segbytes); | ||
724 | maxseg = NILFS_SB2_OFFSET_BYTES(range[1]); | ||
725 | do_div(maxseg, segbytes); | ||
726 | maxseg--; | ||
727 | |||
728 | ret = nilfs_sufile_set_alloc_range(nilfs->ns_sufile, minseg, maxseg); | ||
729 | out: | ||
730 | return ret; | ||
731 | } | ||
732 | |||
701 | static int nilfs_ioctl_get_info(struct inode *inode, struct file *filp, | 733 | static int nilfs_ioctl_get_info(struct inode *inode, struct file *filp, |
702 | unsigned int cmd, void __user *argp, | 734 | unsigned int cmd, void __user *argp, |
703 | size_t membsz, | 735 | size_t membsz, |
@@ -763,6 +795,8 @@ long nilfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | |||
763 | return nilfs_ioctl_clean_segments(inode, filp, cmd, argp); | 795 | return nilfs_ioctl_clean_segments(inode, filp, cmd, argp); |
764 | case NILFS_IOCTL_SYNC: | 796 | case NILFS_IOCTL_SYNC: |
765 | return nilfs_ioctl_sync(inode, filp, cmd, argp); | 797 | return nilfs_ioctl_sync(inode, filp, cmd, argp); |
798 | case NILFS_IOCTL_SET_ALLOC_RANGE: | ||
799 | return nilfs_ioctl_set_alloc_range(inode, argp); | ||
766 | default: | 800 | default: |
767 | return -ENOTTY; | 801 | return -ENOTTY; |
768 | } | 802 | } |