From: "Theodore Ts'o" Move the i_cdev pointer in struct inode into a union. Signed-off-by: "Theodore Ts'o" Signed-off-by: Andrew Morton --- fs/file_table.c | 2 +- fs/inode.c | 2 +- include/linux/fs.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff -puN fs/file_table.c~inode-diet-move-i_cdev-into-a-union fs/file_table.c --- a/fs/file_table.c~inode-diet-move-i_cdev-into-a-union +++ a/fs/file_table.c @@ -169,7 +169,7 @@ void fastcall __fput(struct file *file) if (file->f_op && file->f_op->release) file->f_op->release(inode, file); security_file_free(file); - if (unlikely(inode->i_cdev != NULL)) + if (unlikely(S_ISCHR(inode->i_mode) && inode->i_cdev != NULL)) cdev_put(inode->i_cdev); fops_put(file->f_op); if (file->f_mode & FMODE_WRITE) diff -puN fs/inode.c~inode-diet-move-i_cdev-into-a-union fs/inode.c --- a/fs/inode.c~inode-diet-move-i_cdev-into-a-union +++ a/fs/inode.c @@ -256,7 +256,7 @@ void clear_inode(struct inode *inode) inode->i_sb->s_op->clear_inode(inode); if (S_ISBLK(inode->i_mode) && inode->i_bdev) bd_forget(inode); - if (inode->i_cdev) + if (S_ISCHR(inode->i_mode) && inode->i_cdev) cd_forget(inode); inode->i_state = I_CLEAR; } diff -puN include/linux/fs.h~inode-diet-move-i_cdev-into-a-union include/linux/fs.h --- a/include/linux/fs.h~inode-diet-move-i_cdev-into-a-union +++ a/include/linux/fs.h @@ -531,8 +531,8 @@ struct inode { union { struct pipe_inode_info *i_pipe; struct block_device *i_bdev; + struct cdev *i_cdev; }; - struct cdev *i_cdev; int i_cindex; __u32 i_generation; _