All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] xfs_quota: print quota id number if the name can't be found
@ 2016-04-06 17:39 Zorro Lang
  2016-04-06 18:34 ` Eric Sandeen
  0 siblings, 1 reply; 5+ messages in thread
From: Zorro Lang @ 2016-04-06 17:39 UTC (permalink / raw)
  To: xfs; +Cc: sandeen, Zorro Lang

When use GETNEXTQUOTA ioctl to report project quota, it always
report an unexpected quota:

  (null) 0 0 0 00 [--------]

The ID 0 store the default quota, even if no one set default quota,
it still have quota accounting, but not enforced. So GETNEXTQUOTA
can find and report this undefined quota.

>From this problem, I thought if others' quota name miss, (null) will
be printed too. e.g.

  # xfs_quota -xc "limit -u bsoft=300m bhard=400m test" $mnt
  # xfs_quota -xc "report -u" $mnt
  User ID          Used       Soft       Hard    Warn/Grace
  ---------- --------------------------------------------------
  root                0          0          0     00 [--------]
  test                0     307200     409600     00 [--------]
  # userdel -r test
  # xfs_quota -xc "report -u" $mnt
  User ID          Used       Soft       Hard    Warn/Grace
  ---------- --------------------------------------------------
  root                0          0          0     00 [--------]
  (null)              0     307200     409600     00 [--------]

So this problem same with above id 0's problem. For deal with this,
this patch will print id number if the name can't be found.

But if use old GETQUOTA ioctl, it won't print project id 0 quota
information(if it's not defined). That's different with GETNEXTQUOTA.
For keep consistent, this patch also print project id 0 when use old
GETQUOTA.

Signed-off-by: Zorro Lang <zlang@redhat.com>
---

Hi,

This's a problem from GETNEXTQUOTA feature. The original disscussion
is as below:

http://thread.gmane.org/gmane.comp.file-systems.fstests/1852/focus=1968

Then Eryu send a patch to xfstests, try to fix the test failure bring
by this bug. The disscussion is as below:

http://oss.sgi.com/archives/xfs/2016-04/msg00002.html

Finally we decided to fix this problem in xfsprogs. After talked with
Eric Sandeen, I wrote this patch. At first, Eric thought we shouldn't
print project id 0 quota information, if no one set limit for it.

Then he change his mind to always print "root" as project id 0's name,
if no one define a name for it. But there's another problem, if we
print "root" for project id 0, but we can't run:

  xfs_quota -xc "limit -p xxx xxx root" $mnt

Because the "root" is a fake name. Then I suggest to print id number,
if the name can't be found. This method not only used for project id
0, it used for all user/group/project IDs which no name defined.

So this patch should be the V3 patch. We can't sure which one is the
best idea. If anyone have better idea, please tell me.

Thanks,
Zorro

 quota/report.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/quota/report.c b/quota/report.c
index 48a3f29..557d667 100644
--- a/quota/report.c
+++ b/quota/report.c
@@ -389,7 +389,10 @@ report_mount(
 					name = p->pr_name;
 			}
 		}
-		fprintf(fp, "%-10s", name);
+		if (name != NULL)
+			fprintf(fp, "%-10s", name);
+		else
+			fprintf(fp, "#%-10u", d.d_id);
 	}
 
 	if (form & XFS_BLOCK_QUOTA) {
@@ -571,6 +574,12 @@ report_project_mount(
 			id = oid + 1;
 		}
 	} else {
+		if (!getprprid(0)) {
+			report_mount(fp, 0, "#0", NULL, form, XFS_PROJ_QUOTA,
+			             mount, flags);
+			flags |= NO_HEADER_FLAG;
+		}
+
 		setprent();
 		while ((p = getprent()) != NULL) {
 			if (report_mount(fp, p->pr_prid, p->pr_name, NULL,
-- 
2.5.5

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] xfs_quota: print quota id number if the name can't be found
  2016-04-06 17:39 [PATCH] xfs_quota: print quota id number if the name can't be found Zorro Lang
@ 2016-04-06 18:34 ` Eric Sandeen
  2016-04-07  1:41   ` Zorro Lang
  2016-04-07  3:37   ` Zorro Lang
  0 siblings, 2 replies; 5+ messages in thread
