From: Richard Weinberger <richard.weinberger@gmail.com>
To: Sascha Hauer <s.hauer@pengutronix.de>
Cc: linux-fsdevel <linux-fsdevel@vger.kernel.org>,
Richard Weinberger <richard@nod.at>,
linux-mtd@lists.infradead.org, kernel@pengutronix.de,
Jan Kara <jack@suse.com>
Subject: Re: [PATCH 5/7] ubifs: Add support for project id
Date: Sun, 19 Jan 2020 21:09:10 +0100 [thread overview]
Message-ID: <CAFLxGvwfjokR=O+=EiC-6SkEsVSnwaNfxPOS_=7SVdSqHX6A=A@mail.gmail.com> (raw)
In-Reply-To: <20191106091537.32480-6-s.hauer@pengutronix.de>
On Wed, Nov 6, 2019 at 10:16 AM Sascha Hauer <s.hauer@pengutronix.de> wrote:
>
> The project id is necessary for quota project id support. This adds
> support for the project id to UBIFS as well as support for the
> FS_PROJINHERIT_FL flag.
>
> This includes a change for the UBIFS on-disk format. struct
> ubifs_ino_node gains a project id number and a UBIFS_PROJINHERIT_FL
> flag.
>
> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
> ---
> fs/ubifs/dir.c | 23 +++++++++++++++++++++--
> fs/ubifs/ioctl.c | 34 ++++++++++++++++++++++++++++++++--
> fs/ubifs/journal.c | 2 +-
> fs/ubifs/super.c | 1 +
> fs/ubifs/ubifs-media.h | 6 ++++--
> fs/ubifs/ubifs.h | 4 ++++
> 6 files changed, 63 insertions(+), 7 deletions(-)
>
> diff --git a/fs/ubifs/dir.c b/fs/ubifs/dir.c
> index cfce5fee9262..db2456537e6d 100644
> --- a/fs/ubifs/dir.c
> +++ b/fs/ubifs/dir.c
> @@ -56,7 +56,8 @@ static int inherit_flags(const struct inode *dir, umode_t mode)
> */
> return 0;
>
> - flags = ui->flags & (UBIFS_COMPR_FL | UBIFS_SYNC_FL | UBIFS_DIRSYNC_FL);
> + flags = ui->flags & (UBIFS_COMPR_FL | UBIFS_SYNC_FL | UBIFS_DIRSYNC_FL |
> + UBIFS_PROJINHERIT_FL);
> if (!S_ISDIR(mode))
> /* The "DIRSYNC" flag only applies to directories */
> flags &= ~UBIFS_DIRSYNC_FL;
> @@ -112,6 +113,11 @@ struct inode *ubifs_new_inode(struct ubifs_info *c, struct inode *dir,
> current_time(inode);
> inode->i_mapping->nrpages = 0;
>
> + if (ubifs_inode(dir)->flags & UBIFS_PROJINHERIT_FL)
> + ui->projid = ubifs_inode(dir)->projid;
> + else
> + ui->projid = make_kprojid(&init_user_ns, UBIFS_DEF_PROJID);
> +
> switch (mode & S_IFMT) {
> case S_IFREG:
> inode->i_mapping->a_ops = &ubifs_file_address_operations;
> @@ -705,6 +711,9 @@ static int ubifs_link(struct dentry *old_dentry, struct inode *dir,
> ubifs_assert(c, inode_is_locked(dir));
> ubifs_assert(c, inode_is_locked(inode));
>
> + if (!projid_eq(dir_ui->projid, ui->projid))
> + return -EXDEV;
> +
> err = fscrypt_prepare_link(old_dentry, dir, dentry);
> if (err)
> return err;
> @@ -1556,8 +1565,18 @@ static int ubifs_rename(struct inode *old_dir, struct dentry *old_dentry,
> if (err)
> return err;
>
> - if (flags & RENAME_EXCHANGE)
> + if ((ubifs_inode(new_dir)->flags & UBIFS_PROJINHERIT_FL) &&
> + (!projid_eq(ubifs_inode(new_dir)->projid,
> + ubifs_inode(old_dentry->d_inode)->projid)))
> + return -EXDEV;
> +
> + if (flags & RENAME_EXCHANGE) {
> + if ((ubifs_inode(old_dir)->flags & UBIFS_PROJINHERIT_FL) &&
> + (!projid_eq(ubifs_inode(old_dir)->projid,
> + ubifs_inode(new_dentry->d_inode)->projid)))
> + return -EXDEV;
Can we please have a small helper function for these checks?
> return ubifs_xrename(old_dir, old_dentry, new_dir, new_dentry);
> + }
>
> return do_rename(old_dir, old_dentry, new_dir, new_dentry, flags);
> }
> diff --git a/fs/ubifs/ioctl.c b/fs/ubifs/ioctl.c
> index 533df56beab4..829e71d9c9ae 100644
> --- a/fs/ubifs/ioctl.c
> +++ b/fs/ubifs/ioctl.c
> @@ -19,7 +19,7 @@
> /* Need to be kept consistent with checked flags in ioctl2ubifs() */
> #define UBIFS_SUPPORTED_IOCTL_FLAGS \
> (FS_COMPR_FL | FS_SYNC_FL | FS_APPEND_FL | \
> - FS_IMMUTABLE_FL | FS_DIRSYNC_FL)
> + FS_IMMUTABLE_FL | FS_DIRSYNC_FL | FS_PROJINHERIT_FL)
>
> /**
> * ubifs_set_inode_flags - set VFS inode flags.
> @@ -66,6 +66,8 @@ static int ioctl2ubifs(int ioctl_flags)
> ubifs_flags |= UBIFS_IMMUTABLE_FL;
> if (ioctl_flags & FS_DIRSYNC_FL)
> ubifs_flags |= UBIFS_DIRSYNC_FL;
> + if (ioctl_flags & FS_PROJINHERIT_FL)
> + ubifs_flags |= UBIFS_PROJINHERIT_FL;
>
> return ubifs_flags;
> }
> @@ -91,6 +93,8 @@ static int ubifs2ioctl(int ubifs_flags)
> ioctl_flags |= FS_IMMUTABLE_FL;
> if (ubifs_flags & UBIFS_DIRSYNC_FL)
> ioctl_flags |= FS_DIRSYNC_FL;
> + if (ubifs_flags & UBIFS_PROJINHERIT_FL)
> + ioctl_flags |= FS_PROJINHERIT_FL;
>
> return ioctl_flags;
> }
> @@ -106,6 +110,8 @@ static inline unsigned long ubifs_xflags_to_iflags(__u32 xflags)
> iflags |= UBIFS_IMMUTABLE_FL;
> if (xflags & FS_XFLAG_APPEND)
> iflags |= UBIFS_APPEND_FL;
> + if (xflags & FS_XFLAG_PROJINHERIT)
> + iflags |= UBIFS_PROJINHERIT_FL;
>
> return iflags;
> }
> @@ -121,15 +127,34 @@ static inline __u32 ubifs_iflags_to_xflags(unsigned long flags)
> xflags |= FS_XFLAG_IMMUTABLE;
> if (flags & UBIFS_APPEND_FL)
> xflags |= FS_XFLAG_APPEND;
> + if (flags & UBIFS_PROJINHERIT_FL)
> + xflags |= FS_XFLAG_PROJINHERIT;
>
> return xflags;
> }
>
> +static int ubifs_ioc_setproject(struct file *file, __u32 projid)
> +{
> + struct inode *inode = file_inode(file);
> + struct ubifs_inode *ui = ubifs_inode(inode);
> + kprojid_t kprojid;
> +
> + kprojid = make_kprojid(&init_user_ns, (projid_t)projid);
> + if (projid_eq(kprojid, ui->projid))
> + return 0;
> +
> + ui->projid = kprojid;
> +
> + return 0;
> +}
You return in every case 0, so this function cannot fail? If so,
please make it of type void.
> 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));
> +
> + fa->fsx_projid = (__u32)from_kprojid(&init_user_ns, ui->projid);
> }
>
> static int setflags(struct file *file, int flags, struct fsxattr *fa)
> @@ -180,6 +205,10 @@ static int setflags(struct file *file, int flags, struct fsxattr *fa)
> err = vfs_ioc_fssetxattr_check(inode, &old_fa, fa);
> if (err)
> goto out_unlock;
> +
> + err = ubifs_ioc_setproject(file, fa->fsx_projid);
> + if (err)
> + goto out_unlock;
> }
>
> ui->flags = ubi_flags;
> @@ -223,7 +252,8 @@ static int ubifs_ioc_fsgetxattr(struct file *file, void __user *arg)
>
> static int check_xflags(unsigned int flags)
> {
> - if (flags & ~(FS_XFLAG_SYNC | FS_XFLAG_IMMUTABLE | FS_XFLAG_APPEND))
> + if (flags & ~(FS_XFLAG_SYNC | FS_XFLAG_IMMUTABLE | FS_XFLAG_APPEND |
> + FS_XFLAG_PROJINHERIT))
> return -EOPNOTSUPP;
> return 0;
> }
> diff --git a/fs/ubifs/journal.c b/fs/ubifs/journal.c
> index 4fd9683b8245..d8961993f9dd 100644
> --- a/fs/ubifs/journal.c
> +++ b/fs/ubifs/journal.c
> @@ -54,7 +54,6 @@
> */
> static inline void zero_ino_node_unused(struct ubifs_ino_node *ino)
> {
> - memset(ino->padding1, 0, 4);
> memset(ino->padding2, 0, 26);
> }
>
> @@ -469,6 +468,7 @@ static void pack_inode(struct ubifs_info *c, struct ubifs_ino_node *ino,
> ino->xattr_cnt = cpu_to_le32(ui->xattr_cnt);
> ino->xattr_size = cpu_to_le32(ui->xattr_size);
> ino->xattr_names = cpu_to_le32(ui->xattr_names);
> + ino->projid = cpu_to_le32(from_kprojid(&init_user_ns, ui->projid));
> zero_ino_node_unused(ino);
>
> /*
> diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c
> index 7d4547e5202d..281f34789e32 100644
> --- a/fs/ubifs/super.c
> +++ b/fs/ubifs/super.c
> @@ -141,6 +141,7 @@ struct inode *ubifs_iget(struct super_block *sb, unsigned long inum)
> ui->xattr_size = le32_to_cpu(ino->xattr_size);
> ui->xattr_names = le32_to_cpu(ino->xattr_names);
> ui->synced_i_size = ui->ui_size = inode->i_size;
> + ui->projid = make_kprojid(&init_user_ns, le32_to_cpu(ino->projid));
>
> ui->xattr = (ui->flags & UBIFS_XATTR_FL) ? 1 : 0;
>
> diff --git a/fs/ubifs/ubifs-media.h b/fs/ubifs/ubifs-media.h
> index 3c9792cbb6ff..418f4eba1624 100644
> --- a/fs/ubifs/ubifs-media.h
> +++ b/fs/ubifs/ubifs-media.h
> @@ -316,6 +316,7 @@ enum {
> * UBIFS_DIRSYNC_FL: I/O on this directory inode has to be synchronous
> * UBIFS_XATTR_FL: this inode is the inode for an extended attribute value
> * UBIFS_CRYPT_FL: use encryption for this inode
> + * UBIFS_PROJINHERIT_FL: Create with parents projid
> *
> * Note, these are on-flash flags which correspond to ioctl flags
> * (@FS_COMPR_FL, etc). They have the same values now, but generally, do not
> @@ -329,6 +330,7 @@ enum {
> UBIFS_DIRSYNC_FL = 0x10,
> UBIFS_XATTR_FL = 0x20,
> UBIFS_CRYPT_FL = 0x40,
> + UBIFS_PROJINHERIT_FL = 0x80,
> };
>
> /* Inode flag bits used by UBIFS */
> @@ -497,7 +499,7 @@ union ubifs_dev_desc {
> * @data_len: inode data length
> * @xattr_cnt: count of extended attributes this inode has
> * @xattr_size: summarized size of all extended attributes in bytes
> - * @padding1: reserved for future, zeroes
> + * @projid: Quota project id
> * @xattr_names: sum of lengths of all extended attribute names belonging to
> * this inode
> * @compr_type: compression type used for this inode
> @@ -531,7 +533,7 @@ struct ubifs_ino_node {
> __le32 data_len;
> __le32 xattr_cnt;
> __le32 xattr_size;
> - __u8 padding1[4]; /* Watch 'zero_ino_node_unused()' if changing! */
> + __le32 projid;
You claim a new field in struct ubifs_ino_inode and add a new inode flag.
I fear this requires a new feature flag.
> __le32 xattr_names;
> __le16 compr_type;
> __u8 padding2[26]; /* Watch 'zero_ino_node_unused()' if changing! */
> diff --git a/fs/ubifs/ubifs.h b/fs/ubifs/ubifs.h
> index c55f212dcb75..3f8a33fca67b 100644
> --- a/fs/ubifs/ubifs.h
> +++ b/fs/ubifs/ubifs.h
> @@ -155,6 +155,8 @@
> #define UBIFS_HMAC_ARR_SZ 0
> #endif
>
> +#define UBIFS_DEF_PROJID 0
> +
> /*
> * Lockdep classes for UBIFS inode @ui_mutex.
> */
> @@ -362,6 +364,7 @@ struct ubifs_gced_idx_leb {
> * inodes
> * @ui_size: inode size used by UBIFS when writing to flash
> * @flags: inode flags (@UBIFS_COMPR_FL, etc)
> + * @projid: The project id of this inode
> * @compr_type: default compression type used for this inode
> * @last_page_read: page number of last page read (for bulk read)
> * @read_in_a_row: number of consecutive pages read in a row (for bulk read)
> @@ -413,6 +416,7 @@ struct ubifs_inode {
> loff_t synced_i_size;
> loff_t ui_size;
> int flags;
> + kprojid_t projid;
> pgoff_t last_page_read;
> pgoff_t read_in_a_row;
> int data_len;
> --
> 2.24.0.rc1
>
>
> ______________________________________________________
> Linux MTD discussion mailing list
> http://lists.infradead.org/mailman/listinfo/linux-mtd/
--
Thanks,
//richard
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
next prev parent reply other threads:[~2020-01-19 20:09 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-06 9:15 [PATCH v3 0/7] Add quota support to UBIFS Sascha Hauer
2019-11-06 9:15 ` [PATCH 1/7] quota: Allow to pass mount path to quotactl Sascha Hauer
2019-11-06 10:05 ` Jan Kara
2019-11-06 10:15 ` Sascha Hauer
2019-11-06 9:15 ` [PATCH 2/7] ubifs: move checks and preparation into setflags() Sascha Hauer
2020-01-19 19:56 ` Richard Weinberger
2019-11-06 9:15 ` [PATCH 3/7] ubifs: Add support for FS_IOC_FS[SG]ETXATTR ioctls Sascha Hauer
2020-01-19 19:55 ` Richard Weinberger
2019-11-06 9:15 ` [PATCH 4/7] ubifs: do not ubifs_inode() on potentially NULL pointer Sascha Hauer
2020-01-19 19:58 ` Richard Weinberger
2019-11-06 9:15 ` [PATCH 5/7] ubifs: Add support for project id Sascha Hauer
2020-01-19 20:09 ` Richard Weinberger [this message]
2020-01-24 8:05 ` Sascha Hauer
2019-11-06 9:15 ` [PATCH 6/7] ubifs: export get_znode Sascha Hauer
2019-11-06 9:15 ` [PATCH 7/7] ubifs: Add quota support Sascha Hauer
2019-11-06 10:14 ` Jan Kara
2019-11-11 8:57 ` Sascha Hauer
2019-11-11 16:34 ` Jan Kara
2019-11-12 8:59 ` Sascha Hauer
2019-11-12 9:31 ` Jan Kara
2019-11-08 14:47 ` kbuild test robot
2021-03-30 10:43 [PATCH v5 0/7] Add quota support to UBIFS Sascha Hauer
2021-03-30 10:43 ` [PATCH 5/7] ubifs: Add support for project id 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='CAFLxGvwfjokR=O+=EiC-6SkEsVSnwaNfxPOS_=7SVdSqHX6A=A@mail.gmail.com' \
--to=richard.weinberger@gmail.com \
--cc=jack@suse.com \
--cc=kernel@pengutronix.de \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-mtd@lists.infradead.org \
--cc=richard@nod.at \
--cc=s.hauer@pengutronix.de \
/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).