GNU bug report logs - #13927
stat --printf %t, %T flags (major and minor device types) don't work on mount points

Previous Next

Package: coreutils;

Reported by: Tyler Hobbs <tyler <at> datastax.com>

Date: Mon, 11 Mar 2013 20:45:02 UTC

Severity: normal

Done: Pádraig Brady <P <at> draigBrady.com>

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: help-debbugs <at> gnu.org (GNU bug Tracking System)
To: Tyler Hobbs <tyler <at> datastax.com>
Subject: bug#13927: closed (Re: bug#13927: stat --printf %t, %T flags
 (major and minor device types) don't work on mount points)
Date: Tue, 12 Mar 2013 13:54:02 +0000
[Message part 1 (text/plain, inline)]
Your bug report

#13927: stat --printf %t, %T flags (major and minor device types) don't work on mount points

which was filed against the coreutils package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to 13927 <at> debbugs.gnu.org.

-- 
13927: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=13927
GNU Bug Tracking System
Contact help-debbugs <at> gnu.org with problems
[Message part 2 (message/rfc822, inline)]
From: Pádraig Brady <P <at> draigBrady.com>
To: Tyler Hobbs <tyler <at> datastax.com>
Cc: 13927-done <at> debbugs.gnu.org
Subject: Re: bug#13927: stat --printf %t, %T flags (major and minor device
	types) don't work on mount points
Date: Tue, 12 Mar 2013 13:51:38 +0000
[Message part 3 (text/plain, inline)]
On 03/11/2013 08:39 PM, Tyler Hobbs wrote:
> If I run stat --printf='%D', the result is "10ca70", which is correct.
> However, if I run stat --printf='%t %T' /mountpoint, the result is
> erroneously "0 0".  If I instead run stat against the device directly (stat
> --printf='%t %T' /dev/xvdx), I get the correct result of "ca 170".
> 
> I believe the proper fix is to replace (in stat.c):
> 
>   out_uint_x (pformat, prefix_len, major (statbuf->st_rdev));
> 
> with:
> 
>   out_uint_x (pformat, prefix_len, major (statbuf->st_dev));
> 
> That is, use statbuf->st_dev instead of st_rdev, which is what the %d and
> %D directives use.
> 
> 
> I'm using coreutils 8.9, compiled from source, and this is the output of
> uname -a:
> 
> Linux ip-10-39-122-238 2.6.32-276.el6.x86_64 #1 SMP Tue May 29 17:38:19 EDT
> 2012 x86_64 x86_64 x86_64 GNU/Linux
> 
> Thanks for your time.
> - Tyler
> 

So %t and %T are only currently defined for device special files,
allowing one to distinguish between the represented device
and the device of the inode storing the representation (the special file).

$ stat -c '%T%t %D' /dev/sda /dev
08 5
00 5

Now %t and %T returning 0 for non special device nodes is not that useful.
I suppose in this case we might use st_rdev only for block and char specials,
and switch to st_dev otherwise.

However...

st_rdev is not always 0
I notice that st_rdev is not 0 on FreeBSD 9 for files.
I don't know what it represents, but it's non random so may be significant.
Also the man page I have here says that on XENIX
named special file subtypes are distinguished by st_rdev values

Also is it useful to get low level access like this
to the backing device major and minor for normal files
from a shell script?

So I think we'll just improve this through documentation.

Hopefully the attached clarifies things.

thanks,
Pádraig.
[stat-rdev.patch (text/x-patch, attachment)]
[Message part 5 (message/rfc822, inline)]
From: Tyler Hobbs <tyler <at> datastax.com>
To: bug-coreutils <at> gnu.org
Subject: stat --printf %t, %T flags (major and minor device types) don't work
	on mount points
Date: Mon, 11 Mar 2013 15:39:51 -0500
[Message part 6 (text/plain, inline)]
If I run stat --printf='%D', the result is "10ca70", which is correct.
However, if I run stat --printf='%t %T' /mountpoint, the result is
erroneously "0 0".  If I instead run stat against the device directly (stat
--printf='%t %T' /dev/xvdx), I get the correct result of "ca 170".

I believe the proper fix is to replace (in stat.c):

  out_uint_x (pformat, prefix_len, major (statbuf->st_rdev));

with:

  out_uint_x (pformat, prefix_len, major (statbuf->st_dev));

That is, use statbuf->st_dev instead of st_rdev, which is what the %d and
%D directives use.


I'm using coreutils 8.9, compiled from source, and this is the output of
uname -a:

Linux ip-10-39-122-238 2.6.32-276.el6.x86_64 #1 SMP Tue May 29 17:38:19 EDT
2012 x86_64 x86_64 x86_64 GNU/Linux

Thanks for your time.
- Tyler
[Message part 7 (text/html, inline)]

This bug report was last modified 12 years and 73 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.