Received: by 10.213.65.68 with SMTP id h4csp2560745imn; Mon, 9 Apr 2018 05:37:58 -0700 (PDT) X-Google-Smtp-Source: AIpwx48J8yuEO1lN9fPYlbsmyWBFAkh2I0+q2AVeuQUVRDNR52gROWwgiHf8x0G0MkGOhztmZTxG X-Received: by 2002:a17:902:24c7:: with SMTP id l7-v6mr38286132plg.320.1523277477961; Mon, 09 Apr 2018 05:37:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523277477; cv=none; d=google.com; s=arc-20160816; b=ySg63phNTVAyVSQdrdtlFEPbHcsGpkpAaOSeYFLiOeSD3FJc6lOWnDV+3N/bbQWWOF ykcxVYekKdscFCqFjFJ4Uw4Rk1rYClAxP4qntV2H1BCtvrOw1zamU6rjr50Iq3Ne6ZLz jxpYQp/5bFdIJhHU9Lydy2VAjXuY7/KGEPjizxRtseGxwL4/FtU+K1C7wPoULKUDHJPQ t6k9uIGayYsiu6pFiYIcWrtIKzQowcAFn64xuH7TezVgC09X3H8DVTdRYOTKcPTax/It 8riTvphZNwf7WSMgXWqRJQPXyid6D3oPaubbjMlBC220gj7qGbfDjVjFuPbW7KkiGZrM BVOg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=p4ecagfie37sOStbYYa61NT9XAyRxymOz1yPurma57U=; b=xPX8mq5ZS75NMhsiGISYDOjYTeRYWg7PqHTCAkNxUb3mt4l0qFqfeILgndf9FnEDGs YcXm4x/DVVTqvvj9uEfoHhqEkHjLvyvwQPVaIcHCxodJ+4ULwoaP8LDt6797D0RFcsHD YoguTN9tvnn8EIfBJxctG0Wa2+eg38BNUH+i61wiVXvDgKnqrBLKRZwcje9+g19AhG9R q4fnFV/FpxSqNtcw5K8kX+EJw00n/cLets7nxuIFBioD0UCXvJe5P59GR8rAzjskXdK/ Qq7knUBqcQhMX7OEzt7YTbA1MRIGUURwfohZ6+AiVUqwaObHJFaO3bbFisgi1R57OS3e TdjQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=dyHoxqyK; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 1-v6si243365plk.104.2018.04.09.05.37.21; Mon, 09 Apr 2018 05:37:57 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=dyHoxqyK; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751633AbeDIMeR (ORCPT + 99 others); Mon, 9 Apr 2018 08:34:17 -0400 Received: from mail-pg0-f66.google.com ([74.125.83.66]:37117 "EHLO mail-pg0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750759AbeDIMeO (ORCPT ); Mon, 9 Apr 2018 08:34:14 -0400 Received: by mail-pg0-f66.google.com with SMTP id r14so194589pgq.4; Mon, 09 Apr 2018 05:34:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=p4ecagfie37sOStbYYa61NT9XAyRxymOz1yPurma57U=; b=dyHoxqyKnev+gp7LiWUHqOWGfuGr0DU9xayr8gTAzghoRjvLE8oKE93BYm9EQ7/pCu bgUoq8EWBAPldUgHgkZ3iL6PDorXc6Lb+6Tcr2Ikbu8F/RtkTnH3tSL7GAUi1faE7dRh ebKxAQhHJVIZZFPeZ9BLUCi79d+M+NPQLvJ8AT53IpFgN5ZigJt088GliQLQTcnmYSzu 5rAT+HNTJTWaUngxS0YjYfYNOf7uxWJK+mMXzWrLsFDTsGyuZBM5+cZJXeX4SYRxciiR PLMFB85+s+r82SoKUt8q3MWS1ts8AZTHG15QE/D+LAp7VW4EMD7BzT7h4+AA9xNdrL8i 3Pqw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=p4ecagfie37sOStbYYa61NT9XAyRxymOz1yPurma57U=; b=K52RAl10zCN2PRGoGBxoOQsjNG0dNCajWe+3mDx2aEdUfLemAeGRcGJ4NBiUeZcHya Hfo2E6V5GwHRU9nywe7gEvB09sTIYiJ2tt0eRA/uGz0SwvNAqXyku4Wq8V/bP77I6dxc RgybVZsU4VQW4/quV8024RBpeV+0kFkhv4M5kywFaypr4FLDtR63JhNtVeescWPc449j I1ceE7kXlGyqo9151cGHdCJxYUc8Thod8bnl14YnW53l6QDhaR6sL/lvjGvdaNTDSBcj Hl4vMRVKLpTUTzb0pEibrYxLYBFOHKVjilg/RPT9lpgpfukH2eVo02jDpH32l7HbDxvG LUJQ== X-Gm-Message-State: AElRT7G4KnghAtEf6SGJgxISv7TZ14g/HMXlvwNYUgTu1AhQ2zeCl/+U v3STSqNf3LLNQrJP1KAp9gCOUQ== X-Received: by 10.98.62.150 with SMTP id y22mr28075398pfj.46.1523277253725; Mon, 09 Apr 2018 05:34:13 -0700 (PDT) Received: from localhost (outboundhk.mxmail.xiaomi.com. [207.226.244.123]) by smtp.gmail.com with ESMTPSA id d4sm972663pgc.43.2018.04.09.05.34.12 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 09 Apr 2018 05:34:13 -0700 (PDT) From: Geliang Tang To: Phillip Lougher , Jonathan Corbet Cc: Geliang Tang , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] squashfs: Add posix acl support Date: Mon, 9 Apr 2018 20:34:03 +0800 Message-Id: X-Mailer: git-send-email 2.14.1 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add posix acl (Access Control Lists) support for squashfs, which is marked as a todo item in squashfs' documentation. This patch implements the squashfs_get_acl function to read file's acl information from its xattr lists. Signed-off-by: Geliang Tang --- Documentation/filesystems/squashfs.txt | 2 - fs/squashfs/Kconfig | 11 ++++++ fs/squashfs/Makefile | 1 + fs/squashfs/acl.c | 69 ++++++++++++++++++++++++++++++++++ fs/squashfs/acl.h | 27 +++++++++++++ fs/squashfs/inode.c | 4 +- fs/squashfs/namei.c | 6 ++- fs/squashfs/squashfs_fs.h | 12 +++--- fs/squashfs/super.c | 3 ++ fs/squashfs/symlink.c | 6 ++- fs/squashfs/xattr.c | 13 ++++++- fs/squashfs/xattr.h | 8 ++++ 12 files changed, 149 insertions(+), 13 deletions(-) create mode 100644 fs/squashfs/acl.c create mode 100644 fs/squashfs/acl.h diff --git a/Documentation/filesystems/squashfs.txt b/Documentation/filesystems/squashfs.txt index e5274f84dc56..539fad6b4db0 100644 --- a/Documentation/filesystems/squashfs.txt +++ b/Documentation/filesystems/squashfs.txt @@ -235,8 +235,6 @@ list using a second xattr id lookup table. 4.1 Todo list ------------- -Implement ACL support. - 4.2 Squashfs internal cache --------------------------- diff --git a/fs/squashfs/Kconfig b/fs/squashfs/Kconfig index 1adb3346b9d6..f9587bcf9dd9 100644 --- a/fs/squashfs/Kconfig +++ b/fs/squashfs/Kconfig @@ -107,6 +107,17 @@ config SQUASHFS_XATTR If unsure, say N. +config SQUASHFS_POSIX_ACL + bool "Squashfs POSIX ACL support" + depends on SQUASHFS_XATTR + select FS_POSIX_ACL + help + Saying Y here includes support for Access Control Lists (acls). + Acls are used to define more fine-grained discretionary access + rights for files and directories (see the acl(5) manual page). + + If unsure, say N. + config SQUASHFS_ZLIB bool "Include support for ZLIB compressed file systems" depends on SQUASHFS diff --git a/fs/squashfs/Makefile b/fs/squashfs/Makefile index 7bd9b8b856d0..73bc1c8a8df6 100644 --- a/fs/squashfs/Makefile +++ b/fs/squashfs/Makefile @@ -12,6 +12,7 @@ squashfs-$(CONFIG_SQUASHFS_DECOMP_SINGLE) += decompressor_single.o squashfs-$(CONFIG_SQUASHFS_DECOMP_MULTI) += decompressor_multi.o squashfs-$(CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU) += decompressor_multi_percpu.o squashfs-$(CONFIG_SQUASHFS_XATTR) += xattr.o xattr_id.o +squashfs-$(CONFIG_SQUASHFS_POSIX_ACL) += acl.o squashfs-$(CONFIG_SQUASHFS_LZ4) += lz4_wrapper.o squashfs-$(CONFIG_SQUASHFS_LZO) += lzo_wrapper.o squashfs-$(CONFIG_SQUASHFS_XZ) += xz_wrapper.o diff --git a/fs/squashfs/acl.c b/fs/squashfs/acl.c new file mode 100644 index 000000000000..1c9eb2d13c2b --- /dev/null +++ b/fs/squashfs/acl.c @@ -0,0 +1,69 @@ +/* + * Squashfs - a compressed read only filesystem for Linux + * + * Copyright (c) 2018 + * Phillip Lougher + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * acl.c + */ + +#include +#include +#include +#include "squashfs_fs.h" +#include "xattr.h" +#include "acl.h" + +struct posix_acl *squashfs_get_acl(struct inode *inode, int type) +{ + int name_index; + char *name; + struct posix_acl *acl = NULL; + char *value = NULL; + int retval; + + switch (type) { + case ACL_TYPE_ACCESS: + name_index = SQUASHFS_XATTR_POSIX_ACL_ACCESS; + name = XATTR_POSIX_ACL_ACCESS; + break; + case ACL_TYPE_DEFAULT: + name_index = SQUASHFS_XATTR_POSIX_ACL_DEFAULT; + name = XATTR_POSIX_ACL_DEFAULT; + break; + default: + BUG(); + } + + retval = squashfs_xattr_get(inode, name_index, name, NULL, 0); + if (retval > 0) { + value = kmalloc(retval, GFP_KERNEL); + if (!value) + return ERR_PTR(-ENOMEM); + retval = squashfs_xattr_get(inode, name_index, name, value, retval); + } + if (retval > 0) + acl = posix_acl_from_xattr(&init_user_ns, value, retval); + else if (retval == -ENODATA || retval == -ENOSYS) + acl = NULL; + else + acl = ERR_PTR(retval); + + kfree(value); + + return acl; +} diff --git a/fs/squashfs/acl.h b/fs/squashfs/acl.h new file mode 100644 index 000000000000..a9f5fa45bc96 --- /dev/null +++ b/fs/squashfs/acl.h @@ -0,0 +1,27 @@ +/* + * Squashfs - a compressed read only filesystem for Linux + * + * Copyright (c) 2018 + * Phillip Lougher + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * acl.h + */ + +#include +#include + +extern struct posix_acl *squashfs_get_acl(struct inode *inode, int type); diff --git a/fs/squashfs/inode.c b/fs/squashfs/inode.c index e9793b1e49a5..2035a1acffd7 100644 --- a/fs/squashfs/inode.c +++ b/fs/squashfs/inode.c @@ -48,6 +48,7 @@ #include "squashfs_fs_i.h" #include "squashfs.h" #include "xattr.h" +#include "acl.h" /* * Initialise VFS inode with the base inode information common to all @@ -425,6 +426,7 @@ int squashfs_read_inode(struct inode *inode, long long ino) const struct inode_operations squashfs_inode_ops = { - .listxattr = squashfs_listxattr + .listxattr = squashfs_listxattr, + .get_acl = squashfs_get_acl }; diff --git a/fs/squashfs/namei.c b/fs/squashfs/namei.c index 40c10d9974c9..33ad74780040 100644 --- a/fs/squashfs/namei.c +++ b/fs/squashfs/namei.c @@ -64,6 +64,7 @@ #include "squashfs_fs_i.h" #include "squashfs.h" #include "xattr.h" +#include "acl.h" /* * Lookup name in the directory index, returning the location of the metadata @@ -246,6 +247,7 @@ static struct dentry *squashfs_lookup(struct inode *dir, struct dentry *dentry, const struct inode_operations squashfs_dir_inode_ops = { - .lookup = squashfs_lookup, - .listxattr = squashfs_listxattr + .lookup = squashfs_lookup, + .listxattr = squashfs_listxattr, + .get_acl = squashfs_get_acl }; diff --git a/fs/squashfs/squashfs_fs.h b/fs/squashfs/squashfs_fs.h index 24d12fd14177..c7ac9fc4f8f4 100644 --- a/fs/squashfs/squashfs_fs.h +++ b/fs/squashfs/squashfs_fs.h @@ -107,11 +107,13 @@ #define SQUASHFS_MAX_DIR_TYPE 7 /* Xattr types */ -#define SQUASHFS_XATTR_USER 0 -#define SQUASHFS_XATTR_TRUSTED 1 -#define SQUASHFS_XATTR_SECURITY 2 -#define SQUASHFS_XATTR_VALUE_OOL 256 -#define SQUASHFS_XATTR_PREFIX_MASK 0xff +#define SQUASHFS_XATTR_USER 0 +#define SQUASHFS_XATTR_POSIX_ACL_ACCESS 1 +#define SQUASHFS_XATTR_POSIX_ACL_DEFAULT 2 +#define SQUASHFS_XATTR_TRUSTED 3 +#define SQUASHFS_XATTR_SECURITY 4 +#define SQUASHFS_XATTR_VALUE_OOL 256 +#define SQUASHFS_XATTR_PREFIX_MASK 0xff /* Flag whether block is compressed or uncompressed, bit is set if block is * uncompressed */ diff --git a/fs/squashfs/super.c b/fs/squashfs/super.c index 8a73b97217c8..beea564f1063 100644 --- a/fs/squashfs/super.c +++ b/fs/squashfs/super.c @@ -196,6 +196,9 @@ static int squashfs_fill_super(struct super_block *sb, void *data, int silent) sb->s_maxbytes = MAX_LFS_FILESIZE; sb->s_flags |= SB_RDONLY; +#ifdef CONFIG_SQUASHFS_POSIX_ACL + sb->s_flags |= SB_POSIXACL; +#endif sb->s_op = &squashfs_super_ops; err = -ENOMEM; diff --git a/fs/squashfs/symlink.c b/fs/squashfs/symlink.c index befeba0fa70a..a7f30d890905 100644 --- a/fs/squashfs/symlink.c +++ b/fs/squashfs/symlink.c @@ -42,6 +42,7 @@ #include "squashfs_fs_i.h" #include "squashfs.h" #include "xattr.h" +#include "acl.h" static int squashfs_symlink_readpage(struct file *file, struct page *page) { @@ -118,7 +119,8 @@ const struct address_space_operations squashfs_symlink_aops = { }; const struct inode_operations squashfs_symlink_inode_ops = { - .get_link = page_get_link, - .listxattr = squashfs_listxattr + .get_link = page_get_link, + .listxattr = squashfs_listxattr, + .get_acl = squashfs_get_acl }; diff --git a/fs/squashfs/xattr.c b/fs/squashfs/xattr.c index 1548b3784548..a1d773b5b0bc 100644 --- a/fs/squashfs/xattr.c +++ b/fs/squashfs/xattr.c @@ -33,6 +33,7 @@ #include "squashfs_fs_sb.h" #include "squashfs_fs_i.h" #include "squashfs.h" +#include "acl.h" static const struct xattr_handler *squashfs_xattr_handler(int); @@ -115,7 +116,7 @@ ssize_t squashfs_listxattr(struct dentry *d, char *buffer, } -static int squashfs_xattr_get(struct inode *inode, int name_index, +int squashfs_xattr_get(struct inode *inode, int name_index, const char *name, void *buffer, size_t buffer_size) { struct super_block *sb = inode->i_sb; @@ -265,6 +266,12 @@ static const struct xattr_handler *squashfs_xattr_handler(int type) switch (type & SQUASHFS_XATTR_PREFIX_MASK) { case SQUASHFS_XATTR_USER: return &squashfs_xattr_user_handler; +#ifdef CONFIG_SQUASHFS_POSIX_ACL + case SQUASHFS_XATTR_POSIX_ACL_ACCESS: + return &posix_acl_access_xattr_handler; + case SQUASHFS_XATTR_POSIX_ACL_DEFAULT: + return &posix_acl_default_xattr_handler; +#endif case SQUASHFS_XATTR_TRUSTED: return &squashfs_xattr_trusted_handler; case SQUASHFS_XATTR_SECURITY: @@ -277,6 +284,10 @@ static const struct xattr_handler *squashfs_xattr_handler(int type) const struct xattr_handler *squashfs_xattr_handlers[] = { &squashfs_xattr_user_handler, +#ifdef CONFIG_SQUASHFS_POSIX_ACL + &posix_acl_access_xattr_handler, + &posix_acl_default_xattr_handler, +#endif &squashfs_xattr_trusted_handler, &squashfs_xattr_security_handler, NULL diff --git a/fs/squashfs/xattr.h b/fs/squashfs/xattr.h index afe70f815e3d..ac08650c08cc 100644 --- a/fs/squashfs/xattr.h +++ b/fs/squashfs/xattr.h @@ -26,6 +26,8 @@ extern __le64 *squashfs_read_xattr_id_table(struct super_block *, u64, u64 *, int *); extern int squashfs_xattr_lookup(struct super_block *, unsigned int, int *, unsigned int *, unsigned long long *); +extern int squashfs_xattr_get(struct inode *inode, int name_index, + const char *name, void *buffer, size_t buffer_size); #else static inline __le64 *squashfs_read_xattr_id_table(struct super_block *sb, u64 start, u64 *xattr_table_start, int *xattr_ids) @@ -41,6 +43,12 @@ static inline int squashfs_xattr_lookup(struct super_block *sb, { return 0; } + +static int squashfs_xattr_get(struct inode *inode, int name_index, + const char *name, void *buffer, size_t buffer_size) +{ + return 0; +} #define squashfs_listxattr NULL #define squashfs_xattr_handlers NULL #endif -- 2.14.1