diff --git a/fs/nfs/nfs.h b/fs/nfs/nfs.h index a88e5b91c3..600e533507 100644 --- a/fs/nfs/nfs.h +++ b/fs/nfs/nfs.h @@ -53,31 +53,32 @@ * Pre-processor Definitions ****************************************************************************/ -#define NFS_TICKINTVL 5 /* Desired time for a tick (msec) */ +#define NFS_TICKINTVL 5 /* Desired time for a tick (msec) */ #define NFS_HZ (CLOCKS_PER_SEC / nfs_ticks) /* Ticks/sec */ #define NFS_TIMEO (1 * NFS_HZ) /* Default timeout = 1 second */ #define NFS_MINTIMEO (1 * NFS_HZ) /* Min timeout to use */ #define NFS_MAXTIMEO (60 * NFS_HZ) /* Max timeout to backoff to */ #define NFS_MINIDEMTIMEO (5 * NFS_HZ) /* Min timeout for non-idempotent ops */ -#define NFS_TIMEOUTMUL 2 /* Timeout/Delay multiplier */ -#define NFS_MAXREXMIT 100 /* Stop counting after this many */ -#define NFS_RETRANS 10 /* Num of retrans for soft mounts */ -#define NFS_MAXGRPS 16 /* Max. size of groups list */ -#define NFS_MINATTRTIMO 5 /* Attribute cache timeout in sec */ +#define NFS_TIMEOUTMUL 2 /* Timeout/Delay multiplier */ +#define NFS_MAXREXMIT 100 /* Stop counting after this many */ +#define NFS_RETRANS 10 /* Num of retrans for soft mounts */ +#define NFS_MAXGRPS 16 /* Max. size of groups list */ +#define NFS_MINATTRTIMO 5 /* Attribute cache timeout in sec */ #define NFS_MAXATTRTIMO 60 -#define NFS_WSIZE 8192 /* Def. write data size <= 8192 */ -#define NFS_RSIZE 8192 /* Def. read data size <= 8192 */ -#define NFS_READDIRSIZE 8192 /* Def. readdir size */ -#define NFS_DEFRAHEAD 1 /* Def. read ahead # blocks */ -#define NFS_MAXRAHEAD 4 /* Max. read ahead # blocks */ -#define NFS_MAXASYNCDAEMON 20 /* Max. number async_daemons runable */ +#define NFS_WSIZE 8192 /* Def. write data size <= 8192 */ +#define NFS_RSIZE 8192 /* Def. read data size <= 8192 */ +#define NFS_READDIRSIZE 8192 /* Def. readdir size */ +#define NFS_DEFRAHEAD 1 /* Def. read ahead # blocks */ +#define NFS_MAXRAHEAD 4 /* Max. read ahead # blocks */ +#define NFS_MAXASYNCDAEMON 20 /* Max. number async_daemons runable */ +#define NFS_NPROCS 23 /* Ideally, NFS_DIRBLKSIZ should be bigger, but I've seen servers with * broken NFS/ethernet drivers that won't work with anything bigger (Linux..) */ -#define NFS_DIRBLKSIZ 1024 /* Must be a multiple of DIRBLKSIZ */ -#define NFS_READDIRBLKSIZ 512 /* Size of read dir blocks. XXX */ +#define NFS_DIRBLKSIZ 1024 /* Must be a multiple of DIRBLKSIZ */ +#define NFS_READDIRBLKSIZ 512 /* Size of read dir blocks. XXX */ /* Oddballs */ @@ -189,13 +190,14 @@ /* Bits for "nd_flag" */ #define ND_NFSV3 0x08 - #define NFSD_CHECKSLP 0x01 /**************************************************************************** * Public Types ****************************************************************************/ +#undef COMP +#ifdef COMP /* Structures for the nfssvc(2) syscall. * Not that anyone besides nfsd(8) should ever use it. */ @@ -220,46 +222,6 @@ struct nfsd_srvargs uint32_t nsd_ttl; /* credential ttl (sec) */ }; -/* Stats structure */ - -struct nfsstats -{ - uint64_t attrcache_hits; - uint64_t attrcache_misses; - uint64_t lookupcache_hits; - uint64_t lookupcache_misses; - uint64_t direofcache_hits; - uint64_t direofcache_misses; - uint64_t biocache_reads; - uint64_t read_bios; - uint64_t read_physios; - uint64_t biocache_writes; - uint64_t write_bios; - uint64_t write_physios; - uint64_t biocache_readlinks; - uint64_t readlink_bios; - uint64_t biocache_readdirs; - uint64_t readdir_bios; - uint64_t rpccnt[NFS_NPROCS]; - uint64_t rpcretries; - uint64_t srvrpccnt[NFS_NPROCS]; - uint64_t srvrpc_errs; - uint64_t srv_errs; - uint64_t rpcrequests; - uint64_t rpctimeouts; - uint64_t rpcunexpected; - uint64_t rpcinvalid; - uint64_t srvcache_inproghits; - uint64_t srvcache_idemdonehits; - uint64_t srvcache_nonidemdonehits; - uint64_t srvcache_misses; - uint64_t forcedsync; - uint64_t srvnqnfs_leases; - uint64_t srvnqnfs_maxleases; - uint64_t srvnqnfs_getleases; - uint64_t srvvop_writes; -}; - /* The set of signals the interrupt an I/O in progress for NFSMNT_INT mounts. * What should be in this set is open to debate, but I believe that since * I/O system calls on ufs are never interrupted by signals the set should @@ -330,6 +292,47 @@ struct nfsrv_descript int nd_repstat; /* Reply status */ uint32_t nd_retxid; /* Reply xid */ }; +#endif + +/* Stats structure */ + +struct nfsstats +{ + uint64_t attrcache_hits; + uint64_t attrcache_misses; + uint64_t lookupcache_hits; + uint64_t lookupcache_misses; + uint64_t direofcache_hits; + uint64_t direofcache_misses; + uint64_t biocache_reads; + uint64_t read_bios; + uint64_t read_physios; + uint64_t biocache_writes; + uint64_t write_bios; + uint64_t write_physios; + uint64_t biocache_readlinks; + uint64_t readlink_bios; + uint64_t biocache_readdirs; + uint64_t readdir_bios; + uint64_t rpccnt[NFS_NPROCS]; + uint64_t rpcretries; + uint64_t srvrpccnt[NFS_NPROCS]; + uint64_t srvrpc_errs; + uint64_t srv_errs; + uint64_t rpcrequests; + uint64_t rpctimeouts; + uint64_t rpcunexpected; + uint64_t rpcinvalid; + uint64_t srvcache_inproghits; + uint64_t srvcache_idemdonehits; + uint64_t srvcache_nonidemdonehits; + uint64_t srvcache_misses; + uint64_t forcedsync; + uint64_t srvnqnfs_leases; + uint64_t srvnqnfs_maxleases; + uint64_t srvnqnfs_getleases; + uint64_t srvvop_writes; +}; /**************************************************************************** * Public Data diff --git a/fs/nfs/nfs_mount.h b/fs/nfs/nfs_mount.h index 7ca070b9d3..bfd5035bde 100644 --- a/fs/nfs/nfs_mount.h +++ b/fs/nfs/nfs_mount.h @@ -47,6 +47,8 @@ * Included Files ****************************************************************************/ + #include + /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ @@ -68,7 +70,6 @@ struct nfsmount { int nm_flag; /* Flags for soft/hard... */ int nm_state; /* Internal state flags */ -//struct inode *nm_blkdriver; /* Vfs structure for this filesystem */ struct nfsnode *nm_head; /* A list to all files opened on this mountpoint */ bool nm_mounted; /* true: The file system is ready */ sem_t nm_sem; /* Used to assume thread-safe access */ @@ -98,8 +99,6 @@ struct nfsmount int nm_acregmin; /* Reg file attr cache min lifetime */ int nm_acregmax; /* Reg file attr cache max lifetime */ unsigned char *nm_verf; /* V3 write verifier */ -//char nm_mntonname[90]; /* directory on which mounted */ -//uint8_t *nm_buffer; /* This is an allocated buffer to hold one sector*/ }; #endif diff --git a/fs/nfs/nfs_node.h b/fs/nfs/nfs_node.h index 55148d1816..98867c900b 100644 --- a/fs/nfs/nfs_node.h +++ b/fs/nfs/nfs_node.h @@ -49,6 +49,8 @@ #include +#include "nfs.h" + /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ diff --git a/fs/nfs/nfs_proto.h b/fs/nfs/nfs_proto.h index b82b2e104a..7fecb60b4e 100644 --- a/fs/nfs/nfs_proto.h +++ b/fs/nfs/nfs_proto.h @@ -47,8 +47,10 @@ * Included Files ****************************************************************************/ - #include +#include +#include "nfs.h" + /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ @@ -302,7 +304,7 @@ typedef struct fhandle fhandle_t; /* union nfsfh { -fhandle_t fh_generic; + fhandle_t fh_generic; unsigned char fh_bytes[NFS_MAXFHSIZE]; }; typedef union nfsfh nfsfh_t; diff --git a/fs/nfs/nfs_socket.c b/fs/nfs/nfs_socket.c index d659a097e5..53a68ef1a7 100644 --- a/fs/nfs/nfs_socket.c +++ b/fs/nfs/nfs_socket.c @@ -46,8 +46,6 @@ #include #include -#include - #include "nfs.h" #include "rpc.h" #include "rpc_v2.h" diff --git a/fs/nfs/nfs_util.c b/fs/nfs/nfs_util.c index a6c82ab22d..3aedfc65c5 100755 --- a/fs/nfs/nfs_util.c +++ b/fs/nfs/nfs_util.c @@ -134,7 +134,10 @@ int nfs_checkmount(struct nfsmount *nmp) { file->n_open = false; } + + return -ENODEV; } - return -ENODEV; + + return 0; } diff --git a/fs/nfs/nfs_vfsops.c b/fs/nfs/nfs_vfsops.c index 478271419f..4679239c19 100644 --- a/fs/nfs/nfs_vfsops.c +++ b/fs/nfs/nfs_vfsops.c @@ -1016,6 +1016,7 @@ 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_timeo = NFS_TIMEO; nmp->nm_retry = NFS_RETRANS; nmp->nm_wsize = NFS_WSIZE; @@ -1053,8 +1054,7 @@ int mountnfs(struct nfs_args *argp, struct sockaddr *nam, void **handle) /* Mounted! */ nmp->nm_mounted = true; - nfs_init(); - *handle /*= blkdriver->i_private*/ = &nmp; + *handle = &nmp; nfs_semgive(nmp); return 0; diff --git a/include/nuttx/fs/nfs.h b/include/nuttx/fs/nfs.h index 93b0b780c5..9777363905 100644 --- a/include/nuttx/fs/nfs.h +++ b/include/nuttx/fs/nfs.h @@ -51,145 +51,7 @@ * Pre-processor Definitions ****************************************************************************/ -#define NFS_TICKINTVL 5 /* Desired time for a tick (msec) */ -#define NFS_HZ (CLOCKS_PER_SEC / nfs_ticks) /* Ticks/sec */ -#define NFS_TIMEO (1 * NFS_HZ) /* Default timeout = 1 second */ -#define NFS_MINTIMEO (1 * NFS_HZ) /* Min timeout to use */ -#define NFS_MAXTIMEO (60 * NFS_HZ) /* Max timeout to backoff to */ -#define NFS_MINIDEMTIMEO (5 * NFS_HZ) /* Min timeout for non-idempotent ops */ -#define NFS_TIMEOUTMUL 2 /* Timeout/Delay multiplier */ -#define NFS_MAXREXMIT 100 /* Stop counting after this many */ -#define NFS_RETRANS 10 /* Num of retrans for soft mounts */ -#define NFS_MAXGRPS 16 /* Max. size of groups list */ -#define NFS_MINATTRTIMO 5 /* Attribute cache timeout in sec */ -#define NFS_MAXATTRTIMO 60 -#define NFS_WSIZE 8192 /* Def. write data size <= 8192 */ -#define NFS_RSIZE 8192 /* Def. read data size <= 8192 */ -#define NFS_READDIRSIZE 8192 /* Def. readdir size */ -#define NFS_DEFRAHEAD 1 /* Def. read ahead # blocks */ -#define NFS_MAXRAHEAD 4 /* Max. read ahead # blocks */ -#define NFS_MAXASYNCDAEMON 20 /* Max. number async_daemons runable */ - -/* Ideally, NFS_DIRBLKSIZ should be bigger, but I've seen servers with - * broken NFS/ethernet drivers that won't work with anything bigger (Linux..) - */ - -#define NFS_DIRBLKSIZ 1024 /* Must be a multiple of DIRBLKSIZ */ -#define NFS_READDIRBLKSIZ 512 /* Size of read dir blocks. XXX */ - -/* Oddballs */ - -#define NFS_CMPFH(n, f, s) \ - ((n)->n_fhsize == (s) && !bcmp((void *)(n)->n_fhp, (void *)(f), (s))) -#define NFS_ISV3(i) (VFSTONFS((i)->f_inode)->nm_flag & NFSMNT_NFSV3) -#define NFS_SRVMAXDATA(n) \ - (((n)->nd_flag & ND_NFSV3) ? (((n)->nd_nam2) ? \ - NFS_MAXDGRAMDATA : NFS_MAXDATA) : NFS_V2MAXDATA) - -/* sys/malloc.h needs M_NFSDIROFF, M_NFSRVDESC and M_NFSBIGFH added. */ - -#ifndef M_NFSRVDESC -# define M_NFSRVDESC M_TEMP -#endif -#ifndef M_NFSDIROFF -# define M_NFSDIROFF M_TEMP -#endif -#ifndef M_NFSBIGFH -# define M_NFSBIGFH M_TEMP -#endif - -/* The B_INVAFTERWRITE flag should be set to whatever is required by the - * buffer cache code to say "Invalidate the block after it is written back". - */ - -#define B_INVAFTERWRITE B_INVAL - -/* Flags for nfssvc() system call. */ - -#define NFSSVC_BIOD 0x002 -#define NFSSVC_NFSD 0x004 -#define NFSSVC_ADDSOCK 0x008 -#define NFSSVC_AUTHIN 0x010 -#define NFSSVC_GOTAUTH 0x040 -#define NFSSVC_AUTHINFAIL 0x080 -#define NFSSVC_MNTD 0x100 - -/* fs.nfs sysctl(3) identifiers */ - -#define NFS_NFSSTATS 1 /* struct: struct nfsstats */ -#define NFS_NIOTHREADS 2 /* number of i/o threads */ -#define NFS_MAXID 3 - -#define FS_NFS_NAMES { \ - { 0, 0 }, \ - { "nfsstats", CTLTYPE_STRUCT }, \ - { "iothreads", CTLTYPE_INT } \ -} - -#define NFSINT_SIGMASK (sigmask(SIGINT)|sigmask(SIGTERM)|sigmask(SIGKILL)| \ - sigmask(SIGHUP)|sigmask(SIGQUIT)) - -/* Socket errors ignored for connectionless sockets?? - * For now, ignore them all - */ - -#define NFSIGNORE_SOERROR(s, e) \ - ((e) != EINTR && (e) != ERESTART && (e) != EWOULDBLOCK && \ - ((s) & PR_CONNREQUIRED) == 0) - -/* Flag values for r_flags */ - -#define R_TIMING 0x01/* timing request (in mntp) */ -#define R_SENT 0x02/* request has been sent */ -#define R_SOFTTERM 0x04/* soft mnt, too many retries */ -#define R_INTR 0x08/* intr mnt, signal pending */ -#define R_SOCKERR 0x10/* Fatal error on socket */ -#define R_TPRINTFMSG 0x20/* Did a tprintf msg. */ -#define R_MUSTRESEND 0x40/* Must resend request */ - -/* On fast networks, the estimator will try to reduce the - * timeout lower than the latency of the server's disks, - * which results in too many timeouts, so cap the lower - * bound. - */ - -#define NFS_MINRTO (NFS_HZ >> 2) - -/* Keep the RTO from increasing to unreasonably large values - * when a server is not responding. - */ - -#define NFS_MAXRTO (20 * NFS_HZ) - -#define NFS_MAX_TIMER (NFS_WRITE_TIMER) -#define NFS_INITRTT (NFS_HZ << 3) - -/* Bits for "ns_flag" */ - -#define SLP_VALID 0x01/* connection is usable */ -#define SLP_DOREC 0x02/* receive operation required */ -#define SLP_NEEDQ 0x04/* connection has data to queue from socket */ -#define SLP_DISCONN 0x08/* connection is closed */ -#define SLP_GETSTREAM 0x10/* extracting RPC from TCP connection */ -#define SLP_LASTFRAG 0x20/* last fragment received on TCP connection */ -#define SLP_ALLFLAGS 0xff/* convenience */ - -#define SLP_INIT 0x01/* NFS data undergoing initialization */ -#define SLP_WANTINIT 0x02/* thread waiting on NFS initialization */ - -/* Bits for "nfsd_flag" */ - -#define NFSD_WAITING 0x01 -#define NFSD_REQINPROG 0x02 -#define NFSD_NEEDAUTH 0x04 -#define NFSD_AUTHFAIL 0x08 - -/* Bits for "nd_flag" */ - -#define ND_NFSV3 0x08 -#define NFSD_CHECKSLP 0x01 - -/* NFS mount option flags */ + /* NFS mount option flags */ #define NFSMNT_SOFT 0x00000001 /* soft mount (hard is default) */ #define NFSMNT_WSIZE 0x00000002 /* set write size */ @@ -227,14 +89,14 @@ #define NFSMNT_NOAC 0x00080000 /* Turn off attribute cache */ #define NFS_ARGSVERSION 3 /* change when nfs_args changes */ -#define NFS_NPROCS 23 -#define NFS_MAXFHSIZE 64 - +#define NFS_MAXFHSIZE 64 +#define NFS_PORT 2049 + /**************************************************************************** * Public Types ****************************************************************************/ -/* File Handle (32 bytes for version 2), variable up to 64 for version 3. */ + /* File Handle (32 bytes for version 2), variable up to 64 for version 3. */ union nfsfh { @@ -242,106 +104,6 @@ union nfsfh }; typedef union nfsfh nfsfh_t; -#undef COMP -#ifdef COMP -/* Structures for the nfssvc(2) syscall. - * Not that anyone besides nfsd(8) should ever use it. - */ - -struct nfsd_args -{ - int sock; /* Socket to serve */ - void *name; /* Client addr for connection based sockets */ - int namelen; /* Length of name */ -}; - -struct nfsd_srvargs -{ - struct nfsd *nsd_nfsd; /* Pointer to in kernel nfsd struct */ - uid_t nsd_uid; /* Effective uid mapped to cred */ - uint32_t nsd_haddr; /* IP address of client */ - int nsd_authlen; /* Length of auth string (ret) */ - unsigned char *nsd_authstr; /* Auth string (ret) */ - int nsd_verflen; /* and the verifier */ - unsigned char *nsd_verfstr; - struct timeval nsd_timestamp; /* timestamp from verifier */ - uint32_t nsd_ttl; /* credential ttl (sec) */ -}; -#endif - -#ifdef COMP -/* The set of signals the interrupt an I/O in progress for NFSMNT_INT mounts. - * What should be in this set is open to debate, but I believe that since - * I/O system calls on ufs are never interrupted by signals the set should - * be minimal. My reasoning is that many current programs that use signals - * such as SIGALRM will not expect file I/O system calls to be interrupted - * by them and break. - */ - -/* Nfs outstanding request list element */ - -struct nfsmount; -struct nfsreq -{ - dq_entry_t r_chain; - struct nfsmount *r_nmp; - uint32_t r_xid; - int r_flags; /* flags on request, see below */ - int r_rexmit; /* current retrans count */ - int r_timer; /* tick counter on reply */ - int r_procnum; /* NFS procedure number */ - int r_rtt; /* RTT for rpc */ -}; - -enum nfs_rto_timers -{ - NFS_DEFAULT_TIMER, - NFS_GETATTR_TIMER, - NFS_LOOKUP_TIMER, - NFS_READ_TIMER, - NFS_WRITE_TIMER, -}; - -/* Network address hash list element */ - -union nethostaddr -{ - uint32_t had_inetaddr; -}; - -struct nfssvc_sock -{ - // TAILQ_ENTRY(nfssvc_sock) ns_chain; /* List of all nfssvc_sock's */ - struct file *ns_fp; /* fp from the... */ - struct socket *ns_so; /* ...socket this struct wraps */ - int ns_flag; /* socket status flags */ - int ns_solock; /* lock for connected socket */ - int ns_cc; /* actual chars queued */ - int ns_reclen; /* length of first queued record */ - uint32_t ns_sref; /* # of refs to this struct */ -}; - -/* One of these structures is allocated for each nfsd. */ - -struct nfsd -{ - //TAILQ_ENTRY(nfsd) nfsd_chain; /* List of all nfsd's */ - int nfsd_flag; /* NFSD_ flags */ - struct nfssvc_sock *nfsd_slp; /* Current socket */ - struct nfsrv_descript *nfsd_nd; /* Associated nfsrv_descript */ -}; - -/* This structure is used by the server for describing each request. */ - -struct nfsrv_descript -{ - unsigned int nd_procnum; /* RPC # */ - int nd_flag; /* nd_flag */ - int nd_repstat; /* Reply status */ - uint32_t nd_retxid; /* Reply xid */ -}; -#endif - /* Arguments to mount NFS */ struct nfs_args @@ -363,7 +125,6 @@ struct nfs_args int readahead; /* # of blocks to readahead */ int leaseterm; /* Term (sec) of lease */ int deadthresh; /* Retrans threshold */ -//char *hostname; /* server's name */ int acregmin; /* cache attrs for reg files min time */ int acregmax; /* cache attrs for reg files max time */ int acdirmin; /* cache attrs for dirs min time */