--- omv/filesystemmgmt.inc.org	2014-09-18 09:39:59.956015279 +0200
+++ omv/filesystemmgmt.inc	2014-09-18 15:36:01.981792621 +0200
@@ -83,7 +83,7 @@
 			if (!in_array($objectv['type'], array("ext", "ext2", "ext3",
 			  "ext4", "xfs", "jfs", "iso9660", "msdos", "ntfs", "udf",
 			  "umsdos", "vfat", "ufs", "reiserfs", "btrfs", "hfsplus",
-			  "zfs")))
+			  "zfs", "zfs_member")))
 				continue;
 			// Use the devicefile to get the filesystem details because vfat
 			// filesystems do not have a valid UUID. Any idea why?
@@ -117,24 +117,46 @@
 			// exists, then check if it is referenced by any other object,
 			// e.g. by a shared folder configuration object.
 			if (FALSE !== ($meObject = OMVRpc::exec("FsTab", "getByFsName",
-			  array("id" => $fs->getDeviceFile()), $context))) {
-			  	$xpath = sprintf("//mntentref[contains(.,'%s')]",
-			  	  $meObject['uuid']);
-				if (TRUE === $xmlConfig->exists($xpath))
-					$object['_used'] = TRUE;
-			}
+				array("id" => $fs->getDeviceFile()), $context))) {
+					if (strcmp($object['type'], "zfs_member") === 0) {
+						//This is a zfs filesystem which uses another format for UUID.
+						//The UUID of the filesystem is stored in the fsname property.
+						$xpath = "//system/fstab/mntent[fsname='" . $object['uuid'] . "']";
+						$zfs_obj = $xmlConfig->get($xpath);
+						if (!is_null($zfs_obj)) {
+							$xpath = sprintf("//mntentref[contains(.,'%s')]",$zfs_obj['uuid']);
+							if (TRUE === $xmlConfig->exists($xpath)) {
+								$object['_used'] = TRUE;
+							}
+						}
+					} else {
+						$xpath = sprintf("//mntentref[contains(.,'%s')]",
+							$meObject['uuid']);
+						if (TRUE === $xmlConfig->exists($xpath))
+							$object['_used'] = TRUE;
+					}
+				}
 			// Mark the device where the operating system is installed on
 			// as used and read-only.
 			if (OMVSystem::isRootDeviceFile($object['devicefile'])) {
 				$object['_used'] = TRUE;
 				$object['_readonly'] = TRUE;
 			}
+			//zfs filesystems are not detected by the isMounted method, but can be
+			//probed via /proc/mounts
+			$zfs_mounted = FALSE;
+			if (strcmp($object['type'], "zfs_member") === 0) {
+				$cmd = "cat /proc/mounts | grep '^" . $object['label'] . "[[:space:]]' 2>&1";
+				$this->exec($cmd, $output, $result);
+				if (count($output) === 1)
+					$zfs_mounted = TRUE;
+			}
 			// If the filesystem is mounted then try to get more
 			// informations about it. Note,it is not possible to get
 			// details from unmounted filesystems, because on most kinds
 			// of systems doing so requires very nonportable intimate
 			// knowledge of filesystem structures. See man (1) df.
-			if (TRUE === $fs->isMounted()) {
+			if ((TRUE === $fs->isMounted()) || ($zfs_mounted)) {
 				$object['mounted'] = TRUE;
 				// Get some more filesystem details if possible.
 				if (FALSE !== ($fsStats = $fs->getStatistics())) {
@@ -183,8 +205,8 @@
 					  "includeRoot":{"type":"boolean","optional":true}
 				  }
 			  }');
-		// Get list of mount points, except bind mounts.
-		$xpath = "//system/fstab/mntent[not(contains(opts,'bind'))]";
+		// Get list of mount points, except bind mounts and zfs mountpoints
+		$xpath = "//system/fstab/mntent[not(contains(opts,'bind') or contains(type,'zfs'))]";
 		$objects = $xmlConfig->getList($xpath);
 		if (is_null($objects)) {
 			throw new OMVException(OMVErrorMsg::E_CONFIG_GET_OBJECT_FAILED,
@@ -344,7 +366,7 @@
 		// exist anymore. This is necessary to be able remove invalid mount
 		// point configuration objects. Mark such filesystem as missing.
 		$xpath = "//system/fstab/mntent[not(contains(opts,'bind') or ".
-		  "contains(opts,'loop'))]";
+		  "contains(opts,'loop') or contains(type,'zfs'))]";
 		$mntents = $xmlConfig->getList($xpath);
 		if(is_null($mntents)) {
 			throw new OMVException(OMVErrorMsg::E_CONFIG_GET_OBJECT_FAILED,
