PERFORCE change 177940 for review
Zheng Liu
lz at FreeBSD.org
Sat May 8 05:28:20 UTC 2010
http://p4web.freebsd.org/@@177940?ac=10
Change 177940 by lz at gnehzuil-freebsd on 2010/05/08 05:27:30
Add ext2_alloc_rsv() function.
* Add ext2_alloc_rsv() function and change call from ext2_alloc to
ext2_alloc_rsv in ext2_balloc. But it do not implement in ext2_alloc_rsv().
* Modify license in ext2_rsv_win.h and marco style.
Affected files ...
.. //depot/projects/soc2010/extfs/src/sys/fs/ext2fs/ext2_alloc.c#3 edit
.. //depot/projects/soc2010/extfs/src/sys/fs/ext2fs/ext2_balloc.c#3 edit
.. //depot/projects/soc2010/extfs/src/sys/fs/ext2fs/ext2_rsv_win.h#3 edit
Differences ...
==== //depot/projects/soc2010/extfs/src/sys/fs/ext2fs/ext2_alloc.c#3 (text+ko) ====
@@ -79,10 +79,11 @@
rwip = malloc(sizeof(struct ext2_rsv_win_info),
M_EXT2NODE, M_NOWAIT | M_ZERO);
+
+ /* If malloc failed, we just do not use
+ * reservation window mechanism
+ */
if (rwip == NULL)
- /* If malloc failed, we just do not use
- * reservation window mechnism
- */
return;
rwp = &rwip->rwi_entry;
@@ -101,6 +102,7 @@
* It is called at following locations:
* 1. free an inode
* 2. sync inode
+ * 3. truncate a file
*/
void
ext2_discard_rsv_win(struct inode *ip)
@@ -126,7 +128,7 @@
/*
* Remove a ext2_rsv_win structure from RB tree.
*/
-void
+static void
ext2_rsv_win_remove(struct m_ext2fs *sbp, struct ext2_rsv_win *rwp)
{
rwp->rw_start = EXT2_RWI_NOT_ALLOCATED;
@@ -136,6 +138,55 @@
}
/*
+ * Allocate a block using reservation window in ext2 file system.
+ */
+int
+ext2_alloc_rsv(struct inode *ip, int32_t lbn, int32_t bpref,
+ int size, struct ucred *cred, int32_t *bnp)
+{
+ struct m_ext2fs *fs;
+ struct ext2mount *ump;
+ int32_t bno;
+ int cg;
+ *bnp = 0;
+ fs = ip->i_e2fs;
+ ump = ip->i_ump;
+ mtx_assert(EXT2_MTX(ump), MA_OWNED);
+#ifdef DIAGNOSTIC
+ if ((u_int)size > fs->e2fs_bsize || blkoff(fs, size) != 0) {
+ vn_printf(ip->i_devvp, "bsize = %lu, size = %d, fs = %s\n",
+ (long unsigned int)fs->e2fs_bsize, size, fs->e2fs_fsmnt);
+ panic("ext2_alloc: bad size");
+ }
+ if (cred == NOCRED)
+ panic("ext2_alloc: missing credential");
+#endif /* DIAGNOSTIC */
+ if (size == fs->e2fs_bsize && fs->e2fs->e2fs_fbcount == 0)
+ goto nospace;
+ if (cred->cr_uid != 0 &&
+ fs->e2fs->e2fs_fbcount < fs->e2fs->e2fs_rbcount)
+ goto nospace;
+ if (bpref >= fs->e2fs->e2fs_bcount)
+ bpref = 0;
+ if (bpref == 0)
+ cg = ino_to_cg(fs, ip->i_number);
+ else
+ cg = dtog(fs, bpref);
+ bno = (daddr_t)ext2_hashalloc(ip, cg, bpref, fs->e2fs_bsize,
+ ext2_alloccg);
+ if (bno > 0) {
+ ip->i_blocks += btodb(fs->e2fs_bsize);
+ ip->i_flag |= IN_CHANGE | IN_UPDATE;
+ *bnp = bno;
+ return (0);
+ }
+nospace:
+ EXT2_UNLOCK(ump);
+ ext2_fserr(fs, cred->cr_uid, "file system full");
+ uprintf("\n%s: write failed, file system is full\n", fs->e2fs_fsmnt);
+ return (ENOSPC);
+}
+/*
* Allocate a block in the file system.
*
* A preference may be optionally specified. If a preference is given
==== //depot/projects/soc2010/extfs/src/sys/fs/ext2fs/ext2_balloc.c#3 (text+ko) ====
@@ -143,9 +143,14 @@
else
nsize = fs->e2fs_bsize;
EXT2_LOCK(ump);
+/*
error = ext2_alloc(ip, lbn,
ext2_blkpref(ip, lbn, (int)lbn, &ip->i_db[0], 0),
nsize, cred, &newb);
+*/
+ error = ext2_alloc_rsv(ip, lbn,
+ ext2_blkpref(ip, lbn, (int)lbn, &ip->i_db[0], 0),
+ nsize, cred, &newb);
if (error)
return (error);
bp = getblk(vp, lbn, nsize, 0, 0, 0);
@@ -177,9 +182,14 @@
EXT2_LOCK(ump);
pref = ext2_blkpref(ip, lbn, indirs[0].in_off +
EXT2_NDIR_BLOCKS, &ip->i_db[0], 0);
+/*
if ((error = ext2_alloc(ip, lbn, pref,
(int)fs->e2fs_bsize, cred, &newb)))
return (error);
+*/
+ if ((error = ext2_alloc_rsv(ip, lbn, pref,
+ (int)fs->e2fs_bsize, cred, &newb)))
+ return (error);
nb = newb;
bp = getblk(vp, indirs[1].in_lbn, fs->e2fs_bsize, 0, 0, 0);
bp->b_blkno = fsbtodb(fs, newb);
@@ -218,7 +228,10 @@
if (pref == 0)
pref = ext2_blkpref(ip, lbn, indirs[i].in_off, bap,
bp->b_lblkno);
+/*
error = ext2_alloc(ip, lbn, pref, (int)fs->e2fs_bsize, cred, &newb);
+*/
+ error = ext2_alloc_rsv(ip, lbn, pref, (int)fs->e2fs_bsize, cred, &newb);
if (error) {
brelse(bp);
return (error);
@@ -257,11 +270,18 @@
EXT2_LOCK(ump);
pref = ext2_blkpref(ip, lbn, indirs[i].in_off, &bap[0],
bp->b_lblkno);
+/*
if ((error = ext2_alloc(ip,
lbn, pref, (int)fs->e2fs_bsize, cred, &newb)) != 0) {
brelse(bp);
return (error);
}
+*/
+ if ((error = ext2_alloc_rsv(ip, lbn, pref,
+ (int)fs->e2fs_bsize, cred, &newb)) != 0) {
+ brelse(bp);
+ return (error);
+ }
nb = newb;
nbp = getblk(vp, lbn, fs->e2fs_bsize, 0, 0, 0);
nbp->b_blkno = fsbtodb(fs, nb);
==== //depot/projects/soc2010/extfs/src/sys/fs/ext2fs/ext2_rsv_win.h#3 (text+ko) ====
@@ -1,11 +1,6 @@
/*-
- * Copyright (c) 1982, 1989, 1993
- * The Regents of the University of California. All rights reserved.
- * (c) UNIX System Laboratories, Inc.
- * All or some portions of this file are derived from material licensed
- * to the University of California by American Telephone and Telegraph
- * Co. or Unix System Laboratories, Inc. and are reproduced herein with
- * the permission of UNIX System Laboratories, Inc.
+ * Copyright (c) 2010, 2010 Zheng Liu <lz at freebsd.org>
+ * All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -15,14 +10,11 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
*
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
@@ -31,20 +23,20 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * @(#)ext2_rsv_win.h 8.9 (Berkeley) 5/14/95
- * $FreeBSD: src/sys/fs/ext2fs/ext2_rsv_win.h,v 0.1 2010/01/14 14:30:54 lz Exp $
+ * $FreeBSD: src/sys/fs/ext2fs/ext2_rsv_win.h,v 0.1 2010/05/08 12:41:51 lz Exp $
*/
-
-#ifndef _EXT2_RSV_WIN_H_
-#define _EXT2_RSV_WIN_H_
+#ifndef _FS_EXT2FS_EXT2_RSV_WIN_H_
+#define _FS_EXT2FS_EXT2_RSV_WIN_H_
#include <sys/tree.h>
#define EXT2_RWI_DEFAULT_RESERVE_BLKS 8
#define EXT2_RWI_NOT_ALLOCATED 0
+#define EXT2_MAX_RSV_WIN_BLKS 1027
+
/*
- * reservation window entry
+ * Reservation window entry
*/
struct ext2_rsv_win {
RB_ENTRY(ext2_rsv_win) rw_link; /* RB tree links */
@@ -86,5 +78,7 @@
struct inode;
void ext2_init_rsv_win_info(struct inode *ip);
void ext2_discard_rsv_win(struct inode *ip);
+int ext2_alloc_rsv(struct inode *, int32_t, int32_t,
+ int, struct ucred *, int32_t *);
-#endif /* !_EXT2_RSV_WIN_H_ */
+#endif /* !_FS_EXT2FS_EXT2_EXTERN_H_ */
More information about the p4-projects
mailing list