diff mbox

btrfs-progs: du: fix to skip not btrfs dir/file

Message ID 1467807934-23403-1-git-send-email-wangshilong1991@gmail.com (mailing list archive)
State Superseded
Headers show

Commit Message

Wang Shilong July 6, 2016, 12:25 p.m. UTC
'btrfs file du' is a very useful tool to watch my system
file usage with snapshot aware.

when trying to run following commands:
[root@localhost btrfs-progs]# btrfs file du /
     Total   Exclusive  Set shared  Filename
ERROR: Failed to lookup root id - Inappropriate ioctl for device
ERROR: cannot check space of '/': Unknown error -1

and My Filesystem looks like this:
[root@localhost btrfs-progs]# df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs   16G     0   16G   0% /dev
tmpfs          tmpfs      16G  368K   16G   1% /dev/shm
tmpfs          tmpfs      16G  1.4M   16G   1% /run
tmpfs          tmpfs      16G     0   16G   0% /sys/fs/cgroup
/dev/sda3      btrfs      60G   19G   40G  33% /
tmpfs          tmpfs      16G  332K   16G   1% /tmp
/dev/sdc       btrfs     2.8T  166G  1.7T   9% /data
/dev/sda2      xfs       2.0G  452M  1.6G  23% /boot
/dev/sda1      vfat      1.9G   11M  1.9G   1% /boot/efi
tmpfs          tmpfs     3.2G   24K  3.2G   1% /run/user/1000

So I installed Btrfs as my root partition, but boot partition
can be other fs.

We can Let btrfs tool aware of this is not a btrfs file or
directory and skip those files, so that someone like me
could just run 'btrfs file du /' to scan all btrfs filesystems.

After patch, it will look like:
   Total   Exclusive  Set shared  Filename
skipping not btrfs dir/file: boot
skipping not btrfs dir/file: dev
skipping not btrfs dir/file: proc
skipping not btrfs dir/file: run
skipping not btrfs dir/file: sys
     0.00B       0.00B           -  //root/.bash_logout
     0.00B       0.00B           -  //root/.bash_profile
     0.00B       0.00B           -  //root/.bashrc
     0.00B       0.00B           -  //root/.cshrc
     0.00B       0.00B           -  //root/.tcshrc

This works for me to analysis system usage and analysis
performaces.

Signed-off-by: Wang Shilong <wangshilong1991@gmail.com>
---
 cmds-fi-du.c   | 11 ++++++++++-
 cmds-inspect.c |  2 +-
 utils.c        |  8 ++++----
 3 files changed, 15 insertions(+), 6 deletions(-)

Comments

Holger Hoffstätte July 6, 2016, 1:35 p.m. UTC | #1
On 07/06/16 14:25, Wang Shilong wrote:
> 'btrfs file du' is a very useful tool to watch my system
> file usage with snapshot aware.
> 
> when trying to run following commands:
> [root@localhost btrfs-progs]# btrfs file du /
>      Total   Exclusive  Set shared  Filename
> ERROR: Failed to lookup root id - Inappropriate ioctl for device
> ERROR: cannot check space of '/': Unknown error -1
> 
> and My Filesystem looks like this:
> [root@localhost btrfs-progs]# df -Th
> Filesystem     Type      Size  Used Avail Use% Mounted on
> devtmpfs       devtmpfs   16G     0   16G   0% /dev
> tmpfs          tmpfs      16G  368K   16G   1% /dev/shm
> tmpfs          tmpfs      16G  1.4M   16G   1% /run
> tmpfs          tmpfs      16G     0   16G   0% /sys/fs/cgroup
> /dev/sda3      btrfs      60G   19G   40G  33% /
> tmpfs          tmpfs      16G  332K   16G   1% /tmp
> /dev/sdc       btrfs     2.8T  166G  1.7T   9% /data
> /dev/sda2      xfs       2.0G  452M  1.6G  23% /boot
> /dev/sda1      vfat      1.9G   11M  1.9G   1% /boot/efi
> tmpfs          tmpfs     3.2G   24K  3.2G   1% /run/user/1000
> 
> So I installed Btrfs as my root partition, but boot partition
> can be other fs.
> 
> We can Let btrfs tool aware of this is not a btrfs file or
> directory and skip those files, so that someone like me
> could just run 'btrfs file du /' to scan all btrfs filesystems.
> 
> After patch, it will look like:
>    Total   Exclusive  Set shared  Filename
> skipping not btrfs dir/file: boot
> skipping not btrfs dir/file: dev
> skipping not btrfs dir/file: proc
> skipping not btrfs dir/file: run
> skipping not btrfs dir/file: sys
>      0.00B       0.00B           -  //root/.bash_logout
>      0.00B       0.00B           -  //root/.bash_profile
>      0.00B       0.00B           -  //root/.bashrc
>      0.00B       0.00B           -  //root/.cshrc
>      0.00B       0.00B           -  //root/.tcshrc
> 
> This works for me to analysis system usage and analysis
> performaces.

