Author: pschweitzer
Date: Sun Jul 30 08:46:01 2017
New Revision: 75444
URL:
http://svn.reactos.org/svn/reactos?rev=75444&view=rev
Log:
[NFSD]
In case NFS session expires while reading/writing to a file, renew the session instead of
just failing.
This avoids not being able to transfer any file with slow connection, and not being able
to transfer big files with normal connection.
CORE-8204
CORE-13484
Modified:
trunk/reactos/base/services/nfsd/readwrite.c
Modified: trunk/reactos/base/services/nfsd/readwrite.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/services/nfsd/readwri…
==============================================================================
--- trunk/reactos/base/services/nfsd/readwrite.c [iso-8859-1] (original)
+++ trunk/reactos/base/services/nfsd/readwrite.c [iso-8859-1] Sun Jul 30 08:46:01 2017
@@ -142,27 +142,45 @@
ULONG pnfs_bytes_read = 0;
int status = NO_ERROR;
- nfs41_open_stateid_arg(upcall->state_ref, &stateid);
+#ifdef __REACTOS__
+ do
+ {
+#endif
+ nfs41_open_stateid_arg(upcall->state_ref, &stateid);
#ifdef PNFS_ENABLE_READ
- status = read_from_pnfs(upcall, &stateid);
-
- if (status == NO_ERROR || status == ERROR_HANDLE_EOF)
- goto out;
-
- if (args->out_len) {
- pnfs_bytes_read = args->out_len;
- args->out_len = 0;
-
- args->offset += pnfs_bytes_read;
- args->buffer += pnfs_bytes_read;
- args->len -= pnfs_bytes_read;
- }
-#endif
-
- status = read_from_mds(upcall, &stateid);
-
- args->out_len += pnfs_bytes_read;
+ status = read_from_pnfs(upcall, &stateid);
+
+ if (status == NO_ERROR || status == ERROR_HANDLE_EOF)
+ goto out;
+
+ if (args->out_len) {
+ pnfs_bytes_read = args->out_len;
+ args->out_len = 0;
+
+ args->offset += pnfs_bytes_read;
+ args->buffer += pnfs_bytes_read;
+ args->len -= pnfs_bytes_read;
+ }
+#endif
+
+ status = read_from_mds(upcall, &stateid);
+#ifdef __REACTOS__
+ /* Status returned by NFS server when session is to be renewed */
+ if (status == 1006)
+ {
+ nfs41_session_renew(upcall->state_ref->session);
+ dprintf(1, "Session renewed (read)!\n");
+ continue;
+ }
+#endif
+
+ args->out_len += pnfs_bytes_read;
+#ifdef __REACTOS__
+ break;
+ }
+ while (TRUE);
+#endif
out:
return status;
}
@@ -278,24 +296,41 @@
uint32_t pnfs_bytes_written = 0;
int status;
- nfs41_open_stateid_arg(upcall->state_ref, &stateid);
+#ifdef __REACTOS__
+ do
+ {
+#endif
+ nfs41_open_stateid_arg(upcall->state_ref, &stateid);
#ifdef PNFS_ENABLE_WRITE
- status = write_to_pnfs(upcall, &stateid);
- if (args->out_len) {
- pnfs_bytes_written = args->out_len;
- args->out_len = 0;
-
- args->offset += pnfs_bytes_written;
- args->buffer += pnfs_bytes_written;
- args->len -= pnfs_bytes_written;
-
- if (args->len == 0)
- goto out;
- }
-#endif
-
- status = write_to_mds(upcall, &stateid);
+ status = write_to_pnfs(upcall, &stateid);
+ if (args->out_len) {
+ pnfs_bytes_written = args->out_len;
+ args->out_len = 0;
+
+ args->offset += pnfs_bytes_written;
+ args->buffer += pnfs_bytes_written;
+ args->len -= pnfs_bytes_written;
+
+ if (args->len == 0)
+ goto out;
+ }
+#endif
+
+ status = write_to_mds(upcall, &stateid);
+#ifdef __REACTOS__
+ /* Status returned by NFS server when session is to be renewed */
+ if (status == 1006)
+ {
+ nfs41_session_renew(upcall->state_ref->session);
+ dprintf(1, "Session renewed (write)!\n");
+ continue;
+ }
+
+ break;
+ }
+ while (TRUE);
+#endif
out:
args->out_len += pnfs_bytes_written;
return status;