diff mbox series

btrfs-progs: qgroup: Check for ENOTCONN error on create/assign/limit

Message ID 20191127034851.13482-1-marcos.souza.org@gmail.com (mailing list archive)
State New, archived
Headers show
Series btrfs-progs: qgroup: Check for ENOTCONN error on create/assign/limit | expand

Commit Message

Marcos Paulo de Souza Nov. 27, 2019, 3:48 a.m. UTC
From: Marcos Paulo de Souza <mpdesouza@suse.com>

Current btrfs code returns ENOTCONN when the user tries to create a
qgroup on a subvolume without quota enabled. In order to present a
meaningful message to the user, we now handle ENOTCONN showing
the message "quota not enabled".

Signed-off-by: Marcos Paulo de Souza <mpdesouza@suse.com>
---
 This patch survived a full btrfs-progs tests run

 cmds/qgroup.c | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

Comments

Qu Wenruo Nov. 27, 2019, 4:30 a.m. UTC | #1
On 2019/11/27 上午11:48, Marcos Paulo de Souza wrote:
> From: Marcos Paulo de Souza <mpdesouza@suse.com>
> 
> Current btrfs code returns ENOTCONN when the user tries to create a
> qgroup on a subvolume without quota enabled. In order to present a
> meaningful message to the user, we now handle ENOTCONN showing
> the message "quota not enabled".
> 
> Signed-off-by: Marcos Paulo de Souza <mpdesouza@suse.com>

Don't forget the original -EINVAL.

So it needs to cover both -EINVAL (for older kernel) and -ENOTCONN (for
newer kernel).

Thanks,
Qu

