All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jan Kara <jack@suse.cz>
To: Dongsheng Yang <yangds.fnst@cn.fujitsu.com>
Cc: viro@ZenIV.linux.org.uk, jack@suse.cz, dedekind1@gmail.com,
	richard.weinberger@gmail.com, linux-mtd@lists.infradead.org,
	linux-fsdevel@vger.kernel.org
Subject: Re: [PATCH v3 15/39] fs: quota: introduce a callback of restore_iflags to quotactl_ops
Date: Wed, 16 Sep 2015 11:47:35 +0200	[thread overview]
Message-ID: <20150916094735.GC13325@quack.suse.cz> (raw)
In-Reply-To: <1442307754-13233-16-git-send-email-yangds.fnst@cn.fujitsu.com>

On Tue 15-09-15 17:02:10, Dongsheng Yang wrote:
> In dquot_disable, we need to restore the iflags of quota files
> and mark the inodes to dirty. But that's pain to file-systems
> working in out-place-updating way, such as btrfs and ubifs. when
> they are going to update inode, they have to reserve space for
> this inode.
> 
> So we can not mark_inode_dirty() in dquot_disable for them. To solve
> this kind of problem, the common solution is introduce a callback
> to allow file-systems to do the inode_dirty work by themselves,
> the similar way with update_time().
> 
> Signed-off-by: Dongsheng Yang <yangds.fnst@cn.fujitsu.com>

So do you have a good reason to have quota files accessible from userspace?
Because the experience with ext2/3/4 which did this originally taught me it
is a pain in the ass. It is easier to have quota data stored in dedicated
system inodes which are invisible from userspace (ext4 can do it this way,
xfs, ocfs2, gfs2 as well). Then you don't have to bother with flushing
quota files, switching inode bits etc. when enabling / disabling quotas.
Also it makes more sense logically since quota information is really a part
of filesystem metadata.

The only larger disadvantage is that you have to have support for handling
quota files in mkfs and fsck. But in the long run the additional work is
worth it.

								Honza
