From: Darrick J. Wong <djwong@xxxxxxxxxx> Enable users to print the sysfs or debugfs path for the filesystems backing the open files. Signed-off-by: Darrick J. Wong <djwong@xxxxxxxxxx> --- io/fsuuid.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++ man/man8/xfs_io.8 | 7 +++++ 2 files changed, 75 insertions(+) diff --git a/io/fsuuid.c b/io/fsuuid.c index af2f87a20209..8e50ec14c8fd 100644 --- a/io/fsuuid.c +++ b/io/fsuuid.c @@ -12,6 +12,7 @@ #include "libfrog/logging.h" static cmdinfo_t fsuuid_cmd; +static cmdinfo_t sysfspath_cmd; static int fsuuid_f( @@ -35,6 +36,62 @@ fsuuid_f( return 0; } +#ifndef FS_IOC_GETFSSYSFSPATH +struct fs_sysfs_path { + __u8 len; + __u8 name[128]; +}; +#define FS_IOC_GETFSSYSFSPATH _IOR(0x15, 1, struct fs_sysfs_path) +#endif + +static void +sysfspath_help(void) +{ + printf(_( +"\n" +" print the sysfs path for the open file\n" +"\n" +" Prints the path in sysfs where one might find information about the\n" +" filesystem backing the open files. The path is not required to exist.\n" +" -d -- return the path in debugfs, if any\n" +"\n")); +} + +static int +sysfspath_f( + int argc, + char **argv) +{ + struct fs_sysfs_path path; + bool debugfs = false; + int c; + int ret; + + while ((c = getopt(argc, argv, "d")) != EOF) { + switch (c) { + case 'd': + debugfs = true; + break; + default: + exitcode = 1; + return command_usage(&sysfspath_cmd); + } + } + + ret = ioctl(file->fd, FS_IOC_GETFSSYSFSPATH, &path); + if (ret) { + xfrog_perror(ret, "FS_IOC_GETSYSFSPATH"); + exitcode = 1; + return 0; + } + + if (debugfs) + printf("/sys/kernel/debug/%.*s\n", path.len, path.name); + else + printf("/sys/fs/%.*s\n", path.len, path.name); + return 0; +} + void fsuuid_init(void) { @@ -46,4 +103,15 @@ fsuuid_init(void) fsuuid_cmd.oneline = _("get mounted filesystem UUID"); add_command(&fsuuid_cmd); + + sysfspath_cmd.name = "sysfspath"; + sysfspath_cmd.cfunc = sysfspath_f; + sysfspath_cmd.argmin = 0; + sysfspath_cmd.argmax = -1; + sysfspath_cmd.args = _("-d"); + sysfspath_cmd.flags = CMD_NOMAP_OK | CMD_FLAG_FOREIGN_OK; + sysfspath_cmd.oneline = _("get mounted filesystem sysfs path"); + sysfspath_cmd.help = sysfspath_help; + + add_command(&sysfspath_cmd); } diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 index 56abe000f235..3ce280a75b4a 100644 --- a/man/man8/xfs_io.8 +++ b/man/man8/xfs_io.8 @@ -1464,6 +1464,13 @@ flag. .TP .B fsuuid Print the mounted filesystem UUID. +.TP +.B sysfspath +Print the sysfs or debugfs path for the mounted filesystem. + +The +.B -d +option selects debugfs instead of sysfs. .SH OTHER COMMANDS