Commit graph

479 commits

Author SHA1 Message Date
Casey Bodley
827a1b7368 volume: cache volume attr results with vnetroot
moved the FileSystemName definition back down to the kernel, so the daemon is no longer responsible for setting it.  the driver uses the string length to calculate the buffer size needed for NFS41_V_NET_ROOT_EXTENSION.FsAttrs, and copies in the FileSystemName after the first successful volume attributes upcall

Signed-off-by: Casey Bodley <cbodley@umich.edu>
2010-10-12 10:35:58 -04:00
Casey Bodley
25ef4d25bb mount: make persist optional on mount, default to false
added -p argument to nfs_mount.exe to make the mount persist over reboots

when -p is specified, we pass the flag CONNECT_UPDATE_PROFILE to WNetUseConnection(): "If this bit flag is set, the registry will store the connection information and make it available when the system reboots."

Signed-off-by: Casey Bodley <cbodley@umich.edu>
2010-10-12 10:35:57 -04:00
Casey Bodley
62fa60a83a mount: nfs_mount -d removes persistent connections
bug: connections created through 'net use' or 'map network drive' are not fully removed by 'nfs_mount -d'.  the UNMOUNT upcall completes successfully, but the mount remains visible in net use and windows explorer; the next attempted use of the drive will send a new MOUNT and continue normally

solution: added flag CONNECT_UPDATE_PROFILE to WNetCancelConnection2(): "The system updates the user profile with the information that the connection is no longer a persistent one."

Signed-off-by: Casey Bodley <cbodley@umich.edu>
2010-10-12 10:35:56 -04:00
Casey Bodley
4731a97973 mount: use empty mount path when no EAs are present
adds support for mounting with 'net use' and 'Map Network Drive'
if we don't have extended attributes on mount (i.e. not using nfs_mount), don't fail!  instead, use SrvName=SrvCallName and MntPt=""
updated nfs41_MountConfig_InitDefaults() to initialize SrvName and MntPt with Length=0

Signed-off-by: Casey Bodley <cbodley@umich.edu>
2010-10-12 10:35:56 -04:00
Casey Bodley
81f05b1cb8 mount: mount config as a local variable
removed the Config field from NFS41_NETROOT_EXTENSION and NFS41_V_NET_ROOT_EXTENSION and made it local to CreateVNetRoot(), as that's the only place it's accessed and we no longer rely on storing Config.Initialized with the NET_ROOT

Signed-off-by: Casey Bodley <cbodley@umich.edu>
2010-10-12 10:35:55 -04:00
Casey Bodley
5861659162 mount: check for existing session instead of config.initialized
removed NFS41_MOUNT_CONFIG.Initialized field, and replaced checks for Config.Initialized with session != NULL

Signed-off-by: Casey Bodley <cbodley@umich.edu>
2010-10-12 10:35:55 -04:00
Casey Bodley
f612321571 mount: use NULL to indicate no existing session
was previously setting pNetRootContext->session to INVALID_HANDLE_VALUE on error, and required checking for both that and NULL.  since it starts initialized to NULL, keep it that way

Signed-off-by: Casey Bodley <cbodley@umich.edu>
2010-10-12 10:35:54 -04:00
Casey Bodley
8172b5f581 timestamps: setattr uses attributes cansettime,time_delta
added time_delta argument to xdr_settime4().  if the normal 'time' argument is within time_delta of the current time (get_nfs_time()), it uses time_how=SET_TO_SERVER_TIME4.  otherwise, it uses SET_TO_CLIENT_TIME4 and encodes the time as usual

handle_nfs41_setattr() ignores times if superblock->cansettime==0.  otherwise, it passes in superblock->time_delta (via info.time_delta) along with the other time attributes, for use with xdr_settime4()

