svn commit: r203789 - stable/8/sys/fs/nfsclient
Rick Macklem
rmacklem at FreeBSD.org
Thu Feb 11 21:25:49 UTC 2010
Author: rmacklem
Date: Thu Feb 11 21:25:48 2010
New Revision: 203789
URL: http://svn.freebsd.org/changeset/base/203789
Log:
MFC: r203119
Patch the experimental NFS client in a manner analogous to
r203072 for the regular NFS client. Also, delete two fields
of struct nfsmount that are not used by the FreeBSD port of
the client.
Modified:
stable/8/sys/fs/nfsclient/nfs.h
stable/8/sys/fs/nfsclient/nfs_clbio.c
stable/8/sys/fs/nfsclient/nfs_clnfsiod.c
stable/8/sys/fs/nfsclient/nfs_clsubs.c
stable/8/sys/fs/nfsclient/nfsmount.h
Directory Properties:
stable/8/sys/ (props changed)
stable/8/sys/amd64/include/xen/ (props changed)
stable/8/sys/cddl/contrib/opensolaris/ (props changed)
stable/8/sys/contrib/dev/acpica/ (props changed)
stable/8/sys/contrib/pf/ (props changed)
stable/8/sys/dev/xen/xenpci/ (props changed)
stable/8/sys/netinet/ (props changed)
Modified: stable/8/sys/fs/nfsclient/nfs.h
==============================================================================
--- stable/8/sys/fs/nfsclient/nfs.h Thu Feb 11 21:10:56 2010 (r203788)
+++ stable/8/sys/fs/nfsclient/nfs.h Thu Feb 11 21:25:48 2010 (r203789)
@@ -56,6 +56,19 @@
(VFSTONFS((v)->v_mount)->nm_flag & (NFSMNT_NFSV3 | NFSMNT_NFSV4))
/*
+ * NFS iod threads can be in one of these three states once spawned.
+ * NFSIOD_NOT_AVAILABLE - Cannot be assigned an I/O operation at this time.
+ * NFSIOD_AVAILABLE - Available to be assigned an I/O operation.
+ * NFSIOD_CREATED_FOR_NFS_ASYNCIO - Newly created for nfs_asyncio() and
+ * will be used by the thread that called nfs_asyncio().
+ */
+enum nfsiod_state {
+ NFSIOD_NOT_AVAILABLE = 0,
+ NFSIOD_AVAILABLE = 1,
+ NFSIOD_CREATED_FOR_NFS_ASYNCIO = 2,
+};
+
+/*
* Function prototypes.
*/
int ncl_meta_setsize(struct vnode *, struct ucred *, struct thread *,
@@ -87,7 +100,7 @@ int ncl_fsinfo(struct nfsmount *, struct
int ncl_init(struct vfsconf *);
int ncl_uninit(struct vfsconf *);
int ncl_mountroot(struct mount *);
-int ncl_nfsiodnew(void);
+int ncl_nfsiodnew(int);
#endif /* _KERNEL */
Modified: stable/8/sys/fs/nfsclient/nfs_clbio.c
==============================================================================
--- stable/8/sys/fs/nfsclient/nfs_clbio.c Thu Feb 11 21:10:56 2010 (r203788)
+++ stable/8/sys/fs/nfsclient/nfs_clbio.c Thu Feb 11 21:25:48 2010 (r203789)
@@ -63,7 +63,7 @@ extern int newnfs_directio_allow_mmap;
extern struct nfsstats newnfsstats;
extern struct mtx ncl_iod_mutex;
extern int ncl_numasync;
-extern struct proc *ncl_iodwant[NFS_MAXRAHEAD];
+extern enum nfsiod_state ncl_iodwant[NFS_MAXRAHEAD];
extern struct nfsmount *ncl_iodmount[NFS_MAXRAHEAD];
extern int newnfs_directio_enable;
@@ -1396,7 +1396,7 @@ again:
* Find a free iod to process this request.
*/
for (iod = 0; iod < ncl_numasync; iod++)
- if (ncl_iodwant[iod]) {
+ if (ncl_iodwant[iod] == NFSIOD_AVAILABLE) {
gotiod = TRUE;
break;
}
@@ -1405,7 +1405,7 @@ again:
* Try to create one if none are free.
*/
if (!gotiod) {
- iod = ncl_nfsiodnew();
+ iod = ncl_nfsiodnew(1);
if (iod != -1)
gotiod = TRUE;
}
@@ -1417,7 +1417,7 @@ again:
*/
NFS_DPF(ASYNCIO, ("ncl_asyncio: waking iod %d for mount %p\n",
iod, nmp));
- ncl_iodwant[iod] = NULL;
+ ncl_iodwant[iod] = NFSIOD_NOT_AVAILABLE;
ncl_iodmount[iod] = nmp;
nmp->nm_bufqiods++;
wakeup(&ncl_iodwant[iod]);
Modified: stable/8/sys/fs/nfsclient/nfs_clnfsiod.c
==============================================================================
--- stable/8/sys/fs/nfsclient/nfs_clnfsiod.c Thu Feb 11 21:10:56 2010 (r203788)
+++ stable/8/sys/fs/nfsclient/nfs_clnfsiod.c Thu Feb 11 21:25:48 2010 (r203789)
@@ -72,7 +72,7 @@ __FBSDID("$FreeBSD$");
extern struct mtx ncl_iod_mutex;
int ncl_numasync;
-struct proc *ncl_iodwant[NFS_MAXRAHEAD];
+enum nfsiod_state ncl_iodwant[NFS_MAXRAHEAD];
struct nfsmount *ncl_iodmount[NFS_MAXRAHEAD];
static void nfssvc_iod(void *);
@@ -114,7 +114,7 @@ sysctl_iodmin(SYSCTL_HANDLER_ARGS)
* than the new minimum, create some more.
*/
for (i = nfs_iodmin - ncl_numasync; i > 0; i--)
- ncl_nfsiodnew();
+ ncl_nfsiodnew(0);
out:
mtx_unlock(&ncl_iod_mutex);
return (0);
@@ -147,7 +147,7 @@ sysctl_iodmax(SYSCTL_HANDLER_ARGS)
*/
iod = ncl_numasync - 1;
for (i = 0; i < ncl_numasync - ncl_iodmax; i++) {
- if (ncl_iodwant[iod])
+ if (ncl_iodwant[iod] == NFSIOD_AVAILABLE)
wakeup(&ncl_iodwant[iod]);
iod--;
}
@@ -159,7 +159,7 @@ SYSCTL_PROC(_vfs_newnfs, OID_AUTO, iodma
sizeof (ncl_iodmax), sysctl_iodmax, "IU", "");
int
-ncl_nfsiodnew(void)
+ncl_nfsiodnew(int set_iodwant)
{
int error, i;
int newiod;
@@ -175,12 +175,17 @@ ncl_nfsiodnew(void)
}
if (newiod == -1)
return (-1);
+ if (set_iodwant > 0)
+ ncl_iodwant[i] = NFSIOD_CREATED_FOR_NFS_ASYNCIO;
mtx_unlock(&ncl_iod_mutex);
error = kproc_create(nfssvc_iod, nfs_asyncdaemon + i, NULL, RFHIGHPID,
0, "nfsiod %d", newiod);
mtx_lock(&ncl_iod_mutex);
- if (error)
+ if (error) {
+ if (set_iodwant > 0)
+ ncl_iodwant[i] = NFSIOD_NOT_AVAILABLE;
return (-1);
+ }
ncl_numasync++;
return (newiod);
}
@@ -199,7 +204,7 @@ nfsiod_setup(void *dummy)
nfs_iodmin = NFS_MAXRAHEAD;
for (i = 0; i < nfs_iodmin; i++) {
- error = ncl_nfsiodnew();
+ error = ncl_nfsiodnew(0);
if (error == -1)
panic("newnfsiod_setup: ncl_nfsiodnew failed");
}
@@ -235,7 +240,8 @@ nfssvc_iod(void *instance)
goto finish;
if (nmp)
nmp->nm_bufqiods--;
- ncl_iodwant[myiod] = curthread->td_proc;
+ if (ncl_iodwant[myiod] == NFSIOD_NOT_AVAILABLE)
+ ncl_iodwant[myiod] = NFSIOD_AVAILABLE;
ncl_iodmount[myiod] = NULL;
/*
* Always keep at least nfs_iodmin kthreads.
@@ -295,7 +301,7 @@ finish:
nfs_asyncdaemon[myiod] = 0;
if (nmp)
nmp->nm_bufqiods--;
- ncl_iodwant[myiod] = NULL;
+ ncl_iodwant[myiod] = NFSIOD_NOT_AVAILABLE;
ncl_iodmount[myiod] = NULL;
/* Someone may be waiting for the last nfsiod to terminate. */
if (--ncl_numasync == 0)
Modified: stable/8/sys/fs/nfsclient/nfs_clsubs.c
==============================================================================
--- stable/8/sys/fs/nfsclient/nfs_clsubs.c Thu Feb 11 21:10:56 2010 (r203788)
+++ stable/8/sys/fs/nfsclient/nfs_clsubs.c Thu Feb 11 21:25:48 2010 (r203789)
@@ -78,7 +78,7 @@ __FBSDID("$FreeBSD$");
#include <machine/stdarg.h>
extern struct mtx ncl_iod_mutex;
-extern struct proc *ncl_iodwant[NFS_MAXRAHEAD];
+extern enum nfsiod_state ncl_iodwant[NFS_MAXRAHEAD];
extern struct nfsmount *ncl_iodmount[NFS_MAXRAHEAD];
extern int ncl_numasync;
extern unsigned int ncl_iodmax;
@@ -100,7 +100,7 @@ ncl_uninit(struct vfsconf *vfsp)
mtx_lock(&ncl_iod_mutex);
ncl_iodmax = 0;
for (i = 0; i < ncl_numasync; i++)
- if (ncl_iodwant[i])
+ if (ncl_iodwant[i] == NFSIOD_AVAILABLE)
wakeup(&ncl_iodwant[i]);
/* The last nfsiod to exit will wake us up when ncl_numasync hits 0 */
while (ncl_numasync)
@@ -396,7 +396,7 @@ ncl_init(struct vfsconf *vfsp)
/* Ensure async daemons disabled */
for (i = 0; i < NFS_MAXRAHEAD; i++) {
- ncl_iodwant[i] = NULL;
+ ncl_iodwant[i] = NFSIOD_NOT_AVAILABLE;
ncl_iodmount[i] = NULL;
}
ncl_nhinit(); /* Init the nfsnode table */
Modified: stable/8/sys/fs/nfsclient/nfsmount.h
==============================================================================
--- stable/8/sys/fs/nfsclient/nfsmount.h Thu Feb 11 21:10:56 2010 (r203788)
+++ stable/8/sys/fs/nfsclient/nfsmount.h Thu Feb 11 21:25:48 2010 (r203789)
@@ -71,8 +71,6 @@ struct nfsmount {
int nm_tprintf_delay; /* interval for messages */
/* Newnfs additions */
- int nm_iothreadcnt;
- struct proc *nm_iodwant[NFS_MAXRAHEAD];
struct nfsclclient *nm_clp;
uid_t nm_uid; /* Uid for SetClientID etc. */
u_int64_t nm_clval; /* identifies which clientid */
More information about the svn-src-stable
mailing list