NFS update

git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@4657 7fd9a85b-ad96-42d3-883c-3090e2eb8679
This commit is contained in:
patacongo 2012-04-25 23:22:09 +00:00
parent b77059b500
commit 414af0aef2
6 changed files with 65 additions and 76 deletions

View File

@ -8,7 +8,7 @@
<tr align="center" bgcolor="#e4e4e4">
<td>
<h1><big><font color="#3c34ec"><i>NuttX RTOS</i></font></big></h1>
<p>Last Updated: April 23, 2012</p>
<p>Last Updated: April 25, 2012</p>
</td>
</tr>
</table>
@ -2252,7 +2252,9 @@
</li>
<p>
<b>STATUS:</b>
A configuration exists for this board, but has not been verfied as of this writing.
A basic OS test configuration is in place, but the board does not boot.
It looks like I will need an ICD3 in order to debug the code (PICkit3
doesn't work for debugging with this board). This effort is temporarily stalled.
</p>
</ul>
</td>

View File

@ -1496,6 +1496,10 @@ configs/pic32mx7mmb
Mikroelektronika PIC32MX7 Multimedia Board (MMB). See
http://www.mikroe.com/ for further information.
STATUS: Basic OS test configuration is in place, but the board does not boot.
It looks like I will need an ICD3 in order to debug the code (PICkit3
doesn't work for debug with this board). This effort is temporarily stalled.
configs/pjrc-8051
8051 Microcontroller. This port uses the PJRC 87C52 development system
and the SDCC toolchain. This port is not quite ready for prime time.

View File

@ -112,54 +112,50 @@ void nfs_init(void)
int nfs_connect(struct nfsmount *nmp)
{
struct rpcclnt *rpc;
int error = 0;
struct rpcclnt rpc;
if (nmp == NULL)
{
return EFAULT;
}
rpc = nmp->nm_rpcclnt;
//memset(rpc, 0, sizeof(*rpc));
rpc->rc_prog = &nfs3_program;
rpc.rc_prog = &nfs3_program;
nvdbg("nfsxconnect!\n");
nvdbg("nfs connect!\n");
/* translate nfsmnt flags -> rpcclnt flags */
rpc->rc_flag = 0;
nfsmnt_to_rpcclnt(nmp->nm_flag, rpc->rc_flag, SOFT);
nfsmnt_to_rpcclnt(nmp->nm_flag, rpc->rc_flag, INT);
nfsmnt_to_rpcclnt(nmp->nm_flag, rpc->rc_flag, NOCONN);
nfsmnt_to_rpcclnt(nmp->nm_flag, rpc->rc_flag, DUMBTIMR);
rpc.rc_flag = 0;
nfsmnt_to_rpcclnt(nmp->nm_flag, rpc.rc_flag, SOFT);
nfsmnt_to_rpcclnt(nmp->nm_flag, rpc.rc_flag, INT);
nfsmnt_to_rpcclnt(nmp->nm_flag, rpc.rc_flag, NOCONN);
nfsmnt_to_rpcclnt(nmp->nm_flag, rpc.rc_flag, DUMBTIMR);
//rpc->rc_flag |= RPCCLNT_REDIRECT; /* Make this a mount option. */
rpc->rc_authtype = RPCAUTH_NULL; /* for now */
rpc.rc_authtype = RPCAUTH_NULL; /* for now */
//rpc->rc_servername = nmp->nm_mountp->mnt_stat.f_mntfromname;
rpc->rc_name = nmp->nm_nam;
rpc.rc_name = nmp->nm_nam;
rpc->rc_sotype = nmp->nm_sotype;
rpc->rc_soproto = nmp->nm_soproto;
rpc->rc_rsize = (nmp->nm_rsize > nmp->nm_readdirsize) ?
rpc.rc_sotype = nmp->nm_sotype;
rpc.rc_soproto = nmp->nm_soproto;
rpc.rc_rsize = (nmp->nm_rsize > nmp->nm_readdirsize) ?
nmp->nm_rsize : nmp->nm_readdirsize;
rpc->rc_wsize = nmp->nm_wsize;
rpc->rc_deadthresh = nmp->nm_deadthresh;
rpc->rc_timeo = nmp->nm_timeo;
rpc->rc_retry = nmp->nm_retry;
rpc.rc_wsize = nmp->nm_wsize;
rpc.rc_deadthresh = nmp->nm_deadthresh;
rpc.rc_timeo = nmp->nm_timeo;
rpc.rc_retry = nmp->nm_retry;
/* XXX v2,3 need to use this */
/* v3 need to use this */
rpc->rc_proctlen = 0;
rpc->rc_proct = NULL;
rpc.rc_proctlen = 0;
rpc.rc_proct = NULL;
nmp->nm_rpcclnt = &rpc;
if (error)
{
return error;
}
return rpcclnt_connect(rpc);
return rpcclnt_connect(&rpc);
}
/* NFS disconnect. Clean up and unlink. */

View File

@ -65,6 +65,7 @@
#include <nuttx/fs/dirent.h>
#include <nuttx/fs/fs.h>
#include <nuttx/fs/nfs.h>
#include <semaphore.h>
#include <net/if.h>
#include <netinet/in.h>
@ -984,30 +985,15 @@ int mountnfs(struct nfs_args *argp, struct sockaddr *nam, void **handle)
struct nfsmount *nmp;
int error;
/* Open the block driver */
/*
if (!blkdriver || !blkdriver->u.i_bops)
{
fdbg("No block driver/ops\n");
return -ENODEV;
}
if (blkdriver->u.i_bops->open &&
blkdriver->u.i_bops->open(blkdriver) != OK)
{
fdbg("No open method\n");
return -ENODEV;
}
*/
/* Create an instance of the mountpt state structure */
/*
nmp = (struct nfsmount *)kzalloc(sizeof(struct nfsmount));
if (!nmp)
{
fdbg("Failed to allocate mountpoint structure\n");
return -ENOMEM;
}
*/
/* Initialize the allocated mountpt state structure. The filesystem is
* responsible for one reference ont the blkdriver inode and does not
* have to addref() here (but does have to release in ubind().
@ -1015,8 +1001,8 @@ int mountnfs(struct nfs_args *argp, struct sockaddr *nam, void **handle)
sem_init(&nmp->nm_sem, 0, 0); /* Initialize the semaphore that controls access */
//nmp->nm_blkdriver = blkdriver; /* Save the block driver reference */
nfs_init();
nmp->nm_flag = argp->flags;
nmp->nm_timeo = NFS_TIMEO;
nmp->nm_retry = NFS_RETRANS;
nmp->nm_wsize = NFS_WSIZE;
@ -1054,6 +1040,7 @@ int mountnfs(struct nfs_args *argp, struct sockaddr *nam, void **handle)
/* Mounted! */
nmp->nm_mounted = true;
nmp->nm_so = nmp->nm_rpcclnt->rc_so;
*handle = &nmp;
nfs_semgive(nmp);
@ -1109,7 +1096,7 @@ static int nfs_bind(struct inode *blkdriver, const void *data, void **handle)
}
/****************************************************************************
* Name: nfs_unmount
* Name: nfs_unbind
*
* Description: This implements the filesystem portion of the umount
* operation.

View File

@ -221,12 +221,12 @@ struct rpcclnt
#endif
void *rc_auth;
struct rpc_program * rc_prog;
struct rpc_program *rc_prog;
//char *rc_servername;
int rc_proctlen; /* if == 0 then rc_proct == NULL */
int * rc_proct;
int *rc_proct;
};
/****************************************************************************

View File

@ -191,7 +191,7 @@ struct rpc_reply *replymsg;
/* Queue head for rpctask's */
static dq_queue_t *rpctask_q;
static dq_queue_t rpctask_q;
//struct callout_handle rpcclnt_timer_handle;
/****************************************************************************
@ -621,7 +621,7 @@ rpcclnt_reply(struct rpctask *myrep, struct rpc_call *call,
* match, just drop the datagram
*/
for (rep = (struct rpctask *)rpctask_q->head; rep;
for (rep = (struct rpctask *)&rpctask_q.head; rep;
rep = (struct rpctask *)rep->r_chain.flink)
{
if (rxid == rep->r_xid)
@ -635,6 +635,7 @@ rpcclnt_reply(struct rpctask *myrep, struct rpc_call *call,
rpc->rc_cwnd +=
(RPC_CWNDSCALE * RPC_CWNDSCALE +
(rpc->rc_cwnd >> 1)) / rpc->rc_cwnd;
if (rpc->rc_cwnd > RPC_MAXCWND)
{
rpc->rc_cwnd = RPC_MAXCWND;
@ -904,9 +905,9 @@ void rpcclnt_init(void)
/* Initialize rpctask queue */
dq_init(rpctask_q);
dq_init(&rpctask_q);
rpcclnt_timer(NULL, callmgs);
//rpcclnt_timer(NULL, callmgs);
nvdbg("rpc initialed");
return;
@ -930,13 +931,12 @@ int rpcclnt_connect(struct rpcclnt *rpc)
struct socket *so;
int error;
struct sockaddr *saddr;
struct sockaddr_in *sin = NULL;
struct timeval *tv = NULL;
struct sockaddr_in sin;
struct timeval tv;
uint16_t tport;
/* Create the socket */
rpc->rc_so = NULL;
saddr = rpc->rc_name;
error =
@ -956,15 +956,15 @@ int rpcclnt_connect(struct rpcclnt *rpc)
* filehandle disclosure through UDP port capture.
*/
sin->sin_family = AF_INET;
sin->sin_addr.s_addr = INADDR_ANY;
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
tport = 1024;
do
{
tport--;
sin->sin_port = htons(tport);
error = psock_bind(so, (struct sockaddr *)sin, sizeof(*sin));
sin.sin_port = htons(tport);
error = psock_bind(so, (struct sockaddr *)&sin, sizeof(sin));
}
while (error == EADDRINUSE && tport > 1024 / 2);
@ -984,7 +984,6 @@ int rpcclnt_connect(struct rpcclnt *rpc)
{
error = ENOTCONN;
goto bad;
}
else
{
@ -995,7 +994,6 @@ int rpcclnt_connect(struct rpcclnt *rpc)
{
dbg("psock_connect returns %d", error);
goto bad;
}
#ifdef CONFIG_NFS_TCPIP
}
@ -1005,12 +1003,12 @@ int rpcclnt_connect(struct rpcclnt *rpc)
* Otherwise, we can get stuck in psock_receive forever.
*/
tv->tv_sec = 1;
tv->tv_usec = 0;
tv.tv_sec = 1;
tv.tv_usec = 0;
if ((error =
psock_setsockopt(so, SOL_SOCKET, SO_RCVTIMEO, (const void *)tv,
sizeof(*tv))))
psock_setsockopt(so, SOL_SOCKET, SO_RCVTIMEO, (const void *)&tv,
sizeof(tv))))
{
goto bad;
}
@ -1037,6 +1035,7 @@ bad:
* nfs_sndlock() set on the mount point.
*/
#ifdef CONFIG_NFS_TCPIP
int rpcclnt_reconnect(struct rpctask *rep)
{
struct rpctask *rp;
@ -1056,7 +1055,7 @@ int rpcclnt_reconnect(struct rpctask *rep)
* requests on old socket.
*/
for (rp = (struct rpctask *)rpctask_q->head; rp != NULL;
for (rp = (struct rpctask *)&rpctask_q->head; rp != NULL;
rp = (struct rpctask *)rp->r_chain.blink)
{
if (rp->r_rpcclnt == rpc)
@ -1066,6 +1065,7 @@ int rpcclnt_reconnect(struct rpctask *rep)
}
return 0;
}
#endif
void rpcclnt_disconnect(struct rpcclnt *rpc)
{
@ -1117,7 +1117,7 @@ int rpcclnt_request(struct rpcclnt *rpc, int procnum, struct rpc_reply *reply, v
int xid = 0;
task = &_task;
memset(task, 0, sizeof(*task));
task->r_rpcclnt = rpc;
task->r_procnum = procnum;
@ -1159,7 +1159,7 @@ int rpcclnt_request(struct rpcclnt *rpc, int procnum, struct rpc_reply *reply, v
* LAST so timer finds oldest requests first.
*/
dq_addlast(&task->r_chain, rpctask_q);
dq_addlast(&task->r_chain, &rpctask_q);
/* If backing off another request or avoiding congestion, don't send
* this one now but let timer do it. If not timing a request, do it
@ -1208,7 +1208,7 @@ int rpcclnt_request(struct rpcclnt *rpc, int procnum, struct rpc_reply *reply, v
/* RPC done, unlink the request. */
dq_rem(&task->r_chain, rpctask_q);
dq_rem(&task->r_chain, &rpctask_q);
/* Decrement the outstanding request count. */
@ -1277,7 +1277,7 @@ int rpcclnt_request(struct rpcclnt *rpc, int procnum, struct rpc_reply *reply, v
reply->stat.mismatch_info.high =
fxdr_unsigned(uint32_t, replysvr->stat.mismatch_info.high);
ndbg("RPC_MSGACCEPTED: RPC_PROGMISMATCH error");
error = EOPNOTSUPP; /* XXXMARIUS */
error = EOPNOTSUPP;
}
else if (reply->stat.status > 5)
{
@ -1301,7 +1301,7 @@ void rpcclnt_timer(void *arg, struct rpc_call *call)
struct rpcclnt *rpc;
int timeo, error;
for (rep = (struct rpctask *)rpctask_q->head; rep;
for (rep = (struct rpctask *)&rpctask_q.head; rep;
rep = (struct rpctask *)rep->r_chain.flink)
{
rpc = rep->r_rpcclnt;
@ -1487,7 +1487,7 @@ int rpcclnt_cancelreqs(struct rpcclnt *rpc)
struct rpctask *task;
int i;
for (task = (struct rpctask *)rpctask_q->head; task;
for (task = (struct rpctask *)&rpctask_q.head; task;
task = (struct rpctask *)task->r_chain.flink)
{
if (rpc != task->r_rpcclnt || (task->r_flags & TASK_SOFTTERM))
@ -1500,7 +1500,7 @@ int rpcclnt_cancelreqs(struct rpcclnt *rpc)
for (i = 0; i < 30; i++)
{
for (task = (struct rpctask *)rpctask_q->head; task;
for (task = (struct rpctask *)&rpctask_q.head; task;
task = (struct rpctask *)task->r_chain.flink)
{
if (rpc == task->r_rpcclnt)