Re: [PATCH v2] btrfs: check if root is readonly when setting posix acl
Filipe Manana <[email protected]> Mon, 20 Jul 2026 17:03:38 +0100
| Newsgroups | org.kernel.vger.linux-btrfs |
|---|---|
| Message-ID | <CAL3q7H5n5-TJMkFmUCnN5-xoVAcqDc7zNFNGR3ywF7Dx+PRetQ@mail.gmail.com> |
On Thu, Jul 9, 2026 at 9:26 AM Sun YangKai <[email protected]> wrote: > > From: Sun YangKai <[email protected]> > > For a filesystem which has btrfs read-only property set to true, all > write operations including acl and xattr should be denied. However, > acl can still be set even if btrfs ro property is true. > > This happens because no function on the set_acl code path checks the root > is readonly or not. It was checked in btrfs_setxattr_trans() but got > removed in > commit 353c2ea735e4 ("btrfs: remove redundant readonly root check in btrfs_setxattr_trans") This can be split across multiple lines, the only place it shouldn't be is in the Fixes tag. > > That commit didn't check if all the callers properly check the root's > read-only flag. A previous fix is > commit b51111271b03("btrfs: check if root is readonly while setting security xattr") Please always leave a space between the commit hash and the opening parenthesis. I've amended that and pushed to for-next on github, thanks. Reviewed-by: Filipe Manana <[email protected]> > > Always check if the root is read-only before performing the set acl > operation. > > Fixes: 353c2ea735e4 ("btrfs: remove redundant readonly root check in btrfs_setxattr_trans") > Signed-off-by: Sun YangKai <[email protected]> > --- > Changes to v1: > - add the missing header file > > --- > fs/btrfs/acl.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/fs/btrfs/acl.c b/fs/btrfs/acl.c > index e55b686fe1ab..662cdd1cbdef 100644 > --- a/fs/btrfs/acl.c > +++ b/fs/btrfs/acl.c > @@ -15,6 +15,7 @@ > #include "xattr.h" > #include "acl.h" > #include "misc.h" > +#include "btrfs_inode.h" > > struct posix_acl *btrfs_get_acl(struct inode *inode, int type, bool rcu) > { > @@ -107,6 +108,9 @@ int btrfs_set_acl(struct mnt_idmap *idmap, struct dentry *dentry, > struct inode *inode = d_inode(dentry); > umode_t old_mode = inode->i_mode; > > + if (btrfs_root_readonly(BTRFS_I(inode)->root)) > + return -EROFS; > + > if (type == ACL_TYPE_ACCESS && acl) { > ret = posix_acl_update_mode(idmap, inode, > &inode->i_mode, &acl); > -- > 2.54.0 > >