This is great, but can we please skip the "skipping .." messages?
Maybe it's just me but I really don't see the value of printing them
when they don't contribute to the result.
They also mess up the display. :)

thanks,
Holger

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Wang Shilong July 6, 2016, 3:16 p.m. UTC | #2
On Wed, Jul 6, 2016 at 10:35 PM, Holger Hoffstätte
<holger@applied-asynchrony.com> wrote:
> On 07/06/16 14:25, Wang Shilong wrote:
>> 'btrfs file du' is a very useful tool to watch my system
>> file usage with snapshot aware.
>>
>> when trying to run following commands:
>> [root@localhost btrfs-progs]# btrfs file du /
>>      Total   Exclusive  Set shared  Filename
>> ERROR: Failed to lookup root id - Inappropriate ioctl for device
>> ERROR: cannot check space of '/': Unknown error -1
>>
>> and My Filesystem looks like this:
>> [root@localhost btrfs-progs]# df -Th
>> Filesystem     Type      Size  Used Avail Use% Mounted on
>> devtmpfs       devtmpfs   16G     0   16G   0% /dev
>> tmpfs          tmpfs      16G  368K   16G   1% /dev/shm
>> tmpfs          tmpfs      16G  1.4M   16G   1% /run
>> tmpfs          tmpfs      16G     0   16G   0% /sys/fs/cgroup
>> /dev/sda3      btrfs      60G   19G   40G  33% /
>> tmpfs          tmpfs      16G  332K   16G   1% /tmp
>> /dev/sdc       btrfs     2.8T  166G  1.7T   9% /data
>> /dev/sda2      xfs       2.0G  452M  1.6G  23% /boot
>> /dev/sda1      vfat      1.9G   11M  1.9G   1% /boot/efi
>> tmpfs          tmpfs     3.2G   24K  3.2G   1% /run/user/1000
>>
>> So I installed Btrfs as my root partition, but boot partition
>> can be other fs.
>>
>> We can Let btrfs tool aware of this is not a btrfs file or
>> directory and skip those files, so that someone like me
>> could just run 'btrfs file du /' to scan all btrfs filesystems.
>>
>> After patch, it will look like:
>>    Total   Exclusive  Set shared  Filename
>> skipping not btrfs dir/file: boot
>> skipping not btrfs dir/file: dev
>> skipping not btrfs dir/file: proc
>> skipping not btrfs dir/file: run
>> skipping not btrfs dir/file: sys
>>      0.00B       0.00B           -  //root/.bash_logout
>>      0.00B       0.00B           -  //root/.bash_profile
>>      0.00B       0.00B           -  //root/.bashrc
>>      0.00B       0.00B           -  //root/.cshrc
>>      0.00B       0.00B           -  //root/.tcshrc
>>
>> This works for me to analysis system usage and analysis
>> performaces.
>
> This is great, but can we please skip the "skipping .." messages?
> Maybe it's just me but I really don't see the value of printing them
> when they don't contribute to the result.
> They also mess up the display. :)

I don't have a taste whether it needed or not, because it is somehow
useful to let users know some files/directories skipped....

Wait some other guys opinion for this...

thanks,
Shilong

