msdosfs_denode.c (67885) | msdosfs_denode.c (71576) |
---|---|
1/* $FreeBSD: head/sys/fs/msdosfs/msdosfs_denode.c 67885 2000-10-29 14:54:55Z phk $ */ | 1/* $FreeBSD: head/sys/fs/msdosfs/msdosfs_denode.c 71576 2001-01-24 12:35:55Z jasone $ */ |
2/* $NetBSD: msdosfs_denode.c,v 1.28 1998/02/10 14:10:00 mrg Exp $ */ 3 4/*- 5 * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank. 6 * Copyright (C) 1994, 1995, 1997 TooLs GmbH. 7 * All rights reserved. 8 * Original code by Paul Popelka (paulp@uts.amdahl.com) (see below). 9 * --- 41 unchanged lines hidden (view full) --- 51#include <sys/param.h> 52#include <sys/systm.h> 53#include <sys/kernel.h> 54#include <sys/mount.h> 55#include <sys/malloc.h> 56#include <sys/bio.h> 57#include <sys/buf.h> 58#include <sys/vnode.h> | 2/* $NetBSD: msdosfs_denode.c,v 1.28 1998/02/10 14:10:00 mrg Exp $ */ 3 4/*- 5 * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank. 6 * Copyright (C) 1994, 1995, 1997 TooLs GmbH. 7 * All rights reserved. 8 * Original code by Paul Popelka (paulp@uts.amdahl.com) (see below). 9 * --- 41 unchanged lines hidden (view full) --- 51#include <sys/param.h> 52#include <sys/systm.h> 53#include <sys/kernel.h> 54#include <sys/mount.h> 55#include <sys/malloc.h> 56#include <sys/bio.h> 57#include <sys/buf.h> 58#include <sys/vnode.h> |
59#include <sys/mutex.h> |
|
59 60#include <vm/vm.h> 61#include <vm/vm_extern.h> 62 | 60 61#include <vm/vm.h> 62#include <vm/vm_extern.h> 63 |
63#include <machine/mutex.h> 64 | |
65#include <msdosfs/bpb.h> 66#include <msdosfs/msdosfsmount.h> 67#include <msdosfs/direntry.h> 68#include <msdosfs/denode.h> 69#include <msdosfs/fat.h> 70 71static MALLOC_DEFINE(M_MSDOSFSNODE, "MSDOSFS node", "MSDOSFS vnode private part"); 72 73static struct denode **dehashtbl; 74static u_long dehash; /* size of hash table - 1 */ 75#define DEHASH(dev, dcl, doff) (dehashtbl[(minor(dev) + (dcl) + (doff) / \ 76 sizeof(struct direntry)) & dehash]) | 64#include <msdosfs/bpb.h> 65#include <msdosfs/msdosfsmount.h> 66#include <msdosfs/direntry.h> 67#include <msdosfs/denode.h> 68#include <msdosfs/fat.h> 69 70static MALLOC_DEFINE(M_MSDOSFSNODE, "MSDOSFS node", "MSDOSFS vnode private part"); 71 72static struct denode **dehashtbl; 73static u_long dehash; /* size of hash table - 1 */ 74#define DEHASH(dev, dcl, doff) (dehashtbl[(minor(dev) + (dcl) + (doff) / \ 75 sizeof(struct direntry)) & dehash]) |
77#ifndef NULL_SIMPLELOCKS 78static struct simplelock dehash_slock; 79#endif | 76static struct mtx dehash_mtx; |
80 81union _qcvt { 82 quad_t qcvt; 83 long val[2]; 84}; 85#define SETHIGH(q, h) { \ 86 union _qcvt tmp; \ 87 tmp.qcvt = (q); \ --- 14 unchanged lines hidden (view full) --- 102static void msdosfs_hashrem __P((struct denode *dep)); 103 104/*ARGSUSED*/ 105int 106msdosfs_init(vfsp) 107 struct vfsconf *vfsp; 108{ 109 dehashtbl = hashinit(desiredvnodes/2, M_MSDOSFSMNT, &dehash); | 77 78union _qcvt { 79 quad_t qcvt; 80 long val[2]; 81}; 82#define SETHIGH(q, h) { \ 83 union _qcvt tmp; \ 84 tmp.qcvt = (q); \ --- 14 unchanged lines hidden (view full) --- 99static void msdosfs_hashrem __P((struct denode *dep)); 100 101/*ARGSUSED*/ 102int 103msdosfs_init(vfsp) 104 struct vfsconf *vfsp; 105{ 106 dehashtbl = hashinit(desiredvnodes/2, M_MSDOSFSMNT, &dehash); |
110 simple_lock_init(&dehash_slock); | 107 mtx_init(&dehash_mtx, "msdosfs dehash", MTX_DEF); |
111 return (0); 112} 113 114int 115msdosfs_uninit(vfsp) 116 struct vfsconf *vfsp; 117{ 118 119 if (dehashtbl) 120 free(dehashtbl, M_MSDOSFSMNT); | 108 return (0); 109} 110 111int 112msdosfs_uninit(vfsp) 113 struct vfsconf *vfsp; 114{ 115 116 if (dehashtbl) 117 free(dehashtbl, M_MSDOSFSMNT); |
118 mtx_destroy(&dehash_mtx); |
|
121 return (0); 122} 123 124static struct denode * 125msdosfs_hashget(dev, dirclust, diroff) 126 dev_t dev; 127 u_long dirclust; 128 u_long diroff; 129{ 130 struct proc *p = curproc; /* XXX */ 131 struct denode *dep; 132 struct vnode *vp; 133 134loop: | 119 return (0); 120} 121 122static struct denode * 123msdosfs_hashget(dev, dirclust, diroff) 124 dev_t dev; 125 u_long dirclust; 126 u_long diroff; 127{ 128 struct proc *p = curproc; /* XXX */ 129 struct denode *dep; 130 struct vnode *vp; 131 132loop: |
135 simple_lock(&dehash_slock); | 133 mtx_enter(&dehash_mtx, MTX_DEF); |
136 for (dep = DEHASH(dev, dirclust, diroff); dep; dep = dep->de_next) { 137 if (dirclust == dep->de_dirclust 138 && diroff == dep->de_diroffset 139 && dev == dep->de_dev 140 && dep->de_refcnt != 0) { 141 vp = DETOV(dep); 142 mtx_enter(&vp->v_interlock, MTX_DEF); | 134 for (dep = DEHASH(dev, dirclust, diroff); dep; dep = dep->de_next) { 135 if (dirclust == dep->de_dirclust 136 && diroff == dep->de_diroffset 137 && dev == dep->de_dev 138 && dep->de_refcnt != 0) { 139 vp = DETOV(dep); 140 mtx_enter(&vp->v_interlock, MTX_DEF); |
143 simple_unlock(&dehash_slock); | 141 mtx_exit(&dehash_mtx, MTX_DEF); |
144 if (vget(vp, LK_EXCLUSIVE | LK_INTERLOCK, p)) 145 goto loop; 146 return (dep); 147 } 148 } | 142 if (vget(vp, LK_EXCLUSIVE | LK_INTERLOCK, p)) 143 goto loop; 144 return (dep); 145 } 146 } |
149 simple_unlock(&dehash_slock); | 147 mtx_exit(&dehash_mtx, MTX_DEF); |
150 return (NULL); 151} 152 153static void 154msdosfs_hashins(dep) 155 struct denode *dep; 156{ 157 struct denode **depp, *deq; 158 | 148 return (NULL); 149} 150 151static void 152msdosfs_hashins(dep) 153 struct denode *dep; 154{ 155 struct denode **depp, *deq; 156 |
159 simple_lock(&dehash_slock); | 157 mtx_enter(&dehash_mtx, MTX_DEF); |
160 depp = &DEHASH(dep->de_dev, dep->de_dirclust, dep->de_diroffset); 161 deq = *depp; 162 if (deq) 163 deq->de_prev = &dep->de_next; 164 dep->de_next = deq; 165 dep->de_prev = depp; 166 *depp = dep; | 158 depp = &DEHASH(dep->de_dev, dep->de_dirclust, dep->de_diroffset); 159 deq = *depp; 160 if (deq) 161 deq->de_prev = &dep->de_next; 162 dep->de_next = deq; 163 dep->de_prev = depp; 164 *depp = dep; |
167 simple_unlock(&dehash_slock); | 165 mtx_exit(&dehash_mtx, MTX_DEF); |
168} 169 170static void 171msdosfs_hashrem(dep) 172 struct denode *dep; 173{ 174 struct denode *deq; 175 | 166} 167 168static void 169msdosfs_hashrem(dep) 170 struct denode *dep; 171{ 172 struct denode *deq; 173 |
176 simple_lock(&dehash_slock); | 174 mtx_enter(&dehash_mtx, MTX_DEF); |
177 deq = dep->de_next; 178 if (deq) 179 deq->de_prev = dep->de_prev; 180 *dep->de_prev = deq; 181#ifdef DIAGNOSTIC 182 dep->de_next = NULL; 183 dep->de_prev = NULL; 184#endif | 175 deq = dep->de_next; 176 if (deq) 177 deq->de_prev = dep->de_prev; 178 *dep->de_prev = deq; 179#ifdef DIAGNOSTIC 180 dep->de_next = NULL; 181 dep->de_prev = NULL; 182#endif |
185 simple_unlock(&dehash_slock); | 183 mtx_exit(&dehash_mtx, MTX_DEF); |
186} 187 188/* 189 * If deget() succeeds it returns with the gotten denode locked(). 190 * 191 * pmp - address of msdosfsmount structure of the filesystem containing 192 * the denode of interest. The pm_dev field and the address of 193 * the msdosfsmount structure are used. --- 522 unchanged lines hidden (view full) --- 716 * If we are done with the denode, reclaim it 717 * so that it can be reused immediately. 718 */ 719#ifdef MSDOSFS_DEBUG 720 printf("msdosfs_inactive(): v_usecount %d, de_Name[0] %x\n", vp->v_usecount, 721 dep->de_Name[0]); 722#endif 723 if (dep->de_Name[0] == SLOT_DELETED) | 184} 185 186/* 187 * If deget() succeeds it returns with the gotten denode locked(). 188 * 189 * pmp - address of msdosfsmount structure of the filesystem containing 190 * the denode of interest. The pm_dev field and the address of 191 * the msdosfsmount structure are used. --- 522 unchanged lines hidden (view full) --- 714 * If we are done with the denode, reclaim it 715 * so that it can be reused immediately. 716 */ 717#ifdef MSDOSFS_DEBUG 718 printf("msdosfs_inactive(): v_usecount %d, de_Name[0] %x\n", vp->v_usecount, 719 dep->de_Name[0]); 720#endif 721 if (dep->de_Name[0] == SLOT_DELETED) |
724 vrecycle(vp, (struct simplelock *)0, p); | 722 vrecycle(vp, NULL, p); |
725 return (error); 726} | 723 return (error); 724} |