From: Eric Sandeen @ 2016-04-06 18:34 UTC (permalink / raw)
  To: Zorro Lang, xfs

On 4/6/16 12:39 PM, Zorro Lang wrote:
> When use GETNEXTQUOTA ioctl to report project quota, it always
> report an unexpected quota:
> 
>   (null) 0 0 0 00 [--------]
> 
> The ID 0 store the default quota, even if no one set default quota,
> it still have quota accounting, but not enforced. So GETNEXTQUOTA
> can find and report this undefined quota.
> 
> From this problem, I thought if others' quota name miss, (null) will
> be printed too. e.g.
> 
>   # xfs_quota -xc "limit -u bsoft=300m bhard=400m test" $mnt
>   # xfs_quota -xc "report -u" $mnt
>   User ID          Used       Soft       Hard    Warn/Grace
>   ---------- --------------------------------------------------
>   root                0          0          0     00 [--------]
>   test                0     307200     409600     00 [--------]
>   # userdel -r test
>   # xfs_quota -xc "report -u" $mnt
>   User ID          Used       Soft       Hard    Warn/Grace
>   ---------- --------------------------------------------------
>   root                0          0          0     00 [--------]
>   (null)              0     307200     409600     00 [--------]
> 
> So this problem same with above id 0's problem. For deal with this,
> this patch will print id number if the name can't be found.
> 
> But if use old GETQUOTA ioctl, it won't print project id 0 quota
> information(if it's not defined). That's different with GETNEXTQUOTA.
> For keep consistent, this patch also print project id 0 when use old
> GETQUOTA.
> 
> Signed-off-by: Zorro Lang <zlang@redhat.com>

Thanks, I think this makes sense; so this solves 2 problems.

1) always print the id # if there is no name mapping during quota report, and
2) always print default project quota information, even if no PRID 0 in in the projects map.

UID & GID always (?) have an ID 0 defined (if the system has no root user or group,
something is very odd, but it is normal to have no PRID 0 defined)

other comments below.

> ---
> 
> Hi,
> 
> This's a problem from GETNEXTQUOTA feature. The original disscussion
> is as below:
> 
> http://thread.gmane.org/gmane.comp.file-systems.fstests/1852/focus=1968
> 
> Then Eryu send a patch to xfstests, try to fix the test failure bring
> by this bug. The disscussion is as below:
> 
> http://oss.sgi.com/archives/xfs/2016-04/msg00002.html
> 
> Finally we decided to fix this problem in xfsprogs. After talked with
> Eric Sandeen, I wrote this patch. At first, Eric thought we shouldn't
> print project id 0 quota information, if no one set limit for it.
> 
> Then he change his mind to always print "root" as project id 0's name,
> if no one define a name for it. But there's another problem, if we
> print "root" for project id 0, but we can't run:
> 
>   xfs_quota -xc "limit -p xxx xxx root" $mnt
> 
> Because the "root" is a fake name. Then I suggest to print id number,
> if the name can't be found. This method not only used for project id
> 0, it used for all user/group/project IDs which no name defined.
> 
> So this patch should be the V3 patch. We can't sure which one is the
> best idea. If anyone have better idea, please tell me.
> 
> Thanks,
> Zorro
> 
>  quota/report.c | 11 ++++++++++-
>  1 file changed, 10 insertions(+), 1 deletion(-)
> 
> diff --git a/quota/report.c b/quota/report.c
> index 48a3f29..557d667 100644
> --- a/quota/report.c
> +++ b/quota/report.c
> @@ -389,7 +389,10 @@ report_mount(
>  					name = p->pr_name;
>  			}
>  		}
> -		fprintf(fp, "%-10s", name);

Could use a comment:

+		/* If no name is found, print the id # instead of (null) */

