Index: uspace/lib/ext2/libext2_filesystem.c
===================================================================
--- uspace/lib/ext2/libext2_filesystem.c	(revision 4dc6a3262ca8f458f6b3ea55c0868d93b41ab612)
+++ uspace/lib/ext2/libext2_filesystem.c	(revision 66bea2437bb9d02ffae938d02247f34e80b03f21)
@@ -109,4 +109,41 @@
 
 /**
+ * Check feature flags
+ * 
+ * @param fs Pointer to ext2_filesystem_t to check
+ * @param read_only bool to set to true if the fs needs to be read-only
+ * @return EOK on success or negative error code on failure
+ */
+int ext2_filesystem_check_flags(ext2_filesystem_t *fs, bool *o_read_only)
+{
+	// feature flags are present in rev 1 and later
+	if (ext2_superblock_get_rev_major(fs->superblock) == 0) {
+		*o_read_only = false;
+		return 0;
+	}
+	
+	uint32_t incompatible;
+	uint32_t read_only;
+	
+	incompatible = ext2_superblock_get_features_incompatible(fs->superblock);
+	read_only = ext2_superblock_get_features_read_only(fs->superblock);
+	
+	// unset any supported features
+	incompatible &= ~EXT2_SUPPORTED_INCOMPATIBLE_FEATURES;
+	read_only &= ~EXT2_SUPPORTED_READ_ONLY_FEATURES;
+	
+	if (incompatible > 0) {
+		*o_read_only = true;
+		return ENOTSUP;
+	}
+	
+	if (read_only > 0) {
+		*o_read_only = true;
+	}
+	
+	return EOK;
+}
+
+/**
  * Get a reference to block descriptor
  * 
Index: uspace/lib/ext2/libext2_filesystem.h
===================================================================
--- uspace/lib/ext2/libext2_filesystem.h	(revision 4dc6a3262ca8f458f6b3ea55c0868d93b41ab612)
+++ uspace/lib/ext2/libext2_filesystem.h	(revision 66bea2437bb9d02ffae938d02247f34e80b03f21)
@@ -52,6 +52,14 @@
 #define EXT2_REV0_INODE_SIZE		128
 
+#define EXT2_FEATURE_RO_SPARSE_SUPERBLOCK	1
+#define EXT2_FEATURE_RO_LARGE_FILE			2
+#define EXT2_FEATURE_I_TYPE_IN_DIR			2
+
+#define EXT2_SUPPORTED_INCOMPATIBLE_FEATURES EXT2_FEATURE_I_TYPE_IN_DIR
+#define EXT2_SUPPORTED_READ_ONLY_FEATURES 0
+
 extern int ext2_filesystem_init(ext2_filesystem_t *, devmap_handle_t);
 extern int ext2_filesystem_check_sanity(ext2_filesystem_t *);
+extern int ext2_filesystem_check_flags(ext2_filesystem_t *, bool *);
 extern int ext2_filesystem_get_block_group_ref(ext2_filesystem_t *, uint32_t, 
     ext2_block_group_ref_t **);
Index: uspace/lib/ext2/libext2_superblock.c
===================================================================
--- uspace/lib/ext2/libext2_superblock.c	(revision 4dc6a3262ca8f458f6b3ea55c0868d93b41ab612)
+++ uspace/lib/ext2/libext2_superblock.c	(revision 66bea2437bb9d02ffae938d02247f34e80b03f21)
@@ -258,4 +258,34 @@
 
 /**
+ * Get compatible features flags
+ * 
+ * @param sb pointer to superblock
+ */
+inline uint32_t	ext2_superblock_get_features_compatible(ext2_superblock_t *sb)
+{
+	return uint32_t_le2host(sb->features_compatible);
+}
+
+/**
+ * Get incompatible features flags
+ * 
+ * @param sb pointer to superblock
+ */
+inline uint32_t	ext2_superblock_get_features_incompatible(ext2_superblock_t *sb)
+{
+	return uint32_t_le2host(sb->features_incompatible);
+}
+
+/**
+ * Get read-only compatible features flags
+ * 
+ * @param sb pointer to superblock
+ */
+inline uint32_t	ext2_superblock_get_features_read_only(ext2_superblock_t *sb)
+{
+	return uint32_t_le2host(sb->features_read_only);
+}
+
+/**
  * Compute count of block groups present in the filesystem
  * 
Index: uspace/lib/ext2/libext2_superblock.h
===================================================================
--- uspace/lib/ext2/libext2_superblock.h	(revision 4dc6a3262ca8f458f6b3ea55c0868d93b41ab612)
+++ uspace/lib/ext2/libext2_superblock.h	(revision 66bea2437bb9d02ffae938d02247f34e80b03f21)
@@ -64,5 +64,8 @@
 	uint32_t	first_inode;
 	uint16_t	inode_size;
-	uint8_t		unused5[14];
+	uint16_t	unused5;
+	uint32_t	features_compatible;
+	uint32_t	features_incompatible;
+	uint32_t	features_read_only;
 	uint8_t		uuid[16]; // UUID TODO: Create a library for UUIDs
 	uint8_t		volume_name[16];
@@ -103,4 +106,7 @@
 inline uint32_t	ext2_superblock_get_block_group_count(ext2_superblock_t *);
 inline uint32_t	ext2_superblock_get_inodes_per_group(ext2_superblock_t *);
+inline uint32_t	ext2_superblock_get_features_compatible(ext2_superblock_t *);
+inline uint32_t	ext2_superblock_get_features_incompatible(ext2_superblock_t *);
+inline uint32_t	ext2_superblock_get_features_read_only(ext2_superblock_t *);
 
 extern int ext2_superblock_read_direct(devmap_handle_t, ext2_superblock_t **);
