svn commit: r202684 - in projects/suj/6/sys/ufs: ffs ufs
Jeff Roberson
jeff at FreeBSD.org
Wed Jan 20 09:19:19 UTC 2010
Author: jeff
Date: Wed Jan 20 09:19:18 2010
New Revision: 202684
URL: http://svn.freebsd.org/changeset/base/202684
Log:
- Reduce diffs with 7 to make the suj merge easier.
Modified:
projects/suj/6/sys/ufs/ffs/ffs_alloc.c
projects/suj/6/sys/ufs/ffs/ffs_balloc.c
projects/suj/6/sys/ufs/ffs/ffs_extern.h
projects/suj/6/sys/ufs/ffs/ffs_inode.c
projects/suj/6/sys/ufs/ffs/ffs_snapshot.c
projects/suj/6/sys/ufs/ffs/ffs_softdep.c
projects/suj/6/sys/ufs/ffs/ffs_vfsops.c
projects/suj/6/sys/ufs/ffs/fs.h
projects/suj/6/sys/ufs/ufs/dinode.h
projects/suj/6/sys/ufs/ufs/ufs_extern.h
projects/suj/6/sys/ufs/ufs/ufs_lookup.c
projects/suj/6/sys/ufs/ufs/ufs_vnops.c
projects/suj/6/sys/ufs/ufs/ufsmount.h
Modified: projects/suj/6/sys/ufs/ffs/ffs_alloc.c
==============================================================================
--- projects/suj/6/sys/ufs/ffs/ffs_alloc.c Wed Jan 20 09:18:33 2010 (r202683)
+++ projects/suj/6/sys/ufs/ffs/ffs_alloc.c Wed Jan 20 09:19:18 2010 (r202684)
@@ -129,10 +129,10 @@ static int ffs_reallocblks_ufs2(struct v
* available block is located.
*/
int
-ffs_alloc(ip, lbn, bpref, size, cred, bnp)
+ffs_alloc(ip, lbn, bpref, size, flags, cred, bnp)
struct inode *ip;
ufs2_daddr_t lbn, bpref;
- int size;
+ int size, flags;
struct ucred *cred;
ufs2_daddr_t *bnp;
{
@@ -190,7 +190,10 @@ retry:
UFS_UNLOCK(ump);
}
DIP_SET(ip, i_blocks, DIP(ip, i_blocks) + delta);
- ip->i_flag |= IN_CHANGE | IN_UPDATE;
+ if (flags & IO_EXT)
+ ip->i_flag |= IN_CHANGE;
+ else
+ ip->i_flag |= IN_CHANGE | IN_UPDATE;
*bnp = bno;
return (0);
}
@@ -226,12 +229,12 @@ nospace:
* invoked to get an appropriate block.
*/
int
-ffs_realloccg(ip, lbprev, bprev, bpref, osize, nsize, cred, bpp)
+ffs_realloccg(ip, lbprev, bprev, bpref, osize, nsize, flags, cred, bpp)
struct inode *ip;
ufs2_daddr_t lbprev;
ufs2_daddr_t bprev;
ufs2_daddr_t bpref;
- int osize, nsize;
+ int osize, nsize, flags;
struct ucred *cred;
struct buf **bpp;
{
@@ -316,7 +319,10 @@ retry:
UFS_UNLOCK(ump);
}
DIP_SET(ip, i_blocks, DIP(ip, i_blocks) + delta);
- ip->i_flag |= IN_CHANGE | IN_UPDATE;
+ if (flags & IO_EXT)
+ ip->i_flag |= IN_CHANGE;
+ else
+ ip->i_flag |= IN_CHANGE | IN_UPDATE;
allocbuf(bp, nsize);
bp->b_flags |= B_DONE;
if ((bp->b_flags & (B_MALLOC | B_VMIO)) != B_VMIO)
@@ -391,7 +397,10 @@ retry:
UFS_UNLOCK(ump);
}
DIP_SET(ip, i_blocks, DIP(ip, i_blocks) + delta);
- ip->i_flag |= IN_CHANGE | IN_UPDATE;
+ if (flags & IO_EXT)
+ ip->i_flag |= IN_CHANGE;
+ else
+ ip->i_flag |= IN_CHANGE | IN_UPDATE;
allocbuf(bp, nsize);
bp->b_flags |= B_DONE;
if ((bp->b_flags & (B_MALLOC | B_VMIO)) != B_VMIO)
@@ -920,7 +929,7 @@ ffs_valloc(pvp, mode, cred, vpp)
struct timespec ts;
struct ufsmount *ump;
ino_t ino, ipref;
- int cg, error;
+ int cg, error, error1;
static struct timeval lastfail;
static int curfail;
@@ -1838,7 +1847,7 @@ ffs_blkfree(ump, fs, devvp, bno, size, i
struct cdev *dev;
cg = dtog(fs, bno);
- if (devvp->v_type != VCHR) {
+ if (devvp->v_type == VREG) {
/* devvp is a snapshot */
dev = VTOI(devvp)->i_devvp->v_rdev;
cgblkno = fragstoblks(fs, cgtod(fs, cg));
@@ -1883,7 +1892,7 @@ ffs_blkfree(ump, fs, devvp, bno, size, i
if (size == fs->fs_bsize) {
fragno = fragstoblks(fs, cgbno);
if (!ffs_isfreeblock(fs, blksfree, fragno)) {
- if (devvp->v_type != VCHR) {
+ if (devvp->v_type == VREG) {
UFS_UNLOCK(ump);
/* devvp is a snapshot */
brelse(bp);
@@ -2036,7 +2045,7 @@ ffs_freefile(ump, fs, devvp, ino, mode)
struct cdev *dev;
cg = ino_to_cg(fs, ino);
- if (devvp->v_type != VCHR) {
+ if (devvp->v_type == VREG) {
/* devvp is a snapshot */
dev = VTOI(devvp)->i_devvp->v_rdev;
cgbno = fragstoblks(fs, cgtod(fs, cg));
@@ -2102,7 +2111,7 @@ ffs_checkfreefile(fs, devvp, ino)
u_int8_t *inosused;
cg = ino_to_cg(fs, ino);
- if (devvp->v_type != VCHR) {
+ if (devvp->v_type == VREG) {
/* devvp is a snapshot */
cgbno = fragstoblks(fs, cgtod(fs, cg));
} else {
Modified: projects/suj/6/sys/ufs/ffs/ffs_balloc.c
==============================================================================
--- projects/suj/6/sys/ufs/ffs/ffs_balloc.c Wed Jan 20 09:18:33 2010 (r202683)
+++ projects/suj/6/sys/ufs/ffs/ffs_balloc.c Wed Jan 20 09:19:18 2010 (r202684)
@@ -133,7 +133,8 @@ ffs_balloc_ufs1(struct vnode *vp, off_t
UFS_LOCK(ump);
error = ffs_realloccg(ip, nb, dp->di_db[nb],
ffs_blkpref_ufs1(ip, lastlbn, (int)nb,
- &dp->di_db[0]), osize, (int)fs->fs_bsize, cred, &bp);
+ &dp->di_db[0]), osize, (int)fs->fs_bsize, flags,
+ cred, &bp);
if (error)
return (error);
if (DOINGSOFTDEP(vp))
@@ -184,7 +185,8 @@ ffs_balloc_ufs1(struct vnode *vp, off_t
UFS_LOCK(ump);
error = ffs_realloccg(ip, lbn, dp->di_db[lbn],
ffs_blkpref_ufs1(ip, lbn, (int)lbn,
- &dp->di_db[0]), osize, nsize, cred, &bp);
+ &dp->di_db[0]), osize, nsize, flags,
+ cred, &bp);
if (error)
return (error);
if (DOINGSOFTDEP(vp))
@@ -200,7 +202,7 @@ ffs_balloc_ufs1(struct vnode *vp, off_t
UFS_LOCK(ump);
error = ffs_alloc(ip, lbn,
ffs_blkpref_ufs1(ip, lbn, (int)lbn, &dp->di_db[0]),
- nsize, cred, &newb);
+ nsize, flags, cred, &newb);
if (error)
return (error);
bp = getblk(vp, lbn, nsize, 0, 0, 0);
@@ -241,7 +243,7 @@ ffs_balloc_ufs1(struct vnode *vp, off_t
UFS_LOCK(ump);
pref = ffs_blkpref_ufs1(ip, lbn, 0, (ufs1_daddr_t *)0);
if ((error = ffs_alloc(ip, lbn, pref, (int)fs->fs_bsize,
- cred, &newb)) != 0) {
+ flags, cred, &newb)) != 0) {
curthread->td_pflags &= saved_inbdflush;
return (error);
}
@@ -291,8 +293,8 @@ ffs_balloc_ufs1(struct vnode *vp, off_t
UFS_LOCK(ump);
if (pref == 0)
pref = ffs_blkpref_ufs1(ip, lbn, 0, (ufs1_daddr_t *)0);
- if ((error =
- ffs_alloc(ip, lbn, pref, (int)fs->fs_bsize, cred, &newb)) != 0) {
+ if ((error = ffs_alloc(ip, lbn, pref, (int)fs->fs_bsize,
+ flags, cred, &newb)) != 0) {
brelse(bp);
goto fail;
}
@@ -346,7 +348,7 @@ ffs_balloc_ufs1(struct vnode *vp, off_t
UFS_LOCK(ump);
pref = ffs_blkpref_ufs1(ip, lbn, indirs[i].in_off, &bap[0]);
error = ffs_alloc(ip,
- lbn, pref, (int)fs->fs_bsize, cred, &newb);
+ lbn, pref, (int)fs->fs_bsize, flags, cred, &newb);
if (error) {
brelse(bp);
goto fail;
@@ -534,7 +536,7 @@ ffs_balloc_ufs2(struct vnode *vp, off_t
dp->di_extb[nb],
ffs_blkpref_ufs2(ip, lastlbn, (int)nb,
&dp->di_extb[0]), osize,
- (int)fs->fs_bsize, cred, &bp);
+ (int)fs->fs_bsize, flags, cred, &bp);
if (error)
return (error);
if (DOINGSOFTDEP(vp))
@@ -545,7 +547,7 @@ ffs_balloc_ufs2(struct vnode *vp, off_t
dp->di_extsize = smalllblktosize(fs, nb + 1);
dp->di_extb[nb] = dbtofsb(fs, bp->b_blkno);
bp->b_xflags |= BX_ALTDATA;
- ip->i_flag |= IN_CHANGE | IN_UPDATE;
+ ip->i_flag |= IN_CHANGE;
if (flags & IO_SYNC)
bwrite(bp);
else
@@ -588,7 +590,8 @@ ffs_balloc_ufs2(struct vnode *vp, off_t
error = ffs_realloccg(ip, -1 - lbn,
dp->di_extb[lbn],
ffs_blkpref_ufs2(ip, lbn, (int)lbn,
- &dp->di_extb[0]), osize, nsize, cred, &bp);
+ &dp->di_extb[0]), osize, nsize, flags,
+ cred, &bp);
if (error)
return (error);
bp->b_xflags |= BX_ALTDATA;
@@ -605,7 +608,7 @@ ffs_balloc_ufs2(struct vnode *vp, off_t
UFS_LOCK(ump);
error = ffs_alloc(ip, lbn,
ffs_blkpref_ufs2(ip, lbn, (int)lbn, &dp->di_extb[0]),
- nsize, cred, &newb);
+ nsize, flags, cred, &newb);
if (error)
return (error);
bp = getblk(vp, -1 - lbn, nsize, 0, 0, 0);
@@ -618,7 +621,7 @@ ffs_balloc_ufs2(struct vnode *vp, off_t
nsize, 0, bp);
}
dp->di_extb[lbn] = dbtofsb(fs, bp->b_blkno);
- ip->i_flag |= IN_CHANGE | IN_UPDATE;
+ ip->i_flag |= IN_CHANGE;
*bpp = bp;
return (0);
}
@@ -636,7 +639,7 @@ ffs_balloc_ufs2(struct vnode *vp, off_t
error = ffs_realloccg(ip, nb, dp->di_db[nb],
ffs_blkpref_ufs2(ip, lastlbn, (int)nb,
&dp->di_db[0]), osize, (int)fs->fs_bsize,
- cred, &bp);
+ flags, cred, &bp);
if (error)
return (error);
if (DOINGSOFTDEP(vp))
@@ -688,7 +691,8 @@ ffs_balloc_ufs2(struct vnode *vp, off_t
UFS_LOCK(ump);
error = ffs_realloccg(ip, lbn, dp->di_db[lbn],
ffs_blkpref_ufs2(ip, lbn, (int)lbn,
- &dp->di_db[0]), osize, nsize, cred, &bp);
+ &dp->di_db[0]), osize, nsize, flags,
+ cred, &bp);
if (error)
return (error);
if (DOINGSOFTDEP(vp))
@@ -704,7 +708,7 @@ ffs_balloc_ufs2(struct vnode *vp, off_t
UFS_LOCK(ump);
error = ffs_alloc(ip, lbn,
ffs_blkpref_ufs2(ip, lbn, (int)lbn,
- &dp->di_db[0]), nsize, cred, &newb);
+ &dp->di_db[0]), nsize, flags, cred, &newb);
if (error)
return (error);
bp = getblk(vp, lbn, nsize, 0, 0, 0);
@@ -745,7 +749,7 @@ ffs_balloc_ufs2(struct vnode *vp, off_t
UFS_LOCK(ump);
pref = ffs_blkpref_ufs2(ip, lbn, 0, (ufs2_daddr_t *)0);
if ((error = ffs_alloc(ip, lbn, pref, (int)fs->fs_bsize,
- cred, &newb)) != 0) {
+ flags, cred, &newb)) != 0) {
curthread->td_pflags &= saved_inbdflush;
return (error);
}
@@ -795,8 +799,8 @@ ffs_balloc_ufs2(struct vnode *vp, off_t
UFS_LOCK(ump);
if (pref == 0)
pref = ffs_blkpref_ufs2(ip, lbn, 0, (ufs2_daddr_t *)0);
- if ((error =
- ffs_alloc(ip, lbn, pref, (int)fs->fs_bsize, cred, &newb)) != 0) {
+ if ((error = ffs_alloc(ip, lbn, pref, (int)fs->fs_bsize,
+ flags, cred, &newb)) != 0) {
brelse(bp);
goto fail;
}
@@ -850,7 +854,7 @@ ffs_balloc_ufs2(struct vnode *vp, off_t
UFS_LOCK(ump);
pref = ffs_blkpref_ufs2(ip, lbn, indirs[i].in_off, &bap[0]);
error = ffs_alloc(ip,
- lbn, pref, (int)fs->fs_bsize, cred, &newb);
+ lbn, pref, (int)fs->fs_bsize, flags, cred, &newb);
if (error) {
brelse(bp);
goto fail;
Modified: projects/suj/6/sys/ufs/ffs/ffs_extern.h
==============================================================================
--- projects/suj/6/sys/ufs/ffs/ffs_extern.h Wed Jan 20 09:18:33 2010 (r202683)
+++ projects/suj/6/sys/ufs/ffs/ffs_extern.h Wed Jan 20 09:19:18 2010 (r202684)
@@ -48,8 +48,8 @@ struct vnode;
struct vop_fsync_args;
struct vop_reallocblks_args;
-int ffs_alloc(struct inode *,
- ufs2_daddr_t, ufs2_daddr_t, int, struct ucred *, ufs2_daddr_t *);
+int ffs_alloc(struct inode *, ufs2_daddr_t, ufs2_daddr_t, int, int,
+ struct ucred *, ufs2_daddr_t *);
int ffs_balloc_ufs1(struct vnode *a_vp, off_t a_startoffset, int a_size,
struct ucred *a_cred, int a_flags, struct buf **a_bpp);
int ffs_balloc_ufs2(struct vnode *a_vp, off_t a_startoffset, int a_size,
@@ -72,13 +72,15 @@ void ffs_load_inode(struct buf *, struct
int ffs_mountroot(void);
int ffs_reallocblks(struct vop_reallocblks_args *);
int ffs_realloccg(struct inode *, ufs2_daddr_t, ufs2_daddr_t,
- ufs2_daddr_t, int, int, struct ucred *, struct buf **);
+ ufs2_daddr_t, int, int, int, struct ucred *, struct buf **);
+int ffs_sbupdate(struct ufsmount *, int, int);
void ffs_setblock(struct fs *, u_char *, ufs1_daddr_t);
int ffs_snapblkfree(struct fs *, struct vnode *, ufs2_daddr_t, long, ino_t);
void ffs_snapremove(struct vnode *vp);
int ffs_snapshot(struct mount *mp, char *snapfile);
void ffs_snapshot_mount(struct mount *mp);
void ffs_snapshot_unmount(struct mount *mp);
+void process_deferred_inactive(struct mount *mp);
int ffs_syncvnode(struct vnode *vp, int waitfor);
int ffs_truncate(struct vnode *, off_t, int, struct ucred *, struct thread *);
int ffs_update(struct vnode *, int);
Modified: projects/suj/6/sys/ufs/ffs/ffs_inode.c
==============================================================================
--- projects/suj/6/sys/ufs/ffs/ffs_inode.c Wed Jan 20 09:18:33 2010 (r202683)
+++ projects/suj/6/sys/ufs/ffs/ffs_inode.c Wed Jan 20 09:19:18 2010 (r202684)
@@ -48,6 +48,7 @@ __FBSDID("$FreeBSD$");
#include <vm/vm.h>
#include <vm/vm_extern.h>
+#include <vm/vm_object.h>
#include <ufs/ufs/extattr.h>
#include <ufs/ufs/quota.h>
@@ -128,6 +129,18 @@ ffs_update(vp, waitfor)
}
}
+static void
+ffs_pages_remove(struct vnode *vp, vm_pindex_t start, vm_pindex_t end)
+{
+ vm_object_t object;
+
+ if ((object = vp->v_object) == NULL)
+ return;
+ VM_OBJECT_LOCK(object);
+ vm_object_page_remove(object, start, end, FALSE);
+ VM_OBJECT_UNLOCK(object);
+}
+
#define SINGLE 0 /* index of single indirect block */
#define DOUBLE 1 /* index of double indirect block */
#define TRIPLE 2 /* index of triple indirect block */
@@ -203,12 +216,14 @@ ffs_truncate(vp, length, flags, cred, td
(void) chkdq(ip, -extblocks, NOCRED, 0);
#endif
vinvalbuf(vp, V_ALT, td, 0, 0);
+ ffs_pages_remove(vp,
+ OFF_TO_IDX(lblktosize(fs, -extblocks)), 0);
ip->i_din2->di_extsize = 0;
for (i = 0; i < NXADDR; i++) {
oldblks[i] = ip->i_din2->di_extb[i];
ip->i_din2->di_extb[i] = 0;
}
- ip->i_flag |= IN_CHANGE | IN_UPDATE;
+ ip->i_flag |= IN_CHANGE;
if ((error = ffs_update(vp, 1)))
return (error);
for (i = 0; i < NXADDR; i++) {
@@ -279,6 +294,9 @@ ffs_truncate(vp, length, flags, cred, td
IO_EXT | IO_NORMAL : IO_NORMAL);
ASSERT_VOP_LOCKED(vp, "ffs_truncate1");
vinvalbuf(vp, needextclean ? 0 : V_NORMAL, td, 0, 0);
+ if (!needextclean)
+ ffs_pages_remove(vp, 0,
+ OFF_TO_IDX(lblktosize(fs, -extblocks)));
vnode_pager_setsize(vp, 0);
ip->i_flag |= IN_CHANGE | IN_UPDATE;
return (ffs_update(vp, 0));
@@ -294,8 +312,10 @@ ffs_truncate(vp, length, flags, cred, td
vnode_pager_setsize(vp, length);
flags |= BA_CLRBUF;
error = UFS_BALLOC(vp, length - 1, 1, cred, flags, &bp);
- if (error)
+ if (error) {
+ vnode_pager_setsize(vp, osize);
return (error);
+ }
ip->i_size = length;
DIP_SET(ip, i_size, length);
if (bp->b_bufsize == fs->fs_bsize)
@@ -559,7 +579,7 @@ ffs_indirtrunc(ip, lbn, dbn, lastbn, lev
vp = ITOV(ip);
bp = getblk(vp, lbn, (int)fs->fs_bsize, 0, 0, 0);
if ((bp->b_flags & B_CACHE) == 0) {
- curproc->p_stats->p_ru.ru_inblock++; /* pay for read */
+ curproc->p_ru->ru_inblock++; /* pay for read */
bp->b_iocmd = BIO_READ;
bp->b_flags &= ~B_INVAL;
bp->b_ioflags &= ~BIO_ERROR;
Modified: projects/suj/6/sys/ufs/ffs/ffs_snapshot.c
==============================================================================
--- projects/suj/6/sys/ufs/ffs/ffs_snapshot.c Wed Jan 20 09:18:33 2010 (r202683)
+++ projects/suj/6/sys/ufs/ffs/ffs_snapshot.c Wed Jan 20 09:19:18 2010 (r202684)
@@ -161,7 +161,6 @@ static int snapacct_ufs2(struct vnode *,
static int mapacct_ufs2(struct vnode *, ufs2_daddr_t *, ufs2_daddr_t *,
struct fs *, ufs_lbn_t, int);
static int readblock(struct vnode *vp, struct buf *, ufs2_daddr_t);
-static void process_deferred_inactive(struct mount *);
static void try_free_snapdata(struct vnode *devvp, struct thread *td);
static int ffs_bp_snapblk(struct vnode *, struct buf *);
@@ -2417,7 +2416,7 @@ readblock(vp, bp, lbn)
* the file system being suspended. Transfer IN_LAZYACCESS into
* IN_MODIFIED for vnodes that were accessed during suspension.
*/
-static void
+void
process_deferred_inactive(struct mount *mp)
{
struct vnode *vp, *mvp;
Modified: projects/suj/6/sys/ufs/ffs/ffs_softdep.c
==============================================================================
--- projects/suj/6/sys/ufs/ffs/ffs_softdep.c Wed Jan 20 09:18:33 2010 (r202683)
+++ projects/suj/6/sys/ufs/ffs/ffs_softdep.c Wed Jan 20 09:19:18 2010 (r202684)
@@ -635,7 +635,7 @@ workitem_free(item, type)
ump = VFSTOUFS(item->wk_mp);
if (--ump->softdep_deps == 0 && ump->softdep_req)
wakeup(&ump->softdep_deps);
- FREE(item, DtoM(type));
+ free(item, DtoM(type));
}
static void
@@ -866,6 +866,7 @@ softdep_process_worklist(mp, full)
*/
if (loopcount++ % 128 == 0) {
FREE_LOCK(&lk);
+ uio_yield();
bwillwrite();
ACQUIRE_LOCK(&lk);
}
@@ -1076,8 +1077,11 @@ softdep_flushfiles(oldmnt, flags, td)
int flags;
struct thread *td;
{
- int error, count, loopcnt;
+ int error, depcount, loopcnt, retry_flush_count, retry;
+ loopcnt = 10;
+ retry_flush_count = 3;
+retry_flush:
error = 0;
/*
@@ -1086,15 +1090,15 @@ softdep_flushfiles(oldmnt, flags, td)
* creates. In theory, this loop can happen at most twice,
* but we give it a few extra just to be sure.
*/
- for (loopcnt = 10; loopcnt > 0; loopcnt--) {
+ for (; loopcnt > 0; loopcnt--) {
/*
* Do another flush in case any vnodes were brought in
* as part of the cleanup operations.
*/
if ((error = ffs_flushfiles(oldmnt, flags, td)) != 0)
break;
- if ((error = softdep_flushworklist(oldmnt, &count, td)) != 0 ||
- count == 0)
+ if ((error = softdep_flushworklist(oldmnt, &depcount, td)) != 0 ||
+ depcount == 0)
break;
}
/*
@@ -1200,7 +1204,7 @@ pagedep_lookup(ip, lbn, flags, pagedeppp
if (*pagedeppp || (flags & DEPALLOC) == 0)
return (ret);
FREE_LOCK(&lk);
- MALLOC(pagedep, struct pagedep *, sizeof(struct pagedep),
+ pagedep = malloc(sizeof(struct pagedep),
M_PAGEDEP, M_SOFTDEP_FLAGS|M_ZERO);
workitem_alloc(&pagedep->pd_list, D_PAGEDEP, mp);
ACQUIRE_LOCK(&lk);
@@ -1280,7 +1284,7 @@ inodedep_lookup(mp, inum, flags, inodede
if (num_inodedep > max_softdeps && (flags & NODELAY) == 0)
request_cleanup(mp, FLUSH_INODES);
FREE_LOCK(&lk);
- MALLOC(inodedep, struct inodedep *, sizeof(struct inodedep),
+ inodedep = malloc(sizeof(struct inodedep),
M_INODEDEP, M_SOFTDEP_FLAGS);
workitem_alloc(&inodedep->id_list, D_INODEDEP, mp);
ACQUIRE_LOCK(&lk);
@@ -1358,11 +1362,11 @@ newblk_lookup(fs, newblkno, flags, newbl
if ((flags & DEPALLOC) == 0)
return (0);
FREE_LOCK(&lk);
- MALLOC(newblk, struct newblk *, sizeof(struct newblk),
+ newblk = malloc(sizeof(struct newblk),
M_NEWBLK, M_SOFTDEP_FLAGS);
ACQUIRE_LOCK(&lk);
if (newblk_find(newblkhd, fs, newblkno, newblkpp)) {
- FREE(newblk, M_NEWBLK);
+ free(newblk, M_NEWBLK);
return (1);
}
newblk->nb_state = 0;
@@ -1575,7 +1579,7 @@ bmsafemap_lookup(mp, bp)
if (wk->wk_type == D_BMSAFEMAP)
return (WK_BMSAFEMAP(wk));
FREE_LOCK(&lk);
- MALLOC(bmsafemap, struct bmsafemap *, sizeof(struct bmsafemap),
+ bmsafemap = malloc(sizeof(struct bmsafemap),
M_BMSAFEMAP, M_SOFTDEP_FLAGS);
workitem_alloc(&bmsafemap->sm_list, D_BMSAFEMAP, mp);
bmsafemap->sm_buf = bp;
@@ -1636,7 +1640,7 @@ softdep_setup_allocdirect(ip, lbn, newbl
struct mount *mp;
mp = UFSTOVFS(ip->i_ump);
- MALLOC(adp, struct allocdirect *, sizeof(struct allocdirect),
+ adp = malloc(sizeof(struct allocdirect),
M_ALLOCDIRECT, M_SOFTDEP_FLAGS|M_ZERO);
workitem_alloc(&adp->ad_list, D_ALLOCDIRECT, mp);
adp->ad_lbn = lbn;
@@ -1680,7 +1684,7 @@ softdep_setup_allocdirect(ip, lbn, newbl
LIST_INSERT_HEAD(&bmsafemap->sm_allocdirecthd, adp, ad_deps);
}
LIST_REMOVE(newblk, nb_hash);
- FREE(newblk, M_NEWBLK);
+ free(newblk, M_NEWBLK);
inodedep_lookup(mp, ip->i_number, DEPALLOC | NODELAY, &inodedep);
adp->ad_inodedep = inodedep;
@@ -1797,7 +1801,7 @@ newfreefrag(ip, blkno, size)
fs = ip->i_fs;
if (fragnum(fs, blkno) + numfrags(fs, size) > fs->fs_frag)
panic("newfreefrag: frag size");
- MALLOC(freefrag, struct freefrag *, sizeof(struct freefrag),
+ freefrag = malloc(sizeof(struct freefrag),
M_FREEFRAG, M_SOFTDEP_FLAGS);
workitem_alloc(&freefrag->ff_list, D_FREEFRAG, UFSTOVFS(ip->i_ump));
freefrag->ff_inum = ip->i_number;
@@ -1846,7 +1850,7 @@ softdep_setup_allocext(ip, lbn, newblkno
struct mount *mp;
mp = UFSTOVFS(ip->i_ump);
- MALLOC(adp, struct allocdirect *, sizeof(struct allocdirect),
+ adp = malloc(sizeof(struct allocdirect),
M_ALLOCDIRECT, M_SOFTDEP_FLAGS|M_ZERO);
workitem_alloc(&adp->ad_list, D_ALLOCDIRECT, mp);
adp->ad_lbn = lbn;
@@ -1878,7 +1882,7 @@ softdep_setup_allocext(ip, lbn, newblkno
LIST_INSERT_HEAD(&bmsafemap->sm_allocdirecthd, adp, ad_deps);
}
LIST_REMOVE(newblk, nb_hash);
- FREE(newblk, M_NEWBLK);
+ free(newblk, M_NEWBLK);
WORKLIST_INSERT(&bp->b_dep, &adp->ad_list);
if (lbn >= NXADDR)
@@ -1956,7 +1960,7 @@ newallocindir(ip, ptrno, newblkno, oldbl
{
struct allocindir *aip;
- MALLOC(aip, struct allocindir *, sizeof(struct allocindir),
+ aip = malloc(sizeof(struct allocindir),
M_ALLOCINDIR, M_SOFTDEP_FLAGS|M_ZERO);
workitem_alloc(&aip->ai_list, D_ALLOCINDIR, UFSTOVFS(ip->i_ump));
aip->ai_state = ATTACHED;
@@ -2070,7 +2074,7 @@ setup_allocindir_phase2(bp, ip, aip)
aip, ai_deps);
}
LIST_REMOVE(newblk, nb_hash);
- FREE(newblk, M_NEWBLK);
+ free(newblk, M_NEWBLK);
aip->ai_indirdep = indirdep;
/*
* Check to see if there is an existing dependency
@@ -2119,7 +2123,7 @@ setup_allocindir_phase2(bp, ip, aip)
ACQUIRE_LOCK(&lk);
break;
}
- MALLOC(newindirdep, struct indirdep *, sizeof(struct indirdep),
+ newindirdep = malloc(sizeof(struct indirdep),
M_INDIRDEP, M_SOFTDEP_FLAGS);
workitem_alloc(&newindirdep->ir_list, D_INDIRDEP,
UFSTOVFS(ip->i_ump));
@@ -2190,7 +2194,7 @@ softdep_setup_freeblocks(ip, length, fla
mp = UFSTOVFS(ip->i_ump);
if (length != 0)
panic("softdep_setup_freeblocks: non-zero length");
- MALLOC(freeblks, struct freeblks *, sizeof(struct freeblks),
+ freeblks = malloc(sizeof(struct freeblks),
M_FREEBLKS, M_SOFTDEP_FLAGS|M_ZERO);
workitem_alloc(&freeblks->fb_list, D_FREEBLKS, mp);
freeblks->fb_state = ATTACHED;
@@ -2573,7 +2577,7 @@ softdep_freefile(pvp, ino, mode)
/*
* This sets up the inode de-allocation dependency.
*/
- MALLOC(freefile, struct freefile *, sizeof(struct freefile),
+ freefile = malloc(sizeof(struct freefile),
M_FREEFILE, M_SOFTDEP_FLAGS);
workitem_alloc(&freefile->fx_list, D_FREEFILE, pvp->v_mount);
freefile->fx_mode = mode;
@@ -2600,7 +2604,8 @@ softdep_freefile(pvp, ino, mode)
}
WORKLIST_INSERT(&inodedep->id_inowait, &freefile->fx_list);
FREE_LOCK(&lk);
- ip->i_flag |= IN_MODIFIED;
+ if (ip->i_number == ino)
+ ip->i_flag |= IN_MODIFIED;
}
/*
@@ -2649,7 +2654,7 @@ check_inode_unwritten(inodedep)
if (inodedep->id_state & ONWORKLIST)
WORKLIST_REMOVE(&inodedep->id_list);
if (inodedep->id_savedino1 != NULL) {
- FREE(inodedep->id_savedino1, M_SAVEDINO);
+ free(inodedep->id_savedino1, M_SAVEDINO);
inodedep->id_savedino1 = NULL;
}
if (free_inodedep(inodedep) == 0)
@@ -2986,14 +2991,14 @@ softdep_setup_directory_add(bp, dp, diro
fs = dp->i_fs;
lbn = lblkno(fs, diroffset);
offset = blkoff(fs, diroffset);
- MALLOC(dap, struct diradd *, sizeof(struct diradd), M_DIRADD,
+ dap = malloc(sizeof(struct diradd), M_DIRADD,
M_SOFTDEP_FLAGS|M_ZERO);
workitem_alloc(&dap->da_list, D_DIRADD, mp);
dap->da_offset = offset;
dap->da_newinum = newinum;
dap->da_state = ATTACHED;
if (isnewblk && lbn < NDADDR && fragoff(fs, diroffset) == 0) {
- MALLOC(newdirblk, struct newdirblk *, sizeof(struct newdirblk),
+ newdirblk = malloc(sizeof(struct newdirblk),
M_NEWDIRBLK, M_SOFTDEP_FLAGS);
workitem_alloc(&newdirblk->db_list, D_NEWDIRBLK, mp);
}
@@ -3002,12 +3007,12 @@ softdep_setup_directory_add(bp, dp, diro
ACQUIRE_LOCK(&lk);
} else {
dap->da_state |= MKDIR_BODY | MKDIR_PARENT;
- MALLOC(mkdir1, struct mkdir *, sizeof(struct mkdir), M_MKDIR,
+ mkdir1 = malloc(sizeof(struct mkdir), M_MKDIR,
M_SOFTDEP_FLAGS);
workitem_alloc(&mkdir1->md_list, D_MKDIR, mp);
mkdir1->md_state = MKDIR_BODY;
mkdir1->md_diradd = dap;
- MALLOC(mkdir2, struct mkdir *, sizeof(struct mkdir), M_MKDIR,
+ mkdir2 = malloc(sizeof(struct mkdir), M_MKDIR,
M_SOFTDEP_FLAGS);
workitem_alloc(&mkdir2->md_list, D_MKDIR, mp);
mkdir2->md_state = MKDIR_PARENT;
@@ -3284,11 +3289,11 @@ newdirrem(bp, dp, ip, isrmdir, prevdirre
* the number of freefile and freeblks structures.
*/
ACQUIRE_LOCK(&lk);
- if (num_dirrem > max_softdeps / 2)
+ if (!(ip->i_flags & SF_SNAPSHOT) && num_dirrem > max_softdeps / 2)
(void) request_cleanup(ITOV(dp)->v_mount, FLUSH_REMOVE);
num_dirrem += 1;
FREE_LOCK(&lk);
- MALLOC(dirrem, struct dirrem *, sizeof(struct dirrem),
+ dirrem = malloc(sizeof(struct dirrem),
M_DIRREM, M_SOFTDEP_FLAGS|M_ZERO);
workitem_alloc(&dirrem->dm_list, D_DIRREM, ITOV(dp)->v_mount);
dirrem->dm_state = isrmdir ? RMDIR : 0;
@@ -3385,7 +3390,7 @@ softdep_setup_directory_change(bp, dp, i
* Whiteouts do not need diradd dependencies.
*/
if (newinum != WINO) {
- MALLOC(dap, struct diradd *, sizeof(struct diradd),
+ dap = malloc(sizeof(struct diradd),
M_DIRADD, M_SOFTDEP_FLAGS|M_ZERO);
workitem_alloc(&dap->da_list, D_DIRADD, mp);
dap->da_state = DIRCHG | ATTACHED | DEPCOMPLETE;
@@ -3787,7 +3792,7 @@ softdep_disk_io_initiation(bp)
* Replace up-to-date version with safe version.
*/
FREE_LOCK(&lk);
- MALLOC(indirdep->ir_saveddata, caddr_t, bp->b_bcount,
+ indirdep->ir_saveddata = malloc(bp->b_bcount,
M_INDIRDEP, M_SOFTDEP_FLAGS);
ACQUIRE_LOCK(&lk);
indirdep->ir_state &= ~ATTACHED;
@@ -3895,8 +3900,8 @@ initiate_write_inodeblock_ufs1(inodedep,
if (inodedep->id_savedino1 != NULL)
panic("initiate_write_inodeblock_ufs1: I/O underway");
FREE_LOCK(&lk);
- MALLOC(sip, struct ufs1_dinode *,
- sizeof(struct ufs1_dinode), M_SAVEDINO, M_SOFTDEP_FLAGS);
+ sip = malloc(sizeof(struct ufs1_dinode),
+ M_SAVEDINO, M_SOFTDEP_FLAGS);
ACQUIRE_LOCK(&lk);
inodedep->id_savedino1 = sip;
*inodedep->id_savedino1 = *dp;
@@ -4041,8 +4046,8 @@ initiate_write_inodeblock_ufs2(inodedep,
if (inodedep->id_savedino2 != NULL)
panic("initiate_write_inodeblock_ufs2: I/O underway");
FREE_LOCK(&lk);
- MALLOC(sip, struct ufs2_dinode *,
- sizeof(struct ufs2_dinode), M_SAVEDINO, M_SOFTDEP_FLAGS);
+ sip = malloc(sizeof(struct ufs2_dinode),
+ M_SAVEDINO, M_SOFTDEP_FLAGS);
ACQUIRE_LOCK(&lk);
inodedep->id_savedino2 = sip;
*inodedep->id_savedino2 = *dp;
@@ -4310,7 +4315,7 @@ softdep_disk_write_complete(bp)
if (indirdep->ir_state & GOINGAWAY)
panic("disk_write_complete: indirdep gone");
bcopy(indirdep->ir_saveddata, bp->b_data, bp->b_bcount);
- FREE(indirdep->ir_saveddata, M_INDIRDEP);
+ free(indirdep->ir_saveddata, M_INDIRDEP);
indirdep->ir_saveddata = 0;
indirdep->ir_state &= ~UNDONE;
indirdep->ir_state |= ATTACHED;
@@ -4497,7 +4502,7 @@ handle_written_inodeblock(inodedep, bp)
*dp1 = *inodedep->id_savedino1;
else
*dp2 = *inodedep->id_savedino2;
- FREE(inodedep->id_savedino1, M_SAVEDINO);
+ free(inodedep->id_savedino1, M_SAVEDINO);
inodedep->id_savedino1 = NULL;
if ((bp->b_flags & B_DELWRI) == 0)
stat_inode_bitmap++;
@@ -6301,4 +6306,30 @@ softdep_error(func, error)
printf("%s: got error %d while accessing filesystem\n", func, error);
}
+#ifdef DDB
+
+DB_SHOW_COMMAND(inodedeps, db_show_inodedeps)
+{
+ struct inodedep_hashhead *inodedephd;
+ struct inodedep *inodedep;
+ struct fs *fs;
+ int cnt;
+
+ fs = have_addr ? (struct fs *)addr : NULL;
+ for (cnt = 0; cnt < inodedep_hash; cnt++) {
+ inodedephd = &inodedep_hashtbl[cnt];
+ LIST_FOREACH(inodedep, inodedephd, id_hash) {
+ if (fs != NULL && fs != inodedep->id_fs)
+ continue;
+ db_printf("%p fs %p st %x ino %jd inoblk %jd\n",
+ inodedep, inodedep->id_fs, inodedep->id_state,
+ (intmax_t)inodedep->id_ino,
+ (intmax_t)fsbtodb(inodedep->id_fs,
+ ino_to_fsba(inodedep->id_fs, inodedep->id_ino)));
+ }
+ }
+}
+
+#endif /* DDB */
+
#endif /* SOFTUPDATES */
Modified: projects/suj/6/sys/ufs/ffs/ffs_vfsops.c
==============================================================================
--- projects/suj/6/sys/ufs/ffs/ffs_vfsops.c Wed Jan 20 09:18:33 2010 (r202683)
+++ projects/suj/6/sys/ufs/ffs/ffs_vfsops.c Wed Jan 20 09:19:18 2010 (r202684)
@@ -70,7 +70,6 @@ __FBSDID("$FreeBSD$");
static uma_zone_t uma_inode, uma_ufs1, uma_ufs2;
-static int ffs_sbupdate(struct ufsmount *, int, int);
static int ffs_reload(struct mount *, struct thread *);
static int ffs_mountfs(struct vnode *, struct mount *, struct thread *);
static void ffs_oldfscompat_read(struct fs *, struct ufsmount *,
@@ -1472,7 +1471,7 @@ ffs_uninit(vfsp)
/*
* Write a superblock and associated information back to disk.
*/
-static int
+int
ffs_sbupdate(mp, waitfor, suspended)
struct ufsmount *mp;
int waitfor;
Modified: projects/suj/6/sys/ufs/ffs/fs.h
==============================================================================
--- projects/suj/6/sys/ufs/ffs/fs.h Wed Jan 20 09:18:33 2010 (r202683)
+++ projects/suj/6/sys/ufs/ffs/fs.h Wed Jan 20 09:19:18 2010 (r202684)
@@ -392,22 +392,24 @@ CTASSERT(sizeof(struct fs) == 1376);
* flag to indicate that the indicies need to be rebuilt (by fsck) before
* they can be used.
*
- * FS_ACLS indicates that ACLs are administratively enabled for the
- * file system, so they should be loaded from extended attributes,
+ * FS_ACLS indicates that POSIX.1e ACLs are administratively enabled
+ * for the file system, so they should be loaded from extended attributes,
* observed for access control purposes, and be administered by object
- * owners. FS_MULTILABEL indicates that the TrustedBSD MAC Framework
- * should attempt to back MAC labels into extended attributes on the
- * file system rather than maintain a single mount label for all
- * objects.
- */
-#define FS_UNCLEAN 0x01 /* filesystem not clean at mount */
-#define FS_DOSOFTDEP 0x02 /* filesystem using soft dependencies */
-#define FS_NEEDSFSCK 0x04 /* filesystem needs sync fsck before mount */
-#define FS_INDEXDIRS 0x08 /* kernel supports indexed directories */
-#define FS_ACLS 0x10 /* file system has ACLs enabled */
-#define FS_MULTILABEL 0x20 /* file system is MAC multi-label */
-#define FS_GJOURNAL 0x40 /* reserved for FreeBSD 7.0 and later */
-#define FS_FLAGS_UPDATED 0x80 /* flags have been moved to new location */
+ * owners. FS_NFS4ACLS indicates that NFSv4 ACLs are administratively
+ * enabled. This flag is mutually exclusive with FS_ACLS. FS_MULTILABEL
+ * indicates that the TrustedBSD MAC Framework should attempt to back MAC
+ * labels into extended attributes on the file system rather than maintain
+ * a single mount label for all objects.
+ */
+#define FS_UNCLEAN 0x0001 /* filesystem not clean at mount */
+#define FS_DOSOFTDEP 0x0002 /* filesystem using soft dependencies */
+#define FS_NEEDSFSCK 0x0004 /* filesystem needs sync fsck before mount */
+#define FS_INDEXDIRS 0x0008 /* kernel supports indexed directories */
+#define FS_ACLS 0x0010 /* file system has POSIX.1e ACLs enabled */
+#define FS_MULTILABEL 0x0020 /* file system is MAC multi-label */
+#define FS_GJOURNAL 0x0040 /* gjournaled file system */
+#define FS_FLAGS_UPDATED 0x0080 /* flags have been moved to new location */
+#define FS_NFS4ACLS 0x0100 /* file system has NFSv4 ACLs enabled */
/*
* Macros to access bits in the fs_active array.
Modified: projects/suj/6/sys/ufs/ufs/dinode.h
==============================================================================
--- projects/suj/6/sys/ufs/ufs/dinode.h Wed Jan 20 09:18:33 2010 (r202683)
+++ projects/suj/6/sys/ufs/ufs/dinode.h Wed Jan 20 09:19:18 2010 (r202684)
@@ -145,7 +145,8 @@ struct ufs2_dinode {
ufs2_daddr_t di_extb[NXADDR];/* 96: External attributes block. */
ufs2_daddr_t di_db[NDADDR]; /* 112: Direct disk blocks. */
ufs2_daddr_t di_ib[NIADDR]; /* 208: Indirect disk blocks. */
- int64_t di_spare[3]; /* 232: Reserved; currently unused */
+ u_int64_t di_modrev; /* 232: i_modrev for NFSv4 */
+ int64_t di_spare[2]; /* 240: Reserved; currently unused */
};
/*
@@ -183,7 +184,7 @@ struct ufs1_dinode {
int32_t di_gen; /* 108: Generation number. */
u_int32_t di_uid; /* 112: File owner. */
u_int32_t di_gid; /* 116: File group. */
- int32_t di_spare[2]; /* 120: Reserved; currently unused */
+ u_int64_t di_modrev; /* 120: i_modrev for NFSv4 */
};
#define di_ogid di_u.oldids[1]
#define di_ouid di_u.oldids[0]
Modified: projects/suj/6/sys/ufs/ufs/ufs_extern.h
==============================================================================
--- projects/suj/6/sys/ufs/ufs/ufs_extern.h Wed Jan 20 09:18:33 2010 (r202683)
+++ projects/suj/6/sys/ufs/ufs/ufs_extern.h Wed Jan 20 09:19:18 2010 (r202684)
@@ -58,7 +58,7 @@ int ufs_bmap(struct vop_bmap_args *);
int ufs_bmaparray(struct vnode *, ufs2_daddr_t, ufs2_daddr_t *,
struct buf *, int *, int *);
int ufs_fhtovp(struct mount *, struct ufid *, struct vnode **);
-int ufs_checkpath(struct inode *, struct inode *, struct ucred *);
+int ufs_checkpath(ino_t, struct inode *, struct ucred *);
void ufs_dirbad(struct inode *, doff_t, char *);
int ufs_dirbadentry(struct vnode *, struct direct *, int);
int ufs_dirempty(struct inode *, ino_t, struct ucred *);
Modified: projects/suj/6/sys/ufs/ufs/ufs_lookup.c
==============================================================================
--- projects/suj/6/sys/ufs/ufs/ufs_lookup.c Wed Jan 20 09:18:33 2010 (r202683)
+++ projects/suj/6/sys/ufs/ufs/ufs_lookup.c Wed Jan 20 09:19:18 2010 (r202684)
@@ -77,6 +77,9 @@ SYSCTL_INT(_debug, OID_AUTO, dircheck, C
/* true if old FS format...*/
#define OFSFMT(vp) ((vp)->v_mount->mnt_maxsymlinklen <= 0)
+static int ufs_lookup_(struct vnode *, struct vnode **, struct componentname *,
+ ino_t *);
+
/*
* Convert a component of a pathname into a pointer to a locked inode.
* This is a very central and rather complicated routine.
@@ -130,13 +133,22 @@ ufs_lookup(ap)
struct componentname *a_cnp;
} */ *ap;
{
- struct vnode *vdp; /* vnode for directory being searched */
+
+ return (ufs_lookup_(ap->a_dvp, ap->a_vpp, ap->a_cnp, NULL));
+}
+
+static int
+ufs_lookup_(struct vnode *vdp, struct vnode **vpp, struct componentname *cnp,
+ ino_t *dd_ino)
+{
struct inode *dp; /* inode for directory being searched */
struct buf *bp; /* a buffer of directory entries */
struct direct *ep; /* the current directory entry */
int entryoffsetinblock; /* offset of ep in bp's buffer */
enum {NONE, COMPACT, FOUND} slotstatus;
doff_t slotoffset; /* offset of area with free space */
+ doff_t i_diroff; /* cached i_diroff value. */
+ doff_t i_offset; /* cached i_offset value. */
int slotsize; /* size of area at slotoffset */
int slotfreespace; /* amount of space free in slot */
int slotneeded; /* size of the entry we're seeking */
@@ -148,23 +160,17 @@ ufs_lookup(ap)
doff_t enduseful; /* pointer past last used dir slot */
u_long bmask; /* block offset mask */
int namlen, error;
- struct vnode **vpp = ap->a_vpp;
- struct componentname *cnp = ap->a_cnp;
struct ucred *cred = cnp->cn_cred;
int flags = cnp->cn_flags;
int nameiop = cnp->cn_nameiop;
struct thread *td = cnp->cn_thread;
ino_t saved_ino;
+ ino_t ino, ino1;
+ int ltype;
- bp = NULL;
- slotoffset = -1;
-/*
- * XXX there was a soft-update diff about this I couldn't merge.
- * I think this was the equiv.
- */
- *vpp = NULL;
+ if (vpp != NULL)
+ *vpp = NULL;
- vdp = ap->a_dvp;
dp = VTOI(vdp);
/*
@@ -175,6 +181,12 @@ ufs_lookup(ap)
*/
vnode_create_vobject_off(vdp, DIP(dp, i_size), cnp->cn_thread);
+ bmask = VFSTOUFS(vdp->v_mount)->um_mountp->mnt_stat.f_iosize - 1;
+
+restart:
+ bp = NULL;
+ slotoffset = -1;
+
/*
* We now have a segment name to search for, and a directory to search.
*
@@ -183,6 +195,8 @@ ufs_lookup(ap)
* we watch for a place to put the new file in
* case it doesn't already exist.
*/
+ ino = 0;
+ i_diroff = dp->i_diroff;
slotstatus = FOUND;
slotfreespace = slotsize = slotneeded = 0;
if ((nameiop == CREATE || nameiop == RENAME) &&
@@ -190,7 +204,6 @@ ufs_lookup(ap)
slotstatus = NONE;
slotneeded = DIRECTSIZ(cnp->cn_namelen);
}
- bmask = VFSTOUFS(vdp->v_mount)->um_mountp->mnt_stat.f_iosize - 1;
#ifdef UFS_DIRHASH
/*
@@ -216,13 +229,13 @@ ufs_lookup(ap)
numdirpasses = 1;
entryoffsetinblock = 0; /* silence compiler warning */
switch (ufsdirhash_lookup(dp, cnp->cn_nameptr, cnp->cn_namelen,
- &dp->i_offset, &bp, nameiop == DELETE ? &prevoff : NULL)) {
+ &i_offset, &bp, nameiop == DELETE ? &prevoff : NULL)) {
case 0:
ep = (struct direct *)((char *)bp->b_data +
- (dp->i_offset & bmask));
+ (i_offset & bmask));
goto foundentry;
case ENOENT:
- dp->i_offset = roundup2(dp->i_size, DIRBLKSIZ);
+ i_offset = roundup2(dp->i_size, DIRBLKSIZ);
goto notfound;
default:
/* Something failed; just do a linear search. */
@@ -241,33 +254,32 @@ ufs_lookup(ap)
* profiling time and hence has been removed in the interest
* of simplicity.
*/
- if (nameiop != LOOKUP || dp->i_diroff == 0 ||
- dp->i_diroff >= dp->i_size) {
+ if (nameiop != LOOKUP || i_diroff == 0 || i_diroff >= dp->i_size) {
entryoffsetinblock = 0;
- dp->i_offset = 0;
+ i_offset = 0;
numdirpasses = 1;
} else {
- dp->i_offset = dp->i_diroff;
- if ((entryoffsetinblock = dp->i_offset & bmask) &&
- (error = UFS_BLKATOFF(vdp, (off_t)dp->i_offset, NULL, &bp)))
+ i_offset = i_diroff;
+ if ((entryoffsetinblock = i_offset & bmask) &&
+ (error = UFS_BLKATOFF(vdp, (off_t)i_offset, NULL, &bp)))
return (error);
numdirpasses = 2;
nchstats.ncs_2passes++;
}
- prevoff = dp->i_offset;
+ prevoff = i_offset;
endsearch = roundup2(dp->i_size, DIRBLKSIZ);
enduseful = 0;
searchloop:
- while (dp->i_offset < endsearch) {
+ while (i_offset < endsearch) {
/*
* If necessary, get the next directory block.
*/
- if ((dp->i_offset & bmask) == 0) {
+ if ((i_offset & bmask) == 0) {
if (bp != NULL)
brelse(bp);
error =
- UFS_BLKATOFF(vdp, (off_t)dp->i_offset, NULL, &bp);
+ UFS_BLKATOFF(vdp, (off_t)i_offset, NULL, &bp);
if (error)
return (error);
entryoffsetinblock = 0;
@@ -294,9 +306,9 @@ searchloop:
(dirchk && ufs_dirbadentry(vdp, ep, entryoffsetinblock))) {
int i;
- ufs_dirbad(dp, dp->i_offset, "mangled entry");
+ ufs_dirbad(dp, i_offset, "mangled entry");
i = DIRBLKSIZ - (entryoffsetinblock & (DIRBLKSIZ - 1));
- dp->i_offset += i;
+ i_offset += i;
entryoffsetinblock += i;
continue;
}
@@ -315,15 +327,15 @@ searchloop:
if (size > 0) {
if (size >= slotneeded) {
slotstatus = FOUND;
- slotoffset = dp->i_offset;
+ slotoffset = i_offset;
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-projects
mailing list