Index: uspace/app/df/df.c
===================================================================
--- uspace/app/df/df.c	(revision 781408e05804959fcfbddeb52c684f479ed86d7b)
+++ uspace/app/df/df.c	(revision 3432ddbc317ea5071bec2700049d0a9766c3f296)
@@ -47,5 +47,6 @@
 #define NAME  "df"
 
-#define HEADER_TABLE "Filesystem     %4u-blocks           Used      Available Used%% Mounted on\n"
+#define HEADER_TABLE 	"Filesystem     %4u-blocks           Used      Available Used%% Mounted on"
+#define HEADER_TABLE_HR "Filesystem           Size           Used      Available Used%% Mounted on"
 
 #define PERCENTAGE(x, tot) ((unsigned long long) (100L * (x) / (tot)))  
@@ -56,5 +57,8 @@
 
 static unsigned int unit_size;
+static unsigned int human_readable;
 
+static int size_to_human_readable(char buf[], uint64_t bytes)
+static void print_header(void);
 static void print_statfs(struct statfs *, char *, char *);
 static void print_usage(void);
@@ -66,4 +70,5 @@
 	
 	unit_size = 512;
+	human_readable = 0;
 
 	/******************************************/
@@ -73,4 +78,5 @@
 		switch(optres) {
 		case 'h':
+			human_readable = 1;
 			break;
 
@@ -111,5 +117,5 @@
 	LIST_INITIALIZE(mtab_list);
 	get_mtab_list(&mtab_list);
-	printf(HEADER_TABLE, unit_size);
+	print_header();
 	list_foreach(mtab_list, cur) {
 		mtab_ent_t *mtab_ent = list_get_instance(cur, mtab_ent_t,
@@ -122,14 +128,57 @@
 }
 
+static int size_to_human_readable(char buf[], uint64_t bytes)
+{
+	const char *units = "BkMGTPEZY";
+	int i = 0;
+	int limit;
+
+	limit = str_length(units);
+	while (bytes >= 1024) {
+		if (i >= limit) 
+			return -1;
+		bytes /= 1024;
+		i++;
+	}
+	snprintf(buf, 6, "%4llu%c", (unsigned long long)bytes, units[i]);
+
+	return 0;
+}
+
+static void print_header(void)
+{
+	if (human_readable)
+		printf(HEADER_TABLE_HR); 
+	else 
+		printf(HEADER_TABLE, unit_size);
+	putchar('\n');
+}
+
 static void print_statfs(struct statfs *st, char *name, char *mountpoint)
 {
 	printf("%10s", name);
-	printf(" %15llu %14llu %14llu %4llu%% %s\n", 
-		FSBK_TO_BK(st->f_blocks, st->f_bsize, unit_size),                              /* Blocks     */
-		FSBK_TO_BK(st->f_blocks - st->f_bfree, st->f_bsize, unit_size),                /* Used       */
-		FSBK_TO_BK(st->f_bfree, st->f_bsize, unit_size),                               /* Available  */
-		(st->f_blocks)?PERCENTAGE(st->f_blocks - st->f_bfree, st->f_blocks):0L,        /* Used%      */
-		mountpoint                                                                     /* Mounted on */
-	);
+	
+	if (human_readable) {
+		char tmp[1024];
+		size_to_human_readable(tmp, st->f_blocks *  st->f_bsize);
+		printf(" %14s", tmp);                                                                 /* Size       */
+		size_to_human_readable(tmp, (st->f_blocks - st->f_bfree)  *  st->f_bsize);
+		printf(" %14s", tmp);                                                                 /* Used       */
+		size_to_human_readable(tmp, st->f_bfree *  st->f_bsize);
+		printf(" %14s", tmp);                                                                 /* Available  */
+		printf(" %4llu%% %s\n", 
+			(st->f_blocks)?PERCENTAGE(st->f_blocks - st->f_bfree, st->f_blocks):0L,        /* Used%      */
+			mountpoint                                                                     /* Mounted on */
+		);
+	}
+	else
+		printf(" %15llu %14llu %14llu %4llu%% %s\n", 
+			FSBK_TO_BK(st->f_blocks, st->f_bsize, unit_size),                              /* Blocks     */
+			FSBK_TO_BK(st->f_blocks - st->f_bfree, st->f_bsize, unit_size),                /* Used       */
+			FSBK_TO_BK(st->f_bfree, st->f_bsize, unit_size),                               /* Available  */
+			(st->f_blocks)?PERCENTAGE(st->f_blocks - st->f_bfree, st->f_blocks):0L,        /* Used%      */
+			mountpoint                                                                     /* Mounted on */
+		);
+	
 }
 
