linux-ext4.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Andreas Dilger <adilger@dilger.ca>
To: tytso@mit.edu
Cc: linux-ext4@vger.kernel.org, Andreas Dilger <adilger@dilger.ca>
Subject: [PATCH 4/6] lsattr: treat inode generation as an unsigned int
Date: Sat,  5 Mar 2016 17:38:34 -0700	[thread overview]
Message-ID: <1457224716-72388-4-git-send-email-adilger@dilger.ca> (raw)
In-Reply-To: <1457224716-72388-1-git-send-email-adilger@dilger.ca>

The EXT2_GETVERSION ioctl is defined to take a "long" parameter, but
fgetversion() calls ioctl() with an "int" parameter instead.  This is
handled in the kernel correctly, but the generation is sign-extended
in fgetversion() before return on 64-bit systems and lsattr prints
it as a huge positive number for inode generation above 0x80000000:

        1635574212 -------------e-- /mnt/ost0/O/0/d0/12928
        18446744073045131735 -------------e-- /mnt/ost0/O/0/d0/166240
        782808861 -------------e-- /mnt/ost0/O/0/d0/31744
        18446744072181134840 -------------e-- /mnt/ost0/O/0/d0/135008

Correctly assign the returned generation number as an unsigned value,
and print it with a 10-character field width.  The version is printed
left-aligned for consistency with the old code and to ensure it is
always printed in the first column for use with tools like "cut":

        1635574212 -------------e-- /mnt/ost0/O/0/d0/12928
        3630547415 -------------e-- /mnt/ost0/O/0/d0/166240
        782808861  -------------e-- /mnt/ost0/O/0/d0/31744
        2766550520 -------------e-- /mnt/ost0/O/0/d0/135008

Do not return a random value from the stack as the version on error.
Clean up some style issues and consolidate some duplicate code.

Signed-off-by: Andreas Dilger <adilger@dilger.ca>
---
 lib/e2p/fgetversion.c | 36 +++++++++++++++++++-----------------
 misc/lsattr.c         |  2 +-
 2 files changed, 20 insertions(+), 18 deletions(-)

diff --git a/lib/e2p/fgetversion.c b/lib/e2p/fgetversion.c
index e6cee8b..2ad813b 100644
--- a/lib/e2p/fgetversion.c
+++ b/lib/e2p/fgetversion.c
@@ -37,32 +37,34 @@
 #define OPEN_FLAGS (O_RDONLY|O_NONBLOCK)
 #endif
 
-int fgetversion (const char * name, unsigned long * version)
+int fgetversion(const char *name, unsigned long *version)
 {
+	unsigned int ver = -1;
+	int rc = -1;
 #if HAVE_EXT2_IOCTLS
-#if !APPLE_DARWIN
-	int fd, r, ver, save_errno = 0;
+# if !APPLE_DARWIN
+	int fd, save_errno = 0;
 
-	fd = open (name, OPEN_FLAGS);
+	fd = open(name, OPEN_FLAGS);
 	if (fd == -1)
 		return -1;
-	r = ioctl (fd, EXT2_IOC_GETVERSION, &ver);
-	if (r == -1)
+
+	rc = ioctl(fd, EXT2_IOC_GETVERSION, &ver);
+	if (rc == -1)
 		save_errno = errno;
-	*version = ver;
-	close (fd);
-	if (save_errno)
+	close(fd);
+	if (rc == -1)
 		errno = save_errno;
-	return r;
-#else
-   int ver=-1, err;
-   err = syscall(SYS_fsctl, name, EXT2_IOC_GETVERSION, &ver, 0);
-   *version = ver;
-   return(err);
-#endif
+# else /* APPLE_DARWIN */
+	rc = syscall(SYS_fsctl, name, EXT2_IOC_GETVERSION, &ver, 0);
+# endif /* !APPLE_DARWIN */
 #else /* ! HAVE_EXT2_IOCTLS */
 	extern int errno;
+
 	errno = EOPNOTSUPP;
-	return -1;
 #endif /* ! HAVE_EXT2_IOCTLS */
+	if (rc == 0)
+		*version = ver;
+
+	return rc;
 }
diff --git a/misc/lsattr.c b/misc/lsattr.c
index e5e5969..4c34e2f 100644
--- a/misc/lsattr.c
+++ b/misc/lsattr.c
@@ -92,7 +92,7 @@ static int list_attributes (const char * name)
 				 name);
 			return -1;
 		}
-		printf ("%5lu ", generation);
+		printf ("%-10lu ", generation);
 	}
 	if (pf_options & PFOPT_LONG) {
 		printf("%-28s ", name);
-- 
1.8.0


  parent reply	other threads:[~2016-03-06  0:46 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-03-06  0:38 [PATCH 1/6] blkid: fix ZFS device detection Andreas Dilger
2016-03-06  0:38 ` [PATCH 2/6] debugfs: improve dump_mmp handling Andreas Dilger
2016-03-06 23:11   ` Theodore Ts'o
2016-03-06  0:38 ` [PATCH 3/6] misc: add missing declarations on maint Andreas Dilger
2016-03-06 23:12   ` Theodore Ts'o
2016-03-06  0:38 ` Andreas Dilger [this message]
2016-03-06 23:13   ` [PATCH 4/6] lsattr: treat inode generation as an unsigned int Theodore Ts'o
2016-03-06  0:38 ` [PATCH 5/6] findsuper: improve output if s_mkfs_time unset Andreas Dilger
2016-03-06 23:16   ` Theodore Ts'o
2016-03-06  0:38 ` [PATCH 6/6] debugfs: update to handle newer inode fields Andreas Dilger
2016-03-07  0:54   ` Theodore Ts'o
2016-03-06 23:10 ` [PATCH 1/6] blkid: fix ZFS device detection Theodore Ts'o

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1457224716-72388-4-git-send-email-adilger@dilger.ca \
    --to=adilger@dilger.ca \
    --cc=linux-ext4@vger.kernel.org \
    --cc=tytso@mit.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).