ext4: add a new ioctl EXT4_IOC_GETSTATE
The new ioctl EXT4_IOC_GETSTATE returns some of the dynamic state of an ext4 inode for debugging purposes. Signed-off-by: Theodore Ts'o <tytso@mit.edu>
This commit is contained in:
parent
b0c013e292
commit
1ad3ea6e0a
@ -651,6 +651,7 @@ enum {
|
|||||||
#define EXT4_IOC_GET_ENCRYPTION_POLICY FS_IOC_GET_ENCRYPTION_POLICY
|
#define EXT4_IOC_GET_ENCRYPTION_POLICY FS_IOC_GET_ENCRYPTION_POLICY
|
||||||
/* ioctl codes 19--39 are reserved for fscrypt */
|
/* ioctl codes 19--39 are reserved for fscrypt */
|
||||||
#define EXT4_IOC_CLEAR_ES_CACHE _IO('f', 40)
|
#define EXT4_IOC_CLEAR_ES_CACHE _IO('f', 40)
|
||||||
|
#define EXT4_IOC_GETSTATE _IOW('f', 41, __u32)
|
||||||
|
|
||||||
#define EXT4_IOC_FSGETXATTR FS_IOC_FSGETXATTR
|
#define EXT4_IOC_FSGETXATTR FS_IOC_FSGETXATTR
|
||||||
#define EXT4_IOC_FSSETXATTR FS_IOC_FSSETXATTR
|
#define EXT4_IOC_FSSETXATTR FS_IOC_FSSETXATTR
|
||||||
@ -664,6 +665,16 @@ enum {
|
|||||||
#define EXT4_GOING_FLAGS_LOGFLUSH 0x1 /* flush log but not data */
|
#define EXT4_GOING_FLAGS_LOGFLUSH 0x1 /* flush log but not data */
|
||||||
#define EXT4_GOING_FLAGS_NOLOGFLUSH 0x2 /* don't flush log nor data */
|
#define EXT4_GOING_FLAGS_NOLOGFLUSH 0x2 /* don't flush log nor data */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Flags returned by EXT4_IOC_GETSTATE
|
||||||
|
*
|
||||||
|
* We only expose to userspace a subset of the state flags in
|
||||||
|
* i_state_flags
|
||||||
|
*/
|
||||||
|
#define EXT4_STATE_FLAG_EXT_PRECACHED 0x00000001
|
||||||
|
#define EXT4_STATE_FLAG_NEW 0x00000002
|
||||||
|
#define EXT4_STATE_FLAG_NEWENTRY 0x00000004
|
||||||
|
#define EXT4_STATE_FLAG_DA_ALLOC_CLOSE 0x00000008
|
||||||
|
|
||||||
#if defined(__KERNEL__) && defined(CONFIG_COMPAT)
|
#if defined(__KERNEL__) && defined(CONFIG_COMPAT)
|
||||||
/*
|
/*
|
||||||
|
@ -1123,6 +1123,22 @@ resizefs_out:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case EXT4_IOC_GETSTATE:
|
||||||
|
{
|
||||||
|
__u32 state = 0;
|
||||||
|
|
||||||
|
if (ext4_test_inode_state(inode, EXT4_STATE_EXT_PRECACHED))
|
||||||
|
state |= EXT4_STATE_FLAG_EXT_PRECACHED;
|
||||||
|
if (ext4_test_inode_state(inode, EXT4_STATE_NEW))
|
||||||
|
state |= EXT4_STATE_FLAG_NEW;
|
||||||
|
if (ext4_test_inode_state(inode, EXT4_STATE_NEWENTRY))
|
||||||
|
state |= EXT4_STATE_FLAG_NEWENTRY;
|
||||||
|
if (ext4_test_inode_state(inode, EXT4_STATE_DA_ALLOC_CLOSE))
|
||||||
|
state |= EXT4_STATE_FLAG_DA_ALLOC_CLOSE;
|
||||||
|
|
||||||
|
return put_user(state, (__u32 __user *) arg);
|
||||||
|
}
|
||||||
|
|
||||||
case EXT4_IOC_FSGETXATTR:
|
case EXT4_IOC_FSGETXATTR:
|
||||||
{
|
{
|
||||||
struct fsxattr fa;
|
struct fsxattr fa;
|
||||||
@ -1242,6 +1258,7 @@ long ext4_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
|||||||
case EXT4_IOC_SHUTDOWN:
|
case EXT4_IOC_SHUTDOWN:
|
||||||
case FS_IOC_GETFSMAP:
|
case FS_IOC_GETFSMAP:
|
||||||
case EXT4_IOC_CLEAR_ES_CACHE:
|
case EXT4_IOC_CLEAR_ES_CACHE:
|
||||||
|
case EXT4_IOC_GETSTATE:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return -ENOIOCTLCMD;
|
return -ENOIOCTLCMD;
|
||||||
|
Loading…
Reference in New Issue
Block a user