Date: Sun, 30 Oct 2005 19:09:49 -0600 From: Brian Bergstrand <freebsd@classicalguitar.net> To: Ivan Voras <ivoras@fer.hr> Cc: freebsd-fs@freebsd.org Subject: Re: ext2 large_file Message-ID: <46D894BD-16E0-4CBA-B40A-EEBAAC2547D2@classicalguitar.net> In-Reply-To: <20051030183340.B19470@geri.cc.fer.hr> References: <20051030183340.B19470@geri.cc.fer.hr>
next in thread | previous in thread | raw e-mail | index | archive | help
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
I ported the FreeBSD driver to Mac OS X / Darwin a few years ago and
added large file support in the process. Here's the patch, as you can
see it's a rather simple patch (as long as the in core i_size member
is 64bit which I think is true for FreeBSD):
I doubt this patch will apply cleanly as my tree has diverged from
FreeBSD in a non-compatible way quite a while ago -- but it should
give you a start:
The first part of the patch (@@ -98,7 +128,9 @@) is to ext2_ei2i()
and the second part (@@ -182,6 +214,31 @@) is to ext2_i2ei()
$ cvs diff -r 1.6 -r 1.7 ext2_inode_cnv.c
Index: ext2_inode_cnv.c
===================================================================
RCS file: /cvsroot/ext2fsx/src/gnu/ext2fs/ext2_inode_cnv.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
- --- ext2_inode_cnv.c 3 May 2003 23:54:39 -0000 1.6
+++ ext2_inode_cnv.c 9 Jul 2003 23:09:24 -0000 1.7
@@ -98,7 +128,9 @@
ip->i_uid |= le16_to_cpu(ei->i_uid_high) << 16;
ip->i_gid |= le16_to_cpu(ei->i_gid_high) << 16;
/*}*/
- - /* XXX use memcpy */
+ if (S_ISREG(ip->i_mode))
+ ip->i_size |= ((u_int64_t)le32_to_cpu(ei->i_size_high)) << 32;
+ /* TBD: Otherwise, setup the dir acl */
#if BYTE_ORDER == BIG_ENDIAN
/* We don't want to swap the block addr's for a short symlink
because
@@ -182,6 +214,31 @@
raw_inode->i_uid_high = 0;
raw_inode->i_gid_high = 0;
}*/
+ if (S_ISREG(ip->i_mode)) {
+ ei->i_size_high = cpu_to_le32(ip->i_size >> 32);
+ if (ip->i_size > 0x7fffffffULL) {
+ struct ext2_sb_info *sb = ip->i_e2fs;
+ if (!EXT2_HAS_RO_COMPAT_FEATURE(sb,
+ EXT2_FEATURE_RO_COMPAT_LARGE_FILE) ||
+ EXT2_SB(sb)->s_es->s_rev_level == cpu_to_le32
(EXT2_GOOD_OLD_REV)) {
+ /* First large file, add the flag to the superblock. */
+ lock_super (VFSTOEXT2(ip->i_vnode->v_mount)->um_devvp);
+
+ if (EXT2_SB(sb)->s_es->s_rev_level == cpu_to_le32
(EXT2_GOOD_OLD_REV)) {
+ log(LOG_WARNING,
+ "ext2: updating to rev %d because of new feature
flag, "
+ "running e2fsck is recommended", EXT2_DYNAMIC_REV);
+ sb->s_es->s_first_ino = cpu_to_le32
(EXT2_GOOD_OLD_FIRST_INO);
+ sb->s_es->s_inode_size = cpu_to_le16
(EXT2_GOOD_OLD_INODE_SIZE);
+ sb->s_es->s_rev_level = cpu_to_le32(EXT2_DYNAMIC_REV);
+ }
+
+ EXT2_SET_RO_COMPAT_FEATURE(sb,
EXT2_FEATURE_RO_COMPAT_LARGE_FILE);
+ sb->s_dirt = 1;
+ unlock_super (VFSTOEXT2(ip->i_vnode->v_mount)->um_devvp);
+ }
+ }
+ }
On Oct 30, 2005, at 11:37 AM, Ivan Voras wrote:
> I recently tried to use ext2 on FreeBSD but have decided not to
> when I saw that the support for large files is missing (and went
> with msdosfs instead).
>
> Now I accidentaly noticed that large_file support is present in
> latest NetBSD (and maybe OpenBSD). Is anyone interested in porting
> the support to FreeBSD? :)
>
Brian Bergstrand
<http://www.bergstrand.org/brian/> PGP Key ID: 0xB6C7B6A2
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (Darwin)
iD8DBQFDZW7jedHYW7bHtqIRAtbIAKC4WIm+F/vruqRDWCfTLQ9XDrqNigCfdJO/
263t1QPoOgfSuz7LWwYEiAQ=
=gxC7
-----END PGP SIGNATURE-----
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?46D894BD-16E0-4CBA-B40A-EEBAAC2547D2>
