All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eric Sandeen <sandeen@redhat.com>
To: ext4 development <linux-ext4@vger.kernel.org>
Subject: [PATCH] Accomodate 32-bit uid/guid values in e2fsprogs
Date: Mon, 07 May 2007 12:10:37 -0500	[thread overview]
Message-ID: <463F5D8D.7080201@redhat.com> (raw)

e2fsprogs doesn't handle large (> 16 bit) UID/GID...

Create an fs by user with large UID:

bash-3.1$ id
uid=501666(newuser) gid=501666(newuser) groups=501666(newuser)
bash-3.1$ /sbin/mke2fs -q fsfile
fsfile is not a block special device.
Proceed anyway? (y,n) y

Now mount it:

[root@neon tmp]# mount -o loop fsfile /mnt/tmp/
[root@neon tmp]# ls -la /mnt/tmp/
total 13
drwxr-xr-x 3 42914 42914  1024 May  7 11:55 .
drwxr-xr-x 4 root  root     28 Jan 23 10:34 ..
drwx------ 2 root  root  12288 May  7 11:55 lost+found

uid/gid is wrong (only bottom 16 bits)!  (it's wrong on disk...)

And even if I get it right on disk:

[root@neon tmp]# ls -lan /mnt/tmp/
total 13
drwxr-xr-x 3 501666 501666  1024 May  7 11:57 .
drwxr-xr-x 4      0      0    28 Jan 23 10:34 ..
drwx------ 2      0      0 12288 May  7 11:57 lost+found

debugfs has further problems:

[root@neon tmp]# /sbin/debugfs /tmp/fsfile 
debugfs 1.39 (29-May-2006)
debugfs:  stat .
Inode: 2   Type: directory    Mode:  0755   Flags: 0x0   Generation: 0
User: 42914   Group: 42914   Size: 1024
File ACL: 0    Directory ACL: 0
Links: 3   Blockcount: 2
Fragment:  Address: 0    Number: 0    Size: 0
ctime: 0x463f5a8a -- Mon May  7 11:57:46 2007
atime: 0x463f5a90 -- Mon May  7 11:57:52 2007
mtime: 0x463f5a8a -- Mon May  7 11:57:46 2007
BLOCKS:
(0):508
TOTAL: 1

debugfs:  ls -l
      2   40755 (2)  42914  42914    1024  7-May-2007 11:57 .
      2   40755 (2)  42914  42914    1024  7-May-2007 11:57 ..
     11   40700 (2)      0      0   12288  7-May-2007 11:57 lost+found

The attached patch creates inode_uid() and inode_gid() macros to accommodate
the high bits when reading uid/gid, on platforms that support it.

It also accommodates large UID/GID at mkfs time.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>

Index: e2fsprogs-hg/debugfs/debugfs.c
===================================================================
--- e2fsprogs-hg.orig/debugfs/debugfs.c
+++ e2fsprogs-hg/debugfs/debugfs.c
@@ -534,7 +534,7 @@ void internal_dump_inode(FILE *out, cons
 		prefix, 
 		inode->i_mode & 0777, inode->i_flags, inode->i_generation);
 	fprintf(out, "%sUser: %5d   Group: %5d   Size: ",
-		prefix, inode->i_uid, inode->i_gid);
+		prefix, inode_uid(*inode), inode_gid(*inode));
 	if (LINUX_S_ISREG(inode->i_mode)) {
 		__u64 i_size = (inode->i_size |
 				((unsigned long long)inode->i_size_high << 32));
Index: e2fsprogs-hg/debugfs/ls.c
===================================================================
--- e2fsprogs-hg.orig/debugfs/ls.c
+++ e2fsprogs-hg/debugfs/ls.c
@@ -88,7 +88,7 @@ static int list_dir_proc(ext2_ino_t dir 
 		}
 		fprintf(ls->f, "%c%6u%c %6o (%d)  %5d  %5d   ", lbr, ino, rbr,
 			inode.i_mode, dirent->name_len >> 8,
-			inode.i_uid, inode.i_gid);
+			inode_uid(inode), inode_gid(inode));
 		if (LINUX_S_ISDIR(inode.i_mode))
 			fprintf(ls->f, "%5d", inode.i_size);
 		else
