Commit graph

581 commits

Author SHA1 Message Date
Casey Bodley
18d462a37e pnfs: proper handling of pnfs COMMITs
COMMIT-to-ds: if pnfs_write() finds that its data server requests weren't written stably, it must fail with PNFSERR_IO instead of sending a COMMIT to the mds.  mds COMMITs can only be used for mds WRITEs in this configuration

COMMIT-to-mds: the mds and data servers are required to use a common write/commit verifier, so the mds COMMIT's verifier must be checked against all ds verifiers

Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
2012-05-03 11:46:10 -04:00
Casey Bodley
db7caebe28 pnfs: handle partial layout recalls
layout status flags for PNFS_LAYOUT_RECALLED and PNFS_LAYOUT_CHANGED are removed, and replaced by a list of recalled ranges.  recalls during io are added to the list and processed on pnfs_layout_io_finished().  recalls outside of io are processed immediately

new function layout_recall_range() loops through all existing layout segments, and removes ranges that intersect with the range recalled.  deals with 4 cases per segment:
-only the beginning of the segment is recalled
-only the end of the segment is recalled
-the entire segment is recalled
-only a middle part of the segment is recalled

new function pnfs_layout_recall_status() is called before each unit of io, allowing io threads to bail out early if a recall is detected.  takes a layout segment as an argument, and only returns an error if that segment intersects a recalled range

new function pnfs_layout_recall_fenced() is called when map_ds_error() in pnfs_io.c detects fencing.  also takes a layout segment as an argument, and appends a recall matching the range of the segment

pnfs_layout_state_prepare() now checks the given range against the list of recalled ranges

Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
2012-05-03 11:46:05 -04:00
Casey Bodley
d0ff37a195 pnfs: strategy for merging layout segments
when processing new layout segments from a LAYOUTGET response, layout_update_range() first attempts to merge each new segment into existing segments before calling layout_ordered_insert().  two segments are eligible for merging if their ranges overlap, and all other relevant fields (iomode, stripe unit, deviceid, filehandles, etc) match

when a new segment is merged with an existing segment, the existing segment's extended range may cause it to overlap with another existing segment; additional merging may then be necessary.  but merging an existing segment with another existing segment results in the the first segment being removed/freed, so this type of merging can -only- be performed when no io threads are referencing the layout.  pnfs_layout_io_finished() calls layout_state_merge() to finish any merging that was delayed during io

Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
2012-05-03 11:45:56 -04:00
Casey Bodley
5cc317e8a5 pnfs: store a list of layout segments
pnfs_layout_state now stores a list instead of a single pnfs_file_layout entry.  when new segments are acquired through LAYOUTGET, they are inserted into the list in order of increasing offset

functions related to pnfs_layout_state_prepare() now operate on the list to find missing layout ranges and segments missing devices

pattern_init() in pnfs_io.c now allocates and initializes io threads for each layout segment in the range

new function pattern_join() will call WaitForMultipleObjects() in a loop, to support io patterns with more than 64 threads.  if pattern_fork() is called with a thread count of 1, the thread function is called directly instead of spawning a new thread

Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
2012-05-03 11:45:50 -04:00
Casey Bodley
62ed5248bf cosmetic: moved pnfs io structs to pnfs_io.c
struct pnfs_io_pattern, pnfs_io_thread, and pnfs_io_unit are not referenced outside of pnfs_io.c, so they don't need to be in pnfs.h
also grouped the inline helper functions together at the bottom of pnfs.h

Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
2012-05-03 11:45:43 -04:00
Casey Bodley
904cae13f0 pnfs: simplified logic for calculating next stripe unit
added stripe_next_unit() in pnfs_io.c, removed pnfs_file_device_io_unit() from pnfs_device.c

moved get_sparse_fh()/get_dense_fh() to pnfs_io.c, now only called once on pattern_init()

Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
2012-05-03 11:45:36 -04:00
Casey Bodley
91609640df pnfs: prepare layout under a single lock
when starting io, both pnfs_read() and pnfs_write() need a guarantee that their range is covered by layout segments.  because we have to drop the lock for LAYOUTGET and GETDEVICEINFO, earlier layout segments may be recalled during this process.  to avoid this, new function pnfs_layout_state_prepare() gets called repeatedly until it can verify under a single lock that 1) the entire desired range is covered with layouts and 2) each of these layouts has an associated device.  whenever pnfs_layout_state_prepare() has to drop its lock for LAYOUTGET or GETDEVICEINFO, it returns PNFS_PENDING