>
> thanks,
> Holger
>
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Hugo Mills July 6, 2016, 3:20 p.m. UTC | #3
On Thu, Jul 07, 2016 at 12:16:01AM +0900, Wang Shilong wrote:
> On Wed, Jul 6, 2016 at 10:35 PM, Holger Hoffstätte
> <holger@applied-asynchrony.com> wrote:
> > On 07/06/16 14:25, Wang Shilong wrote:
> >> 'btrfs file du' is a very useful tool to watch my system
> >> file usage with snapshot aware.
> >>
> >> when trying to run following commands:
> >> [root@localhost btrfs-progs]# btrfs file du /
> >>      Total   Exclusive  Set shared  Filename
> >> ERROR: Failed to lookup root id - Inappropriate ioctl for device
> >> ERROR: cannot check space of '/': Unknown error -1
> >>
> >> and My Filesystem looks like this:
> >> [root@localhost btrfs-progs]# df -Th
> >> Filesystem     Type      Size  Used Avail Use% Mounted on
> >> devtmpfs       devtmpfs   16G     0   16G   0% /dev
> >> tmpfs          tmpfs      16G  368K   16G   1% /dev/shm
> >> tmpfs          tmpfs      16G  1.4M   16G   1% /run
> >> tmpfs          tmpfs      16G     0   16G   0% /sys/fs/cgroup
> >> /dev/sda3      btrfs      60G   19G   40G  33% /
> >> tmpfs          tmpfs      16G  332K   16G   1% /tmp
> >> /dev/sdc       btrfs     2.8T  166G  1.7T   9% /data
> >> /dev/sda2      xfs       2.0G  452M  1.6G  23% /boot
> >> /dev/sda1      vfat      1.9G   11M  1.9G   1% /boot/efi
> >> tmpfs          tmpfs     3.2G   24K  3.2G   1% /run/user/1000
> >>
> >> So I installed Btrfs as my root partition, but boot partition
> >> can be other fs.
> >>
> >> We can Let btrfs tool aware of this is not a btrfs file or
> >> directory and skip those files, so that someone like me
> >> could just run 'btrfs file du /' to scan all btrfs filesystems.
> >>
> >> After patch, it will look like:
> >>    Total   Exclusive  Set shared  Filename
> >> skipping not btrfs dir/file: boot
> >> skipping not btrfs dir/file: dev
> >> skipping not btrfs dir/file: proc
> >> skipping not btrfs dir/file: run
> >> skipping not btrfs dir/file: sys
> >>      0.00B       0.00B           -  //root/.bash_logout
> >>      0.00B       0.00B           -  //root/.bash_profile
> >>      0.00B       0.00B           -  //root/.bashrc
> >>      0.00B       0.00B           -  //root/.cshrc
> >>      0.00B       0.00B           -  //root/.tcshrc
> >>
> >> This works for me to analysis system usage and analysis
> >> performaces.
> >
> > This is great, but can we please skip the "skipping .." messages?
> > Maybe it's just me but I really don't see the value of printing them
> > when they don't contribute to the result.
> > They also mess up the display. :)
> 
> I don't have a taste whether it needed or not, because it is somehow
> useful to let users know some files/directories skipped....

   At the absolute minimum, I think that these messages should go to
