Commit d5beb31b authored by Chao Yu's avatar Chao Yu Committed by Greg Kroah-Hartman

staging: erofs: support special inode

This patch adds to support special inode, such as block dev, char,
socket, pipe inode.
Reviewed-by: default avatarGao Xiang <gaoxiang25@huawei.com>
Signed-off-by: default avatarChao Yu <yuchao0@huawei.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent b17500a0
...@@ -34,8 +34,18 @@ static int read_inode(struct inode *inode, void *data) ...@@ -34,8 +34,18 @@ static int read_inode(struct inode *inode, void *data)
vi->inode_isize = sizeof(struct erofs_inode_v2); vi->inode_isize = sizeof(struct erofs_inode_v2);
vi->xattr_isize = ondisk_xattr_ibody_size(v2->i_xattr_icount); vi->xattr_isize = ondisk_xattr_ibody_size(v2->i_xattr_icount);
vi->raw_blkaddr = le32_to_cpu(v2->i_u.raw_blkaddr);
inode->i_mode = le16_to_cpu(v2->i_mode); inode->i_mode = le16_to_cpu(v2->i_mode);
if (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
S_ISLNK(inode->i_mode)) {
vi->raw_blkaddr = le32_to_cpu(v2->i_u.raw_blkaddr);
} else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
inode->i_rdev =
new_decode_dev(le32_to_cpu(v2->i_u.rdev));
} else if (S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) {
inode->i_rdev = 0;
} else {
return -EIO;
}
i_uid_write(inode, le32_to_cpu(v2->i_uid)); i_uid_write(inode, le32_to_cpu(v2->i_uid));
i_gid_write(inode, le32_to_cpu(v2->i_gid)); i_gid_write(inode, le32_to_cpu(v2->i_gid));
...@@ -54,8 +64,18 @@ static int read_inode(struct inode *inode, void *data) ...@@ -54,8 +64,18 @@ static int read_inode(struct inode *inode, void *data)
vi->inode_isize = sizeof(struct erofs_inode_v1); vi->inode_isize = sizeof(struct erofs_inode_v1);
vi->xattr_isize = ondisk_xattr_ibody_size(v1->i_xattr_icount); vi->xattr_isize = ondisk_xattr_ibody_size(v1->i_xattr_icount);
vi->raw_blkaddr = le32_to_cpu(v1->i_u.raw_blkaddr);
inode->i_mode = le16_to_cpu(v1->i_mode); inode->i_mode = le16_to_cpu(v1->i_mode);
if (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
S_ISLNK(inode->i_mode)) {
vi->raw_blkaddr = le32_to_cpu(v1->i_u.raw_blkaddr);
} else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
inode->i_rdev =
new_decode_dev(le32_to_cpu(v1->i_u.rdev));
} else if (S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) {
inode->i_rdev = 0;
} else {
return -EIO;
}
i_uid_write(inode, le16_to_cpu(v1->i_uid)); i_uid_write(inode, le16_to_cpu(v1->i_uid));
i_gid_write(inode, le16_to_cpu(v1->i_gid)); i_gid_write(inode, le16_to_cpu(v1->i_gid));
...@@ -173,6 +193,12 @@ static int fill_inode(struct inode *inode, int isdir) ...@@ -173,6 +193,12 @@ static int fill_inode(struct inode *inode, int isdir)
&page_symlink_inode_operations; &page_symlink_inode_operations;
#endif #endif
inode_nohighmem(inode); inode_nohighmem(inode);
} else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) ||
S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) {
#ifdef CONFIG_EROFS_FS_XATTR
inode->i_op = &erofs_special_inode_operations;
#endif
init_special_inode(inode, inode->i_mode, inode->i_rdev);
} else { } else {
err = -EIO; err = -EIO;
goto out_unlock; goto out_unlock;
...@@ -232,6 +258,12 @@ const struct inode_operations erofs_symlink_xattr_iops = { ...@@ -232,6 +258,12 @@ const struct inode_operations erofs_symlink_xattr_iops = {
}; };
#endif #endif
const struct inode_operations erofs_special_inode_operations = {
#ifdef CONFIG_EROFS_FS_XATTR
.listxattr = erofs_listxattr,
#endif
};
#ifdef CONFIG_EROFS_FS_XATTR #ifdef CONFIG_EROFS_FS_XATTR
const struct inode_operations erofs_fast_symlink_xattr_iops = { const struct inode_operations erofs_fast_symlink_xattr_iops = {
.get_link = simple_get_link, .get_link = simple_get_link,
......
...@@ -252,6 +252,7 @@ extern const struct xattr_handler *erofs_xattr_handlers[]; ...@@ -252,6 +252,7 @@ extern const struct xattr_handler *erofs_xattr_handlers[];
#ifdef CONFIG_EROFS_FS_XATTR #ifdef CONFIG_EROFS_FS_XATTR
extern const struct inode_operations erofs_symlink_xattr_iops; extern const struct inode_operations erofs_symlink_xattr_iops;
extern const struct inode_operations erofs_fast_symlink_xattr_iops; extern const struct inode_operations erofs_fast_symlink_xattr_iops;
extern const struct inode_operations erofs_special_inode_operations;
#endif #endif
static inline void set_inode_fast_symlink(struct inode *inode) static inline void set_inode_fast_symlink(struct inode *inode)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment