Index: uspace/srv/fs/cdfs/Makefile
===================================================================
--- uspace/srv/fs/cdfs/Makefile	(revision 993d608d2b4bfddbfa671d535ec36a5427b0803c)
+++ uspace/srv/fs/cdfs/Makefile	(revision 0c91cff933f97a7076e264d09bcbd815027707cd)
@@ -29,5 +29,6 @@
 USPACE_PREFIX = ../../..
 LIBS = $(LIBBLOCK_PREFIX)/libblock.a $(LIBFS_PREFIX)/libfs.a
-EXTRA_CFLAGS += -I$(LIBBLOCK_PREFIX) -I$(LIBFS_PREFIX)
+EXTRA_CFLAGS += -I$(LIBBLOCK_PREFIX) -I$(LIBFS_PREFIX) \
+    -I$(LIBSCSI_PREFIX)/include
 BINARY = cdfs
 
Index: uspace/srv/fs/cdfs/cdfs_ops.c
===================================================================
--- uspace/srv/fs/cdfs/cdfs_ops.c	(revision 993d608d2b4bfddbfa671d535ec36a5427b0803c)
+++ uspace/srv/fs/cdfs/cdfs_ops.c	(revision 0c91cff933f97a7076e264d09bcbd815027707cd)
@@ -48,4 +48,5 @@
 #include <errno.h>
 #include <block.h>
+#include <scsi/mmc.h>
 #include <str.h>
 #include <byteorder.h>
@@ -1035,10 +1036,13 @@
 			altroot = 0;
 	} else {
-		/* Read TOC and find the last session */
-		toc_block_t *toc = block_get_toc(service_id, 1);
-		if ((toc != NULL) && (uint16_t_be2host(toc->size) == 10)) {
-			altroot = uint32_t_be2host(toc->first_lba);
-			free(toc);
-		}
+		/*
+		 * Read TOC multisession information and get the start address
+		 * of the first track in the last session
+		 */
+		scsi_toc_multisess_data_t toc;
+
+		rc = block_read_toc(service_id, 1, &toc, sizeof(toc));
+		if (rc == EOK && (uint16_t_be2host(toc.toc_len) == 10))
+			altroot = uint32_t_be2host(toc.ftrack_lsess.start_addr);
 	}
 	