stderr (like du does when it deosn't have permissions), and should go
away with -q. They're still irritating, but at least you can get rid
of them easily.

   Hugo.

> Wait some other guys opinion for this...
> 
> thanks,
> Shilong
> 
> >
> > thanks,
> > Holger
> >
Holger Hoffstätte July 6, 2016, 3:42 p.m. UTC | #4
On 07/06/16 17:20, Hugo Mills wrote:
> On Thu, Jul 07, 2016 at 12:16:01AM +0900, Wang Shilong wrote:
>> On Wed, Jul 6, 2016 at 10:35 PM, Holger Hoffstätte
>> <holger@applied-asynchrony.com> wrote:
>>> On 07/06/16 14:25, Wang Shilong wrote:
>>>> 'btrfs file du' is a very useful tool to watch my system
>>>> file usage with snapshot aware.
>>>>
>>>> when trying to run following commands:
>>>> [root@localhost btrfs-progs]# btrfs file du /
>>>>      Total   Exclusive  Set shared  Filename
>>>> ERROR: Failed to lookup root id - Inappropriate ioctl for device
>>>> ERROR: cannot check space of '/': Unknown error -1
>>>>
>>>> and My Filesystem looks like this:
>>>> [root@localhost btrfs-progs]# df -Th
>>>> Filesystem     Type      Size  Used Avail Use% Mounted on
>>>> devtmpfs       devtmpfs   16G     0   16G   0% /dev
>>>> tmpfs          tmpfs      16G  368K   16G   1% /dev/shm
>>>> tmpfs          tmpfs      16G  1.4M   16G   1% /run
>>>> tmpfs          tmpfs      16G     0   16G   0% /sys/fs/cgroup
>>>> /dev/sda3      btrfs      60G   19G   40G  33% /
>>>> tmpfs          tmpfs      16G  332K   16G   1% /tmp
>>>> /dev/sdc       btrfs     2.8T  166G  1.7T   9% /data
>>>> /dev/sda2      xfs       2.0G  452M  1.6G  23% /boot
>>>> /dev/sda1      vfat      1.9G   11M  1.9G   1% /boot/efi
>>>> tmpfs          tmpfs     3.2G   24K  3.2G   1% /run/user/1000
>>>>
>>>> So I installed Btrfs as my root partition, but boot partition
>>>> can be other fs.
>>>>
>>>> We can Let btrfs tool aware of this is not a btrfs file or
>>>> directory and skip those files, so that someone like me
>>>> could just run 'btrfs file du /' to scan all btrfs filesystems.
>>>>
>>>> After patch, it will look like:
>>>>    Total   Exclusive  Set shared  Filename
>>>> skipping not btrfs dir/file: boot
>>>> skipping not btrfs dir/file: dev
>>>> skipping not btrfs dir/file: proc
>>>> skipping not btrfs dir/file: run
>>>> skipping not btrfs dir/file: sys
>>>>      0.00B       0.00B           -  //root/.bash_logout
>>>>      0.00B       0.00B           -  //root/.bash_profile
>>>>      0.00B       0.00B           -  //root/.bashrc
>>>>      0.00B       0.00B           -  //root/.cshrc
>>>>      0.00B       0.00B           -  //root/.tcshrc
>>>>
>>>> This works for me to analysis system usage and analysis
>>>> performaces.
>>>
>>> This is great, but can we please skip the "skipping .." messages?
>>> Maybe it's just me but I really don't see the value of printing them
>>> when they don't contribute to the result.
>>> They also mess up the display. :)
>>
>> I don't have a taste whether it needed or not, because it is somehow
>> useful to let users know some files/directories skipped....

When you run "find /path -type d" you don't get messages for all the
things you just didn't want to find either.