on PNFS_SUCCESS, the caller knows that all segments in the range are valid and can dispatch io to those segments without worrying about recalls, because it still holds the pnfs_layout_state lock

Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
2012-05-03 11:45:29 -04:00
Casey Bodley
c66771cda6 ea: QueryEaInfo support for index, restart, single
nfs41_open_state stores current ea index, and increments it for each successful entry returned.  index is set to 0 when the 'restart' argument is given.  cached directory listing is freed after the listing is complete

QueryEaInfo now sends up its output buffer size, and the daemon uses this to limit its results.  added checks for buffer overflows, which required changes to the downcall structure

updated driver error mappings for map_setea_error()

Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
2012-05-03 10:58:42 -04:00
Olga Kornievskaia
17aac16946 use readdir to generate ea list
when given a null for FILE_GET_EA_INFORMATION, use READDIR to construct one with
 the full named attribute directory listing

new function read_entire_dir() allocates an initial buffer for readdir entries a
nd calls nfs41_readdir() repeatedly to fill it.  the buffer is realloc()ed as mo
re space is required, allowing the function to return a complete listing in a si
ngle buffer

new function calculate_ea_list_length() calculates the exact length of the FILE_
GET_EA_INFORMATION buffer required to hold all of the names from the directory l
isting

once the FILE_GET_EA_INFORMATION buffer is allocated, it is filled by populate_e
a_list() and cached with nfs41_open_state

handle_getexattr() remains largely unchanged

Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
2012-05-03 10:58:36 -04:00
Casey Bodley
7b8715ce8e ea: QueryEaInfo accepts a null EaList
check_nfs41_queryea_args() will now accept EaList == NULL, unless EAs are unsupported

moved handling of cygwin EAs to new function QueryCygwinEA()

Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
2012-05-03 10:58:29 -04:00
Casey Bodley
b2e6a60710 ea: refactor SetEaInfo for use on open
when open is given an ea buffer, pass it to new function nfs41_ea_set() after successful file creation.  matches NTFS behavior on all dispositions: sets EAs on FILE_CREATE, FILE_OVERWRITE, FILE_OVERWRITE_IF, FILE_SUPERSEDE.  does not set EAs on FILE_OPEN.  only sets EAs on FILE_OPEN_IF if file did not previously exist.  see new function create_with_ea()

nfs41_ea_set() returns nfs error codes.  uses NFS4ERR_FBIG when the EaValueLength exceeds NFS4_EASIZE (256).  this gets mapped to windows error ERROR_FILE_TOO_LARGE, which the driver now converts to STATUS_EA_TOO_LARGE

Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
2012-05-03 10:58:24 -04:00
Casey Bodley
5a4439a894 cosmetic: move ea get and set upcalls to separate file
Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
2012-05-03 10:58:01 -04:00
Olga Kornievskaia
470d0832ee [ea] pass ea to daemonon open
if an EA buffer is given on create, map it to use space and pass
it to the daemon

removed check for FILE_WRITE_EA permission; it isn't required on ntfs

Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
2012-05-03 10:56:47 -04:00
Casey Bodley
380e04867d test: nfs_ea to create, list, set, and query file EAs
nfs_ea <filename> create <name> <value>
nfs_ea <filename> set <name> [value]
nfs_ea <filename> get <name> [name...]
nfs_ea <filename> list