> ---
>  This patch survived a full btrfs-progs tests run
> 
>  cmds/qgroup.c | 15 +++++++++++----
>  1 file changed, 11 insertions(+), 4 deletions(-)
> 
> diff --git a/cmds/qgroup.c b/cmds/qgroup.c
> index ba81052a..6bfb4949 100644
> --- a/cmds/qgroup.c
> +++ b/cmds/qgroup.c
> @@ -98,7 +98,9 @@ static int _cmd_qgroup_assign(const struct cmd_struct *cmd, int assign,
>  
>  	ret = ioctl(fd, BTRFS_IOC_QGROUP_ASSIGN, &args);
>  	if (ret < 0) {
> -		error("unable to assign quota group: %m");
> +		error("unable to assign quota group: %s",
> +				errno == ENOTCONN ? "quota not enabled"
> +						: strerror(errno));
>  		close_file_or_dir(fd, dirstream);
>  		return 1;
>  	}
> @@ -152,8 +154,10 @@ static int _cmd_qgroup_create(int create, int argc, char **argv)
>  	ret = ioctl(fd, BTRFS_IOC_QGROUP_CREATE, &args);
>  	close_file_or_dir(fd, dirstream);
>  	if (ret < 0) {
> -		error("unable to %s quota group: %m",
> -			create ? "create":"destroy");
> +		error("unable to %s quota group: %s",
> +			create ? "create":"destroy",
> +				errno == ENOTCONN ? "quota not enabled"
> +						: strerror(errno));
>  		return 1;
>  	}
>  	return 0;
> @@ -447,7 +451,10 @@ static int cmd_qgroup_limit(const struct cmd_struct *cmd, int argc, char **argv)
>  	ret = ioctl(fd, BTRFS_IOC_QGROUP_LIMIT, &args);
>  	close_file_or_dir(fd, dirstream);
>  	if (ret < 0) {
> -		error("unable to limit requested quota group: %m");
> +		error("unable to limit requested quota group: %s",
> +				errno == ENOTCONN ? "quota not enabled"
> +						: strerror(errno));
> +
>  		return 1;
>  	}
>  	return 0;
>
David Sterba Nov. 28, 2019, 11:08 a.m. UTC | #2
On Wed, Nov 27, 2019 at 12:30:38PM +0800, Qu Wenruo wrote:
> 
> 
> On 2019/11/27 上午11:48, Marcos Paulo de Souza wrote:
> > From: Marcos Paulo de Souza <mpdesouza@suse.com>
> > 
> > Current btrfs code returns ENOTCONN when the user tries to create a
> > qgroup on a subvolume without quota enabled. In order to present a
> > meaningful message to the user, we now handle ENOTCONN showing
> > the message "quota not enabled".
> > 
> > Signed-off-by: Marcos Paulo de Souza <mpdesouza@suse.com>
> 
> Don't forget the original -EINVAL.
> 
> So it needs to cover both -EINVAL (for older kernel) and -ENOTCONN (for
> newer kernel).

I think for now only ENOTCONN should be interpreted as 'quotas not
enabled' as we can be sure it's just that. But EINVAL means 'invalid
parameter' and this can be interpreted in that context as if the qgroup
ids are wrong etc.
Qu Wenruo Nov. 28, 2019, 12:39 p.m. UTC | #3
On 2019/11/28 下午7:08, David Sterba wrote:
> On Wed, Nov 27, 2019 at 12:30:38PM +0800, Qu Wenruo wrote:
>>
>>
>> On 2019/11/27 上午11:48, Marcos Paulo de Souza wrote:
>>> From: Marcos Paulo de Souza <mpdesouza@suse.com>
>>>
>>> Current btrfs code returns ENOTCONN when the user tries to create a
>>> qgroup on a subvolume without quota enabled. In order to present a
>>> meaningful message to the user, we now handle ENOTCONN showing
>>> the message "quota not enabled".
>>>
>>> Signed-off-by: Marcos Paulo de Souza <mpdesouza@suse.com>
>>
>> Don't forget the original -EINVAL.
>>
>> So it needs to cover both -EINVAL (for older kernel) and -ENOTCONN (for
>> newer kernel).
> 
> I think for now only ENOTCONN should be interpreted as 'quotas not
> enabled' as we can be sure it's just that. But EINVAL means 'invalid
> parameter' and this can be interpreted in that context as if the qgroup
> ids are wrong etc.
>

Ah, makes sense.
So no need for a new version.
Reviewed-by: Qu Wenruo <wqu@suse.com>
diff mbox series

Patch

diff --git a/cmds/qgroup.c b/cmds/qgroup.c
index ba81052a..6bfb4949 100644
--- a/cmds/qgroup.c
+++ b/cmds/qgroup.c
@@ -98,7 +98,9 @@  static int _cmd_qgroup_assign(const struct cmd_struct *cmd, int assign,
 
 	ret = ioctl(fd, BTRFS_IOC_QGROUP_ASSIGN, &args);
 	if (ret < 0) {
-		error("unable to assign quota group: %m");
+		error("unable to assign quota group: %s",
+				errno == ENOTCONN ? "quota not enabled"
+						: strerror(errno));
 		close_file_or_dir(fd, dirstream);
 		return 1;
 	}
@@ -152,8 +154,10 @@  static int _cmd_qgroup_create(int create, int argc, char **argv)
 	ret = ioctl(fd, BTRFS_IOC_QGROUP_CREATE, &args);
 	close_file_or_dir(fd, dirstream);
 	if (ret < 0) {
-		error("unable to %s quota group: %m",
-			create ? "create":"destroy");
+		error("unable to %s quota group: %s",
+			create ? "create":"destroy",
+				errno == ENOTCONN ? "quota not enabled"
+						: strerror(errno));
 		return 1;
 	}
 	return 0;
@@ -447,7 +451,10 @@  static int cmd_qgroup_limit(const struct cmd_struct *cmd, int argc, char **argv)
 	ret = ioctl(fd, BTRFS_IOC_QGROUP_LIMIT, &args);
 	close_file_or_dir(fd, dirstream);
 	if (ret < 0) {
-		error("unable to limit requested quota group: %m");
+		error("unable to limit requested quota group: %s",
+				errno == ENOTCONN ? "quota not enabled"
+						: strerror(errno));
+
 		return 1;
 	}
 	return 0;