Signed-off-by: Casey Bodley <cbodley@umich.edu>
2010-10-12 10:35:54 -04:00
Casey Bodley
a8eca1ca7b timestamps: nfstime4 helper functions
Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
2010-10-12 10:35:53 -04:00
Casey Bodley
e67560fd4a timestamps: superblock stores attributes cansettime,time_delta
Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
2010-10-12 10:35:52 -04:00
Casey Bodley
cc298599d8 timestamps: bitmap4 helper functions
Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
2010-10-12 10:35:52 -04:00
Casey Bodley
d38360672d volume: daemon handles FileFsAttributeInformation
added FILE_FS_ATTRIBUTE_INFORMATION and FileSystemAttributes flags to from_kernel.h
queries case_preserving, case_insensitive attributes to fill in FileSystemAttributes, and uses #defines from nfs41_const.h for MaximumComponentNameLength and FileSystemName

Signed-off-by: Casey Bodley <cbodley@umich.edu>
2010-10-12 10:35:51 -04:00
Casey Bodley
c13ed30b9a volume: daemon handles new generic volume size upcall
added FS_INFORMATION_CLASS, FILE_FS_SIZE_INFORMATION, FILE_FS_FULL_SIZE_INFORMATION to from_kernel.h
moved get_volume_size_info() and byte->unit conversion up to the daemon

Signed-off-by: Casey Bodley <cbodley@umich.edu>
2010-10-12 10:35:51 -04:00
Casey Bodley
b9e8c7f8b2 driver: generalized volume query into buf, len
Signed-off-by: Casey Bodley <cbodley@umich.edu>
2010-10-12 10:35:50 -04:00
Casey Bodley
59b4f5410c cosmetic: removed unused fields of readdir_upcall_args
Signed-off-by: Casey Bodley <cbodley@umich.edu>
2010-10-12 10:35:49 -04:00
Casey Bodley
d6d8aea013 driver: eliminating extra copy in QueryFileInfo
was doing a memcpy from entry->u.QueryFile.buf to RxContext->Info.Buffer, even though we set entry->u.QueryFile.buf = RxContext->Info.Buffer

Signed-off-by: Casey Bodley <cbodley@umich.edu>
2010-10-12 10:35:49 -04:00
Casey Bodley
d345a7b12e name cache: bug fix for name_cache_search()
symptom: in certain cases, name_cache_find_or_create() was returning ERROR_FILE_EXISTS, which should never happen!

cause: the string comparisons in name_cache_search() and name_cache_insert() were returning different results when the argument to name_cache_search() is a) not null-terminated, and b) shorter than the other string.  this caused name_cache_search() to search the wrong branch of the rbtree and fail to find the component, while name_cache_insert() would correctly find it and return ERROR_FILE_EXISTS

fix: compare the string lengths before calling strncmp() to avoid comparing past the end of the component.  moved the comparisons to a separate component_cmp() function called by both name_cache_search() and name_cache_insert() to make sure they get the same result!

Signed-off-by: Casey Bodley <cbodley@umich.edu>
2010-10-12 10:35:48 -04:00
Casey Bodley
c72007f076 name cache: LINK inserts target to name cache
the link part of basic test7 was failing because LINK's target was still cached as a negative entry, leading to the error "can't stat newfile.0 after link".  the solution is to replace the negative entry with the real fh and attributes of the target file

so instead of doing RESTOREFH+GETATTR on the source file and calling nfs41_attr_cache_update(), nfs41_link() uses LOOKUP+GETATTR+GETFH to get attributes for the target file and passes them to nfs41_name_cache_insert() along with dst_dir's changeinfo.  because the source and target file will have the same fileid attribute, nfs41_name_cache_insert() will update the attributes of both at the same time.  added the target file as an optional return parameter

Signed-off-by: Casey Bodley <cbodley@umich.edu>
2010-10-12 10:35:48 -04:00
Casey Bodley
7db2d60c3b cosmetic: comment describing negative lookup caching
/* negative lookup caching
 *
 * by caching lookups that result in NOENT, we can avoid sending subsequent
 * lookups over the wire.  a name cache entry is negative when its attributes
 * pointer is NULL.  negative entries are created by three functions:
 * nfs41_name_cache_remove(), _insert() when called with NULL for the fh and
 * attributes, and _rename() for the source entry
 */

