aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nilfs2/ioctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nilfs2/ioctl.c')
-rw-r--r--fs/nilfs2/ioctl.c34
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
701static 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);
729out:
730 return ret;
731}
732
701static int nilfs_ioctl_get_info(struct inode *inode, struct file *filp, 733static 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 }