NFS update

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4746 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2012-05-18 01:11:57 +00:00
parent 6d58ba972f
commit bab803e9fd
9 changed files with 1075 additions and 261 deletions

View File

@ -75,7 +75,7 @@ struct nfsmount
sem_t nm_sem; /* Used to assume thread-safe access */
int nm_numgrps; /* Max. size of groupslist */
nfsfh_t nm_fh; /* File handle of root dir */
char *nm_path; /* server's path of the directory being mount */
char nm_path[90]; /* server's path of the directory being mount */
int nm_fhsize; /* Size of root file handle */
struct rpcclnt *nm_rpcclnt; /* rpc state */
struct socket *nm_so; /* Rpc socket */

View File

@ -142,9 +142,9 @@ struct nfsnode
struct timespec nf_mtim;
off_t nd_direof; /* Directory EOF offset cache */
} n_un2;
short n_fhsize; /* size in bytes, of fh */
//short n_fhsize; /* size in bytes, of fh */
short n_flag; /* Flag for locking.. */
nfsfh_t n_fh; /* Small File Handle */
//nfsfh_t n_fh; /* Small File Handle */
time_t n_accstamp; /* Access cache timestamp */
uid_t n_accuid; /* Last access requester */
int n_accmode; /* Last mode requested */

View File

@ -632,14 +632,8 @@ struct READDIR3resok
struct dirlist3 reply;
};
struct FSINFOargs
struct FS3args
{
nfsfh_t fsroot;
};
struct FSSTAT3args
{
nfsfh_t fsroot;
};
#endif

View File

@ -141,9 +141,9 @@ int nfs_connect(struct nfsmount *nmp)
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_flag |= RPCCLNT_REDIRECT; /* Make this a mount option. */
rpc->rc_authtype = RPCAUTH_NULL; /* for now */
//rpc->rc_authtype = RPCAUTH_NULL; /* for now */
rpc->rc_path = nmp->nm_path;
rpc->rc_name = &nmp->nm_nam;
@ -152,7 +152,7 @@ int nfs_connect(struct nfsmount *nmp)
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_deadthresh = nmp->nm_deadthresh;
rpc->rc_timeo = nmp->nm_timeo;
rpc->rc_retry = nmp->nm_retry;
@ -180,29 +180,31 @@ void nfs_safedisconnect(struct nfsmount *nmp)
}
#endif
int nfs_request(struct nfsmount *nmp, int procnum, void *datain, void **dataout)
int nfs_request(struct nfsmount *nmp, int procnum, FAR const void *datain,
void *dataout)
{
int error;
struct rpcclnt *clnt= nmp->nm_rpcclnt;
struct rpc_reply reply;
struct rpc_reply_header replyh;
int trylater_delay;
tryagain:
memset(&reply, 0, sizeof(reply));
memset(&replyh, 0, sizeof(struct rpc_reply_header));
error = rpcclnt_request(clnt, procnum, nmp->nm_rpcclnt->rc_prog->prog_id,
nmp->nm_rpcclnt->rc_prog->prog_version, &reply, datain);
nmp->nm_rpcclnt->rc_prog->prog_version, dataout,
datain);
if (error != 0)
{
goto out;
}
*dataout = (void *)reply.stat.where;
bcopy(dataout, &replyh, sizeof(replyh));
if (reply.rpc_verfi.authtype != 0)
if (replyh.rpc_verfi.authtype != 0)
{
error = fxdr_unsigned(int, reply.rpc_verfi.authtype);
error = fxdr_unsigned(int, replyh.rpc_verfi.authtype);
if ((nmp->nm_flag & NFSMNT_NFSV3) && error == NFSERR_TRYLATER)
{
@ -240,9 +242,13 @@ out:
return error;
}
#undef COMP
#ifdef COMP
/* terminate any outstanding RPCs. */
int nfs_nmcancelreqs(struct nfsmount *nmp)
{
return rpcclnt_cancelreqs(nmp->nm_rpcclnt);
return 0; //rpcclnt_cancelreqs(nmp->nm_rpcclnt);
}
#endif

View File

@ -61,9 +61,11 @@ EXTERN void nfs_disconnect(struct nfsmount *);
EXTERN int nfs_sigintr(struct nfsmount *, struct nfsreq *, cthread_t *);
EXTERN void nfs_safedisconnect(struct nfsmount *);
#endif
EXTERN int nfs_request(struct nfsmount *, int, void *, void **);
EXTERN int nfs_request(struct nfsmount *, int, FAR const void *, void *);
#undef COMP
#ifdef COMP
EXTERN int nfs_nmcancelreqs(struct nfsmount *);
#endif
#undef EXTERN
#if defined(__cplusplus)
}

