diff --git a/exfat/libexfat/node.c b/exfat/libexfat/node.c
index 56205fc..1d66387 100644
--- a/exfat/libexfat/node.c
+++ b/exfat/libexfat/node.c
@@ -3,7 +3,7 @@
 	exFAT file system implementation library.
 
 	Free exFAT implementation.
-	Copyright (C) 2010-2013  Andrew Nayenko
+	Copyright (C) 2010-2014  Andrew Nayenko
 
 	This program is free software; you can redistribute it and/or modify
 	it under the terms of the GNU General Public License as published by
@@ -44,28 +44,44 @@
 
 void exfat_put_node(struct exfat* ef, struct exfat_node* node)
 {
-	if (--node->references < 0)
-	{
-		char buffer[UTF8_BYTES(EXFAT_NAME_MAX) + 1];
-		exfat_get_name(node, buffer, sizeof(buffer) - 1);
-		exfat_bug("reference counter of `%s' is below zero", buffer);
-	}
+	char buffer[UTF8_BYTES(EXFAT_NAME_MAX) + 1];
 
-	if (node->references == 0)
+	--node->references;
+	if (node->references < 0)
 	{
-		/* FIXME handle I/O error */
-		if (exfat_flush_node(ef, node) != 0)
-			exfat_bug("node flush failed");
-		if (node->flags & EXFAT_ATTRIB_UNLINKED)
-		{
-			/* free all clusters and node structure itself */
-			exfat_truncate(ef, node, 0, true);
-			free(node);
-		}
-		/* FIXME handle I/O error */
-		if (exfat_flush(ef) != 0)
-			exfat_bug("flush failed");
+		exfat_get_name(node, buffer, sizeof(buffer) - 1);
+		exfat_bug("reference counter of '%s' is below zero", buffer);
 	}
+	else if (node->references == 0 && node != ef->root)
+	{
+		if (node->flags & EXFAT_ATTRIB_DIRTY)
+		{
+			exfat_get_name(node, buffer, sizeof(buffer) - 1);
+			exfat_warn("dirty node '%s' with zero references", buffer);
+		}
+	}
+}
+
+/**
+ * This function must be called on rmdir and unlink (after the last
+ * exfat_put_node()) to free clusters.
+ */
+int exfat_cleanup_node(struct exfat* ef, struct exfat_node* node)
+{
+	int rc = 0;
+
+	if (node->references != 0)
+		exfat_bug("unable to cleanup a node with %d references",
+				node->references);
+
+	if (node->flags & EXFAT_ATTRIB_UNLINKED)
+	{
+		/* free all clusters and node structure itself */
+		rc = exfat_truncate(ef, node, 0, true);
+		/* free the node even in case of error or its memory will be lost */
+		free(node);
+	}
+	return rc;
 }
 
 /**
@@ -108,7 +124,7 @@
 	it->chunk = NULL;
 }
 
-static int fetch_next_entry(struct exfat* ef, const struct exfat_node* parent,
+static bool fetch_next_entry(struct exfat* ef, const struct exfat_node* parent,
 		struct iterator* it)
 {
 	/* move iterator to the next entry in the directory */
@@ -119,23 +135,23 @@
 		/* reached the end of directory; the caller should check this
 		   condition too */
 		if (it->offset >= parent->size)
-			return 0;
+			return true;
 		it->cluster = exfat_next_cluster(ef, parent, it->cluster);
 		if (CLUSTER_INVALID(it->cluster))
 		{
 			exfat_error("invalid cluster 0x%x while reading directory",
 					it->cluster);
-			return 1;
+			return false;
 		}
 		if (exfat_pread(ef->dev, it->chunk, CLUSTER_SIZE(*ef->sb),
 				exfat_c2o(ef, it->cluster)) < 0)
 		{
 			exfat_error("failed to read the next directory cluster %#x",
 					it->cluster);
-			return 1;
+			return false;
 		}
 	}
-	return 0;
+	return true;
 }
 
 static struct exfat_node* allocate_node(void)
@@ -177,6 +193,40 @@
 			(it->chunk + it->offset % CLUSTER_SIZE(*ef->sb));
 }
 
