diff options
Diffstat (limited to 'fs/ext2/ioctl.c')
-rw-r--r-- | fs/ext2/ioctl.c | 41 |
1 files changed, 36 insertions, 5 deletions
diff --git a/fs/ext2/ioctl.c b/fs/ext2/ioctl.c index 4262172..d01f9ef 100644 --- a/fs/ext2/ioctl.c +++ b/fs/ext2/ioctl.c @@ -4,15 +4,46 @@ * Copyright (C) 1993 Remy Card (card@masi.ibp.fr) */ -#include <linux/sched.h> +#include <asm/segment.h> + #include <linux/errno.h> +#include <linux/fs.h> #include <linux/ext2_fs.h> +#include <linux/ioctl.h> +#include <linux/sched.h> int ext2_ioctl (struct inode * inode, struct file * filp, unsigned int cmd, unsigned long arg) { -#ifdef EXT2FS_DEBUG - printk ("ext2_ioctl: cmd = %d, arg = %d\n", cmd, arg); -#endif - return -EINVAL; + + ext2_debug ("cmd = %u, arg = %lu\n", cmd, arg); + + switch (cmd) { + case EXT2_IOC_GETFLAGS: + put_fs_long (inode->u.ext2_i.i_flags, (long *) arg); + return 0; + case EXT2_IOC_SETFLAGS: + if ((current->euid != inode->i_uid) && !suser()) + return -EPERM; + if (IS_RDONLY(inode)) + return -EROFS; + inode->u.ext2_i.i_flags = get_fs_long ((long *) arg); + inode->i_ctime = CURRENT_TIME; + inode->i_dirt = 1; + return 0; + case EXT2_IOC_GETVERSION: + put_fs_long (inode->u.ext2_i.i_version, (long *) arg); + return 0; + case EXT2_IOC_SETVERSION: + if ((current->euid != inode->i_uid) && !suser()) + return -EPERM; + if (IS_RDONLY(inode)) + return -EROFS; + inode->u.ext2_i.i_version = get_fs_long ((long *) arg); + inode->i_ctime = CURRENT_TIME; + inode->i_dirt = 1; + return 0; + default: + return -EINVAL; + } } |