> +		if (name != NULL)
> +			fprintf(fp, "%-10s", name);
> +		else
> +			fprintf(fp, "#%-10u", d.d_id);
>  	}
>  
>  	if (form & XFS_BLOCK_QUOTA) {
> @@ -571,6 +574,12 @@ report_project_mount(
>  			id = oid + 1;
>  		}
>  	} else {

Comment:

+		/* Print default project quota even if PRID 0 isn't defined */

> +		if (!getprprid(0)) {
> +			report_mount(fp, 0, "#0", NULL, form, XFS_PROJ_QUOTA,

If you pass in NULL instead of "#0" does report_mount do the right thing?
If so, better to not hard-code "#0" here.

-Eric

> +			             mount, flags);
> +			flags |= NO_HEADER_FLAG;
> +		}
> +
>  		setprent();
>  		while ((p = getprent()) != NULL) {
>  			if (report_mount(fp, p->pr_prid, p->pr_name, NULL,
> 

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] xfs_quota: print quota id number if the name can't be found
  2016-04-06 18:34 ` Eric Sandeen
@ 2016-04-07  1:41   ` Zorro Lang
  2016-04-07  3:37   ` Zorro Lang
  1 sibling, 0 replies; 5+ messages in thread
From: Zorro Lang @ 2016-04-07  1:41 UTC (permalink / raw)
  To: Eric Sandeen; +Cc: zlang, xfs


[-- Attachment #1.1: Type: text/plain, Size: 5395 bytes --]

2016年4月7日 02:34,"Eric Sandeen" <sandeen@redhat.com>写道:
>
> On 4/6/16 12:39 PM, Zorro Lang wrote:
> > When use GETNEXTQUOTA ioctl to report project quota, it always
> > report an unexpected quota:
> >
> >   (null) 0 0 0 00 [--------]
> >
> > The ID 0 store the default quota, even if no one set default quota,
> > it still have quota accounting, but not enforced. So GETNEXTQUOTA
> > can find and report this undefined quota.
> >
> > From this problem, I thought if others' quota name miss, (null) will
> > be printed too. e.g.
> >
> >   # xfs_quota -xc "limit -u bsoft=300m bhard=400m test" $mnt
> >   # xfs_quota -xc "report -u" $mnt
> >   User ID          Used       Soft       Hard    Warn/Grace
> >   ---------- --------------------------------------------------
> >   root                0          0          0     00 [--------]
> >   test                0     307200     409600     00 [--------]
> >   # userdel -r test
> >   # xfs_quota -xc "report -u" $mnt
> >   User ID          Used       Soft       Hard    Warn/Grace
> >   ---------- --------------------------------------------------
> >   root                0          0          0     00 [--------]
> >   (null)              0     307200     409600     00 [--------]
> >
> > So this problem same with above id 0's problem. For deal with this,
> > this patch will print id number if the name can't be found.
> >
> > But if use old GETQUOTA ioctl, it won't print project id 0 quota
> > information(if it's not defined). That's different with GETNEXTQUOTA.
> > For keep consistent, this patch also print project id 0 when use old
> > GETQUOTA.
> >
> > Signed-off-by: Zorro Lang <zlang@redhat.com>
>
> Thanks, I think this makes sense; so this solves 2 problems.
>
> 1) always print the id # if there is no name mapping during quota report,
and
> 2) always print default project quota information, even if no PRID 0 in
in the projects map.
>
> UID & GID always (?) have an ID 0 defined (if the system has no root user
or group,
> something is very odd, but it is normal to have no PRID 0 defined)
>
> other comments below.

Yes, I should add some comments. And I will add one line in xfs_quota man
page about report command too.
>
> > ---
> >
> > Hi,
> >
> > This's a problem from GETNEXTQUOTA feature. The original disscussion
> > is as below:
> >
> > http://thread.gmane.org/gmane.comp.file-systems.fstests/1852/focus=1968
> >
> > Then Eryu send a patch to xfstests, try to fix the test failure bring
> > by this bug. The disscussion is as below:
> >
> > http://oss.sgi.com/archives/xfs/2016-04/msg00002.html
> >
> > Finally we decided to fix this problem in xfsprogs. After talked with
> > Eric Sandeen, I wrote this patch. At first, Eric thought we shouldn't
> > print project id 0 quota information, if no one set limit for it.
> >
> > Then he change his mind to always print "root" as project id 0's name,
> > if no one define a name for it. But there's another problem, if we
> > print "root" for project id 0, but we can't run:
> >
> >   xfs_quota -xc "limit -p xxx xxx root" $mnt
> >
> > Because the "root" is a fake name. Then I suggest to print id number,
> > if the name can't be found. This method not only used for project id
> > 0, it used for all user/group/project IDs which no name defined.
> >
> > So this patch should be the V3 patch. We can't sure which one is the
> > best idea. If anyone have better idea, please tell me.
> >
> > Thanks,
> > Zorro
> >
> >  quota/report.c | 11 ++++++++++-
> >  1 file changed, 10 insertions(+), 1 deletion(-)
> >
> > diff --git a/quota/report.c b/quota/report.c
> > index 48a3f29..557d667 100644
> > --- a/quota/report.c
> > +++ b/quota/report.c
> > @@ -389,7 +389,10 @@ report_mount(
> >                                       name = p->pr_name;
> >                       }
> >               }
> > -             fprintf(fp, "%-10s", name);
>
> Could use a comment:
>
> +               /* If no name is found, print the id # instead of (null)
*/
>
> > +             if (name != NULL)
> > +                     fprintf(fp, "%-10s", name);
> > +             else
> > +                     fprintf(fp, "#%-10u", d.d_id);
> >       }
> >
> >       if (form & XFS_BLOCK_QUOTA) {
> > @@ -571,6 +574,12 @@ report_project_mount(
> >                       id = oid + 1;
> >               }
> >       } else {
>
> Comment:
>
> +               /* Print default project quota even if PRID 0 isn't
defined */
>
> > +             if (!getprprid(0)) {
> > +                     report_mount(fp, 0, "#0", NULL, form,
XFS_PROJ_QUOTA,
>
> If you pass in NULL instead of "#0" does report_mount do the right thing?
> If so, better to not hard-code "#0" here.

This's a good idea! Better than use hard–code #0 which looks ugly.

I will send V2 patch to fix all above problems.

Thanks,
Zorro
>
> -Eric
>
> > +                                  mount, flags);
> > +                     flags |= NO_HEADER_FLAG;
> > +             }
> > +
> >               setprent();
> >               while ((p = getprent()) != NULL) {
> >                       if (report_mount(fp, p->pr_prid, p->pr_name, NULL,
> >
>
> _______________________________________________
> xfs mailing list
> xfs@oss.sgi.com
> http://oss.sgi.com/mailman/listinfo/xfs

[-- Attachment #1.2: Type: text/html, Size: 7628 bytes --]

[-- Attachment #2: Type: text/plain, Size: 121 bytes --]

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] xfs_quota: print quota id number if the name can't be found
  2016-04-06 18:34 ` Eric Sandeen
  2016-04-07  1:41   ` Zorro Lang
@ 2016-04-07  3:37   ` Zorro Lang
  2016-04-07  4:10     ` Eric Sandeen
  1 sibling, 1 reply; 5+ messages in thread
From: Zorro Lang @ 2016-04-07  3:37 UTC (permalink / raw)
  To: Eric Sandeen; +Cc: xfs

On Wed, Apr 06, 2016 at 01:34:22PM -0500, Eric Sandeen wrote:
> On 4/6/16 12:39 PM, Zorro Lang wrote:
> > When use GETNEXTQUOTA ioctl to report project quota, it always
> > report an unexpected quota:
> > 
> >   (null) 0 0 0 00 [--------]
> > 
> > The ID 0 store the default quota, even if no one set default quota,
> > it still have quota accounting, but not enforced. So GETNEXTQUOTA
> > can find and report this undefined quota.
> > 
> > From this problem, I thought if others' quota name miss, (null) will
> > be printed too. e.g.
> > 
> >   # xfs_quota -xc "limit -u bsoft=300m bhard=400m test" $mnt
> >   # xfs_quota -xc "report -u" $mnt
> >   User ID          Used       Soft       Hard    Warn/Grace
> >   ---------- --------------------------------------------------
> >   root                0          0          0     00 [--------]
> >   test                0     307200     409600     00 [--------]
> >   # userdel -r test
> >   # xfs_quota -xc "report -u" $mnt
> >   User ID          Used       Soft       Hard    Warn/Grace
> >   ---------- --------------------------------------------------
> >   root                0          0          0     00 [--------]
> >   (null)              0     307200     409600     00 [--------]
> > 
> > So this problem same with above id 0's problem. For deal with this,
> > this patch will print id number if the name can't be found.
> > 
> > But if use old GETQUOTA ioctl, it won't print project id 0 quota
> > information(if it's not defined). That's different with GETNEXTQUOTA.
> > For keep consistent, this patch also print project id 0 when use old
> > GETQUOTA.
> > 
> > Signed-off-by: Zorro Lang <zlang@redhat.com>
> 
> Thanks, I think this makes sense; so this solves 2 problems.
> 
> 1) always print the id # if there is no name mapping during quota report, and
> 2) always print default project quota information, even if no PRID 0 in in the projects map.
> 
> UID & GID always (?) have an ID 0 defined (if the system has no root user or group,
> something is very odd, but it is normal to have no PRID 0 defined)
> 
> other comments below.
> 
> > ---
> > 
> > Hi,
> > 
> > This's a problem from GETNEXTQUOTA feature. The original disscussion
> > is as below:
> > 
> > http://thread.gmane.org/gmane.comp.file-systems.fstests/1852/focus=1968
> > 
> > Then Eryu send a patch to xfstests, try to fix the test failure bring
> > by this bug. The disscussion is as below:
> > 
> > http://oss.sgi.com/archives/xfs/2016-04/msg00002.html
> > 
> > Finally we decided to fix this problem in xfsprogs. After talked with
> > Eric Sandeen, I wrote this patch. At first, Eric thought we shouldn't
> > print project id 0 quota information, if no one set limit for it.
> > 
> > Then he change his mind to always print "root" as project id 0's name,
> > if no one define a name for it. But there's another problem, if we
> > print "root" for project id 0, but we can't run:
> > 
> >   xfs_quota -xc "limit -p xxx xxx root" $mnt
> > 
> > Because the "root" is a fake name. Then I suggest to print id number,
> > if the name can't be found. This method not only used for project id
> > 0, it used for all user/group/project IDs which no name defined.
> > 
> > So this patch should be the V3 patch. We can't sure which one is the
> > best idea. If anyone have better idea, please tell me.
> > 
> > Thanks,
> > Zorro
> > 
> >  quota/report.c | 11 ++++++++++-
> >  1 file changed, 10 insertions(+), 1 deletion(-)
> > 
> > diff --git a/quota/report.c b/quota/report.c
> > index 48a3f29..557d667 100644
> > --- a/quota/report.c
> > +++ b/quota/report.c
> > @@ -389,7 +389,10 @@ report_mount(
> >  					name = p->pr_name;
> >  			}
> >  		}
> > -		fprintf(fp, "%-10s", name);
> 
> Could use a comment:
> 
> +		/* If no name is found, print the id # instead of (null) */
> 
> > +		if (name != NULL)
> > +			fprintf(fp, "%-10s", name);
> > +		else
> > +			fprintf(fp, "#%-10u", d.d_id);

There's one more problem. When we print id number we print #%-10u, but
for name we print %-10s. There's one more "#" be printed for number.
So if we print name and number both, the output will like this:

User ID          Used       Soft       Hard    Warn/Grace
---------- --------------------------------------------------
root           512000          0          0     00 [--------]
#1000                0     307200     409600     00 [--------]

You can find the line of #1000 is not align at the line of "root".
Because the name print 10 characters, but the number print 10
characters + #.

Should we fix this problem?
If fix it, should we make name print %-11s, or make number print
#%-9u?

Thanks,
Zorro

> >  	}
> >  
> >  	if (form & XFS_BLOCK_QUOTA) {
> > @@ -571,6 +574,12 @@ report_project_mount(
> >  			id = oid + 1;
> >  		}
> >  	} else {
> 
> Comment:
> 
> +		/* Print default project quota even if PRID 0 isn't defined */
> 
> > +		if (!getprprid(0)) {
> > +			report_mount(fp, 0, "#0", NULL, form, XFS_PROJ_QUOTA,
> 
> If you pass in NULL instead of "#0" does report_mount do the right thing?
> If so, better to not hard-code "#0" here.
> 
> -Eric
> 
> > +			             mount, flags);
> > +			flags |= NO_HEADER_FLAG;
> > +		}
> > +
> >  		setprent();
> >  		while ((p = getprent()) != NULL) {
> >  			if (report_mount(fp, p->pr_prid, p->pr_name, NULL,
> > 
> 
> _______________________________________________
> xfs mailing list
> xfs@oss.sgi.com
> http://oss.sgi.com/mailman/listinfo/xfs

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] xfs_quota: print quota id number if the name can't be found
  2016-04-07  3:37   ` Zorro Lang
@ 2016-04-07  4:10     ` Eric Sandeen
  0 siblings, 0 replies; 5+ messages in thread
From: Eric Sandeen @ 2016-04-07  4:10 UTC (permalink / raw)
  To: Zorro Lang; +Cc: Eric Sandeen, xfs



> On Apr 6, 2016, at 10:37 PM, Zorro Lang <zlang@redhat.com> wrote:
> 
>> 
>> 
>>> +        if (name != NULL)
>>> +            fprintf(fp, "%-10s", name);
>>> +        else
>>> +            fprintf(fp, "#%-10u", d.d_id);
> 
> There's one more problem. When we print id number we print #%-10u, but
> for name we print %-10s. There's one more "#" be printed for number.
> So if we print name and number both, the output will like this:
> 
> User ID          Used       Soft       Hard    Warn/Grace
> ---------- --------------------------------------------------
> root           512000          0          0     00 [--------]
> #1000                0     307200     409600     00 [--------]
> 
> You can find the line of #1000 is not align at the line of "root".
> Because the name print 10 characters, but the number print 10
> characters + #.
> 
> Should we fix this problem?
> If fix it, should we make name print %-11s, or make number print
> #%-9u?

9u I think.  Leave the existing format unchanged.

Thx,
Eric

> Thanks,
> Zorro
> 
>>>    }
>>> 
>>>    if (form & XFS_BLOCK_QUOTA) {
>>> @@ -571,6 +574,12 @@ report_project_mount(
>>>            id = oid + 1;
>>>        }
>>>    } else {
>> 
>> Comment:
>> 
>> +        /* Print default project quota even if PRID 0 isn't defined */
>> 
>>> +        if (!getprprid(0)) {
>>> +            report_mount(fp, 0, "#0", NULL, form, XFS_PROJ_QUOTA,
>> 
>> If you pass in NULL instead of "#0" does report_mount do the right thing?
>> If so, better to not hard-code "#0" here.
>> 
>> -Eric
>> 
>>> +                         mount, flags);
>>> +            flags |= NO_HEADER_FLAG;
>>> +        }
>>> +
>>>        setprent();
>>>        while ((p = getprent()) != NULL) {
>>>            if (report_mount(fp, p->pr_prid, p->pr_name, NULL,
>> 
>> _______________________________________________
>> xfs mailing list
>> xfs@oss.sgi.com
>> http://oss.sgi.com/mailman/listinfo/xfs

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2016-04-07  4:10 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-04-06 17:39 [PATCH] xfs_quota: print quota id number if the name can't be found Zorro Lang
2016-04-06 18:34 ` Eric Sandeen
2016-04-07  1:41   ` Zorro Lang
2016-04-07  3:37   ` Zorro Lang
2016-04-07  4:10     ` Eric Sandeen

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.