+static bool check_node(const struct exfat_node* node, uint16_t actual_checksum,
+		uint16_t reference_checksum, uint64_t valid_size)
+{
+	char buffer[UTF8_BYTES(EXFAT_NAME_MAX) + 1];
+
+	/*
+	   Validate checksum first. If it's invalid all other fields probably
+	   contain just garbage.
+	*/
+	if (actual_checksum != reference_checksum)
+	{
+		exfat_get_name(node, buffer, sizeof(buffer) - 1);
+		exfat_error("'%s' has invalid checksum (%#hx != %#hx)", buffer,
+				actual_checksum, reference_checksum);
+		return false;
+	}
+
+	/*
+	   exFAT does not support sparse files but allows files with uninitialized
+	   clusters. For such files valid_size means initialized data size and
+	   cannot be greater than file size. See SetFileValidData() function
+	   description in MSDN.
+	*/
+	if (valid_size > node->size)
+	{
+		exfat_get_name(node, buffer, sizeof(buffer) - 1);
+		exfat_error("'%s' has valid size (%"PRIu64") greater than size "
+				"(%"PRIu64")", buffer, valid_size, node->size);
+		return false;
+	}
+
+	return true;
+}
+
 /*
  * Reads one entry in directory at position pointed by iterator and fills
  * node structure.
@@ -196,7 +246,7 @@
 	le16_t* namep = NULL;
 	uint16_t reference_checksum = 0;
 	uint16_t actual_checksum = 0;
-	uint64_t real_size = 0;
+	uint64_t valid_size = 0;
 
 	*node = NULL;
 
@@ -267,7 +317,7 @@
 			}
 			init_node_meta2(*node, meta2);
 			actual_checksum = exfat_add_checksum(entry, actual_checksum);
-			real_size = le64_to_cpu(meta2->real_size);
+			valid_size = le64_to_cpu(meta2->valid_size);
 			/* empty files must be marked as non-contiguous */
 			if ((*node)->size == 0 && (meta2->flags & EXFAT_FLAG_CONTIGUOUS))
 			{
@@ -302,37 +352,10 @@
 			namep += EXFAT_ENAME_MAX;
 			if (--continuations == 0)
 			{
-				/*
-				   There are two fields that contain file size. Maybe they
-				   plan to add compression support in the future and one of
-				   those fields is visible (uncompressed) size and the other
-				   is real (compressed) size. Anyway, currently it looks like
-				   exFAT does not support compression and both fields must be
-				   equal.
-
-				   There is an exception though: pagefile.sys (its real_size
-				   is always 0).
-				*/
-				if (real_size != (*node)->size)
-				{
-					char buffer[UTF8_BYTES(EXFAT_NAME_MAX) + 1];
-
-					exfat_get_name(*node, buffer, sizeof(buffer) - 1);
-					exfat_error("`%s' real size does not equal to size "
-							"(%"PRIu64" != %"PRIu64")", buffer,
-							real_size, (*node)->size);
+				if (!check_node(*node, actual_checksum, reference_checksum,
+						valid_size))
 					goto error;
-				}
-				if (actual_checksum != reference_checksum)
-				{
-					char buffer[UTF8_BYTES(EXFAT_NAME_MAX) + 1];
-
-					exfat_get_name(*node, buffer, sizeof(buffer) - 1);
-					exfat_error("`%s' has invalid checksum (0x%hx != 0x%hx)",
-							buffer, actual_checksum, reference_checksum);
-					goto error;
-				}
-				if (fetch_next_entry(ef, parent, it) != 0)
+				if (!fetch_next_entry(ef, parent, it))
 					goto error;
 				return 0; /* entry completed */
 			}
@@ -439,7 +462,7 @@
 			break;
 		}
 
-		if (fetch_next_entry(ef, parent, it) != 0)
+		if (!fetch_next_entry(ef, parent, it))
 			goto error;
 	}
 	/* we never reach here */
@@ -520,6 +543,8 @@
 
 static void reset_cache(struct exfat* ef, struct exfat_node* node)
 {
+	char buffer[UTF8_BYTES(EXFAT_NAME_MAX) + 1];
+
 	while (node->child)
 	{
 		struct exfat_node* p = node->child;
@@ -530,11 +555,15 @@
 	node->flags &= ~EXFAT_ATTRIB_CACHED;
 	if (node->references != 0)
 	{
-		char buffer[UTF8_BYTES(EXFAT_NAME_MAX) + 1];
 		exfat_get_name(node, buffer, sizeof(buffer) - 1);
-		exfat_warn("non-zero reference counter (%d) for `%s'",
+		exfat_warn("non-zero reference counter (%d) for '%s'",
 				node->references, buffer);
 	}
+	if (node != ef->root && (node->flags & EXFAT_ATTRIB_DIRTY))
+	{
+		exfat_get_name(node, buffer, sizeof(buffer) - 1);
+		exfat_bug("node '%s' is dirty", buffer);
+	}
 	while (node->references)
 		exfat_put_node(ef, node);
 }
@@ -544,13 +573,21 @@
 	reset_cache(ef, ef->root);
 }
 
-static void next_entry(struct exfat* ef, const struct exfat_node* parent,
+static bool next_entry(struct exfat* ef, const struct exfat_node* parent,
 		cluster_t* cluster, off64_t* offset)
 {
 	*offset += sizeof(struct exfat_entry);
 	if (*offset % CLUSTER_SIZE(*ef->sb) == 0)
-		/* next cluster cannot be invalid */
+	{
 		*cluster = exfat_next_cluster(ef, parent, *cluster);
+		if (CLUSTER_INVALID(*cluster))
+		{
+			exfat_error("invalid cluster %#x while getting next entry",
+					*cluster);
+			return false;
+		}
+	}
+	return true;
 }
 
 int exfat_flush_node(struct exfat* ef, struct exfat_node* node)
@@ -573,7 +610,8 @@
 	cluster = node->entry_cluster;
 	offset = node->entry_offset;
 	meta1_offset = co2o(ef, cluster, offset);
-	next_entry(ef, node->parent, &cluster, &offset);
+	if (!next_entry(ef, node->parent, &cluster, &offset))
+		return -EIO;
 	meta2_offset = co2o(ef, cluster, offset);
 
 	if (exfat_pread(ef->dev, &meta1, sizeof(meta1), meta1_offset) < 0)
@@ -594,7 +632,7 @@
 	}
 	if (meta2.type != EXFAT_ENTRY_FILE_INFO)
 		exfat_bug("invalid type of meta2: 0x%hhx", meta2.type);
-	meta2.size = meta2.real_size = cpu_to_le64(node->size);
+	meta2.size = meta2.valid_size = cpu_to_le64(node->size);
 	meta2.start_cluster = cpu_to_le32(node->start_cluster);
 	meta2.flags = EXFAT_FLAG_ALWAYS1;
 	/* empty files must not be marked as contiguous */
@@ -633,7 +671,8 @@
 		return false;
 	}
 
-	next_entry(ef, node->parent, &cluster, &offset);
+	if (!next_entry(ef, node->parent, &cluster, &offset))
+		return false;
 	entry_type = EXFAT_ENTRY_FILE_INFO & ~EXFAT_ENTRY_VALID;
 	if (exfat_pwrite(ef->dev, &entry_type, 1, co2o(ef, cluster, offset)) < 0)
 	{
@@ -643,7 +682,8 @@
 
 	while (name_entries--)
 	{
-		next_entry(ef, node->parent, &cluster, &offset);
+		if (!next_entry(ef, node->parent, &cluster, &offset))
+			return false;
 		entry_type = EXFAT_ENTRY_FILE_NAME & ~EXFAT_ENTRY_VALID;
 		if (exfat_pwrite(ef->dev, &entry_type, 1,
 				co2o(ef, cluster, offset)) < 0)
@@ -662,7 +702,6 @@
 	const struct exfat_node* last_node;
 	uint64_t entries = 0;
 	uint64_t new_size;
-	int rc;
 
 	if (!(dir->flags & EXFAT_ATTRIB_DIR))
 		exfat_bug("attempted to shrink a file");
@@ -698,10 +737,7 @@
 		new_size = CLUSTER_SIZE(*ef->sb);
 	if (new_size == dir->size)
 		return 0;
-	rc = exfat_truncate(ef, dir, new_size, true);
-	if (rc != 0)
-		return rc;
-	return 0;
+	return exfat_truncate(ef, dir, new_size, true);
 }
 
 static int delete(struct exfat* ef, struct exfat_node* node)
@@ -719,9 +755,15 @@
 	exfat_update_mtime(parent);
 	tree_detach(node);
 	rc = shrink_directory(ef, parent, deleted_offset);
-	exfat_put_node(ef, parent);
-	/* file clusters will be freed when node reference counter becomes 0 */
 	node->flags |= EXFAT_ATTRIB_UNLINKED;
+	if (rc != 0)
+	{
+		exfat_flush_node(ef, parent);
+		exfat_put_node(ef, parent);
+		return rc;
+	}
+	rc = exfat_flush_node(ef, parent);
+	exfat_put_node(ef, parent);
 	return rc;
 }
 
@@ -734,10 +776,14 @@
 
 int exfat_rmdir(struct exfat* ef, struct exfat_node* node)
 {
+	int rc;
+
 	if (!(node->flags & EXFAT_ATTRIB_DIR))
 		return -ENOTDIR;
 	/* check that directory is empty */
-	exfat_cache_directory(ef, node);
+	rc = exfat_cache_directory(ef, node);
+	if (rc != 0)
+		return rc;
 	if (node->child)
 		return -ENOTEMPTY;
 	return delete(ef, node);
@@ -786,7 +832,7 @@
 				return rc;
 			}
 		}
-		if (fetch_next_entry(ef, dir, &it) != 0)
+		if (!fetch_next_entry(ef, dir, &it))
 		{
 			closedir(&it);
 			return -EIO;
@@ -838,7 +884,8 @@
 		exfat_error("failed to write meta1 entry");
 		return -EIO;
 	}
-	next_entry(ef, dir, &cluster, &offset);
+	if (!next_entry(ef, dir, &cluster, &offset))
+		return -EIO;
 	if (exfat_pwrite(ef->dev, &meta2, sizeof(meta2),
 			co2o(ef, cluster, offset)) < 0)
 	{
@@ -851,7 +898,8 @@
 		memcpy(name_entry.name, node->name + i * EXFAT_ENAME_MAX,
 				MIN(EXFAT_ENAME_MAX, EXFAT_NAME_MAX - i * EXFAT_ENAME_MAX) *
 				sizeof(le16_t));
-		next_entry(ef, dir, &cluster, &offset);
+		if (!next_entry(ef, dir, &cluster, &offset))
+			return -EIO;
 		if (exfat_pwrite(ef->dev, &name_entry, sizeof(name_entry),
 				co2o(ef, cluster, offset)) < 0)
 		{
@@ -895,6 +943,12 @@
 		return rc;
 	}
 	rc = write_entry(ef, dir, name, cluster, offset, attrib);
+	if (rc != 0)
+	{
+		exfat_put_node(ef, dir);
+		return rc;
+	}
+	rc = exfat_flush_node(ef, dir);
 	exfat_put_node(ef, dir);
 	return rc;
 }
@@ -923,6 +977,13 @@
 		exfat_put_node(ef, node);
 		return rc;
 	}
+	rc = exfat_flush_node(ef, node);
+	if (rc != 0)
+	{
+		delete(ef, node);
+		exfat_put_node(ef, node);
+		return rc;
+	}
 	exfat_put_node(ef, node);
 	return 0;
 }
@@ -945,7 +1006,8 @@
 		exfat_error("failed to read meta1 entry on rename");
 		return -EIO;
 	}
-	next_entry(ef, node->parent, &old_cluster, &old_offset);
+	if (!next_entry(ef, node->parent, &old_cluster, &old_offset))
+		return -EIO;
 	if (exfat_pread(ef->dev, &meta2, sizeof(meta2),
 			co2o(ef, old_cluster, old_offset)) < 0)
 	{
@@ -969,7 +1031,8 @@
 		exfat_error("failed to write meta1 entry on rename");
 		return -EIO;
 	}
-	next_entry(ef, dir, &new_cluster, &new_offset);
+	if (!next_entry(ef, dir, &new_cluster, &new_offset))
+		return -EIO;
 	if (exfat_pwrite(ef->dev, &meta2, sizeof(meta2),
 			co2o(ef, new_cluster, new_offset)) < 0)
 	{
@@ -982,7 +1045,8 @@
 		struct exfat_entry_name name_entry = {EXFAT_ENTRY_FILE_NAME, 0};
 		memcpy(name_entry.name, name + i * EXFAT_ENAME_MAX,
 				EXFAT_ENAME_MAX * sizeof(le16_t));
-		next_entry(ef, dir, &new_cluster, &new_offset);
+		if (!next_entry(ef, dir, &new_cluster, &new_offset))
+			return -EIO;
 		if (exfat_pwrite(ef->dev, &name_entry, sizeof(name_entry),
 				co2o(ef, new_cluster, new_offset)) < 0)
 		{
@@ -1076,7 +1140,7 @@
 	rc = rename_entry(ef, dir, node, name, cluster, offset);
 	exfat_put_node(ef, dir);
 	exfat_put_node(ef, node);
-	return 0;
+	return rc;
 }
 
 void exfat_utimes(struct exfat_node* node, const struct timespec tv[2])
@@ -1128,7 +1192,7 @@
 			return 0;
 		}
 
-		if (fetch_next_entry(ef, ef->root, &it) != 0)
+		if (!fetch_next_entry(ef, ef->root, &it))
 		{
 			closedir(&it);
 			return -EIO;
