Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 142635
b: refs/heads/master
c: 8082d36
h: refs/heads/master
i:
  142633: c1b8801
  142631: 2817592
v: v3
  • Loading branch information
Ryusuke Konishi authored and Linus Torvalds committed Apr 7, 2009
1 parent e527fe3 commit 4caf03c
Show file tree
Hide file tree
Showing 6 changed files with 3 additions and 273 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: dc498d09be28172846cacded35ca2378222a8c7b
refs/heads/master: 8082d36aed26c4fb6ed43e4008303682eabf839e
2 changes: 1 addition & 1 deletion trunk/fs/nilfs2/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -704,7 +704,7 @@ struct file_operations nilfs_dir_operations = {
.readdir = nilfs_readdir,
.ioctl = nilfs_ioctl,
#ifdef CONFIG_COMPAT
.compat_ioctl = nilfs_compat_ioctl,
.compat_ioctl = nilfs_ioctl,
#endif /* CONFIG_COMPAT */
.fsync = nilfs_sync_file,

Expand Down
2 changes: 1 addition & 1 deletion trunk/fs/nilfs2/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ struct file_operations nilfs_file_operations = {
.aio_write = generic_file_aio_write,
.ioctl = nilfs_ioctl,
#ifdef CONFIG_COMPAT
.compat_ioctl = nilfs_compat_ioctl,
.compat_ioctl = nilfs_ioctl,
#endif /* CONFIG_COMPAT */
.mmap = nilfs_file_mmap,
.open = generic_file_open,
Expand Down
228 changes: 0 additions & 228 deletions trunk/fs/nilfs2/ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -631,231 +631,3 @@ int nilfs_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
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
1 change: 0 additions & 1 deletion trunk/fs/nilfs2/nilfs.h
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,6 @@ extern int nilfs_sync_file(struct file *, struct dentry *, int);

/* ioctl.c */
int nilfs_ioctl(struct inode *, struct file *, unsigned int, unsigned long);
long nilfs_compat_ioctl(struct file *, unsigned int, unsigned long);
int nilfs_ioctl_prepare_clean_segments(struct the_nilfs *, void __user *);

/* inode.c */
Expand Down
41 changes: 0 additions & 41 deletions trunk/include/linux/nilfs2_fs.h
Original file line number Diff line number Diff line change
Expand Up @@ -793,45 +793,4 @@ struct nilfs_bdesc {
#define NILFS_IOCTL_RESIZE \
_IOW(NILFS_IOCTL_IDENT, 0x8B, __u64)

/* compat_ioctl */
#ifdef CONFIG_COMPAT
#include <linux/compat.h>

struct nilfs_cpmode32 {
__u64 cm_cno;
compat_int_t cm_mode;
};

struct nilfs_argv32 {
compat_caddr_t v_base;
compat_size_t v_nmembs;
compat_size_t v_size;
compat_int_t v_index;
compat_int_t v_flags;
};

struct nilfs_sustat32 {
__u64 ss_nsegs;
__u64 ss_ncleansegs;
__u64 ss_ndirtysegs;
compat_time_t ss_ctime;
compat_time_t ss_nongc_ctime;
};

#define NILFS_IOCTL32_CHANGE_CPMODE \
_IOW(NILFS_IOCTL_IDENT, 0x80, struct nilfs_cpmode32)
#define NILFS_IOCTL32_GET_CPINFO \
_IOR(NILFS_IOCTL_IDENT, 0x82, struct nilfs_argv32)
#define NILFS_IOCTL32_GET_SUINFO \
_IOR(NILFS_IOCTL_IDENT, 0x84, struct nilfs_argv32)
#define NILFS_IOCTL32_GET_SUSTAT \
_IOR(NILFS_IOCTL_IDENT, 0x85, struct nilfs_sustat32)
#define NILFS_IOCTL32_GET_VINFO \
_IOWR(NILFS_IOCTL_IDENT, 0x86, struct nilfs_argv32)
#define NILFS_IOCTL32_GET_BDESCS \
_IOWR(NILFS_IOCTL_IDENT, 0x87, struct nilfs_argv32)
#define NILFS_IOCTL32_CLEAN_SEGMENTS \
_IOW(NILFS_IOCTL_IDENT, 0x88, struct nilfs_argv32[5])
#endif /* CONFIG_COMPAT */

#endif /* _LINUX_NILFS_FS_H */

0 comments on commit 4caf03c

Please sign in to comment.