diff --git a/tools/mtd-utils/Makefile b/tools/mtd-utils/Makefile
index 49f1ad021f639bc1423c864a3e3fca32c3f8e094..7dc31f51a509a58429569010acb168f541d59537 100644
--- a/tools/mtd-utils/Makefile
+++ b/tools/mtd-utils/Makefile
@@ -7,14 +7,14 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=mtd
-PKG_VERSION:=20101002
+PKG_VERSION:=20101124
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=git://git.infradead.org/mtd-utils.git
 PKG_SOURCE_PROTO:=git
-PKG_SOURCE_VERSION:=b8bbd73bb5bd0b1f5f2c6a3441486d69a45cc79c
+PKG_SOURCE_VERSION:=c1a7889da754dfac2f130772daef783980c65d5d
 PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
-PKG_MD5SUM:=475a6bd4b26bdde63f759f9e1f7bc461
+PKG_MD5SUM:=78e5e74957f458bd808a6d4af0a38071
 PKG_CAT:=zcat
 
 HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/$(PKG_NAME)-$(PKG_VERSION)
diff --git a/tools/mtd-utils/patches/000-upstream_jffs2reader.patch b/tools/mtd-utils/patches/000-upstream_jffs2reader.patch
deleted file mode 100644
index bacef76210672422c99ad22d9569b84ba270b857..0000000000000000000000000000000000000000
--- a/tools/mtd-utils/patches/000-upstream_jffs2reader.patch
+++ /dev/null
@@ -1,165 +0,0 @@
-From fec81abd9593fe11ba8577d38e4143e5708e3343 Mon Sep 17 00:00:00 2001
-From: Mike Frysinger <vapier@gentoo.org>
-Date: Sat, 2 Oct 2010 14:58:09 -0400
-Subject: [PATCH] jffs2reader: convert to common.h helpers
-
-Signed-off-by: Mike Frysinger <vapier@gentoo.org>
-Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
----
- jffs2reader.c |   71 +++++++++++++++++---------------------------------------
- 1 files changed, 22 insertions(+), 49 deletions(-)
-
-diff --git a/jffs2reader.c b/jffs2reader.c
-index 0cdff19..d5a3d95 100644
---- a/jffs2reader.c
-+++ b/jffs2reader.c
-@@ -77,6 +77,7 @@ BUGS:
- #include <sys/param.h>
- #include <dirent.h>
- #include <linux/jffs2.h>
-+#include "common.h"
- 
- #define SCRATCH_SIZE (5*1024*1024)
- 
-@@ -136,10 +137,8 @@ void putblock(char *b, size_t bsize, size_t * rsize,
- {
- 	uLongf dlen = n->dsize;
- 
--	if (n->isize > bsize || (n->offset + dlen) > bsize) {
--		fprintf(stderr, "File does not fit into buffer!\n");
--		exit(EXIT_FAILURE);
--	}
-+	if (n->isize > bsize || (n->offset + dlen) > bsize)
-+		errmsg_die("File does not fit into buffer!");
- 
- 	if (*rsize < n->isize)
- 		bzero(b + *rsize, n->isize - *rsize);
-@@ -163,8 +162,7 @@ void putblock(char *b, size_t bsize, size_t * rsize,
- 			/* [DYN]RUBIN support required! */
- 
- 		default:
--			fprintf(stderr, "Unsupported compression method!\n");
--			exit(EXIT_FAILURE);
-+			errmsg_die("Unsupported compression method!");
- 	}
- 
- 	*rsize = n->isize;
-@@ -188,7 +186,7 @@ struct dir *putdir(struct dir *dd, struct jffs2_raw_dirent *n)
- 
- 	if (n->ino) {
- 		if (dd == NULL) {
--			d = malloc(sizeof(struct dir));
-+			d = xmalloc(sizeof(struct dir));
- 			d->type = n->type;
- 			memcpy(d->name, n->name, n->nsize);
- 			d->nsize = n->nsize;
-@@ -208,7 +206,7 @@ struct dir *putdir(struct dir *dd, struct jffs2_raw_dirent *n)
- 			}
- 
- 			if (dd->next == NULL) {
--				dd->next = malloc(sizeof(struct dir));
-+				dd->next = xmalloc(sizeof(struct dir));
- 				dd->next->type = n->type;
- 				memcpy(dd->next->name, n->name, n->nsize);
- 				dd->next->nsize = n->nsize;
-@@ -344,7 +342,7 @@ void printdir(char *o, size_t size, struct dir *d, char *path, int recurse)
- 		}
- 		ri = find_raw_inode(o, size, d->ino);
- 		if (!ri) {
--			fprintf(stderr, "bug: raw_inode missing!\n");
-+			warnmsg("bug: raw_inode missing!");
- 			d = d->next;
- 			continue;
- 		}
-@@ -379,11 +377,7 @@ void printdir(char *o, size_t size, struct dir *d, char *path, int recurse)
- 
- 		if (d->type == DT_DIR && recurse) {
- 			char *tmp;
--			tmp = malloc(BUFSIZ);
--			if (!tmp) {
--				fprintf(stderr, "memory exhausted\n");
--				exit(EXIT_FAILURE);
--			}
-+			tmp = xmalloc(BUFSIZ);
- 			sprintf(tmp, "%s/%s", path, d->name);
- 			lsdir(o, size, tmp, recurse);		/* Go recursive */
- 			free(tmp);
-@@ -817,11 +811,8 @@ void lsdir(char *o, size_t size, char *path, int recurse)
- 	dd = resolvepath(o, size, 1, path, &ino);
- 
- 	if (ino == 0 ||
--			(dd == NULL && ino == 0) || (dd != NULL && dd->type != DT_DIR)) {
--		fprintf(stderr, "%s: %s: No such file or directory\n",
--				PROGRAM_NAME, path);
--		exit(EXIT_FAILURE);
--	}
-+			(dd == NULL && ino == 0) || (dd != NULL && dd->type != DT_DIR))
-+		errmsg_die("%s: No such file or directory", path);
- 
- 	d = collectdir(o, size, ino, d);
- 	printdir(o, size, d, path, recurse);
-@@ -848,15 +839,11 @@ void catfile(char *o, size_t size, char *path, char *b, size_t bsize,
- 
- 	dd = resolvepath(o, size, 1, path, &ino);
- 
--	if (ino == 0) {
--		fprintf(stderr, "%s: No such file or directory\n", path);
--		exit(EXIT_FAILURE);
--	}
-+	if (ino == 0)
-+		errmsg_die("%s: No such file or directory", path);
- 
--	if (dd == NULL || dd->type != DT_REG) {
--		fprintf(stderr, "%s: Not a regular file\n", path);
--		exit(EXIT_FAILURE);
--	}
-+	if (dd == NULL || dd->type != DT_REG)
-+		errmsg_die("%s: Not a regular file", path);
- 
- 	ri = find_raw_inode(o, size, ino);
- 	putblock(b, bsize, rsize, ri);
-@@ -896,36 +883,22 @@ int main(int argc, char **argv)
- 	}
- 
- 	fd = open(argv[optind], O_RDONLY);
--	if (fd == -1) {
--		fprintf(stderr, "%s: %s\n", argv[optind], strerror(errno));
--		exit(2);
--	}
-+	if (fd == -1)
-+		sys_errmsg_die("%s", argv[optind]);
- 
--	if (fstat(fd, &st)) {
--		fprintf(stderr, "%s: %s\n", argv[optind], strerror(errno));
--		exit(3);
--	}
-+	if (fstat(fd, &st))
-+		sys_errmsg_die("%s", argv[optind]);
- 
--	buf = malloc((size_t) st.st_size);
--	if (buf == NULL) {
--		fprintf(stderr, "%s: memory exhausted\n", argv[optind]);
--		exit(4);
--	}
-+	buf = xmalloc((size_t) st.st_size);
- 
--	if (read(fd, buf, st.st_size) != (ssize_t) st.st_size) {
--		fprintf(stderr, "%s: %s\n", argv[optind], strerror(errno));
--		exit(5);
--	}
-+	if (read(fd, buf, st.st_size) != (ssize_t) st.st_size)
-+		sys_errmsg_die("%s", argv[optind]);
- 
- 	if (dir)
- 		lsdir(buf, st.st_size, dir, recurse);
- 
- 	if (file) {
--		scratch = malloc(SCRATCH_SIZE);
--		if (scratch == NULL) {
--			fprintf(stderr, "%s: memory exhausted\n", argv[optind]);
--			exit(6);
--		}
-+		scratch = xmalloc(SCRATCH_SIZE);
- 
- 		catfile(buf, st.st_size, file, scratch, SCRATCH_SIZE, &ssize);
- 		free(scratch);
diff --git a/tools/mtd-utils/patches/000-upstream_nanddump.patch b/tools/mtd-utils/patches/000-upstream_nanddump.patch
deleted file mode 100644
index e04f6d5e0d3bbc98a5e4efaa8832eae7af4e7d15..0000000000000000000000000000000000000000
--- a/tools/mtd-utils/patches/000-upstream_nanddump.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From: Baruch Siach <baruch@tkos.co.il>
-Date: Mon, 11 Oct 2010 09:19:38 +0000 (+0200)
-Subject: nanddump: fix initialization of bad blocks oob data buffer
-X-Git-Url: http://git.infradead.org
-
-nanddump: fix initialization of bad blocks oob data buffer
-
-When dumping oob data of a bad block, initialize oobbuf with 0xff, instead of
-readbuf.  This avoids bogus oob data on output.
-
-Signed-off-by: Baruch Siach <baruch@tkos.co.il>
-Acked-by: Mike Frysinger <vapier@gentoo.org>
-Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
----
-
-diff --git a/nanddump.c b/nanddump.c
-index 3589931..b7341a5 100644
---- a/nanddump.c
-+++ b/nanddump.c
-@@ -452,7 +452,7 @@ int main(int argc, char * const argv[])
- 			continue;
- 
- 		if (badblock) {
--			memset (readbuf, 0xff, meminfo.oobsize);
-+			memset(oobbuf, 0xff, meminfo.oobsize);
- 		} else {
- 			/* Read OOB data and exit on failure */
- 			oob.start = ofs;