[U-Boot-Users] [Patch] bugfix:return value of NFS command

Hiroshi Ito ito at mlb.co.jp
Fri Dec 10 20:03:16 CET 2004


Hello,

1.nfs command return code is depend on umount-all, but not state of
  downloading.

2.When fail to write flash, it doesn't change state to umount

example1:
---nfs server---
[mldbox]# ls -l u-boot.bin
----------  1 root root 204048 Dec 11 02:06 u-boot.bin

--- u-boot ---
# if nfs 80400000 192.168.3.98:/usr/src/mldbox/u-boot.bin; then echo ok; else echo error; fi
Trying i82559#0
Using i82559#0 device
File transfer via NFS from server 192.168.3.98; our IP address is 192.168.3.200
Filename '/usr/src/mldbox/u-boot.bin'.
Load address: 0x80400000
Loading: *
done
ok	<= Wrong!!

example2:
[root at tv mldbox]# rm u-boot.bin
rm: remove regular file `u-boot.bin'? y
[root at tv mldbox]#
# if nfs 80400000 192.168.3.98:/usr/src/mldbox/u-boot.bin; then echo ok; else echo error; fi
Trying i82559#0
Using i82559#0 device
File transfer via NFS from server 192.168.3.98; our IP address is 192.168.3.200
Filename '/usr/src/mldbox/u-boot.bin'.
Load address: 0x80400000
Loading: *** ERROR: File lookup fail

done
ok	<= Wrong!!
#

attached patch fixes these problems.
patch is for current CVS.
--------
Hiroshi Ito
Media Lab. Inc.,
URL http://www.mlb.co.jp ( Sorry, Japanese only. )
TEL +81-3-5294-7255  FAX +81-3-5294-7256
-------------- next part --------------
Index: net/nfs.c
===================================================================
RCS file: /cvsroot/u-boot/u-boot/net/nfs.c,v
retrieving revision 1.8
diff -u -b -B -w -p -r1.8 nfs.c
--- net/nfs.c	28 Sep 2004 21:51:43 -0000	1.8
+++ net/nfs.c	10 Dec 2004 17:36:09 -0000
@@ -44,6 +44,7 @@ static int nfs_len;
 static char dirfh[NFS_FHSIZE];	/* file handle of directory */
 static char filefh[NFS_FHSIZE]; /* file handle of kernel image */
 
+static int	NfsDownloadState;
 static IPaddr_t NfsServerIP;
 static int	NfsSrvMountPort;
 static int	NfsSrvNfsPort;
@@ -63,7 +64,7 @@ static char *nfs_filename;
 static char *nfs_path;
 static char nfs_path_buff[2048];
 
-static __inline__ void
+static __inline__ int
 store_block (uchar * src, unsigned offset, unsigned len)
 {
 	ulong newsize = offset + len;
@@ -82,8 +83,7 @@ store_block (uchar * src, unsigned offse
 		rc = flash_write ((uchar *)src, (ulong)(load_addr+offset), len);
 		if (rc) {
 			flash_perror (rc);
-			NetState = NETLOOP_FAIL;
-			return;
+			return -1;
 		}
 	} else
 #endif /* CFG_DIRECT_FLASH_NFS */
@@ -93,6 +93,7 @@ store_block (uchar * src, unsigned offse
 
 	if (NetBootFileXferSize < (offset+len))
 		NetBootFileXferSize = newsize;
+	return 0;
 }
 
 static char*
@@ -573,7 +574,8 @@ nfs_read_reply (uchar *pkt, unsigned len
 	}
 
 	rlen = ntohl(rpc_pkt.u.reply.data[18]);
-	store_block ((uchar *)pkt+sizeof(rpc_pkt.u.reply), nfs_offset, rlen);
+	if ( store_block ((uchar *)pkt+sizeof(rpc_pkt.u.reply), nfs_offset, rlen) )
+		return -9999;
 
 	return rlen;
 }
@@ -632,7 +634,7 @@ NfsHandler (uchar *pkt, unsigned dest, u
 			NetState = NETLOOP_FAIL;
 		} else {
 			puts ("\ndone\n");
-			NetState = NETLOOP_SUCCESS;
+			NetState = NfsDownloadState;
 		}
 		break;
 
@@ -678,6 +680,7 @@ NfsHandler (uchar *pkt, unsigned dest, u
 			NfsState = STATE_READLINK_REQ;
 			NfsSend ();
 		} else {
+			if ( ! rlen ) NfsDownloadState = NETLOOP_SUCCESS;
 			NfsState = STATE_UMOUNT_REQ;
 			NfsSend ();
 		}
@@ -692,6 +695,7 @@ NfsStart (void)
 #ifdef NFS_DEBUG
 	printf ("%s\n", __FUNCTION__);
 #endif
+	NfsDownloadState = NETLOOP_FAIL;
 
 	NfsServerIP = NetServerIP;
 	nfs_path = (char *)nfs_path_buff;


More information about the U-Boot mailing list