|
@@ -631,231 +631,3 @@ int nilfs_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
|
|
return -ENOTTY;
|
|
return -ENOTTY;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
-/* compat_ioctl */
|
|
|
|
-#ifdef CONFIG_COMPAT
|
|
|
|
-#include <linux/compat.h>
|
|
|
|
-
|
|
|
|
-static int nilfs_compat_locked_ioctl(struct inode *inode, struct file *filp,
|
|
|
|
- unsigned int cmd, unsigned long arg)
|
|
|
|
-{
|
|
|
|
- int ret;
|
|
|
|
-
|
|
|
|
- lock_kernel();
|
|
|
|
- ret = nilfs_ioctl(inode, filp, cmd, arg);
|
|
|
|
- unlock_kernel();
|
|
|
|
- return ret;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static int
|
|
|
|
-nilfs_compat_ioctl_uargv32_to_uargv(struct nilfs_argv32 __user *uargv32,
|
|
|
|
- struct nilfs_argv __user *uargv)
|
|
|
|
-{
|
|
|
|
- compat_uptr_t base;
|
|
|
|
- compat_size_t nmembs, size;
|
|
|
|
- compat_int_t index, flags;
|
|
|
|
-
|
|
|
|
- if (get_user(base, &uargv32->v_base) ||
|
|
|
|
- put_user(compat_ptr(base), &uargv->v_base) ||
|
|
|
|
- get_user(nmembs, &uargv32->v_nmembs) ||
|
|
|
|
- put_user(nmembs, &uargv->v_nmembs) ||
|
|
|
|
- get_user(size, &uargv32->v_size) ||
|
|
|
|
- put_user(size, &uargv->v_size) ||
|
|
|
|
- get_user(index, &uargv32->v_index) ||
|
|
|
|
- put_user(index, &uargv->v_index) ||
|
|
|
|
- get_user(flags, &uargv32->v_flags) ||
|
|
|
|
- put_user(flags, &uargv->v_flags))
|
|
|
|
- return -EFAULT;
|
|
|
|
- return 0;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static int
|
|
|
|
-nilfs_compat_ioctl_uargv_to_uargv32(struct nilfs_argv __user *uargv,
|
|
|
|
- struct nilfs_argv32 __user *uargv32)
|
|
|
|
-{
|
|
|
|
- size_t nmembs;
|
|
|
|
-
|
|
|
|
- if (get_user(nmembs, &uargv->v_nmembs) ||
|
|
|
|
- put_user(nmembs, &uargv32->v_nmembs))
|
|
|
|
- return -EFAULT;
|
|
|
|
- return 0;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static int
|
|
|
|
-nilfs_compat_ioctl_get_by_argv(struct inode *inode, struct file *filp,
|
|
|
|
- unsigned int cmd, unsigned long arg)
|
|
|
|
-{
|
|
|
|
- struct nilfs_argv __user *uargv;
|
|
|
|
- struct nilfs_argv32 __user *uargv32;
|
|
|
|
- int ret;
|
|
|
|
-
|
|
|
|
- uargv = compat_alloc_user_space(sizeof(struct nilfs_argv));
|
|
|
|
- uargv32 = compat_ptr(arg);
|
|
|
|
- ret = nilfs_compat_ioctl_uargv32_to_uargv(uargv32, uargv);
|
|
|
|
- if (ret < 0)
|
|
|
|
- return ret;
|
|
|
|
-
|
|
|
|
- ret = nilfs_compat_locked_ioctl(inode, filp, cmd, (unsigned long)uargv);
|
|
|
|
- if (ret < 0)
|
|
|
|
- return ret;
|
|
|
|
-
|
|
|
|
- return nilfs_compat_ioctl_uargv_to_uargv32(uargv, uargv32);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static int
|
|
|
|
-nilfs_compat_ioctl_change_cpmode(struct inode *inode, struct file *filp,
|
|
|
|
- unsigned int cmd, unsigned long arg)
|
|
|
|
-{
|
|
|
|
- struct nilfs_cpmode __user *ucpmode;
|
|
|
|
- struct nilfs_cpmode32 __user *ucpmode32;
|
|
|
|
- int mode;
|
|
|
|
-
|
|
|
|
- ucpmode = compat_alloc_user_space(sizeof(struct nilfs_cpmode));
|
|
|
|
- ucpmode32 = compat_ptr(arg);
|
|
|
|
- if (copy_in_user(&ucpmode->cm_cno, &ucpmode32->cm_cno,
|
|
|
|
- sizeof(__u64)) ||
|
|
|
|
- get_user(mode, &ucpmode32->cm_mode) ||
|
|
|
|
- put_user(mode, &ucpmode->cm_mode))
|
|
|
|
- return -EFAULT;
|
|
|
|
-
|
|
|
|
- return nilfs_compat_locked_ioctl(
|
|
|
|
- inode, filp, cmd, (unsigned long)ucpmode);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-static inline int
|
|
|
|
-nilfs_compat_ioctl_delete_checkpoint(struct inode *inode, struct file *filp,
|
|
|
|
- unsigned int cmd, unsigned long arg)
|
|
|
|
-{
|
|
|
|
- return nilfs_compat_locked_ioctl(inode, filp, cmd, arg);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static inline int
|
|
|
|
-nilfs_compat_ioctl_get_cpinfo(struct inode *inode, struct file *filp,
|
|
|
|
- unsigned int cmd, unsigned long arg)
|
|
|
|
-{
|
|
|
|
- return nilfs_compat_ioctl_get_by_argv(inode, filp, cmd, arg);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static inline int
|
|
|
|
-nilfs_compat_ioctl_get_cpstat(struct inode *inode, struct file *filp,
|
|
|
|
- unsigned int cmd, unsigned long arg)
|
|
|
|
-{
|
|
|
|
- return nilfs_compat_locked_ioctl(inode, filp, cmd, arg);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static inline int
|
|
|
|
-nilfs_compat_ioctl_get_suinfo(struct inode *inode, struct file *filp,
|
|
|
|
- unsigned int cmd, unsigned long arg)
|
|
|
|
-{
|
|
|
|
- return nilfs_compat_ioctl_get_by_argv(inode, filp, cmd, arg);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static int
|
|
|
|
-nilfs_compat_ioctl_get_sustat(struct inode *inode, struct file *filp,
|
|
|
|
- unsigned int cmd, unsigned long arg)
|
|
|
|
-{
|
|
|
|
- struct nilfs_sustat __user *usustat;
|
|
|
|
- struct nilfs_sustat32 __user *usustat32;
|
|
|
|
- time_t ctime, nongc_ctime;
|
|
|
|
- int ret;
|
|
|
|
-
|
|
|
|
- usustat = compat_alloc_user_space(sizeof(struct nilfs_sustat));
|
|
|
|
- ret = nilfs_compat_locked_ioctl(inode, filp, cmd,
|
|
|
|
- (unsigned long)usustat);
|
|
|
|
- if (ret < 0)
|
|
|
|
- return ret;
|
|
|
|
-
|
|
|
|
- usustat32 = compat_ptr(arg);
|
|
|
|
- if (copy_in_user(&usustat32->ss_nsegs, &usustat->ss_nsegs,
|
|
|
|
- sizeof(__u64)) ||
|
|
|
|
- copy_in_user(&usustat32->ss_ncleansegs, &usustat->ss_ncleansegs,
|
|
|
|
- sizeof(__u64)) ||
|
|
|
|
- copy_in_user(&usustat32->ss_ndirtysegs, &usustat->ss_ndirtysegs,
|
|
|
|
- sizeof(__u64)) ||
|
|
|
|
- get_user(ctime, &usustat->ss_ctime) ||
|
|
|
|
- put_user(ctime, &usustat32->ss_ctime) ||
|
|
|
|
- get_user(nongc_ctime, &usustat->ss_nongc_ctime) ||
|
|
|
|
- put_user(nongc_ctime, &usustat32->ss_nongc_ctime))
|
|
|
|
- return -EFAULT;
|
|
|
|
- return 0;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static inline int
|
|
|
|
-nilfs_compat_ioctl_get_vinfo(struct inode *inode, struct file *filp,
|
|
|
|
- unsigned int cmd, unsigned long arg)
|
|
|
|
-{
|
|
|
|
- return nilfs_compat_ioctl_get_by_argv(inode, filp, cmd, arg);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static inline int
|
|
|
|
-nilfs_compat_ioctl_get_bdescs(struct inode *inode, struct file *filp,
|
|
|
|
- unsigned int cmd, unsigned long arg)
|
|
|
|
-{
|
|
|
|
- return nilfs_compat_ioctl_get_by_argv(inode, filp, cmd, arg);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static int
|
|
|
|
-nilfs_compat_ioctl_clean_segments(struct inode *inode, struct file *filp,
|
|
|
|
- unsigned int cmd, unsigned long arg)
|
|
|
|
-{
|
|
|
|
- struct nilfs_argv __user *uargv;
|
|
|
|
- struct nilfs_argv32 __user *uargv32;
|
|
|
|
- int i, ret;
|
|
|
|
-
|
|
|
|
- uargv = compat_alloc_user_space(sizeof(struct nilfs_argv) * 5);
|
|
|
|
- uargv32 = compat_ptr(arg);
|
|
|
|
- for (i = 0; i < 5; i++) {
|
|
|
|
- ret = nilfs_compat_ioctl_uargv32_to_uargv(&uargv32[i],
|
|
|
|
- &uargv[i]);
|
|
|
|
- if (ret < 0)
|
|
|
|
- return ret;
|
|
|
|
- }
|
|
|
|
- return nilfs_compat_locked_ioctl(
|
|
|
|
- inode, filp, cmd, (unsigned long)uargv);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static int nilfs_compat_ioctl_sync(struct inode *inode, struct file *filp,
|
|
|
|
- unsigned int cmd, unsigned long arg)
|
|
|
|
-{
|
|
|
|
- return nilfs_compat_locked_ioctl(inode, filp, cmd, arg);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-long nilfs_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
|
|
|
-{
|
|
|
|
- struct inode *inode = filp->f_dentry->d_inode;
|
|
|
|
-
|
|
|
|
- switch (cmd) {
|
|
|
|
- case NILFS_IOCTL32_CHANGE_CPMODE:
|
|
|
|
- return nilfs_compat_ioctl_change_cpmode(
|
|
|
|
- inode, filp, NILFS_IOCTL_CHANGE_CPMODE, arg);
|
|
|
|
- case NILFS_IOCTL_DELETE_CHECKPOINT:
|
|
|
|
- return nilfs_compat_ioctl_delete_checkpoint(
|
|
|
|
- inode, filp, cmd, arg);
|
|
|
|
- case NILFS_IOCTL32_GET_CPINFO:
|
|
|
|
- return nilfs_compat_ioctl_get_cpinfo(
|
|
|
|
- inode, filp, NILFS_IOCTL_GET_CPINFO, arg);
|
|
|
|
- case NILFS_IOCTL_GET_CPSTAT:
|
|
|
|
- return nilfs_compat_ioctl_get_cpstat(inode, filp, cmd, arg);
|
|
|
|
- case NILFS_IOCTL32_GET_SUINFO:
|
|
|
|
- return nilfs_compat_ioctl_get_suinfo(
|
|
|
|
- inode, filp, NILFS_IOCTL_GET_SUINFO, arg);
|
|
|
|
- case NILFS_IOCTL32_GET_SUSTAT:
|
|
|
|
- return nilfs_compat_ioctl_get_sustat(
|
|
|
|
- inode, filp, NILFS_IOCTL_GET_SUSTAT, arg);
|
|
|
|
- case NILFS_IOCTL32_GET_VINFO:
|
|
|
|
- return nilfs_compat_ioctl_get_vinfo(
|
|
|
|
- inode, filp, NILFS_IOCTL_GET_VINFO, arg);
|
|
|
|
- case NILFS_IOCTL32_GET_BDESCS:
|
|
|
|
- return nilfs_compat_ioctl_get_bdescs(
|
|
|
|
- inode, filp, NILFS_IOCTL_GET_BDESCS, arg);
|
|
|
|
- case NILFS_IOCTL32_CLEAN_SEGMENTS:
|
|
|
|
- return nilfs_compat_ioctl_clean_segments(
|
|
|
|
- inode, filp, NILFS_IOCTL_CLEAN_SEGMENTS, arg);
|
|
|
|
- case NILFS_IOCTL_SYNC:
|
|
|
|
- return nilfs_compat_ioctl_sync(inode, filp, cmd, arg);
|
|
|
|
- default:
|
|
|
|
- return -ENOIOCTLCMD;
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-#endif
|
|
|