aboutsummaryrefslogtreecommitdiff
path: root/libdiskfs/rdwr-internal.c
diff options
context:
space:
mode:
Diffstat (limited to 'libdiskfs/rdwr-internal.c')
-rw-r--r--libdiskfs/rdwr-internal.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/libdiskfs/rdwr-internal.c b/libdiskfs/rdwr-internal.c
index 9fe42ade..18a4ae1e 100644
--- a/libdiskfs/rdwr-internal.c
+++ b/libdiskfs/rdwr-internal.c
@@ -1,5 +1,5 @@
/*
- Copyright (C) 1994, 1995, 1996 Free Software Foundation
+ Copyright (C) 1994,95,96,97,99,2000 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
@@ -41,16 +41,23 @@ _diskfs_rdwr_internal (struct node *np,
if (dir)
assert (!diskfs_readonly);
+ if (*amt == 0)
+ /* Zero-length writes do not update mtime or anything else, by POSIX. */
+ return 0;
+
if (!diskfs_check_readonly () && !notime)
{
if (dir)
np->dn_set_mtime = 1;
- else
+ else if (! _diskfs_noatime)
np->dn_set_atime = 1;
}
memobj = diskfs_get_filemap (np, prot);
+ if (memobj == MACH_PORT_NULL)
+ return errno;
+
err = pager_memcpy (diskfs_get_filemap_pager_struct (np), memobj,
offset, data, amt, prot);
@@ -58,7 +65,7 @@ _diskfs_rdwr_internal (struct node *np,
{
if (dir)
np->dn_set_mtime = 1;
- else
+ else if (!_diskfs_noatime)
np->dn_set_atime = 1;
}