Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/ufs/ext2fs Write support for the Ext4 Read-only Compatib...
details: https://anonhg.NetBSD.org/src/rev/2cfc4b4d287e
branches: trunk
changeset: 782829:2cfc4b4d287e
user: jakllsch <jakllsch%NetBSD.org@localhost>
date: Wed Nov 21 23:11:23 2012 +0000
description:
Write support for the Ext4 Read-only Compatible Feature "huge_file".
Primarily, this feature extends the inode block count field to 48 bits.
Additionally, this feature allows this field to be represented in file
system block size units rather than DEV_BSIZE units.
diffstat:
sys/ufs/ext2fs/ext2fs.h | 5 ++-
sys/ufs/ext2fs/ext2fs_alloc.c | 6 ++--
sys/ufs/ext2fs/ext2fs_balloc.c | 6 ++--
sys/ufs/ext2fs/ext2fs_extern.h | 4 ++-
sys/ufs/ext2fs/ext2fs_inode.c | 58 ++++++++++++++++++++++++++++++++++++--
sys/ufs/ext2fs/ext2fs_readwrite.c | 6 ++--
sys/ufs/ext2fs/ext2fs_vfsops.c | 7 ++--
sys/ufs/ext2fs/ext2fs_vnops.c | 8 ++--
8 files changed, 77 insertions(+), 23 deletions(-)
diffs (276 lines):
diff -r d45309319f94 -r 2cfc4b4d287e sys/ufs/ext2fs/ext2fs.h
--- a/sys/ufs/ext2fs/ext2fs.h Wed Nov 21 22:37:03 2012 +0000
+++ b/sys/ufs/ext2fs/ext2fs.h Wed Nov 21 23:11:23 2012 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ext2fs.h,v 1.32 2012/11/21 20:45:35 jakllsch Exp $ */
+/* $NetBSD: ext2fs.h,v 1.33 2012/11/21 23:11:23 jakllsch Exp $ */
/*
* Copyright (c) 1982, 1986, 1993
@@ -265,7 +265,8 @@
*/
#define EXT2F_COMPAT_SUPP 0x0000
#define EXT2F_ROCOMPAT_SUPP (EXT2F_ROCOMPAT_SPARSESUPER \
- | EXT2F_ROCOMPAT_LARGEFILE)
+ | EXT2F_ROCOMPAT_LARGEFILE \
+ | EXT2F_ROCOMPAT_HUGE_FILE)
#define EXT2F_INCOMPAT_SUPP EXT2F_INCOMPAT_FTYPE
/*
diff -r d45309319f94 -r 2cfc4b4d287e sys/ufs/ext2fs/ext2fs_alloc.c
--- a/sys/ufs/ext2fs/ext2fs_alloc.c Wed Nov 21 22:37:03 2012 +0000
+++ b/sys/ufs/ext2fs/ext2fs_alloc.c Wed Nov 21 23:11:23 2012 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ext2fs_alloc.c,v 1.42 2011/03/06 04:46:26 rmind Exp $ */
+/* $NetBSD: ext2fs_alloc.c,v 1.43 2012/11/21 23:11:23 jakllsch Exp $ */
/*
* Copyright (c) 1982, 1986, 1989, 1993
@@ -60,7 +60,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ext2fs_alloc.c,v 1.42 2011/03/06 04:46:26 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ext2fs_alloc.c,v 1.43 2012/11/21 23:11:23 jakllsch Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -135,7 +135,7 @@
bno = (daddr_t)ext2fs_hashalloc(ip, cg, bpref, fs->e2fs_bsize,
ext2fs_alloccg);
if (bno > 0) {
- ip->i_e2fs_nblock += btodb(fs->e2fs_bsize);
+ ext2fs_setnblock(ip, ext2fs_nblock(ip) + btodb(fs->e2fs_bsize));
ip->i_flag |= IN_CHANGE | IN_UPDATE;
*bnp = bno;
return (0);
diff -r d45309319f94 -r 2cfc4b4d287e sys/ufs/ext2fs/ext2fs_balloc.c
--- a/sys/ufs/ext2fs/ext2fs_balloc.c Wed Nov 21 22:37:03 2012 +0000
+++ b/sys/ufs/ext2fs/ext2fs_balloc.c Wed Nov 21 23:11:23 2012 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ext2fs_balloc.c,v 1.34 2009/10/19 18:41:17 bouyer Exp $ */
+/* $NetBSD: ext2fs_balloc.c,v 1.35 2012/11/21 23:11:23 jakllsch Exp $ */
/*
* Copyright (c) 1982, 1986, 1989, 1993
@@ -60,7 +60,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ext2fs_balloc.c,v 1.34 2009/10/19 18:41:17 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ext2fs_balloc.c,v 1.35 2012/11/21 23:11:23 jakllsch Exp $");
#if defined(_KERNEL_OPT)
#include "opt_uvmhist.h"
@@ -343,7 +343,7 @@
}
}
if (deallocated) {
- ip->i_e2fs_nblock -= btodb(deallocated);
+ ext2fs_setnblock(ip, ext2fs_nblock(ip) - btodb(deallocated));
ip->i_e2fs_flags |= IN_CHANGE | IN_UPDATE;
}
return error;
diff -r d45309319f94 -r 2cfc4b4d287e sys/ufs/ext2fs/ext2fs_extern.h
--- a/sys/ufs/ext2fs/ext2fs_extern.h Wed Nov 21 22:37:03 2012 +0000
+++ b/sys/ufs/ext2fs/ext2fs_extern.h Wed Nov 21 23:11:23 2012 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ext2fs_extern.h,v 1.45 2012/11/17 16:03:48 jakllsch Exp $ */
+/* $NetBSD: ext2fs_extern.h,v 1.46 2012/11/21 23:11:23 jakllsch Exp $ */
/*-
* Copyright (c) 1991, 1993, 1994
@@ -110,6 +110,8 @@
/* ext2fs_inode.c */
uint64_t ext2fs_size(struct inode *);
int ext2fs_setsize(struct inode *, uint64_t);
+uint64_t ext2fs_nblock(struct inode *);
+int ext2fs_setnblock(struct inode *, uint64_t);
int ext2fs_update(struct vnode *, const struct timespec *,
const struct timespec *, int);
int ext2fs_truncate(struct vnode *, off_t, int, kauth_cred_t);
diff -r d45309319f94 -r 2cfc4b4d287e sys/ufs/ext2fs/ext2fs_inode.c
--- a/sys/ufs/ext2fs/ext2fs_inode.c Wed Nov 21 22:37:03 2012 +0000
+++ b/sys/ufs/ext2fs/ext2fs_inode.c Wed Nov 21 23:11:23 2012 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ext2fs_inode.c,v 1.75 2012/01/27 19:22:48 para Exp $ */
+/* $NetBSD: ext2fs_inode.c,v 1.76 2012/11/21 23:11:23 jakllsch Exp $ */
/*
* Copyright (c) 1982, 1986, 1989, 1993
@@ -60,7 +60,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ext2fs_inode.c,v 1.75 2012/01/27 19:22:48 para Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ext2fs_inode.c,v 1.76 2012/11/21 23:11:23 jakllsch Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -128,6 +128,54 @@
return 0;
}
+uint64_t
+ext2fs_nblock(struct inode *ip)
+{
+ uint64_t nblock = ip->i_e2fs_nblock;
+ struct m_ext2fs * const fs = ip->i_e2fs;
+
+ if (fs->e2fs.e2fs_features_rocompat & EXT2F_ROCOMPAT_HUGE_FILE) {
+ nblock |= (uint64_t)ip->i_e2fs_nblock_high << 32;
+
+ if ((ip->i_e2fs_flags & EXT2_HUGE_FILE)) {
+ nblock = fsbtodb(fs, nblock);
+ }
+ }
+
+ return nblock;
+}
+
+int
+ext2fs_setnblock(struct inode *ip, uint64_t nblock)
+{
+ struct m_ext2fs * const fs = ip->i_e2fs;
+
+ if (nblock <= 0xffffffffULL) {
+ CLR(ip->i_e2fs_flags, EXT2_HUGE_FILE);
+ ip->i_e2fs_nblock = nblock;
+ return 0;
+ }
+
+ if (!ISSET(fs->e2fs.e2fs_features_rocompat, EXT2F_ROCOMPAT_HUGE_FILE))
+ return EFBIG;
+
+ if (nblock <= 0xffffffffffffULL) {
+ CLR(ip->i_e2fs_flags, EXT2_HUGE_FILE);
+ ip->i_e2fs_nblock = nblock & 0xffffffff;
+ ip->i_e2fs_nblock_high = (nblock >> 32) & 0xffff;
+ return 0;
+ }
+
+ if (dbtofsb(fs, nblock) <= 0xffffffffffffULL) {
+ SET(ip->i_e2fs_flags, EXT2_HUGE_FILE);
+ ip->i_e2fs_nblock = dbtofsb(fs, nblock) & 0xffffffff;
+ ip->i_e2fs_nblock_high = (dbtofsb(fs, nblock) >> 32) & 0xffff;
+ return 0;
+ }
+
+ return EFBIG;
+}
+
/*
* Last reference to an inode. If necessary, write or delete it.
*/
@@ -260,7 +308,7 @@
if (ovp->v_type == VLNK &&
(ext2fs_size(oip) < ump->um_maxsymlinklen ||
- (ump->um_maxsymlinklen == 0 && oip->i_e2fs_nblock == 0))) {
+ (ump->um_maxsymlinklen == 0 && ext2fs_nblock(oip) == 0))) {
KDASSERT(length == 0);
memset((char *)&oip->i_din.e2fs_din->e2di_shortlink, 0,
(u_int)ext2fs_size(oip));
@@ -425,7 +473,9 @@
* Put back the real size.
*/
(void)ext2fs_setsize(oip, length);
- oip->i_e2fs_nblock -= blocksreleased;
+ error = ext2fs_setnblock(oip, ext2fs_nblock(oip) - blocksreleased);
+ if (error != 0)
+ allerror = error;
oip->i_flag |= IN_CHANGE;
KASSERT(ovp->v_type != VREG || ovp->v_size == ext2fs_size(oip));
return (allerror);
diff -r d45309319f94 -r 2cfc4b4d287e sys/ufs/ext2fs/ext2fs_readwrite.c
--- a/sys/ufs/ext2fs/ext2fs_readwrite.c Wed Nov 21 22:37:03 2012 +0000
+++ b/sys/ufs/ext2fs/ext2fs_readwrite.c Wed Nov 21 23:11:23 2012 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ext2fs_readwrite.c,v 1.61 2012/04/29 22:54:00 chs Exp $ */
+/* $NetBSD: ext2fs_readwrite.c,v 1.62 2012/11/21 23:11:23 jakllsch Exp $ */
/*-
* Copyright (c) 1993
@@ -60,7 +60,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ext2fs_readwrite.c,v 1.61 2012/04/29 22:54:00 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ext2fs_readwrite.c,v 1.62 2012/11/21 23:11:23 jakllsch Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -123,7 +123,7 @@
if (vp->v_type == VLNK) {
if (ext2fs_size(ip) < ump->um_maxsymlinklen ||
- (ump->um_maxsymlinklen == 0 && ip->i_e2fs_nblock == 0))
+ (ump->um_maxsymlinklen == 0 && ext2fs_nblock(ip) == 0))
panic("%s: short symlink", "ext2fs_read");
} else if (vp->v_type != VREG && vp->v_type != VDIR)
panic("%s: type %d", "ext2fs_read", vp->v_type);
diff -r d45309319f94 -r 2cfc4b4d287e sys/ufs/ext2fs/ext2fs_vfsops.c
--- a/sys/ufs/ext2fs/ext2fs_vfsops.c Wed Nov 21 22:37:03 2012 +0000
+++ b/sys/ufs/ext2fs/ext2fs_vfsops.c Wed Nov 21 23:11:23 2012 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ext2fs_vfsops.c,v 1.166 2012/09/01 17:01:24 christos Exp $ */
+/* $NetBSD: ext2fs_vfsops.c,v 1.167 2012/11/21 23:11:23 jakllsch Exp $ */
/*
* Copyright (c) 1989, 1991, 1993, 1994
@@ -60,7 +60,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ext2fs_vfsops.c,v 1.166 2012/09/01 17:01:24 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ext2fs_vfsops.c,v 1.167 2012/11/21 23:11:23 jakllsch Exp $");
#if defined(_KERNEL_OPT)
#include "opt_compat_netbsd.h"
@@ -1075,8 +1075,9 @@
/* If the inode was deleted, reset all fields */
if (ip->i_e2fs_dtime != 0) {
- ip->i_e2fs_mode = ip->i_e2fs_nblock = 0;
+ ip->i_e2fs_mode = 0;
(void)ext2fs_setsize(ip, 0);
+ (void)ext2fs_setnblock(ip, 0);
memset(ip->i_e2fs_blocks, 0, sizeof(ip->i_e2fs_blocks));
}
diff -r d45309319f94 -r 2cfc4b4d287e sys/ufs/ext2fs/ext2fs_vnops.c
--- a/sys/ufs/ext2fs/ext2fs_vnops.c Wed Nov 21 22:37:03 2012 +0000
+++ b/sys/ufs/ext2fs/ext2fs_vnops.c Wed Nov 21 23:11:23 2012 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ext2fs_vnops.c,v 1.104 2012/05/09 00:21:18 riastradh Exp $ */
+/* $NetBSD: ext2fs_vnops.c,v 1.105 2012/11/21 23:11:23 jakllsch Exp $ */
/*
* Copyright (c) 1982, 1986, 1989, 1993
@@ -65,7 +65,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ext2fs_vnops.c,v 1.104 2012/05/09 00:21:18 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ext2fs_vnops.c,v 1.105 2012/11/21 23:11:23 jakllsch Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -326,7 +326,7 @@
vap->va_blocksize = MAXBSIZE;
else
vap->va_blocksize = vp->v_mount->mnt_stat.f_iosize;
- vap->va_bytes = dbtob((u_quad_t)ip->i_e2fs_nblock);
+ vap->va_bytes = dbtob(ext2fs_nblock(ip));
vap->va_type = vp->v_type;
vap->va_filerev = ip->i_modrev;
return (0);
@@ -922,7 +922,7 @@
isize = ext2fs_size(ip);
if (isize < ump->um_maxsymlinklen ||
- (ump->um_maxsymlinklen == 0 && ip->i_e2fs_nblock == 0)) {
+ (ump->um_maxsymlinklen == 0 && ext2fs_nblock(ip) == 0)) {
uiomove((char *)ip->i_din.e2fs_din->e2di_shortlink, isize, ap->a_uio);
return (0);
}
Home |
Main Index |
Thread Index |
Old Index