From: Sascha Hauer <s.hauer@pengutronix.de>
To: linux-fsdevel@vger.kernel.org
Cc: Richard Weinberger <richard@nod.at>,
Sascha Hauer <s.hauer@pengutronix.de>,
linux-mtd@lists.infradead.org, kernel@pengutronix.de,
Jan Kara <jack@suse.com>
Subject: [PATCH 3/8] ubifs: Add support for FS_IOC_FS[SG]ETXATTR ioctls
Date: Fri, 22 Jan 2021 16:15:31 +0100 [thread overview]
Message-ID: <20210122151536.7982-4-s.hauer@pengutronix.de> (raw)
In-Reply-To: <20210122151536.7982-1-s.hauer@pengutronix.de>
The FS_IOC_FS[SG]ETXATTR ioctls are an alternative to FS_IOC_[GS]ETFLAGS
with additional features. This patch adds support for these ioctls.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
fs/ubifs/ioctl.c | 107 ++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 102 insertions(+), 5 deletions(-)
diff --git a/fs/ubifs/ioctl.c b/fs/ubifs/ioctl.c
index b64a9cec7d47..5977edd4d185 100644
--- a/fs/ubifs/ioctl.c
+++ b/fs/ubifs/ioctl.c
@@ -101,9 +101,46 @@ static int ubifs2ioctl(int ubifs_flags)
return ioctl_flags;
}
-static int setflags(struct file *file, int flags)
+/* Transfer xflags flags to internal */
+static unsigned long ubifs_xflags_to_iflags(__u32 xflags)
{
- int oldflags, err, release;
+ unsigned long iflags = 0;
+
+ if (xflags & FS_XFLAG_SYNC)
+ iflags |= UBIFS_SYNC_FL;
+ if (xflags & FS_XFLAG_IMMUTABLE)
+ iflags |= UBIFS_IMMUTABLE_FL;
+ if (xflags & FS_XFLAG_APPEND)
+ iflags |= UBIFS_APPEND_FL;
+
+ return iflags;
+}
+
+/* Transfer internal flags to xflags */
+static __u32 ubifs_iflags_to_xflags(unsigned long flags)
+{
+ __u32 xflags = 0;
+
+ if (flags & UBIFS_SYNC_FL)
+ xflags |= FS_XFLAG_SYNC;
+ if (flags & UBIFS_IMMUTABLE_FL)
+ xflags |= FS_XFLAG_IMMUTABLE;
+ if (flags & UBIFS_APPEND_FL)
+ xflags |= FS_XFLAG_APPEND;
+
+ return xflags;
+}
+
+static void ubifs_fill_fsxattr(struct inode *inode, struct fsxattr *fa)
+{
+ struct ubifs_inode *ui = ubifs_inode(inode);
+
+ simple_fill_fsxattr(fa, ubifs_iflags_to_xflags(ui->flags));
+}
+
+static int setflags(struct file *file, int flags, struct fsxattr *fa)
+{
+ int ubi_flags, oldflags, err, release;
struct inode *inode = file_inode(file);
struct ubifs_inode *ui = ubifs_inode(inode);
struct ubifs_info *c = inode->i_sb->s_fs_info;
@@ -116,6 +153,13 @@ static int setflags(struct file *file, int flags)
if (!inode_owner_or_capable(inode))
return -EACCES;
+ ubifs_assert(c, !(flags && fa));
+
+ if (fa)
+ ubi_flags = ubifs_xflags_to_iflags(fa->fsx_xflags);
+ else
+ ubi_flags = ioctl2ubifs(flags);
+
/*
* Make sure the file-system is read-write and make sure it
* will not become read-only while we are changing the flags.
@@ -132,12 +176,24 @@ static int setflags(struct file *file, int flags)
mutex_lock(&ui->ui_mutex);
oldflags = ubifs2ioctl(ui->flags);
- err = vfs_ioc_setflags_prepare(inode, oldflags, flags);
+ err = vfs_ioc_setflags_prepare(inode, oldflags, ubifs2ioctl(ubi_flags));
if (err)
goto out_unlock;
ui->flags &= ~ioctl2ubifs(UBIFS_SETTABLE_IOCTL_FLAGS);
- ui->flags |= ioctl2ubifs(flags);
+
+ if (fa) {
+ struct fsxattr old_fa;
+
+ ubifs_fill_fsxattr(inode, &old_fa);
+
+ err = vfs_ioc_fssetxattr_check(inode, &old_fa, fa);
+ if (err)
+ goto out_unlock;
+ }
+
+ ui->flags |= ubi_flags;
+
ubifs_set_inode_flags(inode);
inode->i_ctime = current_time(inode);
release = ui->dirty;
@@ -162,6 +218,41 @@ static int setflags(struct file *file, int flags)
return err;
}
+static int ubifs_ioc_fsgetxattr(struct file *file, void __user *arg)
+{
+ struct inode *inode = file_inode(file);
+ struct fsxattr fa;
+
+ ubifs_fill_fsxattr(inode, &fa);
+
+ if (copy_to_user(arg, &fa, sizeof(fa)))
+ return -EFAULT;
+
+ return 0;
+}
+
+static int check_xflags(unsigned int flags)
+{
+ if (flags & ~(FS_XFLAG_SYNC | FS_XFLAG_IMMUTABLE | FS_XFLAG_APPEND))
+ return -EOPNOTSUPP;
+ return 0;
+}
+
+static int ubifs_ioc_fssetxattr(struct file *file, const void __user *arg)
+{
+ struct fsxattr fa;
+ int err;
+
+ if (copy_from_user(&fa, (struct fsxattr __user *)arg, sizeof(fa)))
+ return -EFAULT;
+
+ err = check_xflags(fa.fsx_xflags);
+ if (err)
+ return err;
+
+ return setflags(file, 0, &fa);
+}
+
long ubifs_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
int flags, err;
@@ -186,7 +277,7 @@ long ubifs_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
flags &= ~FS_DIRSYNC_FL;
- return setflags(file, flags);
+ return setflags(file, flags, NULL);
}
case FS_IOC_SET_ENCRYPTION_POLICY: {
struct ubifs_info *c = inode->i_sb->s_fs_info;
@@ -218,6 +309,12 @@ long ubifs_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
case FS_IOC_GET_ENCRYPTION_NONCE:
return fscrypt_ioctl_get_nonce(file, (void __user *)arg);
+ case FS_IOC_FSGETXATTR:
+ return ubifs_ioc_fsgetxattr(file, (void __user *)arg);
+
+ case FS_IOC_FSSETXATTR:
+ return ubifs_ioc_fssetxattr(file, (const void __user *)arg);
+
default:
return -ENOTTY;
}
--
2.20.1
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
next prev parent reply other threads:[~2021-01-22 15:17 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-22 15:15 [PATCH v5 0/8] Add quota support to UBIFS Sascha Hauer
2021-01-22 15:15 ` [PATCH 1/8] quota: Allow to pass mount path to quotactl Sascha Hauer
2021-01-22 17:16 ` Christoph Hellwig
2021-01-25 8:38 ` Sascha Hauer
2021-01-25 15:45 ` Jan Kara
2021-01-25 20:42 ` Christoph Hellwig
2021-01-26 13:17 ` Jan Kara
2021-01-26 13:34 ` Christoph Hellwig
2021-01-26 16:18 ` Jan Kara
2021-01-27 14:05 ` Sascha Hauer
2021-01-27 14:19 ` Jan Kara
2021-01-26 10:45 ` Sascha Hauer
2021-01-27 14:46 ` Jan Kara
2021-01-27 16:25 ` Christoph Hellwig
2021-01-22 15:15 ` [PATCH 2/8] ubifs: move checks and preparation into setflags() Sascha Hauer
2021-01-22 15:15 ` Sascha Hauer [this message]
2021-01-22 17:18 ` [PATCH 3/8] ubifs: Add support for FS_IOC_FS[SG]ETXATTR ioctls Christoph Hellwig
2021-01-22 15:15 ` [PATCH 4/8] ubifs: do not ubifs_inode() on potentially NULL pointer Sascha Hauer
2021-01-22 15:15 ` [PATCH 5/8] ubifs: Factor out ubifs_set_feature_flag() Sascha Hauer
2021-01-22 15:15 ` [PATCH 6/8] ubifs: Add support for project id Sascha Hauer
2021-01-22 15:15 ` [PATCH 7/8] ubifs: export get_znode Sascha Hauer
2021-01-22 17:20 ` Christoph Hellwig
2021-01-22 15:15 ` [PATCH 8/8] ubifs: Add quota support Sascha Hauer
-- strict thread matches above, loose matches on Subject: below --
2020-01-24 13:13 [PATCH v4 0/8] Add quota support to UBIFS Sascha Hauer
2020-01-24 13:13 ` [PATCH 3/8] ubifs: Add support for FS_IOC_FS[SG]ETXATTR ioctls Sascha Hauer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210122151536.7982-4-s.hauer@pengutronix.de \
--to=s.hauer@pengutronix.de \
--cc=jack@suse.com \
--cc=kernel@pengutronix.de \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-mtd@lists.infradead.org \
--cc=richard@nod.at \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).