2 * linux/fs/ext2/ioctl.c
4 * Copyright (C) 1993, 1994, 1995
5 * Remy Card (card@masi.ibp.fr)
6 * Laboratoire MASI - Institut Blaise Pascal
7 * Universite Pierre et Marie Curie (Paris VI)
10 #include <asm/uaccess.h>
12 #include <linux/errno.h>
14 #include <linux/ext2_fs.h>
15 #include <linux/ioctl.h>
16 #include <linux/sched.h>
19 int ext2_ioctl (struct inode
* inode
, struct file
* filp
, unsigned int cmd
,
24 ext2_debug ("cmd = %u, arg = %lu\n", cmd
, arg
);
27 case EXT2_IOC_GETFLAGS
:
28 flags
= inode
->u
.ext2_i
.i_flags
& EXT2_FL_USER_VISIBLE
;
29 return put_user(inode
->u
.ext2_i
.i_flags
, (int *) arg
);
30 case EXT2_IOC_SETFLAGS
:
31 if (get_user(flags
, (int *) arg
))
33 flags
= flags
& EXT2_FL_USER_MODIFIABLE
;
35 * The IMMUTABLE and APPEND_ONLY flags can only be changed by
36 * the super user when the security level is zero.
38 if ((flags
& (EXT2_APPEND_FL
| EXT2_IMMUTABLE_FL
)) ^
39 (inode
->u
.ext2_i
.i_flags
&
40 (EXT2_APPEND_FL
| EXT2_IMMUTABLE_FL
))) {
41 /* This test looks nicer. Thanks to Pauline Middelink */
42 if (!capable(CAP_LINUX_IMMUTABLE
))
45 if ((current
->fsuid
!= inode
->i_uid
) &&
50 inode
->u
.ext2_i
.i_flags
= (inode
->u
.ext2_i
.i_flags
&
51 ~EXT2_FL_USER_MODIFIABLE
) | flags
;
52 if (flags
& EXT2_SYNC_FL
)
53 inode
->i_flags
|= MS_SYNCHRONOUS
;
55 inode
->i_flags
&= ~MS_SYNCHRONOUS
;
56 if (flags
& EXT2_APPEND_FL
)
57 inode
->i_flags
|= S_APPEND
;
59 inode
->i_flags
&= ~S_APPEND
;
60 if (flags
& EXT2_IMMUTABLE_FL
)
61 inode
->i_flags
|= S_IMMUTABLE
;
63 inode
->i_flags
&= ~S_IMMUTABLE
;
64 if (flags
& EXT2_NOATIME_FL
)
65 inode
->i_flags
|= MS_NOATIME
;
67 inode
->i_flags
&= ~MS_NOATIME
;
68 inode
->i_ctime
= CURRENT_TIME
;
69 mark_inode_dirty(inode
);
71 case EXT2_IOC_GETVERSION
:
72 return put_user(inode
->i_generation
, (int *) arg
);
73 case EXT2_IOC_SETVERSION
:
74 if ((current
->fsuid
!= inode
->i_uid
) && !capable(CAP_FOWNER
))
78 if (get_user(inode
->i_generation
, (int *) arg
))
80 inode
->i_ctime
= CURRENT_TIME
;
81 mark_inode_dirty(inode
);