mirror of https://github.com/torvalds/linux.git
erofs: Add support for FS_IOC_GETFSLABEL
Add support for reading to the erofs volume label from the FS_IOC_GETFSLABEL ioctls. Signed-off-by: Bo Liu (OpenAnolis) <liubo03@inspur.com> Reviewed-by: Gao Xiang <hsiangkao@linux.alibaba.com> Reviewed-by: Chao Yu <chao@kernel.org> Reviewed-by: Hongbo Li <lihongbo22@huawei.com> Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
This commit is contained in:
parent
334c0e493c
commit
1cf12c7177
|
|
@ -475,6 +475,10 @@ static loff_t erofs_file_llseek(struct file *file, loff_t offset, int whence)
|
||||||
const struct file_operations erofs_file_fops = {
|
const struct file_operations erofs_file_fops = {
|
||||||
.llseek = erofs_file_llseek,
|
.llseek = erofs_file_llseek,
|
||||||
.read_iter = erofs_file_read_iter,
|
.read_iter = erofs_file_read_iter,
|
||||||
|
.unlocked_ioctl = erofs_ioctl,
|
||||||
|
#ifdef CONFIG_COMPAT
|
||||||
|
.compat_ioctl = erofs_compat_ioctl,
|
||||||
|
#endif
|
||||||
.mmap_prepare = erofs_file_mmap_prepare,
|
.mmap_prepare = erofs_file_mmap_prepare,
|
||||||
.get_unmapped_area = thp_get_unmapped_area,
|
.get_unmapped_area = thp_get_unmapped_area,
|
||||||
.splice_read = filemap_splice_read,
|
.splice_read = filemap_splice_read,
|
||||||
|
|
|
||||||
|
|
@ -123,4 +123,8 @@ const struct file_operations erofs_dir_fops = {
|
||||||
.llseek = generic_file_llseek,
|
.llseek = generic_file_llseek,
|
||||||
.read = generic_read_dir,
|
.read = generic_read_dir,
|
||||||
.iterate_shared = erofs_readdir,
|
.iterate_shared = erofs_readdir,
|
||||||
|
.unlocked_ioctl = erofs_ioctl,
|
||||||
|
#ifdef CONFIG_COMPAT
|
||||||
|
.compat_ioctl = erofs_compat_ioctl,
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@
|
||||||
* Copyright (C) 2021, Alibaba Cloud
|
* Copyright (C) 2021, Alibaba Cloud
|
||||||
*/
|
*/
|
||||||
#include "xattr.h"
|
#include "xattr.h"
|
||||||
|
#include <linux/compat.h>
|
||||||
#include <trace/events/erofs.h>
|
#include <trace/events/erofs.h>
|
||||||
|
|
||||||
static int erofs_fill_symlink(struct inode *inode, void *kaddr,
|
static int erofs_fill_symlink(struct inode *inode, void *kaddr,
|
||||||
|
|
@ -213,10 +214,7 @@ static int erofs_fill_inode(struct inode *inode)
|
||||||
switch (inode->i_mode & S_IFMT) {
|
switch (inode->i_mode & S_IFMT) {
|
||||||
case S_IFREG:
|
case S_IFREG:
|
||||||
inode->i_op = &erofs_generic_iops;
|
inode->i_op = &erofs_generic_iops;
|
||||||
if (erofs_inode_is_data_compressed(vi->datalayout))
|
inode->i_fop = &erofs_file_fops;
|
||||||
inode->i_fop = &generic_ro_fops;
|
|
||||||
else
|
|
||||||
inode->i_fop = &erofs_file_fops;
|
|
||||||
break;
|
break;
|
||||||
case S_IFDIR:
|
case S_IFDIR:
|
||||||
inode->i_op = &erofs_dir_iops;
|
inode->i_op = &erofs_dir_iops;
|
||||||
|
|
@ -341,6 +339,40 @@ int erofs_getattr(struct mnt_idmap *idmap, const struct path *path,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int erofs_ioctl_get_volume_label(struct inode *inode, void __user *arg)
|
||||||
|
{
|
||||||
|
struct erofs_sb_info *sbi = EROFS_I_SB(inode);
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (!sbi->volume_name)
|
||||||
|
ret = clear_user(arg, 1);
|
||||||
|
else
|
||||||
|
ret = copy_to_user(arg, sbi->volume_name,
|
||||||
|
strlen(sbi->volume_name));
|
||||||
|
return ret ? -EFAULT : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
long erofs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
||||||
|
{
|
||||||
|
struct inode *inode = file_inode(filp);
|
||||||
|
void __user *argp = (void __user *)arg;
|
||||||
|
|
||||||
|
switch (cmd) {
|
||||||
|
case FS_IOC_GETFSLABEL:
|
||||||
|
return erofs_ioctl_get_volume_label(inode, argp);
|
||||||
|
default:
|
||||||
|
return -ENOTTY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_COMPAT
|
||||||
|
long erofs_compat_ioctl(struct file *filp, unsigned int cmd,
|
||||||
|
unsigned long arg)
|
||||||
|
{
|
||||||
|
return erofs_ioctl(filp, cmd, (unsigned long)compat_ptr(arg));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
const struct inode_operations erofs_generic_iops = {
|
const struct inode_operations erofs_generic_iops = {
|
||||||
.getattr = erofs_getattr,
|
.getattr = erofs_getattr,
|
||||||
.listxattr = erofs_listxattr,
|
.listxattr = erofs_listxattr,
|
||||||
|
|
|
||||||
|
|
@ -153,6 +153,7 @@ struct erofs_sb_info {
|
||||||
/* used for statfs, f_files - f_favail */
|
/* used for statfs, f_files - f_favail */
|
||||||
u64 inos;
|
u64 inos;
|
||||||
|
|
||||||
|
char *volume_name;
|
||||||
u32 feature_compat;
|
u32 feature_compat;
|
||||||
u32 feature_incompat;
|
u32 feature_incompat;
|
||||||
|
|
||||||
|
|
@ -536,6 +537,10 @@ static inline struct bio *erofs_fscache_bio_alloc(struct erofs_map_dev *mdev) {
|
||||||
static inline void erofs_fscache_submit_bio(struct bio *bio) {}
|
static inline void erofs_fscache_submit_bio(struct bio *bio) {}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
long erofs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg);
|
||||||
|
long erofs_compat_ioctl(struct file *filp, unsigned int cmd,
|
||||||
|
unsigned long arg);
|
||||||
|
|
||||||
#define EFSCORRUPTED EUCLEAN /* Filesystem is corrupted */
|
#define EFSCORRUPTED EUCLEAN /* Filesystem is corrupted */
|
||||||
|
|
||||||
#endif /* __EROFS_INTERNAL_H */
|
#endif /* __EROFS_INTERNAL_H */
|
||||||
|
|
|
||||||
|
|
@ -343,6 +343,13 @@ static int erofs_read_superblock(struct super_block *sb)
|
||||||
sbi->fixed_nsec = le32_to_cpu(dsb->fixed_nsec);
|
sbi->fixed_nsec = le32_to_cpu(dsb->fixed_nsec);
|
||||||
super_set_uuid(sb, (void *)dsb->uuid, sizeof(dsb->uuid));
|
super_set_uuid(sb, (void *)dsb->uuid, sizeof(dsb->uuid));
|
||||||
|
|
||||||
|
if (dsb->volume_name[0]) {
|
||||||
|
sbi->volume_name = kstrndup(dsb->volume_name,
|
||||||
|
sizeof(dsb->volume_name), GFP_KERNEL);
|
||||||
|
if (!sbi->volume_name)
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
/* parse on-disk compression configurations */
|
/* parse on-disk compression configurations */
|
||||||
ret = z_erofs_parse_cfgs(sb, dsb);
|
ret = z_erofs_parse_cfgs(sb, dsb);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
|
|
@ -822,6 +829,7 @@ static void erofs_sb_free(struct erofs_sb_info *sbi)
|
||||||
kfree(sbi->domain_id);
|
kfree(sbi->domain_id);
|
||||||
if (sbi->dif0.file)
|
if (sbi->dif0.file)
|
||||||
fput(sbi->dif0.file);
|
fput(sbi->dif0.file);
|
||||||
|
kfree(sbi->volume_name);
|
||||||
kfree(sbi);
|
kfree(sbi);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue