aboutsummaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/e2fsprogs/e2fsprogs/0009-misc-create_inode.c-handle-hardlinks.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-devtools/e2fsprogs/e2fsprogs/0009-misc-create_inode.c-handle-hardlinks.patch')
-rw-r--r--meta/recipes-devtools/e2fsprogs/e2fsprogs/0009-misc-create_inode.c-handle-hardlinks.patch210
1 files changed, 0 insertions, 210 deletions
diff --git a/meta/recipes-devtools/e2fsprogs/e2fsprogs/0009-misc-create_inode.c-handle-hardlinks.patch b/meta/recipes-devtools/e2fsprogs/e2fsprogs/0009-misc-create_inode.c-handle-hardlinks.patch
deleted file mode 100644
index a330ee45a5..0000000000
--- a/meta/recipes-devtools/e2fsprogs/e2fsprogs/0009-misc-create_inode.c-handle-hardlinks.patch
+++ /dev/null
@@ -1,210 +0,0 @@
-From d83dc950b3ec1fbde33b23d42c5154091a74f4d9 Mon Sep 17 00:00:00 2001
-From: Robert Yang <liezhi.yang@windriver.com>
-Date: Mon, 23 Dec 2013 03:44:03 -0500
-Subject: [PATCH 09/11] misc/create_inode.c: handle hardlinks
-
-Create the inode and save the native inode number when we meet the hard
-link (st_nlink > 1) at the first time, use ext2fs_link() to link the
-name to the target inode number when we meet the same native inode
-number again.
-
-This algorithm is referred from the genext2fs.
-
-Upstream-Status: Backport
-
-Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
-Reviewed-by: Darren Hart <dvhart@linux.intel.com>
----
- misc/create_inode.c | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++
- misc/create_inode.h | 18 +++++++++++
- misc/mke2fs.c | 12 +++++++
- 3 files changed, 118 insertions(+)
-
-diff --git a/misc/create_inode.c b/misc/create_inode.c
-index aad7354..763504d 100644
---- a/misc/create_inode.c
-+++ b/misc/create_inode.c
-@@ -18,6 +18,44 @@
- #define S_BLKSIZE 512
- #endif
-
-+/* For saving the hard links */
-+int hdlink_cnt = HDLINK_CNT;
-+
-+/* Link an inode number to a directory */
-+static errcode_t add_link(ext2_ino_t parent_ino, ext2_ino_t ino, const char *name)
-+{
-+ struct ext2_inode inode;
-+ errcode_t retval;
-+
-+ retval = ext2fs_read_inode(current_fs, ino, &inode);
-+ if (retval) {
-+ com_err(__func__, retval, "while reading inode %u", ino);
-+ return retval;
-+ }
-+
-+ retval = ext2fs_link(current_fs, parent_ino, name, ino, inode.i_flags);
-+ if (retval == EXT2_ET_DIR_NO_SPACE) {
-+ retval = ext2fs_expand_dir(current_fs, parent_ino);
-+ if (retval) {
-+ com_err(__func__, retval, "while expanding directory");
-+ return retval;
-+ }
-+ retval = ext2fs_link(current_fs, parent_ino, name, ino, inode.i_flags);
-+ }
-+ if (retval) {
-+ com_err(__func__, retval, "while linking %s", name);
-+ return retval;
-+ }
-+
-+ inode.i_links_count++;
-+
-+ retval = ext2fs_write_inode(current_fs, ino, &inode);
-+ if (retval)
-+ com_err(__func__, retval, "while writing inode %u", ino);
-+
-+ return retval;
-+}
-+
- /* Fill the uid, gid, mode and time for the inode */
- static void fill_inode(struct ext2_inode *inode, struct stat *st)
- {
-@@ -278,6 +316,17 @@ fail:
- return retval;
- }
-
-+int is_hardlink(ext2_ino_t ino)
-+{
-+ int i;
-+
-+ for(i = 0; i < hdlinks.count; i++) {
-+ if(hdlinks.hdl[i].src_ino == ino)
-+ return i;
-+ }
-+ return -1;
-+}
-+
- /* Copy the native file to the fs */
- errcode_t do_write_internal(ext2_ino_t cwd, const char *src, const char *dest)
- {
-@@ -388,9 +437,11 @@ errcode_t populate_fs(ext2_ino_t parent_ino, const char *source_dir)
- struct dirent *dent;
- struct stat st;
- char ln_target[PATH_MAX];
-+ unsigned int save_inode;
- ext2_ino_t ino;
- errcode_t retval;
- int read_cnt;
-+ int hdlink;
-
- root = EXT2_ROOT_INO;
-
-@@ -412,6 +463,22 @@ errcode_t populate_fs(ext2_ino_t parent_ino, const char *source_dir)
- lstat(dent->d_name, &st);
- name = dent->d_name;
-
-+ /* Check for hardlinks */
-+ save_inode = 0;
-+ if (!S_ISDIR(st.st_mode) && !S_ISLNK(st.st_mode) && st.st_nlink > 1) {
-+ hdlink = is_hardlink(st.st_ino);
-+ if (hdlink >= 0) {
-+ retval = add_link(parent_ino,
-+ hdlinks.hdl[hdlink].dst_ino, name);
-+ if (retval) {
-+ com_err(__func__, retval, "while linking %s", name);
-+ return retval;
-+ }
-+ continue;
-+ } else
-+ save_inode = 1;
-+ }
-+
- switch(st.st_mode & S_IFMT) {
- case S_IFCHR:
- case S_IFBLK:
-@@ -480,6 +547,27 @@ errcode_t populate_fs(ext2_ino_t parent_ino, const char *source_dir)
- _("while setting inode for \"%s\""), name);
- return retval;
- }
-+
-+ /* Save the hardlink ino */
-+ if (save_inode) {
-+ /*
-+ * Check whether need more memory, and we don't need
-+ * free() since the lifespan will be over after the fs
-+ * populated.
-+ */
-+ if (hdlinks.count == hdlink_cnt) {
-+ if ((hdlinks.hdl = realloc (hdlinks.hdl,
-+ (hdlink_cnt + HDLINK_CNT) *
-+ sizeof (struct hdlink_s))) == NULL) {
-+ com_err(name, errno, "Not enough memory");
-+ return errno;
-+ }
-+ hdlink_cnt += HDLINK_CNT;
-+ }
-+ hdlinks.hdl[hdlinks.count].src_ino = st.st_ino;
-+ hdlinks.hdl[hdlinks.count].dst_ino = ino;
-+ hdlinks.count++;
-+ }
- }
- closedir(dh);
- return retval;
-diff --git a/misc/create_inode.h b/misc/create_inode.h
-index 9fc97fa..2b6d429 100644
---- a/misc/create_inode.h
-+++ b/misc/create_inode.h
-@@ -6,9 +6,27 @@
- #include "ext2fs/ext2fs.h"
- #include "nls-enable.h"
-
-+struct hdlink_s
-+{
-+ ext2_ino_t src_ino;
-+ ext2_ino_t dst_ino;
-+};
-+
-+struct hdlinks_s
-+{
-+ int count;
-+ struct hdlink_s *hdl;
-+};
-+
-+struct hdlinks_s hdlinks;
-+
- ext2_filsys current_fs;
- ext2_ino_t root;
-
-+/* For saving the hard links */
-+#define HDLINK_CNT 4
-+extern int hdlink_cnt;
-+
- /* For populating the filesystem */
- extern errcode_t populate_fs(ext2_ino_t parent_ino, const char *source_dir);
- extern errcode_t do_mknod_internal(ext2_ino_t cwd, const char *name, struct stat *st);
-diff --git a/misc/mke2fs.c b/misc/mke2fs.c
-index 578b62d..a63f0b7 100644
---- a/misc/mke2fs.c
-+++ b/misc/mke2fs.c
-@@ -2730,6 +2730,18 @@ no_journal:
- if (!quiet)
- printf("%s", _("Copying files into the device: "));
-
-+ /*
-+ * Allocate memory for the hardlinks, we don't need free()
-+ * since the lifespan will be over after the fs populated.
-+ */
-+ if ((hdlinks.hdl = (struct hdlink_s *)
-+ malloc(hdlink_cnt * sizeof(struct hdlink_s))) == NULL) {
-+ fprintf(stderr, "%s", _("\nNot enough memory\n"));
-+ retval = ext2fs_close(fs);
-+ return retval;
-+ }
-+
-+ hdlinks.count = 0;
- current_fs = fs;
- root = EXT2_ROOT_INO;
- retval = populate_fs(root, root_dir);
---
-1.7.10.4
-