>    At the absolute minimum, I think that these messages should go to
> stderr (like du does when it deosn't have permissions), and should go
> away with -q. They're still irritating, but at least you can get rid
> of them easily.

If anything this should require a --verbose, not the other way
around. Maybe instead of breaking the output just indicate the
special status via "-- --" values, or default to 0.00?
Still, we're explicitly only interested in btrfs stuff and not
anything else, so printing non-information can only yield noise.

This is very much orthogonal to not printing anything after an
otherwise successful command execution.

-h
Hugo Mills July 6, 2016, 3:56 p.m. UTC | #5
On Wed, Jul 06, 2016 at 05:42:33PM +0200, Holger Hoffstätte wrote:
> On 07/06/16 17:20, Hugo Mills wrote:
> > On Thu, Jul 07, 2016 at 12:16:01AM +0900, Wang Shilong wrote:
> >> On Wed, Jul 6, 2016 at 10:35 PM, Holger Hoffstätte
> >> <holger@applied-asynchrony.com> wrote:
> >>> On 07/06/16 14:25, Wang Shilong wrote:
> >>>> 'btrfs file du' is a very useful tool to watch my system
> >>>> file usage with snapshot aware.
> >>>>
> >>>> when trying to run following commands:
> >>>> [root@localhost btrfs-progs]# btrfs file du /
> >>>>      Total   Exclusive  Set shared  Filename
> >>>> ERROR: Failed to lookup root id - Inappropriate ioctl for device
> >>>> ERROR: cannot check space of '/': Unknown error -1
> >>>>
> >>>> and My Filesystem looks like this:
> >>>> [root@localhost btrfs-progs]# df -Th
> >>>> Filesystem     Type      Size  Used Avail Use% Mounted on
> >>>> devtmpfs       devtmpfs   16G     0   16G   0% /dev
> >>>> tmpfs          tmpfs      16G  368K   16G   1% /dev/shm
> >>>> tmpfs          tmpfs      16G  1.4M   16G   1% /run
> >>>> tmpfs          tmpfs      16G     0   16G   0% /sys/fs/cgroup
> >>>> /dev/sda3      btrfs      60G   19G   40G  33% /
> >>>> tmpfs          tmpfs      16G  332K   16G   1% /tmp
> >>>> /dev/sdc       btrfs     2.8T  166G  1.7T   9% /data
> >>>> /dev/sda2      xfs       2.0G  452M  1.6G  23% /boot
> >>>> /dev/sda1      vfat      1.9G   11M  1.9G   1% /boot/efi
> >>>> tmpfs          tmpfs     3.2G   24K  3.2G   1% /run/user/1000
> >>>>
> >>>> So I installed Btrfs as my root partition, but boot partition
> >>>> can be other fs.
> >>>>
> >>>> We can Let btrfs tool aware of this is not a btrfs file or
> >>>> directory and skip those files, so that someone like me
> >>>> could just run 'btrfs file du /' to scan all btrfs filesystems.
> >>>>
> >>>> After patch, it will look like:
> >>>>    Total   Exclusive  Set shared  Filename
> >>>> skipping not btrfs dir/file: boot
> >>>> skipping not btrfs dir/file: dev
> >>>> skipping not btrfs dir/file: proc
> >>>> skipping not btrfs dir/file: run
> >>>> skipping not btrfs dir/file: sys
> >>>>      0.00B       0.00B           -  //root/.bash_logout
> >>>>      0.00B       0.00B           -  //root/.bash_profile
> >>>>      0.00B       0.00B           -  //root/.bashrc
> >>>>      0.00B       0.00B           -  //root/.cshrc
> >>>>      0.00B       0.00B           -  //root/.tcshrc
> >>>>
> >>>> This works for me to analysis system usage and analysis
> >>>> performaces.
> >>>
> >>> This is great, but can we please skip the "skipping .." messages?
> >>> Maybe it's just me but I really don't see the value of printing them
> >>> when they don't contribute to the result.
> >>> They also mess up the display. :)
> >>
> >> I don't have a taste whether it needed or not, because it is somehow
> >> useful to let users know some files/directories skipped....
> 
> When you run "find /path -type d" you don't get messages for all the
> things you just didn't want to find either.

   No, but you do get messages about unreadable directories from find.

   Your example above would be "You asked for X and <thing> isn't an
X". That's not what these messages are about -- what we're seeing here
is "I tried to do what you asked to <thing>, but couldn't".

   Hugo.

> >    At the absolute minimum, I think that these messages should go to
> > stderr (like du does when it deosn't have permissions), and should go
> > away with -q. They're still irritating, but at least you can get rid
> > of them easily.
> 
> If anything this should require a --verbose, not the other way
> around. Maybe instead of breaking the output just indicate the
> special status via "-- --" values, or default to 0.00?
> Still, we're explicitly only interested in btrfs stuff and not
> anything else, so printing non-information can only yield noise.
> 
> This is very much orthogonal to not printing anything after an
> otherwise successful command execution.
> 
> -h
> 
>
Eric Sandeen July 7, 2016, 2:43 a.m. UTC | #6
On 7/6/16 8:35 AM, Holger Hoffstätte wrote:
> On 07/06/16 14:25, Wang Shilong wrote:

...

>> After patch, it will look like:
>>    Total   Exclusive  Set shared  Filename
>> skipping not btrfs dir/file: boot
>> skipping not btrfs dir/file: dev
>> skipping not btrfs dir/file: proc
>> skipping not btrfs dir/file: run
>> skipping not btrfs dir/file: sys
>>      0.00B       0.00B           -  //root/.bash_logout
>>      0.00B       0.00B           -  //root/.bash_profile
>>      0.00B       0.00B           -  //root/.bashrc
>>      0.00B       0.00B           -  //root/.cshrc
>>      0.00B       0.00B           -  //root/.tcshrc
>>
>> This works for me to analysis system usage and analysis
>> performaces.
> 
> This is great, but can we please skip the "skipping .." messages?
> Maybe it's just me but I really don't see the value of printing them
> when they don't contribute to the result.
> They also mess up the display. :)