Index: e2fsprogs-hg/debugfs/lsdel.c
===================================================================
--- e2fsprogs-hg.orig/debugfs/lsdel.c
+++ e2fsprogs-hg/debugfs/lsdel.c
@@ -23,7 +23,7 @@
 struct deleted_info {
 	ext2_ino_t	ino;
 	unsigned short	mode;
-	unsigned short	uid;
+	__u32		uid;
 	__u64		size;
 	time_t		dtime;
 	int		num_blocks;
@@ -160,7 +160,7 @@ void do_lsdel(int argc, char **argv)
 				
 			delarray[num_delarray].ino = ino;
 			delarray[num_delarray].mode = inode.i_mode;
-			delarray[num_delarray].uid = inode.i_uid;
+			delarray[num_delarray].uid = inode_uid(inode);
 			delarray[num_delarray].size = inode.i_size;
 			if (!LINUX_S_ISDIR(inode.i_mode))
 				delarray[num_delarray].size |= 
Index: e2fsprogs-hg/e2fsck/message.c
===================================================================
--- e2fsprogs-hg.orig/e2fsck/message.c
+++ e2fsprogs-hg/e2fsck/message.c
@@ -304,12 +304,10 @@ static _INLINE_ void expand_inode_expres
 			      inode->i_dir_acl : 0));
 		break;
 	case 'u':
-		printf("%d", (inode->i_uid |
-			      (inode->osd2.linux2.l_i_uid_high << 16)));
+		printf("%d", inode_uid(*inode));
 		break;
 	case 'g':
-		printf("%d", (inode->i_gid |
-			      (inode->osd2.linux2.l_i_gid_high << 16)));
+		printf("%d", inode_gid(*inode));
 		break;
 	case 't':
 		if (LINUX_S_ISREG(inode->i_mode)) 
Index: e2fsprogs-hg/lib/ext2fs/ext2_fs.h
===================================================================
--- e2fsprogs-hg.orig/lib/ext2fs/ext2_fs.h
+++ e2fsprogs-hg/lib/ext2fs/ext2_fs.h
@@ -423,7 +423,8 @@ struct ext2_inode_large {
 #define i_uid_high	osd2.linux2.l_i_uid_high
 #define i_gid_high	osd2.linux2.l_i_gid_high
 #define i_reserved2	osd2.linux2.l_i_reserved2
-
+#define inode_uid(inode)	((inode).i_uid | (inode).i_uid_high << 16)
+#define inode_gid(inode)	((inode).i_gid | (inode).i_gid_high << 16)
 #else
 #if defined(__GNU__)
 
@@ -433,6 +434,8 @@ struct ext2_inode_large {
 #define i_uid_high	osd2.hurd2.h_i_uid_high
 #define i_gid_high	osd2.hurd2.h_i_gid_high
 #define i_author	osd2.hurd2.h_i_author
+#define inode_uid(inode)	((inode).i_uid | (inode).i_uid_high << 16)
+#define inode_gid(inode)	((inode).i_gid | (inode).i_gid_high << 16)
 
 #else
 #if defined(__masix__)
@@ -441,6 +444,8 @@ struct ext2_inode_large {
 #define i_frag		osd2.masix2.m_i_frag
 #define i_fsize		osd2.masix2.m_i_fsize
 #define i_reserved2	osd2.masix2.m_i_reserved2
+#define inode_uid(inode)	((inode).i_uid)
+#define inode_gid(inode)	((inode).i_gid)
 
 #endif  /* __masix__ */
 #endif  /* __GNU__ */
Index: e2fsprogs-hg/misc/mke2fs.c
===================================================================
--- e2fsprogs-hg.orig/misc/mke2fs.c
+++ e2fsprogs-hg/misc/mke2fs.c
@@ -479,6 +479,8 @@ static void create_root_dir(ext2_filsys 
 {
 	errcode_t	retval;
 	struct ext2_inode	inode;
+	__u32		uid;
+	__u32		gid;
 
 	retval = ext2fs_mkdir(fs, EXT2_ROOT_INO, EXT2_ROOT_INO, 0);
 	if (retval) {
@@ -492,9 +494,14 @@ static void create_root_dir(ext2_filsys 
 				_("while reading root inode"));
 			exit(1);
 		}
-		inode.i_uid = getuid();
-		if (inode.i_uid)
-			inode.i_gid = getgid();
+		uid = getuid();
+		inode.i_uid = uid;
+		inode.i_uid_high = uid >> 16;
+		if (inode.i_uid) {
+			gid = getgid();
+			inode.i_gid = gid;
+			inode.i_gid_high = gid >> 16;
+		}
 		retval = ext2fs_write_new_inode(fs, EXT2_ROOT_INO, &inode);
 		if (retval) {
 			com_err("ext2fs_write_inode", retval,

             reply	other threads:[~2007-05-07 17:12 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-05-07 17:10 Eric Sandeen [this message]
2007-05-08  4:28 ` [PATCH] Accomodate 32-bit uid/guid values in e2fsprogs Theodore Tso
2007-05-08  5:05   ` Eric Sandeen

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=463F5D8D.7080201@redhat.com \
    --to=sandeen@redhat.com \
    --cc=linux-ext4@vger.kernel.org \
    /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 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.