On Sat, Jan 26, 2019 at 10:48:53AM +0800, Chao Yu wrote: > On 2019/1/26 0:10, Gao Xiang wrote: > > Let's add .get_acl() to read the file's acl from its xattrs > > to make POSIX ACL usable. > > > > Here is the on-disk detail, > > fullname: system.posix_acl_access > > struct erofs_xattr_entry: > > .e_name_len = 0 > > .e_name_index = EROFS_XATTR_INDEX_POSIX_ACL_ACCESS (2) > > > > fullname: system.posix_acl_default > > struct erofs_xattr_entry: > > .e_name_len = 0 > > .e_name_index = EROFS_XATTR_INDEX_POSIX_ACL_DEFAULT (3) > > > > Signed-off-by: Gao Xiang <gaoxiang25@xxxxxxxxxx> > > --- > > change log v2: > > - add the missing SB_POSIXACL flag; > > - fix the on-disk detail, use .e_name_len == 0 and proper prefix value; > > - tested ok with xattr enabled erofs_mkfs; > > > .../erofs/Documentation/filesystems/erofs.txt | 2 ++ > > drivers/staging/erofs/inode.c | 3 ++ > > drivers/staging/erofs/namei.c | 1 + > > drivers/staging/erofs/super.c | 8 +++++ > > drivers/staging/erofs/xattr.c | 37 ++++++++++++++++++++++ > > drivers/staging/erofs/xattr.h | 6 ++++ > > 6 files changed, 57 insertions(+) > > > > diff --git a/drivers/staging/erofs/Documentation/filesystems/erofs.txt b/drivers/staging/erofs/Documentation/filesystems/erofs.txt > > index 803988d74c21..961ec4da7705 100644 > > --- a/drivers/staging/erofs/Documentation/filesystems/erofs.txt > > +++ b/drivers/staging/erofs/Documentation/filesystems/erofs.txt > > @@ -36,6 +36,8 @@ Here is the main features of EROFS: > > > > - Support xattr inline and tail-end data inline for all files; > > > > + - Support POSIX.1e ACLs by using xattrs; > > + > > - Support transparent file compression as an option: > > LZ4 algorithm with 4 KB fixed-output compression for high performance; > > > > diff --git a/drivers/staging/erofs/inode.c b/drivers/staging/erofs/inode.c > > index 4f04f7c38cf2..924b8dfc7a8f 100644 > > --- a/drivers/staging/erofs/inode.c > > +++ b/drivers/staging/erofs/inode.c > > @@ -287,6 +287,7 @@ const struct inode_operations erofs_generic_iops = { > > #ifdef CONFIG_EROFS_FS_XATTR > > .listxattr = erofs_listxattr, > > #endif > > + .get_acl = erofs_get_acl, > > }; > > > > const struct inode_operations erofs_symlink_iops = { > > @@ -294,6 +295,7 @@ const struct inode_operations erofs_symlink_iops = { > > #ifdef CONFIG_EROFS_FS_XATTR > > .listxattr = erofs_listxattr, > > #endif > > + .get_acl = erofs_get_acl, > > }; > > > > const struct inode_operations erofs_fast_symlink_iops = { > > @@ -301,5 +303,6 @@ const struct inode_operations erofs_fast_symlink_iops = { > > #ifdef CONFIG_EROFS_FS_XATTR > > .listxattr = erofs_listxattr, > > #endif > > + .get_acl = erofs_get_acl, > > }; > > > > diff --git a/drivers/staging/erofs/namei.c b/drivers/staging/erofs/namei.c > > index 7fed1f996ab0..b1752adc5934 100644 > > --- a/drivers/staging/erofs/namei.c > > +++ b/drivers/staging/erofs/namei.c > > @@ -238,5 +238,6 @@ const struct inode_operations erofs_dir_iops = { > > #ifdef CONFIG_EROFS_FS_XATTR > > .listxattr = erofs_listxattr, > > #endif > > + .get_acl = erofs_get_acl, > > }; > > > > diff --git a/drivers/staging/erofs/super.c b/drivers/staging/erofs/super.c > > index 176fca2af379..54cd7dac0a1f 100644 > > --- a/drivers/staging/erofs/super.c > > +++ b/drivers/staging/erofs/super.c > > @@ -398,6 +398,14 @@ static int erofs_read_super(struct super_block *sb, > > if (!silent) > > infoln("root inode @ nid %llu", ROOT_NID(sbi)); > > > > +#ifdef CONFIG_EROFS_FS_POSIX_ACL > > + /* Update the POSIXACL Flag */ > > + if (test_opt(sbi, POSIX_ACL)) > > + sb->s_flags |= SB_POSIXACL; > > + else > > + sb->s_flags &= ~SB_POSIXACL; > > +#endif > > + > > #ifdef CONFIG_EROFS_FS_ZIP > > INIT_RADIX_TREE(&sbi->workstn_tree, GFP_ATOMIC); > > #endif > > diff --git a/drivers/staging/erofs/xattr.c b/drivers/staging/erofs/xattr.c > > index 7de46690d972..6759485ae862 100644 > > --- a/drivers/staging/erofs/xattr.c > > +++ b/drivers/staging/erofs/xattr.c > > @@ -643,3 +643,40 @@ ssize_t erofs_listxattr(struct dentry *dentry, > > return shared_listxattr(&it); > > } > > > > +#ifdef CONFIG_EROFS_FS_POSIX_ACL > > +struct posix_acl *erofs_get_acl(struct inode *inode, int type) > > +{ > > + struct posix_acl *acl; > > + int ea_prefix, rc; > > + char *value = NULL; > > + > > + switch(type) { > > + case ACL_TYPE_ACCESS: > > + ea_prefix = EROFS_XATTR_INDEX_POSIX_ACL_ACCESS; > > + break; > > + case ACL_TYPE_DEFAULT: > > + ea_prefix = EROFS_XATTR_INDEX_POSIX_ACL_DEFAULT; > > + break; > > + default: > > + return ERR_PTR(-EINVAL); > > + } > > + > > + rc = erofs_getxattr(inode, ea_prefix, "", NULL, 0); > > + if (rc > 0) { > > + value = kvmalloc(rc, GFP_KERNEL); > > erofs_kmalloc() is enough? > > Thanks, > Hopefully, regular kmalloc() is enough. Do really need the erofs_kmalloc() function? Regular kmalloc() has fault injection already. Have you tried to use it? regards, dan carpenter _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel