From: Jan Kara <jack@suse.cz>
To: Christoph Hellwig <hch@infradead.org>
Cc: jack@suse.cz, linux-fsdevel@vger.kernel.org
Subject: Re: [PATCH 2/6] quota: kill the vfs_dq_off and vfs_dq_quota_on_remount wrappers
Date: Tue, 18 May 2010 00:46:22 +0200 [thread overview]
Message-ID: <20100517224622.GH3364@quack.suse.cz> (raw)
In-Reply-To: <20100512194453.628332135@bombadil.infradead.org>
On Wed 12-05-10 15:44:10, Christoph Hellwig wrote:
> Instead of having wrappers in the VFS namespace export the dquot_suspend
> and dquot_resume helpers directly. Also rename vfs_quota_disable to
> dquot_disable while we're at it.
This patch looks good.
Honza
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
>
> Index: linux-2.6/fs/quota/dquot.c
> ===================================================================
> --- linux-2.6.orig/fs/quota/dquot.c 2010-05-10 22:28:55.358254512 +0200
> +++ linux-2.6/fs/quota/dquot.c 2010-05-10 22:28:59.739003639 +0200
> @@ -1875,7 +1875,7 @@ EXPORT_SYMBOL(dquot_file_open);
> /*
> * Turn quota off on a device. type == -1 ==> quotaoff for all types (umount)
> */
> -int vfs_quota_disable(struct super_block *sb, int type, unsigned int flags)
> +int dquot_disable(struct super_block *sb, int type, unsigned int flags)
> {
> int cnt, ret = 0;
> struct quota_info *dqopt = sb_dqopt(sb);
> @@ -2005,14 +2005,16 @@ put_inodes:
> }
> return ret;
> }
> -EXPORT_SYMBOL(vfs_quota_disable);
> +EXPORT_SYMBOL(dquot_disable);
>
> int vfs_quota_off(struct super_block *sb, int type, int remount)
> {
> - return vfs_quota_disable(sb, type, remount ? DQUOT_SUSPENDED :
> - (DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED));
> + BUG_ON(remount);
> + return dquot_disable(sb, type,
> + DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED);
> }
> EXPORT_SYMBOL(vfs_quota_off);
> +
> /*
> * Turn quotas on on a device
> */
> @@ -2129,35 +2131,48 @@ out_fmt:
> return error;
> }
>
> +/* Suspend quotas on remount RO */
> +int dquot_suspend(struct super_block *sb, int type)
> +{
> + return dquot_disable(sb, type, DQUOT_SUSPENDED);
> +}
> +
> /* Reenable quotas on remount RW */
> -static int vfs_quota_on_remount(struct super_block *sb, int type)
> +int dquot_resume(struct super_block *sb, int type)
> {
> struct quota_info *dqopt = sb_dqopt(sb);
> struct inode *inode;
> - int ret;
> + int ret = 0, cnt;
> unsigned int flags;
>
> - mutex_lock(&dqopt->dqonoff_mutex);
> - if (!sb_has_quota_suspended(sb, type)) {
> + for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
> + if (type != -1 && cnt != type)
> + continue;
> +
> + mutex_lock(&dqopt->dqonoff_mutex);
> + if (!sb_has_quota_suspended(sb, cnt)) {
> + mutex_unlock(&dqopt->dqonoff_mutex);
> + continue;
> + }
> + inode = dqopt->files[cnt];
> + dqopt->files[cnt] = NULL;
> + spin_lock(&dq_state_lock);
> + flags = dqopt->flags & dquot_state_flag(DQUOT_USAGE_ENABLED |
> + DQUOT_LIMITS_ENABLED,
> + cnt);
> + dqopt->flags &= ~dquot_state_flag(DQUOT_STATE_FLAGS, cnt);
> + spin_unlock(&dq_state_lock);
> mutex_unlock(&dqopt->dqonoff_mutex);
> - return 0;
> - }
> - inode = dqopt->files[type];
> - dqopt->files[type] = NULL;
> - spin_lock(&dq_state_lock);
> - flags = dqopt->flags & dquot_state_flag(DQUOT_USAGE_ENABLED |
> - DQUOT_LIMITS_ENABLED, type);
> - dqopt->flags &= ~dquot_state_flag(DQUOT_STATE_FLAGS, type);
> - spin_unlock(&dq_state_lock);
> - mutex_unlock(&dqopt->dqonoff_mutex);
>
> - flags = dquot_generic_flag(flags, type);
> - ret = vfs_load_quota_inode(inode, type, dqopt->info[type].dqi_fmt_id,
> - flags);
> - iput(inode);
> + flags = dquot_generic_flag(flags, cnt);
> + ret = vfs_load_quota_inode(inode, cnt,
> + dqopt->info[cnt].dqi_fmt_id, flags);
> + iput(inode);
> + }
>
> return ret;
> }
> +EXPORT_SYMBOL(dquot_resume);
>
> int vfs_quota_on_path(struct super_block *sb, int type, int format_id,
> struct path *path)
> @@ -2182,8 +2197,7 @@ int vfs_quota_on(struct super_block *sb,
> struct path path;
> int error;
>
> - if (remount)
> - return vfs_quota_on_remount(sb, type);
> + BUG_ON(remount);
>
> error = kern_path(name, LOOKUP_FOLLOW, &path);
> if (!error) {
> @@ -2206,8 +2220,8 @@ int vfs_quota_enable(struct inode *inode
> struct quota_info *dqopt = sb_dqopt(sb);
>
> /* Just unsuspend quotas? */
> - if (flags & DQUOT_SUSPENDED)
> - return vfs_quota_on_remount(sb, type);
> + BUG_ON(flags & DQUOT_SUSPENDED);
> +
> if (!flags)
> return 0;
> /* Just updating flags needed? */
> @@ -2273,23 +2287,6 @@ out:
> }
> EXPORT_SYMBOL(vfs_quota_on_mount);
>
> -/* Wrapper to turn on quotas when remounting rw */
> -int vfs_dq_quota_on_remount(struct super_block *sb)
> -{
> - int cnt;
> - int ret = 0, err;
> -
> - if (!sb->s_qcop || !sb->s_qcop->quota_on)
> - return -ENOSYS;
> - for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
> - err = sb->s_qcop->quota_on(sb, cnt, 0, NULL, 1);
> - if (err < 0 && !ret)
> - ret = err;
> - }
> - return ret;
> -}
> -EXPORT_SYMBOL(vfs_dq_quota_on_remount);
> -
> static inline qsize_t qbtos(qsize_t blocks)
> {
> return blocks << QIF_DQBLKSIZE_BITS;
> Index: linux-2.6/fs/ext2/super.c
> ===================================================================
> --- linux-2.6.orig/fs/ext2/super.c 2010-05-10 22:28:59.310003709 +0200
> +++ linux-2.6/fs/ext2/super.c 2010-05-10 22:28:59.740003429 +0200
> @@ -1251,9 +1251,8 @@ static int ext2_remount (struct super_bl
> es->s_mtime = cpu_to_le32(get_seconds());
> spin_unlock(&sbi->s_lock);
>
> - err = vfs_dq_off(sb, 1);
> - if (err < 0 && err != -ENOSYS) {
> - err = -EBUSY;
> + err = dquot_suspend(sb, -1);
> + if (err < 0) {
> spin_lock(&sbi->s_lock);
> goto restore_opts;
> }
> @@ -1285,7 +1284,7 @@ static int ext2_remount (struct super_bl
> }
>
> if (enable_quota)
> - vfs_dq_quota_on_remount(sb);
> + dquot_resume(sb, -1);
> return 0;
> restore_opts:
> sbi->s_mount_opt = old_opts.s_mount_opt;
> Index: linux-2.6/fs/ext3/super.c
> ===================================================================
> --- linux-2.6.orig/fs/ext3/super.c 2010-05-10 22:28:59.311004407 +0200
> +++ linux-2.6/fs/ext3/super.c 2010-05-10 22:28:59.741003918 +0200
> @@ -2598,11 +2598,9 @@ static int ext3_remount (struct super_bl
> }
>
> if (*flags & MS_RDONLY) {
> - err = vfs_dq_off(sb, 1);
> - if (err < 0 && err != -ENOSYS) {
> - err = -EBUSY;
> + err = dquot_suspend(sb, -1);
> + if (err < 0)
> goto restore_opts;
> - }
>
> /*
> * First of all, the unconditional stuff we have to do
> @@ -2672,7 +2670,7 @@ static int ext3_remount (struct super_bl
> unlock_kernel();
>
> if (enable_quota)
> - vfs_dq_quota_on_remount(sb);
> + dquot_resume(sb, -1);
> return 0;
> restore_opts:
> sb->s_flags = old_sb_flags;
> Index: linux-2.6/fs/ext4/super.c
> ===================================================================
> --- linux-2.6.orig/fs/ext4/super.c 2010-05-10 22:28:59.314004267 +0200
> +++ linux-2.6/fs/ext4/super.c 2010-05-10 22:28:59.744003778 +0200
> @@ -3631,11 +3631,9 @@ static int ext4_remount(struct super_blo
> }
>
> if (*flags & MS_RDONLY) {
> - err = vfs_dq_off(sb, 1);
> - if (err < 0 && err != -ENOSYS) {
> - err = -EBUSY;
> + err = dquot_suspend(sb, -1);
> + if (err < 0)
> goto restore_opts;
> - }
>
> /*
> * First of all, the unconditional stuff we have to do
> @@ -3722,7 +3720,7 @@ static int ext4_remount(struct super_blo
> unlock_super(sb);
> unlock_kernel();
> if (enable_quota)
> - vfs_dq_quota_on_remount(sb);
> + dquot_resume(sb, -1);
> return 0;
>
> restore_opts:
> Index: linux-2.6/fs/jfs/super.c
> ===================================================================
> --- linux-2.6.orig/fs/jfs/super.c 2010-05-10 22:28:59.318023753 +0200
> +++ linux-2.6/fs/jfs/super.c 2010-05-10 22:28:59.746023753 +0200
> @@ -397,14 +397,14 @@ static int jfs_remount(struct super_bloc
> JFS_SBI(sb)->flag = flag;
> ret = jfs_mount_rw(sb, 1);
> unlock_kernel();
> - vfs_dq_quota_on_remount(sb);
> + dquot_resume(sb, -1);
> return ret;
> }
> if ((!(sb->s_flags & MS_RDONLY)) && (*flags & MS_RDONLY)) {
> - rc = vfs_dq_off(sb, 1);
> - if (rc < 0 && rc != -ENOSYS) {
> + rc = dquot_suspend(sb, -1);
> + if (rc < 0) {
> unlock_kernel();
> - return -EBUSY;
> + return rc;
> }
> rc = jfs_umount_rw(sb);
> JFS_SBI(sb)->flag = flag;
> Index: linux-2.6/fs/ocfs2/super.c
> ===================================================================
> --- linux-2.6.orig/fs/ocfs2/super.c 2010-05-10 22:28:55.414004477 +0200
> +++ linux-2.6/fs/ocfs2/super.c 2010-05-10 22:31:09.147254093 +0200
> @@ -873,13 +873,9 @@ static int ocfs2_susp_quotas(struct ocfs
> if (!OCFS2_HAS_RO_COMPAT_FEATURE(sb, feature[type]))
> continue;
> if (unsuspend)
> - status = vfs_quota_enable(
> - sb_dqopt(sb)->files[type],
> - type, QFMT_OCFS2,
> - DQUOT_SUSPENDED);
> + status = dquot_resume(sb, type);
> else
> - status = vfs_quota_disable(sb, type,
> - DQUOT_SUSPENDED);
> + status = dquot_suspend(sb, type);
> if (status < 0)
> break;
> }
> @@ -942,8 +938,8 @@ static void ocfs2_disable_quotas(struct
> /* Turn off quotas. This will remove all dquot structures from
> * memory and so they will be automatically synced to global
> * quota files */
> - vfs_quota_disable(sb, type, DQUOT_USAGE_ENABLED |
> - DQUOT_LIMITS_ENABLED);
> + dquot_disable(sb, type, DQUOT_USAGE_ENABLED |
> + DQUOT_LIMITS_ENABLED);
> if (!inode)
> continue;
> iput(inode);
> @@ -973,7 +969,7 @@ static int ocfs2_quota_off(struct super_
> if (remount)
> return 0; /* Ignore now and handle later in
> * ocfs2_remount() */
> - return vfs_quota_disable(sb, type, DQUOT_LIMITS_ENABLED);
> + return dquot_disable(sb, type, DQUOT_LIMITS_ENABLED);
> }
>
> static const struct quotactl_ops ocfs2_quotactl_ops = {
> Index: linux-2.6/fs/reiserfs/super.c
> ===================================================================
> --- linux-2.6.orig/fs/reiserfs/super.c 2010-05-10 22:28:59.324003918 +0200
> +++ linux-2.6/fs/reiserfs/super.c 2010-05-10 22:28:59.755004128 +0200
> @@ -1243,11 +1243,9 @@ static int reiserfs_remount(struct super
> /* it is read-only already */
> goto out_ok;
>
> - err = vfs_dq_off(s, 1);
> - if (err < 0 && err != -ENOSYS) {
> - err = -EBUSY;
> + err = dquot_suspend(s, -1);
> + if (err < 0)
> goto out_err;
> - }
>
> /* try to remount file system with read-only permissions */
> if (sb_umount_state(rs) == REISERFS_VALID_FS
> @@ -1304,7 +1302,7 @@ static int reiserfs_remount(struct super
> if (!(*mount_flags & MS_RDONLY)) {
> finish_unfinished(s);
> reiserfs_xattr_init(s, *mount_flags);
> - vfs_dq_quota_on_remount(s);
> + dquot_resume(s, -1);
> }
>
> out_ok:
> Index: linux-2.6/fs/ufs/super.c
> ===================================================================
> --- linux-2.6.orig/fs/ufs/super.c 2010-05-10 22:28:59.330004128 +0200
> +++ linux-2.6/fs/ufs/super.c 2010-05-10 22:28:59.760004128 +0200
> @@ -1291,11 +1291,11 @@ static int ufs_remount (struct super_blo
> * fs was mouted as rw, remounting ro
> */
> if (*mount_flags & MS_RDONLY) {
> - err = vfs_dq_off(sb, 1);
> - if (err < 0 && err != -ENOSYS) {
> + err = dquot_suspend(sb, -1);
> + if (err < 0) {
> unlock_super(sb);
> unlock_kernel();
> - return -EBUSY;
> + return err;
> }
>
> ufs_put_super_internal(sb);
> @@ -1343,7 +1343,7 @@ static int ufs_remount (struct super_blo
> unlock_super(sb);
> unlock_kernel();
> if (enable_quota)
> - vfs_dq_quota_on_remount(sb);
> + dquot_resume(sb, -1);
> return 0;
> }
>
> Index: linux-2.6/include/linux/quotaops.h
> ===================================================================
> --- linux-2.6.orig/include/linux/quotaops.h 2010-05-10 22:28:55.455254232 +0200
> +++ linux-2.6/include/linux/quotaops.h 2010-05-10 22:34:24.134024452 +0200
> @@ -42,6 +42,10 @@ int dquot_alloc_inode(const struct inode
> int dquot_claim_space_nodirty(struct inode *inode, qsize_t number);
> void dquot_free_inode(const struct inode *inode);
>
> +int dquot_disable(struct super_block *sb, int type, unsigned int flags);
> +int dquot_suspend(struct super_block *sb, int type);
> +int dquot_resume(struct super_block *sb, int type);
> +
> int dquot_commit(struct dquot *dquot);
> int dquot_acquire(struct dquot *dquot);
> int dquot_release(struct dquot *dquot);
> @@ -59,7 +63,6 @@ int vfs_quota_on_path(struct super_block
> int vfs_quota_on_mount(struct super_block *sb, char *qf_name,
> int format_id, int type);
> int vfs_quota_off(struct super_block *sb, int type, int remount);
> -int vfs_quota_disable(struct super_block *sb, int type, unsigned int flags);
> int vfs_quota_sync(struct super_block *sb, int type, int wait);
> int vfs_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii);
> int vfs_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii);
> @@ -69,7 +72,6 @@ int vfs_set_dqblk(struct super_block *sb
> struct fs_disk_quota *di);
>
> int dquot_transfer(struct inode *inode, struct iattr *iattr);
> -int vfs_dq_quota_on_remount(struct super_block *sb);
>
> static inline struct mem_dqinfo *sb_dqinfo(struct super_block *sb, int type)
> {
> @@ -222,11 +224,6 @@ static inline int vfs_dq_off(struct supe
> return 0;
> }
>
> -static inline int vfs_dq_quota_on_remount(struct super_block *sb)
> -{
> - return 0;
> -}
> -
> static inline int dquot_transfer(struct inode *inode, struct iattr *iattr)
> {
> return 0;
> @@ -253,6 +250,22 @@ static inline int dquot_claim_space_nodi
> return 0;
> }
>
> +static inline int dquot_disable(struct super_block *sb, int type,
> + unsigned int flags)
> +{
> + return 0;
> +}
> +
> +static inline int dquot_suspend(struct super_block *sb, int type)
> +{
> + return 0;
> +}
> +
> +static inline int dquot_resume(struct super_block *sb, int type)
> +{
> + return 0;
> +}
> +
> #define dquot_file_open generic_file_open
>
> #endif /* CONFIG_QUOTA */
>
--
Jan Kara <jack@suse.cz>
SUSE Labs, CR
next prev parent reply other threads:[~2010-05-17 22:46 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-05-12 19:44 [PATCH 0/6] more quota cleanups Christoph Hellwig
2010-05-12 19:44 ` [PATCH 1/6] dquot: move remount handling into the filesystem Christoph Hellwig
2010-05-17 22:34 ` Jan Kara
2010-05-19 10:55 ` Christoph Hellwig
2010-05-19 13:47 ` Jan Kara
2010-05-12 19:44 ` [PATCH 2/6] quota: kill the vfs_dq_off and vfs_dq_quota_on_remount wrappers Christoph Hellwig
2010-05-17 22:46 ` Jan Kara [this message]
2010-05-12 19:44 ` [PATCH 3/6] dquot: move unmount handling into the filesystem Christoph Hellwig
2010-05-17 22:58 ` Jan Kara
2010-05-19 11:03 ` Christoph Hellwig
2010-05-12 19:44 ` [PATCH 4/6] quota: drop remount argument to ->quota_on and ->quota_off Christoph Hellwig
2010-05-17 23:00 ` Jan Kara
2010-05-12 19:44 ` [PATCH 5/6] quota: explicitly set ->dq_op and ->s_qcop Christoph Hellwig
2010-05-17 23:06 ` Jan Kara
2010-05-19 11:07 ` Christoph Hellwig
2010-05-12 19:44 ` [PATCH 6/6] quota: rename default quotactl methods to dqout_ Christoph Hellwig
2010-05-17 23:09 ` Jan Kara
2010-05-19 11:07 ` Christoph Hellwig
-- strict thread matches above, loose matches on Subject: below --
2010-05-19 11:16 [PATCH 0/6] more quota cleanups V2 Christoph Hellwig
2010-05-19 11:16 ` [PATCH 2/6] quota: kill the vfs_dq_off and vfs_dq_quota_on_remount wrappers Christoph Hellwig
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=20100517224622.GH3364@quack.suse.cz \
--to=jack@suse.cz \
--cc=hch@infradead.org \
--cc=linux-fsdevel@vger.kernel.org \
/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.