<driveby>
I agree, those messages add no value.
</driveby>

-Eric

> thanks,
> Holger

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
David Sterba July 11, 2016, 10:20 a.m. UTC | #7
On Wed, Jul 06, 2016 at 05:42:33PM +0200, Holger Hoffstätte wrote:
> >    At the absolute minimum, I think that these messages should go to
> > stderr (like du does when it deosn't have permissions), and should go
> > away with -q. They're still irritating, but at least you can get rid
> > of them easily.
> 
> If anything this should require a --verbose, not the other way
> around. Maybe instead of breaking the output just indicate the
> special status via "-- --" values, or default to 0.00?

The '--' replacement values sound good to me (0.00 would be confusing).

> Still, we're explicitly only interested in btrfs stuff and not
> anything else, so printing non-information can only yield noise.

I think the extra lines would happen mostly in scenario where
directories are mountpoints and thus have a potentially different
filesystem. If we print just a single line for a mountpoint (and not
descend to it), I don't think it will create that much noise in the
output.
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/cmds-fi-du.c b/cmds-fi-du.c
index 12855a5..bf0e62c 100644
--- a/cmds-fi-du.c
+++ b/cmds-fi-du.c
@@ -389,8 +389,17 @@  static int du_walk_dir(struct du_dir_ctxt *ctxt, struct rb_root *shared_extents)
 						  dirfd(dirstream),
 						  shared_extents, &tot, &shr,
 						  0);
-				if (ret)
+				if (ret == -ENOTTY) {
+					fprintf(stdout,
+						"skipping not btrfs dir/file: %s\n",
+						entry->d_name);
+					continue;
+				} else if (ret) {
+					fprintf(stderr,
+						"failed to walk dir/file: %s :%s\n",
+						entry->d_name, strerror(-ret));
 					break;
+				}
 
 				ctxt->bytes_total += tot;
 				ctxt->bytes_shared += shr;
diff --git a/cmds-inspect.c b/cmds-inspect.c
index dd7b9dd..2ae44be 100644
--- a/cmds-inspect.c
+++ b/cmds-inspect.c
@@ -323,7 +323,7 @@  static int cmd_inspect_rootid(int argc, char **argv)
 
 	ret = lookup_ino_rootid(fd, &rootid);
 	if (ret) {
-		error("rootid failed with ret=%d", ret);
+		error("failed to lookup root id: %s", strerror(-ret));
 		goto out;
 	}
 
diff --git a/utils.c b/utils.c
index 578fdb0..f73b048 100644
--- a/utils.c
+++ b/utils.c
@@ -2815,6 +2815,8 @@  path:
 	if (fd < 0)
 		goto err;
 	ret = lookup_ino_rootid(fd, &id);
+	if (ret)
+		error("failed to lookup root id: %s", strerror(-ret));
 	close(fd);
 	if (ret < 0)
 		goto err;
@@ -3497,10 +3499,8 @@  int lookup_ino_rootid(int fd, u64 *rootid)
 	args.objectid = BTRFS_FIRST_FREE_OBJECTID;
 
 	ret = ioctl(fd, BTRFS_IOC_INO_LOOKUP, &args);
-	if (ret < 0) {
-		error("failed to lookup root id: %s", strerror(errno));
-		return ret;
-	}
+	if (ret < 0)
+		return -errno;
 
 	*rootid = args.treeid;