Note that the test uses NtCreateFile(), so filenames must be specified in NT format: \??\z:\foo

Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
2012-05-03 10:27:54 -04:00
Casey Bodley
f127d92173 vc10: build nfs41_driver.sys in win7 environment
RtlUnicodeToUTF8N() is unsupported before win7

Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
2012-05-03 10:17:35 -04:00
Olga Kornievskaia
fb00cff254 increasing maxfilename to 255 2012-05-02 18:54:21 -04:00
Olga Kornievskaia
556bf9c4fe increasing namecache size to 256K 2012-05-02 18:53:38 -04:00
Casey Bodley
49693532a2 locks: serialize lock requests
adds a critical section to nfs41_open_state.  this lock is taken before generating the stateid/seqid, and released after updated stateid is saved to nfs41_open_state

Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
2012-05-02 18:36:15 -04:00
Olga Kornievskaia
b9775a69e9 [driver] fixing arguments checking for acls
a null buffer for get/setacl is valid if buffer length is 0.
2012-05-02 16:17:01 -04:00
Olga Kornievskaia
2253b28ed3 [driver] fixing auth_sys session after gss session 2012-05-02 16:11:45 -04:00
Olga Kornievskaia
9dd4708aed leaving one max_component len constant
both NFS41_MAX_COMPONENT_SIZE and NFS41_MAX_COMPONENT_LEN
represented the same value.
2012-04-30 11:57:34 -04:00
Olga Kornievskaia
11a13bef0f [driver] changing structure to pointer
NFS41_MOUNT_CONFIG structure was allocated on the stack and it's over
2046bytes. Allocating it from the heap to reduce stack size.
2012-04-30 11:16:28 -04:00
Olga Kornievskaia
bcc0ed71cb [driver] finer-grained pool tagging 2012-04-26 16:20:18 -04:00
Olga Kornievskaia
1d2d21632d free upcall entry for async io 2012-04-26 16:14:10 -04:00
Casey Bodley
a0d2e12806 rename: skip upcall when same filename matches destination
Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
2012-04-26 16:14:02 -04:00
Casey Bodley
787202cb9d name cache: skip rename with same src and target
fileio tests 214,215 does lots of renames with the same source and target filename.  nfs41_name_cache_rename() would operate on the same pointer for both src and existing, and accidentally turn both into a negative entry

Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
2012-04-26 16:13:54 -04:00
Olga Kornievskaia
beb33855e0 check pathlen on referrals 2012-04-26 16:13:45 -04:00
Olga Kornievskaia
3e334ef73a [driver] change nt_params structure to pointer 2012-04-26 16:13:24 -04:00
Olga Kornievskaia
495760d69a [readdir] make sure buffer produces nul-terminated str 2012-04-26 11:07:27 -04:00
Olga Kornievskaia
57baa75f04 changing error code when path is too long 2012-04-26 11:06:31 -04:00
Olga Kornievskaia
7f338d871b [driver] storing fsattrs in netroot 2012-04-25 12:40:58 -04:00
Olga Kornievskaia
c4c76c97d2 [volume] fixing FsAttributes volume query
not setting the length of the reply produced a zero valued query.
2012-04-25 11:37:24 -04:00
Olga Kornievskaia
b3a86d0256 simply logic for unsetting readonly attribute 2012-04-24 11:41:40 -04:00
Casey Bodley
2baeeb855b volume: cache volume attributes on mount
struct NFS41_V_NET_ROOT_EXTENSION now stores only the FILE_FS_ATTRIBUTE_INFORMATION (without the extra buffer space for a name).  on QueryVolumeInfo() for FileFsAttributeInformation on the root directory, the FILE_FS_ATTRIBUTE_INFORMATION is copied into the output buffer, and the name is added there.  QueryVolumeInfo() only makes upcalls when FileFsAttributeInformation queries are not for the root directory

new function is_root_directory() uses the logic from Set/GetReparsePoint() to determine whether it's operating on the root directory

moved logic from volume.c:handle_volume_attributes() to superblock.c:nfs41_superblock_fs_attributes().  the mount downcall copies the FILE_FS_ATTRIBUTE_INFORMATION buffer down to the driver.  the driver reads this buffer directly into VNetRootContext->FsAttrs

Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
2012-04-20 15:03:14 -04:00
Olga Kornievskaia
4c8c263b49 implement getattr for FileNetworkOpenInformation 2012-04-20 12:42:36 -04:00
Olga Kornievskaia
f4071450c0 [driver] done overide open create mode 0 w 0777
removing the check of mode 0 and then setting mode 0777. cygwin can
open for create with mode 0 which we were overriding with 0777.
2012-04-09 15:02:21 -04:00
Casey Bodley
c837631750 ea: fail non-cygwin EAs without named attr support
if non-cygwin EAs are given to Create, SetEaInfo, or QueryEaInfo and the server does not support named attributes, fail with STATUS_EAS_NOT_SUPPORTED.  also adds access checks for FILE_READ_EA and FILE_WRITE_EA