Signed-off-by: Casey Bodley <cbodley@umich.edu>
2010-10-12 10:35:47 -04:00
Casey Bodley
794dfeca49 name cache: lookup semantics match nfs41_lookup() on NOENT
previously, when the name cache encountered a missing/negative/expired entry, it returned the previous two entries as 'target' and 'parent', and nfs41_lookup() started new lookups from the filehandle in 'target'.  this differs from nfs41_lookup(), which on NOENT will return NULL for the 'target' and the previous entry as 'parent'.  modified name_cache_lookup() to do the same, and updated nfs41_lookup() to start new lookups from the filehandle in 'parent'

now when nfs41_lookup() gets the is_negative flag from nfs41_name_cache_lookup(), it can just return the error without needing to copy the 'target' to 'parent'

Signed-off-by: Casey Bodley <cbodley@umich.edu>
2010-10-12 10:35:47 -04:00
Casey Bodley
765bc0284b name cache: rename leaves behind a negative entry
as before, we move the src entry from src_parent to dst_parent.  but instead of unlinking the destination entry if it exists, we recycle it as a negative entry where src used to be.  if the destination entry doesn't exist, we create a new one for this negative entry

if the dst_parent entry is invalidated by the change_info, we just leave the original src entry in place and make it negative

Signed-off-by: Casey Bodley <cbodley@umich.edu>
2010-10-12 10:35:46 -04:00
Casey Bodley
bc81c3f6f5 name cache: negative entries ignore change_info
negative lookup entries don't have attributes, so we won't invalidate them based on 'change'.  name_cache_entry_changed() returns false if entry->attributes == NULL

Signed-off-by: Casey Bodley <cbodley@umich.edu>
2010-10-12 10:35:46 -04:00
Casey Bodley
61ddf671fa name cache: remove changes entry to negative
instead of calling name_cache_entry_unlink(), nfs41_name_cache_remove() calls name_cache_entry_update() with NULL for fh and info to make it a negative entry, then name_cache_unlink_children_recursive() to remove any children

Signed-off-by: Casey Bodley <cbodley@umich.edu>
2010-10-12 10:35:45 -04:00
Casey Bodley
6ee8bba79e name cache: merged entry_has_expired() into entry_invis()
Signed-off-by: Casey Bodley <cbodley@umich.edu>
2010-10-12 10:35:44 -04:00
Casey Bodley
bfae29e9c2 name cache: nfs41_lookup() inserts negative entry on NOENT
Signed-off-by: Casey Bodley <cbodley@umich.edu>
2010-10-12 10:35:44 -04:00
Casey Bodley
6bc86c1bff name cache: insert supports negative entries
marked nfs41_name_cache_insert() parameters fh and info as OPTIONAL; passing NULL designates a negative lookup entry
name_cache_entry_create() no longer calls attr_cache_find_or_create(), and doesn't need the 'fileid' argument
name_cache_entry_update() also makes fh and info OPTIONAL, and handles the cases where we switch from a negative <-> positive entry, calling attr_cache_find_or_create() or attr_cache_entry_deref() as appropriate
removed unused function name_cache_find_or_create(); everything uses name_cache_entry_find_or_create() instead, so renamed that to name_cache_find_or_create()

Signed-off-by: Casey Bodley <cbodley@umich.edu>
2010-10-12 10:35:43 -04:00
Casey Bodley
112313bc45 name cache: lookup returns flag is_negative
added function entry_invis() in addition to entry_has_expired().  entry_invis() returns true if entry_has_expired() or for negative entries.  the is_negative flag is set for negative entries (defined as having entry->attributes == NULL), and returned by nfs41_name_cache_lookup().  when nfs41_lookup() sees this flag set, it returns the status without attempting to do any more lookups

Signed-off-by: Casey Bodley <cbodley@umich.edu>
2010-10-12 10:35:43 -04:00
Casey Bodley
55ff9d855d cthon: added patches for connectathon
patches apply on top of http://www.connectathon.org/nfstests.zip

Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
2010-10-12 10:18:14 -04:00
Casey Bodley
0ad4db4fad fresh git tree for public release
we regretfully had to remove our git history for licensing reasons

Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
2010-10-12 10:15:48 -04:00