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>