View File

@ -593,7 +593,7 @@ int nfs_readdirrpc(struct nfsmount *nmp, struct nfsnode *np,
int error = 0;
void *datareply;
struct READDIR3args readir;
struct READDIR3resok *resok;
struct READDIR3resok *resok = NULL;
/* Loop around doing readdir rpc's of size nm_readdirsize
* truncated to a multiple of NFS_READDIRBLKSIZ.
@ -903,6 +903,7 @@ void nfs_decode_args(struct nfsmount *nmp, struct nfs_args *argp)
nmp->nm_readdirsize = maxio;
}
/*
if ((argp->flags & NFSMNT_MAXGRPS) && argp->maxgrouplist >= 0 &&
argp->maxgrouplist <= NFS_MAXGRPS)
{
@ -914,6 +915,7 @@ void nfs_decode_args(struct nfsmount *nmp, struct nfs_args *argp)
{
nmp->nm_readahead = argp->readahead;
}
*/
if (argp->flags & NFSMNT_ACREGMIN && argp->acregmin >= 0)
{
@ -1028,11 +1030,7 @@ int mountnfs(struct nfs_args *argp, void **handle)
nmp->nm_acdirmin = NFS_MINATTRTIMO;
nmp->nm_acdirmax = NFS_MAXATTRTIMO;
nmp->nm_fh = argp->fh;
//strncpy(&mp->mnt_stat.f_fstypename[0], mp->mnt_vfc->vfc_name, MFSNAMELEN);
//memmove(hst, mp->mnt_stat.f_mntfromname, MNAMELEN);
//bcopy(pth, nmp->nm_mntonname, 90);
nmp->nm_path = argp->path;
//memmove(argp, &mp->mnt_stat.mount_info.nfs_args, sizeof(*argp));
strncpy(nmp->nm_path, argp->path,90);
nmp->nm_nam = argp->addr;
nfs_decode_args(nmp, argp);
@ -1048,6 +1046,7 @@ int mountnfs(struct nfs_args *argp, void **handle)
}
nmp->nm_head = np;
/* Set up the sockets and per-host congestion */
nmp->nm_sotype = argp->sotype;
@ -1179,7 +1178,7 @@ static int nfs_statfs(struct inode *mountpt, struct statfs *sbp)
int error = 0;
uint64_t tquad;
void *datareply;
struct FSSTAT3args fsstat;
struct FS3args fsstat;
/* Sanity checks */
@ -1210,7 +1209,7 @@ static int nfs_statfs(struct inode *mountpt, struct statfs *sbp)
}
nfsstats.rpccnt[NFSPROC_FSSTAT]++;
memset(&fsstat, 0, sizeof(struct FSSTAT3args));
memset(&fsstat, 0, sizeof(struct FS3args));
fsstat.fsroot = nmp->nm_fh;
error = nfs_request(nmp, NFSPROC_FSSTAT, &fsstat, &datareply);
if (error)
@ -1542,7 +1541,7 @@ errout_with_semaphore:
static int nfs_fsinfo(struct inode *mountpt, const char *relpath, struct stat *buf)
{
struct nfsv3_fsinfo *fsp;
struct FSINFOargs fsinfo;
struct FS3args fsinfo;
struct nfsmount *nmp;
uint32_t pref, max;
int error = 0;

View File

@ -74,6 +74,7 @@
****************************************************************************/
#include <sys/types.h>
#include "nfs_proto.h"
/****************************************************************************
* Pre-processor Definitions
@ -99,7 +100,7 @@
#define PMAPPROG 100000
#define PMAPVERS 2
#define PMAPPROC_NULL 0
#define MAPPROC_SET 1
#define PMAPPROC_SET 1
#define PMAPPROC_UNSET 2
#define PMAPPROC_GETPORT 3
#define PMAPPROC_DUMP 4
@ -109,6 +110,12 @@
* Public Types
****************************************************************************/
struct xidr
{
uint32_t xid;
};
/* PMAP headers */
struct call_args_pmap
{
uint32_t prog;
@ -117,18 +124,236 @@ struct call_args_pmap
uint32_t port;
};
struct call_result_pmap
struct call_result_pmap
{
uint16_t port;
unsigned char *extradata;
};
struct call_result_mount
/* MOUNTD headers */
struct call_args_mount
{
char *rpath;
uint8_t len;
};
struct call_result_mount
{
uint16_t problem;
nfsfh_t fhandle;
};
/* Generic RPC call headers */
enum auth_flavor
{
AUTH_NONE = 0,
AUTH_SYS = 1,
AUTH_SHORT = 2
/* and more to be defined */
};
struct rpc_auth_info
{
enum auth_flavor authtype; /* auth type */
uint32_t authlen; /* auth length */
};
struct auth_unix
{
int32_t stamp;
unsigned char hostname; /* null */
int32_t uid;
int32_t gid;
int32_t gidlist; /* null */
};
struct rpc_call_header
{
uint32_t rp_xid; /* request transaction id */
int32_t rp_direction; /* call direction (0) */
uint32_t rp_rpcvers; /* rpc version (2) */
uint32_t rp_prog; /* program */
uint32_t rp_vers; /* version */
uint32_t rp_proc; /* procedure */
struct rpc_auth_info rpc_auth;
#ifdef CONFIG_NFS_UNIX_AUTH
struct auth_unix rpc_unix;
#endif
struct rpc_auth_info rpc_verf;
};
struct rpc_call_pmap
{
struct rpc_call_header ch;
struct call_args_pmap pmap;
};
struct rpc_call_mount
{
struct rpc_call_header ch;
struct call_args_mount mount;
};
struct rpc_call_create
{
struct rpc_call_header ch;
struct CREATE3args create;
};
struct rpc_call_read
{
struct rpc_call_header ch;
struct READ3args read;
};
struct rpc_call_write
{
struct rpc_call_header ch;
struct WRITE3args write;
};
struct rpc_call_remove
{
struct rpc_call_header ch;
struct REMOVE3args remove;
};
struct rpc_call_rename
{
struct rpc_call_header ch;
struct RENAME3args rename;
};
struct rpc_call_mkdir
{
struct rpc_call_header ch;
struct MKDIR3args mkdir;
};
struct rpc_call_rmdir
{
struct rpc_call_header ch;
struct RMDIR3args rmdir;
};
struct rpc_call_readdir
{
struct rpc_call_header ch;
struct READDIR3args readdir;
};
struct rpc_call_fs
{
struct rpc_call_header ch;
struct FS3args fs;
};
/* Generic RPC reply headers */
struct rpc_reply_header
{
uint32_t rp_xid; /* request transaction id */
int32_t rp_direction; /* call direction (1) */
struct
{
uint32_t type;
uint32_t status;
/* used only when reply == RPC_MSGDENIED and status == RPC_AUTHERR */
uint32_t autherr;
/* rpc mismatch info if reply == RPC_MSGDENIED and status == RPC_MISMATCH */
struct
{
uint32_t low;
uint32_t high;
} mismatch_info;
} stat;
unsigned char *where;
struct rpc_auth_info rpc_verfi;
};
struct rpc_reply_pmap
{
struct rpc_reply_header rh;
struct call_result_pmap pmap;
};
struct rpc_reply_mount
{
struct rpc_reply_header rh;
struct call_result_mount mount;
};
struct rpc_reply_create
{
struct rpc_reply_header rh;
struct CREATE3resok create;
};
struct rpc_reply_write
{
struct rpc_reply_header rh;
struct WRITE3resok write;
};
struct rpc_reply_read
{
struct rpc_reply_header rh;
struct READ3resok read;
};
struct rpc_reply_remove
{
struct rpc_reply_header rh;
struct REMOVE3resok remove;
};
struct rpc_reply_rename
{
struct rpc_reply_header rh;
struct RENAME3resok rename;
};
struct rpc_reply_mkdir
{
struct rpc_reply_header rh;
struct MKDIR3resok mkdir;
};
struct rpc_reply_rmdir
{
struct rpc_reply_header rh;
struct RMDIR3resok rmdir;
};
struct rpc_reply_readdir
{
struct rpc_reply_header rh;
struct READDIR3resok readdir;
};
struct rpc_reply_fsinfo
{
struct rpc_reply_header rh;
struct nfsv3_fsinfo fsinfo;
};
struct rpc_reply_fsstat
{
struct rpc_reply_header rh;
struct nfs_statfs fsstat;
};
/* RPC Client connection context. One allocated on every NFS mount.
* Holds RPC specific information for mount.
*/
struct rpc_program
{
uint32_t prog_id;
@ -149,118 +374,49 @@ struct rpctask
int r_rtt; /* RTT for rpc */
};
/* Generic RPC headers */
struct rpc_auth_info
{
uint32_t authtype; /* auth type */
uint32_t authlen; /* auth length */
};
struct auth_unix
{
int32_t ua_time;
int32_t ua_hostname; /* null */
int32_t ua_uid;
int32_t ua_gid;
int32_t ua_gidlist; /* null */
};
struct rpc_call
{
uint32_t rp_xid; /* request transaction id */
int32_t rp_direction; /* call direction (0) */
uint32_t rp_rpcvers; /* rpc version (2) */
uint32_t rp_prog; /* program */
uint32_t rp_vers; /* version */
uint32_t rp_proc; /* procedure */
unsigned char *data;
struct rpc_auth_info rpc_auth;
#ifdef CONFIG_NFS_UNIX_AUTH
struct auth_unix rpc_unix;
#endif
struct rpc_auth_info rpc_verf;
};
struct rpc_reply
{
uint32_t rp_xid; /* request transaction id */
int32_t rp_direction; /* call direction (1) */
struct
{
uint32_t type;
uint32_t status;
unsigned char *where; /* Data */
/* used only when reply == RPC_MSGDENIED and status == RPC_AUTHERR */
uint32_t autherr;
/* rpc mismatch info if reply == RPC_MSGDENIED and status == RPC_MISMATCH */
struct
{
uint32_t low;
uint32_t high;
} mismatch_info;
} stat;
struct rpc_auth_info rpc_verfi;
};
/* RPC Client connection context.
* One allocated on every NFS mount.
* Holds RPC specific information for mount.
*/
/* XXX: please note that all pointer type variables are just set (not copied),
* so it is up to the user to free these values */
struct rpcclnt
{
int rc_flag; /* For RPCCLNT_* flags */
int rc_flag; /* For RPCCLNT_* flags */
int rc_wsize; /* Max size of the request data */
int rc_rsize; /* Max size of the response data */
nfsfh_t rc_fh; /* File handle of root dir */
char *rc_path; /* server's path of the directory being mount */
int rc_wsize; /* Max size of the request data */
int rc_rsize; /* Max size of the response data */
nfsfh_t rc_fh; /* File handle of root dir */
char *rc_path; /* server's path of the directory being mount */
struct sockaddr *rc_name;
struct socket *rc_so; /* Rpc socket */
struct socket *rc_so; /* Rpc socket */
uint8_t rc_sotype; /* Type of socket */
int rc_soproto; /* and protocol */
uint8_t rc_soflags; /* pr_flags for socket protocol */
uint8_t rc_sotype; /* Type of socket */
int rc_soproto; /* and protocol */
uint8_t rc_soflags; /* pr_flags for socket protocol */
int rc_timeo; /* Init timer for NFSMNT_DUMBTIMR */
int rc_retry; /* Max retries */
int rc_srtt[4]; /* Timers for rpcs */
int rc_timeo; /* Init timer for NFSMNT_DUMBTIMR */
int rc_retry; /* Max retries */
int rc_srtt[4]; /* Timers for rpcs */
int rc_sdrtt[4];
int rc_sent; /* Request send count */
int rc_cwnd; /* Request send window */
int rc_timeouts; /* Request timeouts */
int rc_sent; /* Request send count */
int rc_cwnd; /* Request send window */
int rc_timeouts; /* Request timeouts */
int rc_deadthresh; /* Threshold of timeouts-->dead server*/
//int rc_deadthresh; /* Threshold of timeouts-->dead server*/
/* authentication: */
/* currently can be RPCAUTH_NULL, RPCAUTH_KERBV4, RPCAUTH_UNIX */
/* should be kept in XDR form */
int rc_authtype; /* Authenticator type */
// int rc_authtype; /* Authenticator type */
#ifdef CONFIG_NFS_UNIX_AUTH
/* RPCAUTH_UNIX*/
struct rpc_auth_info rc_oldauth; /* authentication */
struct rpc_auth_info rc_oldauth; /* authentication */
#endif
void *rc_auth;
//void *rc_auth;
struct rpc_program *rc_prog;
//char *rc_servername;
int rc_proctlen; /* if == 0 then rc_proct == NULL */
int rc_proctlen; /* if == 0 then rc_proct == NULL */
int *rc_proct;
};
@ -274,8 +430,10 @@ int rpcclnt_reconnect(struct rpctask *);
void rpcclnt_disconnect(struct rpcclnt *);
int rpcclnt_umount(struct rpcclnt *);
void rpcclnt_safedisconnect(struct rpcclnt *);
int rpcclnt_request(struct rpcclnt *, int, int, int, struct rpc_reply *, void *);
int rpcclnt_request(struct rpcclnt *, int, int, int, void *, FAR const void *);
#undef COMP
#ifdef COMP
int rpcclnt_cancelreqs(struct rpcclnt *);
#endif
#endif /* _RPCCLNT_H_ */

File diff suppressed because it is too large Load Diff

View File

@ -93,6 +93,7 @@
#define NFS_ARGSVERSION 3 /* change when nfs_args changes */
#define NFS_MAXFHSIZE 64
#define NFS_PORT 2049
#define NFS_PMAPPORT 111
/****************************************************************************
* Public Types
@ -123,10 +124,10 @@ struct nfs_args
int readdirsize; /* readdir size in bytes */
int timeo; /* initial timeout in .1 secs */
int retrans; /* times to retry send */
int maxgrouplist; /* Max. size of group list */
int readahead; /* # of blocks to readahead */
int leaseterm; /* Term (sec) of lease */
int deadthresh; /* Retrans threshold */
//int maxgrouplist; /* Max. size of group list */
//int readahead; /* # of blocks to readahead */
//int leaseterm; /* Term (sec) of lease */
//int deadthresh; /* Retrans threshold */
char *path; /* server's path of the directory being mount */
int acregmin; /* cache attrs for reg files min time */
int acregmax; /* cache attrs for reg files max time */