[01/10] quota: Make inode optional
diff mbox series

Message ID 20191030152702.14269-2-s.hauer@pengutronix.de
State New
Headers show
Series
  • Add quota support to UBIFS
Related show

Commit Message

Sascha Hauer Oct. 30, 2019, 3:26 p.m. UTC
To add support for filesystems which do not store quota informations in
an inode make the inode optional.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
 fs/quota/dquot.c | 33 +++++++++++++++++++++------------
 1 file changed, 21 insertions(+), 12 deletions(-)

Comments

Jan Kara Nov. 1, 2019, 6:07 p.m. UTC | #1
On Wed 30-10-19 16:26:53, Sascha Hauer wrote:
> To add support for filesystems which do not store quota informations in
> an inode make the inode optional.
> 
> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>

Umm, I don't quite like how the first three patches work out. I have
somewhat refactored quota code to make things nicer and allow enabling of
quotas only with superblock at hand. I'll post the patches once they pass
some testing early next week.

								Honza

> ---
>  fs/quota/dquot.c | 33 +++++++++++++++++++++------------
>  1 file changed, 21 insertions(+), 12 deletions(-)
> 
> diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c
> index 6e826b454082..59f31735fe79 100644
> --- a/fs/quota/dquot.c
> +++ b/fs/quota/dquot.c
> @@ -2313,11 +2313,11 @@ static int vfs_load_quota_inode(struct inode *inode, int type, int format_id,
>  
>  	if (!fmt)
>  		return -ESRCH;
> -	if (!S_ISREG(inode->i_mode)) {
> +	if (inode && !S_ISREG(inode->i_mode)) {
>  		error = -EACCES;
>  		goto out_fmt;
>  	}
> -	if (IS_RDONLY(inode)) {
> +	if (inode && IS_RDONLY(inode)) {
>  		error = -EROFS;
>  		goto out_fmt;
>  	}
> @@ -2352,7 +2352,7 @@ static int vfs_load_quota_inode(struct inode *inode, int type, int format_id,
>  		invalidate_bdev(sb->s_bdev);
>  	}
>  
> -	if (!(dqopt->flags & DQUOT_QUOTA_SYS_FILE)) {
> +	if (inode && !(dqopt->flags & DQUOT_QUOTA_SYS_FILE)) {
>  		/* We don't want quota and atime on quota files (deadlocks
>  		 * possible) Also nobody should write to the file - we use
>  		 * special IO operations which ignore the immutable bit. */
> @@ -2367,9 +2367,13 @@ static int vfs_load_quota_inode(struct inode *inode, int type, int format_id,
>  	}
>  
>  	error = -EIO;
> -	dqopt->files[type] = igrab(inode);
> -	if (!dqopt->files[type])
> -		goto out_file_flags;
> +
> +	if (inode) {
> +		dqopt->files[type] = igrab(inode);
> +		if (!dqopt->files[type])
> +			goto out_file_flags;
> +	}
> +
>  	error = -EINVAL;
>  	if (!fmt->qf_ops->check_quota_file(sb, type))
>  		goto out_file_init;
> @@ -2397,11 +2401,14 @@ static int vfs_load_quota_inode(struct inode *inode, int type, int format_id,
>  	return error;
>  out_file_init:
>  	dqopt->files[type] = NULL;
> -	iput(inode);
> +	if (inode)
> +		iput(inode);
>  out_file_flags:
> -	inode_lock(inode);
> -	inode->i_flags &= ~S_NOQUOTA;
> -	inode_unlock(inode);
> +	if (inode) {
> +		inode_lock(inode);
> +		inode->i_flags &= ~S_NOQUOTA;
> +		inode_unlock(inode);
> +	}
>  out_fmt:
>  	put_quota_format(fmt);
>  
> @@ -2800,8 +2807,10 @@ int dquot_get_state(struct super_block *sb, struct qc_state *state)
>  			tstate->flags |= QCI_LIMITS_ENFORCED;
>  		tstate->spc_timelimit = mi->dqi_bgrace;
>  		tstate->ino_timelimit = mi->dqi_igrace;
> -		tstate->ino = dqopt->files[type]->i_ino;
> -		tstate->blocks = dqopt->files[type]->i_blocks;
> +		if (dqopt->files[type]) {
> +			tstate->ino = dqopt->files[type]->i_ino;
> +			tstate->blocks = dqopt->files[type]->i_blocks;
> +		}
>  		tstate->nextents = 1;	/* We don't know... */
>  		spin_unlock(&dq_data_lock);
>  	}
> -- 
> 2.24.0.rc1
>
Sascha Hauer Nov. 4, 2019, 7:48 a.m. UTC | #2
On Fri, Nov 01, 2019 at 07:07:21PM +0100, Jan Kara wrote:
> On Wed 30-10-19 16:26:53, Sascha Hauer wrote:
> > To add support for filesystems which do not store quota informations in
> > an inode make the inode optional.
> > 
> > Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
> 
> Umm, I don't quite like how the first three patches work out. I have
> somewhat refactored quota code to make things nicer and allow enabling of
> quotas only with superblock at hand. I'll post the patches once they pass
> some testing early next week.

Ok, thanks. I'll rebase my series onto that then and repost after
integrating the other feedback from you.

Sascha

Patch
diff mbox series

diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c
index 6e826b454082..59f31735fe79 100644
--- a/fs/quota/dquot.c
+++ b/fs/quota/dquot.c
@@ -2313,11 +2313,11 @@  static int vfs_load_quota_inode(struct inode *inode, int type, int format_id,
 
 	if (!fmt)
 		return -ESRCH;
-	if (!S_ISREG(inode->i_mode)) {
+	if (inode && !S_ISREG(inode->i_mode)) {
 		error = -EACCES;
 		goto out_fmt;
 	}
-	if (IS_RDONLY(inode)) {
+	if (inode && IS_RDONLY(inode)) {
 		error = -EROFS;
 		goto out_fmt;
 	}
@@ -2352,7 +2352,7 @@  static int vfs_load_quota_inode(struct inode *inode, int type, int format_id,
 		invalidate_bdev(sb->s_bdev);
 	}
 
-	if (!(dqopt->flags & DQUOT_QUOTA_SYS_FILE)) {
+	if (inode && !(dqopt->flags & DQUOT_QUOTA_SYS_FILE)) {
 		/* We don't want quota and atime on quota files (deadlocks
 		 * possible) Also nobody should write to the file - we use
 		 * special IO operations which ignore the immutable bit. */
@@ -2367,9 +2367,13 @@  static int vfs_load_quota_inode(struct inode *inode, int type, int format_id,
 	}
 
 	error = -EIO;
-	dqopt->files[type] = igrab(inode);
-	if (!dqopt->files[type])
-		goto out_file_flags;
+
+	if (inode) {
+		dqopt->files[type] = igrab(inode);
+		if (!dqopt->files[type])
+			goto out_file_flags;
+	}
+
 	error = -EINVAL;
 	if (!fmt->qf_ops->check_quota_file(sb, type))
 		goto out_file_init;
@@ -2397,11 +2401,14 @@  static int vfs_load_quota_inode(struct inode *inode, int type, int format_id,
 	return error;
 out_file_init:
 	dqopt->files[type] = NULL;
-	iput(inode);
+	if (inode)
+		iput(inode);
 out_file_flags:
-	inode_lock(inode);
-	inode->i_flags &= ~S_NOQUOTA;
-	inode_unlock(inode);
+	if (inode) {
+		inode_lock(inode);
+		inode->i_flags &= ~S_NOQUOTA;
+		inode_unlock(inode);
+	}
 out_fmt:
 	put_quota_format(fmt);
 
@@ -2800,8 +2807,10 @@  int dquot_get_state(struct super_block *sb, struct qc_state *state)
 			tstate->flags |= QCI_LIMITS_ENFORCED;
 		tstate->spc_timelimit = mi->dqi_bgrace;
 		tstate->ino_timelimit = mi->dqi_igrace;
-		tstate->ino = dqopt->files[type]->i_ino;
-		tstate->blocks = dqopt->files[type]->i_blocks;
+		if (dqopt->files[type]) {
+			tstate->ino = dqopt->files[type]->i_ino;
+			tstate->blocks = dqopt->files[type]->i_blocks;
+		}
 		tstate->nextents = 1;	/* We don't know... */
 		spin_unlock(&dq_data_lock);
 	}