> ---
>  fs/quota/dquot.c      | 51 ++++++++++++++++++++++++++++++++++-----------------
>  include/linux/quota.h |  4 ++++
>  2 files changed, 38 insertions(+), 17 deletions(-)
> 
> diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c
> index c73f44d..3f08e69 100644
> --- a/fs/quota/dquot.c
> +++ b/fs/quota/dquot.c
> @@ -2020,6 +2020,33 @@ int dquot_file_open(struct inode *inode, struct file *file)
>  }
>  EXPORT_SYMBOL(dquot_file_open);
>  
> +static int generic_restore_iflags(struct super_block *sb, struct inode **toputinode,
> +					unsigned int *old_flags)
> +{
> +	int cnt = 0;
> +	struct quota_info *dqopt = sb_dqopt(sb);
> +
> +	for (cnt = 0; cnt < MAXQUOTAS; cnt++)
> +		if (toputinode[cnt]) {
> +			mutex_lock(&dqopt->dqonoff_mutex);
> +			/* If quota was reenabled in the meantime, we have
> +			 * nothing to do */
> +			if (!sb_has_quota_loaded(sb, cnt)) {
> +				mutex_lock(&toputinode[cnt]->i_mutex);
> +				toputinode[cnt]->i_flags &= ~(S_IMMUTABLE |
> +				  S_NOATIME | S_NOQUOTA);
> +				toputinode[cnt]->i_flags |= old_flags[cnt];
> +				truncate_inode_pages(&toputinode[cnt]->i_data,
> +						     0);
> +				mutex_unlock(&toputinode[cnt]->i_mutex);
> +				mark_inode_dirty_sync(toputinode[cnt]);
> +			}
> +			mutex_unlock(&dqopt->dqonoff_mutex);
> +		}
> +
> +	return 0;
> +}
> +
>  /*
>   * Turn quota off on a device. type == -1 ==> quotaoff for all types (umount)
>   */
> @@ -2028,6 +2055,7 @@ int dquot_disable(struct super_block *sb, int type, unsigned int flags)
>  	int cnt, ret = 0;
>  	struct quota_info *dqopt = sb_dqopt(sb);
>  	struct inode *toputinode[MAXQUOTAS];
> +	unsigned int *old_flags = dqopt->old_flags;
>  
>  	/* Cannot turn off usage accounting without turning off limits, or
>  	 * suspend quotas and simultaneously turn quotas off. */
> @@ -2111,28 +2139,17 @@ int dquot_disable(struct super_block *sb, int type, unsigned int flags)
>  	 * disk (and so userspace sees correct data afterwards). */
>  	sync_filesystem(sb);
>  	sync_blockdev(sb->s_bdev);
> +
>  	/* Now the quota files are just ordinary files and we can set the
>  	 * inode flags back. Moreover we discard the pagecache so that
>  	 * userspace sees the writes we did bypassing the pagecache. We
>  	 * must also discard the blockdev buffers so that we see the
>  	 * changes done by userspace on the next quotaon() */
> -	for (cnt = 0; cnt < MAXQUOTAS; cnt++)
> -		if (toputinode[cnt]) {
> -			mutex_lock(&dqopt->dqonoff_mutex);
> -			/* If quota was reenabled in the meantime, we have
> -			 * nothing to do */
> -			if (!sb_has_quota_loaded(sb, cnt)) {
> -				mutex_lock(&toputinode[cnt]->i_mutex);
> -				toputinode[cnt]->i_flags &= ~(S_IMMUTABLE |
> -				  S_NOATIME | S_NOQUOTA);
> -				toputinode[cnt]->i_flags |= dqopt->old_flags[cnt];
> -				truncate_inode_pages(&toputinode[cnt]->i_data,
> -						     0);
> -				mutex_unlock(&toputinode[cnt]->i_mutex);
> -				mark_inode_dirty_sync(toputinode[cnt]);
> -			}
> -			mutex_unlock(&dqopt->dqonoff_mutex);
> -		}
> +	if (sb->s_qcop->restore_iflags)
> +		ret = sb->s_qcop->restore_iflags(sb, toputinode, old_flags);
> +	else
> +		ret = generic_restore_iflags(sb, toputinode, old_flags);
> +
>  	if (sb->s_bdev)
>  		invalidate_bdev(sb->s_bdev);
>  put_inodes:
> diff --git a/include/linux/quota.h b/include/linux/quota.h
> index fcfee5a..64e52e4 100644
> --- a/include/linux/quota.h
> +++ b/include/linux/quota.h
> @@ -428,6 +428,10 @@ struct quotactl_ops {
>  	int (*set_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *);
>  	int (*get_state)(struct super_block *, struct qc_state *);
>  	int (*rm_xquota)(struct super_block *, unsigned int);
> +	/*
> +	 * used in quota_disable to restore the i_flags of quota files.
> +	 */
> +	int (*restore_iflags)(struct super_block *sb, struct inode **, unsigned int *);
>  };
>  
>  struct quota_format_type {
> -- 
> 1.8.4.2
> 
-- 
Jan Kara <jack@suse.com>
SUSE Labs, CR

  reply	other threads:[~2015-09-16  9:47 UTC|newest]

Thread overview: 107+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-15  9:01 [PATCH v3 00/39] Add quota supporting in ubifs Dongsheng Yang
2015-09-15  9:01 ` Dongsheng Yang
2015-09-15  9:01 ` [PATCH v3 01/39] fs: introduce a ->s_cdev field into struct super_block Dongsheng Yang
2015-09-15  9:01   ` Dongsheng Yang
2015-10-04  6:31   ` Christoph Hellwig
2015-10-05  8:36     ` Jan Kara
2015-09-15  9:01 ` [PATCH v3 02/39] fs: cleanup: remove the blank line before EXPORT_SYMBOL Dongsheng Yang
2015-09-15  9:01   ` Dongsheng Yang
2015-09-15  9:01 ` [PATCH v3 03/39] fs: super: cleanup: make the comment of each function aligned Dongsheng Yang
2015-09-15  9:01   ` Dongsheng Yang
2015-09-15  9:01 ` [PATCH v3 04/39] fs: super: consolidate the get_super class functions Dongsheng Yang
2015-09-15  9:01   ` Dongsheng Yang
2015-09-15  9:02 ` [PATCH v3 05/39] fs: super: introduce a get_super_cdev to get super by a cdev reference Dongsheng Yang
2015-09-15  9:02   ` Dongsheng Yang
2015-10-04  6:32   ` Christoph Hellwig
2015-09-15  9:02 ` [PATCH v3 06/39] fs: super: introduce a get_super_cdev_thawed to get sb by " Dongsheng Yang
2015-09-15  9:02   ` Dongsheng Yang
2015-09-15 21:24   ` Jan Kara
2015-09-15  9:02 ` [PATCH v3 07/39] fs: char_dev: introduce cd_acquire function to acquire cdev Dongsheng Yang
2015-09-15  9:02   ` Dongsheng Yang
2015-09-16  8:16   ` Jan Kara
2015-09-17  3:30     ` Dongsheng Yang
2015-09-15  9:02 ` [PATCH v3 08/39] fs: introduce a __lookup_dev for internal using Dongsheng Yang
2015-09-15  9:02   ` Dongsheng Yang
2015-09-15  9:02 ` [PATCH v3 09/39] fs: char_dev: introduce lookup_cdev to get cdev by pathname Dongsheng Yang
2015-09-15  9:02 ` [PATCH v3 10/39] fs: dquot: skip invalidate_bdev if bdev is NULL Dongsheng Yang
2015-09-15  9:02 ` [PATCH v3 11/39] fs: quota: replace opened calling of ->sync_fs with sync_filesystem Dongsheng Yang
2015-09-15  9:02   ` Dongsheng Yang
2015-09-16 10:14   ` Jan Kara
2015-09-17  6:28     ` Dongsheng Yang
2015-09-17  6:28       ` Dongsheng Yang
2015-09-17 11:05       ` Jan Kara
2015-09-18  5:49         ` Dongsheng Yang
2015-09-18  9:00           ` Jan Kara
2015-09-21  4:31             ` Dongsheng Yang
2015-09-15  9:02 ` [PATCH v3 12/39] fs: quota: make quota support fs which is running on char dev Dongsheng Yang
2015-09-15  9:02 ` [PATCH v3 13/39] fs: introduce a get_qsize() to inode_operations Dongsheng Yang
2015-10-04  6:33   ` Christoph Hellwig
2015-10-05  8:01     ` Jan Kara
2015-09-15  9:02 ` [PATCH v3 14/39] fs: quota: restore i_flags of quota files in dquot_disable Dongsheng Yang
2015-09-15  9:02   ` Dongsheng Yang
2015-09-15  9:02 ` [PATCH v3 15/39] fs: quota: introduce a callback of restore_iflags to quotactl_ops Dongsheng Yang
2015-09-15  9:02   ` Dongsheng Yang
2015-09-16  9:47   ` Jan Kara [this message]
2015-09-15  9:02 ` [PATCH v3 16/39] ubi: introduce a interface to get cdev in ubi_volume Dongsheng Yang
2015-09-15  9:02   ` Dongsheng Yang
2015-09-15  9:02 ` [PATCH v3 17/39] ubifs: extend budget for blocks Dongsheng Yang
2015-09-15  9:02   ` Dongsheng Yang
2015-09-15  9:02 ` [PATCH v3 18/39] ubifs: fill sb->s_cdev in ubifs_fill_super() Dongsheng Yang
2015-09-15  9:02   ` Dongsheng Yang
2015-09-15  9:02 ` [PATCH v3 19/39] ubifs: fill ->s_dev in ubifs_fill_super Dongsheng Yang
2015-09-15  9:02   ` Dongsheng Yang
2015-09-15  9:02 ` [PATCH v3 20/39] ubifs: export read_block() from file.c Dongsheng Yang
2015-09-15  9:02   ` Dongsheng Yang
2015-09-15  9:02 ` [PATCH v3 21/39] ubifs: introduce i_dquot to ubifs_inode Dongsheng Yang
2015-09-15  9:02   ` Dongsheng Yang
2015-09-15  9:02 ` [PATCH v3 22/39] ubifs: implement IO functions for quota files Dongsheng Yang
2015-09-15  9:02   ` Dongsheng Yang
2015-09-15  9:02 ` [PATCH v3 23/39] ubifs: disable quota in ubifs_put_super Dongsheng Yang
2015-09-15  9:02   ` Dongsheng Yang
2015-09-15  9:02 ` [PATCH v3 24/39] ubifs: write quota back in ubifs_sync Dongsheng Yang
2015-09-15  9:02   ` Dongsheng Yang
2015-09-15  9:02 ` [PATCH v3 25/39] ubifs: set/clear MS_RDONLY properly in ubifs_remount Dongsheng Yang
2015-09-15  9:02 ` [PATCH v3 26/39] ubifs: suspend & resume quota " Dongsheng Yang
2015-09-15  9:02   ` Dongsheng Yang
2015-09-15  9:02 ` [PATCH v3 27/39] ubifs: check inode with NULL before using it Dongsheng Yang
2015-09-15  9:02   ` Dongsheng Yang
2015-09-15  9:02 ` [PATCH v3 28/39] ubifs: record quota information about inode in ubifs_new_inode Dongsheng Yang
2015-09-15  9:02   ` Dongsheng Yang
2015-09-15  9:35   ` Sheng Yong
2015-09-16  1:46     ` Dongsheng Yang
2015-09-15  9:02 ` [PATCH v3 29/39] ubifs: free quota inode information in ubifs_evict_inode Dongsheng Yang
2015-09-15  9:02   ` Dongsheng Yang
2015-09-15  9:02 ` [PATCH v3 30/39] ubifs: alloc quota space in ubifs writing path Dongsheng Yang
2015-09-15  9:02   ` Dongsheng Yang
2015-09-15  9:02 ` [PATCH v3 31/39] ubifs: free quota space in do_truncation Dongsheng Yang
2015-09-15  9:02 ` [PATCH v3 32/39] ubifs: free quota space when deleting a file Dongsheng Yang
2015-09-15  9:02   ` Dongsheng Yang
2015-09-15  9:02 ` [PATCH v3 33/39] ubifs: adapt quota space informatin in do_setattr Dongsheng Yang
2015-09-15  9:02   ` Dongsheng Yang
2015-09-15  9:02 ` [PATCH v3 34/39] ubifs: transfer quota information in changing owner or group Dongsheng Yang
2015-09-15  9:02   ` Dongsheng Yang
2015-09-15  9:02 ` [PATCH v3 35/39] ubifs: write inode in ubifs_quota_write if we are appending Dongsheng Yang
2015-09-15  9:02   ` Dongsheng Yang
2015-09-15  9:02 ` [PATCH v3 36/39] ubifs: implement ubifs_get_qsize to get quota size in ubifs Dongsheng Yang
2015-09-16 10:00   ` Jan Kara
2015-09-17  7:23     ` Dongsheng Yang
2015-09-17  7:23       ` Dongsheng Yang
2015-09-17 12:00       ` Jan Kara
2015-09-18  6:14         ` Dongsheng Yang
2015-09-18 11:20           ` Jan Kara
2015-09-21  4:35             ` Dongsheng Yang
2015-09-21  9:13               ` Jan Kara
2015-09-21  9:16                 ` Dongsheng Yang
2015-09-21  9:44                   ` Jan Kara
2015-09-21 11:02                     ` Dongsheng Yang
2015-09-23  7:42                       ` Jan Kara
2015-09-24  0:50                         ` Dongsheng Yang
2015-09-15  9:02 ` [PATCH v3 37/39] ubifs: implement ubifs_restore_iflags for quotactl_operations Dongsheng Yang
2015-09-15  9:02   ` Dongsheng Yang
2015-09-15  9:02 ` [PATCH v3 38/39] ubifs: fill the quota related fields in ubifs_fill_super Dongsheng Yang
2015-09-15  9:02 ` [PATCH v3 39/39] ubifs: introduce quota related mount options Dongsheng Yang
2015-09-15  9:02   ` Dongsheng Yang
2015-09-15  9:36   ` Sheng Yong
2015-09-16  1:48     ` Dongsheng Yang
2015-10-03 18:57 ` [PATCH v3 00/39] Add quota supporting in ubifs Richard Weinberger
2015-10-04  2:32   ` Dongsheng Yang

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=20150916094735.GC13325@quack.suse.cz \
    --to=jack@suse.cz \
    --cc=dedekind1@gmail.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-mtd@lists.infradead.org \
    --cc=richard.weinberger@gmail.com \
    --cc=viro@ZenIV.linux.org.uk \
    --cc=yangds.fnst@cn.fujitsu.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.