Deleted Added
full compact
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}