Create will accept all 3 cygwin EAs: NfsV3Attributes, NfsActOnLink, and NfsSymlinkTargetName.  it now handles NfsActOnLink by adding FILE_OPEN_REPARSE_POINT to the create options

SetEaInfo will only accept NfsV3Attributes for setting the file mode. the other two will fail with STATUS_INVALID_PARAMETER.  removed handling of NfsActOnLink in setattr.c

QueryEaInfo will accept all 3 cygwin EAs

Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
2012-04-09 15:01:15 -04:00
Casey Bodley
b3229d20f6 ea: query each superblock for named attr support
adds a new function nfs41_superblock_getattr(), which adds an OPENATTR call with createdir=0 after the GETATTR to check for named attribute support.  OPENATTR will either return ERR_NOTSUPP if not supported, or OK/ERR_NOENT depending on whether named attributes are present on the given file.  we can't query for the 'named_attr' attribute, because it only tells us whether the given file contains named attributes

if named attributes are supported on a superblock, it will return FILE_SUPPORTS_EXTENDED_ATTRIBUTES for associated volume queries

Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
2012-04-09 15:01:12 -04:00
Casey Bodley
fd591f92d7 ea: initialize named attr paths
zero-initialize the paths for named attrs, and initialize the file.name instead of using a temporary dst_name

Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
2012-04-09 15:01:03 -04:00
Casey Bodley
7bd70cf488 ea: defer storing mode until SetEaInfo succeeds
on SetEaInfo for NfsV3Attributes, wait to set nfs41_fcb.mode until the upcall returns successfully

Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
2012-04-09 15:00:57 -04:00
Olga Kornievskaia
92d3500bd2 changing silly rename scheme take 2
reverting patch 4d18cf9ce7.

it was wrong to append the timestamp to create a silly renamed name
because it was not a reproducable name.

instead, take an fh and md5(fh) then append as before.
2012-04-06 17:01:50 -04:00
Olga Kornievskaia
7fe39f0a53 [cosmetic] adding printfs to open error codes 2012-04-05 17:13:35 -04:00
Olga Kornievskaia
99e127156a [driver] make default upcall timeout 50s 2012-04-03 14:40:56 -04:00
Casey Bodley
4e1449a2f8 ea: fixes for named attributes
assign a superblock to named attribute files on nfs41_open(), to prevent crashing in nfs41_write()
also avoid updating the attribute cache with named attribute files on close and write

Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
2012-04-03 13:43:35 -04:00
Olga Kornievskaia
9135e07221 only send setattr if attr changed
for hidden, system, and archive, first check with our cached attributes
and if the values are the same, ignore this setattr
2012-04-02 18:41:37 -04:00
Olga Kornievskaia
41389178a3 setting archive attr based on createopts
was incorrectly using file_attributes instead of create attributes to check
if we are creating a file or a directory. it lead to creating directories
with archive set.
2012-04-02 18:39:54 -04:00
Casey Bodley
c59124dd20 superblock: mask getattr requests with supported_attrs
on creation of a new superblock, construct a bitmap for the default attribute mask to be used for GETATTR and READDIR requests on that filesystem.  mask out any unsupported attributes, and store the bitmap in the field nfs41_superblock.default_getattr

replaced function init_getattr_request() with nfs41_superblock_getattr_mask(), which returns a copy of superblock->default_getattr

removed the locking in nfs41_superblock_supported_attrs() and nfs41_superblock_supported_attrs_exclcreat(), as the supported_attrs and suppattr_exclcreat fields are read-only after the superblock is first initialized.  also factored out their common code into a bitmap_intersect() function in util.h

Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
2012-04-02 16:34:02 -04:00
Casey Bodley
b955b6d3fe ea: assign superblock to named attribute directory
the upcall to set an EA was crashing in nfs41_open() on a null superblock, because nfs41_rpc_openattr() was returning a filehandle without a superblock.  copy the parent file's superblock to the returned filehandle

Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
2012-04-02 16:33:49 -04:00
Olga Kornievskaia
7787ee403b [cosmetic] adding error printf for access_denied on open 2012-04-02 15:29:42 -04:00
Olga Kornievskaia
6ce297022c use provided, not saved mode for superseded opens 2012-04-02 14:42:35 -04:00