mail archive of the barebox mailing list
 help / color / mirror / Atom feed
From: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
To: barebox@lists.infradead.org
Subject: [PATCH 16/18] envfs: add support of variable inode size
Date: Sat,  1 Sep 2012 14:37:31 +0200	[thread overview]
Message-ID: <1346503053-21862-16-git-send-email-plagnioj@jcrosoft.com> (raw)
In-Reply-To: <1346503053-21862-1-git-send-email-plagnioj@jcrosoft.com>

Introduce a struct envfs_inode_end with more data.
Today this will just containt the file mode to be able to add the symlink
support.

But this is compatible with the previous envfs version as they will do not
care about the extra as the previous version is just reading the filename and
then consume the extra data without using them.

Increase the envfs version to 1.0

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
---
 common/environment.c |   53 ++++++++++++++++++++++++++++++++++++++------------
 include/envfs.h      |   12 +++++++++---
 2 files changed, 50 insertions(+), 15 deletions(-)

diff --git a/common/environment.c b/common/environment.c
index 8efed97..fc5c57e 100644
--- a/common/environment.c
+++ b/common/environment.c
@@ -53,6 +53,7 @@ int file_size_action(const char *filename, struct stat *statbuf,
 
 	data->writep += sizeof(struct envfs_inode);
 	data->writep += PAD4(strlen(filename) + 1 - strlen(data->base));
+	data->writep += sizeof(struct envfs_inode_end);
 	data->writep += PAD4(statbuf->st_size);
 	return 1;
 }
@@ -62,6 +63,7 @@ int file_save_action(const char *filename, struct stat *statbuf,
 {
 	struct action_data *data = userdata;
 	struct envfs_inode *inode;
+	struct envfs_inode_end *inode_end;
 	int fd;
 	int namelen = strlen(filename) + 1 - strlen(data->base);
 
@@ -70,12 +72,16 @@ int file_save_action(const char *filename, struct stat *statbuf,
 
 	inode = (struct envfs_inode*)data->writep;
 	inode->magic = ENVFS_32(ENVFS_INODE_MAGIC);
-	inode->namelen = ENVFS_32(namelen);
+	inode->headerlen = ENVFS_32(PAD4(namelen + sizeof(struct envfs_inode_end)));
 	inode->size = ENVFS_32(statbuf->st_size);
 	data->writep += sizeof(struct envfs_inode);
 
 	strcpy(data->writep, filename + strlen(data->base));
 	data->writep += PAD4(namelen);
+	inode_end = (struct envfs_inode_end*)data->writep;
+	data->writep += sizeof(struct envfs_inode_end);
+	inode_end->magic = ENVFS_32(ENVFS_INODE_END_MAGIC);
+	inode_end->mode = ENVFS_32(S_IRWXU | S_IRWXG | S_IRWXO);
 
 	fd = open(filename, O_RDONLY);
 	if (fd < 0) {
@@ -176,8 +182,13 @@ int envfs_load(char *filename, char *dir)
 	int envfd;
 	int fd, ret = 0;
 	char *str, *tmp;
-	int namelen_full;
+	int headerlen_full;
 	unsigned long size;
+	/* for envfs < 1.0 */
+	struct envfs_inode_end inode_end_dummy;
+
+	inode_end_dummy.mode = ENVFS_32(S_IRWXU | S_IRWXG | S_IRWXO);
+	inode_end_dummy.magic = ENVFS_32(ENVFS_INODE_END_MAGIC);
 
 	envfd = open(filename, O_RDONLY);
 	if (envfd < 0) {
@@ -223,11 +234,18 @@ int envfs_load(char *filename, char *dir)
 		goto out;
 	}
 
+	if (super.major < ENVFS_MAJOR)
+		printf("envfs version %d.%d loaded into %d.%d\n",
+			super.major, super.minor,
+			ENVFS_MAJOR, ENVFS_MINOR);
+
 	while (size) {
 		struct envfs_inode *inode;
-		uint32_t inode_size, inode_namelen;
+		struct envfs_inode_end *inode_end;
+		uint32_t inode_size, inode_headerlen, namelen;
 
 		inode = (struct envfs_inode *)buf;
+		buf += sizeof(struct envfs_inode);
 
 		if (ENVFS_32(inode->magic) != ENVFS_INODE_MAGIC) {
 			printf("envfs: wrong magic on %s\n", filename);
@@ -235,16 +253,30 @@ int envfs_load(char *filename, char *dir)
 			goto out;
 		}
 		inode_size = ENVFS_32(inode->size);
-		inode_namelen = ENVFS_32(inode->namelen);
+		inode_headerlen = ENVFS_32(inode->headerlen);
+		namelen = strlen(inode->data) + 1;
+		if (super.major < 1)
+			inode_end = &inode_end_dummy;
+		else
+			inode_end = (struct envfs_inode_end *)(buf + PAD4(namelen));
 
-		debug("loading %s size %d namelen %d\n", inode->data,
-			inode_size, inode_namelen);
+		debug("loading %s size %d namelen %d headerlen %d\n", inode->data,
+			inode_size, namelen, inode_headerlen);
 
 		str = concat_path_file(dir, inode->data);
 		tmp = strdup(str);
 		make_directory(dirname(tmp));
 		free(tmp);
 
+		headerlen_full = PAD4(inode_headerlen);
+		buf += headerlen_full;
+
+		if (ENVFS_32(inode_end->magic) != ENVFS_INODE_END_MAGIC) {
+			printf("envfs: wrong inode_end_magic on %s\n", filename);
+			ret = -EIO;
+			goto out;
+		}
+
 		fd = open(str, O_WRONLY | O_CREAT | O_TRUNC, 0644);
 		free(str);
 		if (fd < 0) {
@@ -253,9 +285,7 @@ int envfs_load(char *filename, char *dir)
 			goto out;
 		}
 
-		namelen_full = PAD4(inode_namelen);
-		ret = write(fd, buf + namelen_full + sizeof(struct envfs_inode),
-				inode_size);
+		ret = write(fd, buf, inode_size);
 		if (ret < inode_size) {
 			perror("write");
 			ret = -errno;
@@ -264,9 +294,8 @@ int envfs_load(char *filename, char *dir)
 		}
 		close(fd);
 
-		buf += PAD4(inode_namelen) + PAD4(inode_size) +
-				sizeof(struct envfs_inode);
-		size -= PAD4(inode_namelen) + PAD4(inode_size) +
+		buf += PAD4(inode_size);
+		size -= headerlen_full + PAD4(inode_size) +
 				sizeof(struct envfs_inode);
 	}
 
diff --git a/include/envfs.h b/include/envfs.h
index c6df8c5..3d14fcb 100644
--- a/include/envfs.h
+++ b/include/envfs.h
@@ -5,18 +5,19 @@
 #include <asm/byteorder.h>
 #endif
 
-#define ENVFS_MAJOR		0
-#define ENVFS_MINOR		1
+#define ENVFS_MAJOR		1
+#define ENVFS_MINOR		0
 
 #define ENVFS_MAGIC		    0x798fba79	/* some random number */
 #define ENVFS_INODE_MAGIC	0x67a8c78d
+#define ENVFS_INODE_END_MAGIC	0x68a8c78d
 #define ENVFS_END_MAGIC		0x6a87d6cd
 #define ENVFS_SIGNATURE	"barebox envfs"
 
 struct envfs_inode {
 	uint32_t magic;	/* ENVFS_INODE_MAGIC */
 	uint32_t size;	/* data size in bytes  */
-	uint32_t namelen; /* The length of the filename _including_ a trailing 0 */
+	uint32_t headerlen; /* The length of the filename _including_ a trailing 0 */
 	char data[0];	/* The filename (zero terminated) + padding to 4 byte boundary
 			 * followed by the data for this inode.
 			 * The next inode follows after the data + padding to 4 byte
@@ -24,6 +25,11 @@ struct envfs_inode {
 			 */
 };
 
+struct envfs_inode_end {
+	uint32_t magic;	/* ENVFS_INODE_END_MAGIC */
+	uint32_t mode;	/* file mode */
+};
+
 /*
  * Superblock information at the beginning of the FS.
  */
-- 
1.7.10.4


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

  parent reply	other threads:[~2012-09-01 12:37 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-09-01 12:35 [PATCH 00/18 v2] fs: add symlink and readlink support Jean-Christophe PLAGNIOL-VILLARD
2012-09-01 12:37 ` [PATCH 01/18] fs: add " Jean-Christophe PLAGNIOL-VILLARD
2012-09-01 12:37   ` [PATCH 02/18] fs: rename stat to lstat as we implement lstat Jean-Christophe PLAGNIOL-VILLARD
2012-09-01 12:37   ` [PATCH 03/18] fs: add symlink support Jean-Christophe PLAGNIOL-VILLARD
2012-09-03  8:17     ` Sascha Hauer
2012-09-03  9:09       ` Jean-Christophe PLAGNIOL-VILLARD
2012-09-01 12:37   ` [PATCH 04/18] fs: implement stat Jean-Christophe PLAGNIOL-VILLARD
2012-09-03  8:28     ` Sascha Hauer
2012-09-01 12:37   ` [PATCH 05/18] fs: open: add symlink support Jean-Christophe PLAGNIOL-VILLARD
2012-09-01 12:37   ` [PATCH 06/18] fs: introduce get_mounted_path to get the path where a file is mounted Jean-Christophe PLAGNIOL-VILLARD
2012-09-01 12:37   ` [PATCH 07/18] ramfs: add symlink and readlink support Jean-Christophe PLAGNIOL-VILLARD
2012-09-01 12:37   ` [PATCH 08/18] nfs: add " Jean-Christophe PLAGNIOL-VILLARD
2012-09-01 12:37   ` [PATCH 09/18] test: add -L support to test if it's a symbolic link Jean-Christophe PLAGNIOL-VILLARD
2012-09-01 12:37   ` [PATCH 10/18] command: add readlink support Jean-Christophe PLAGNIOL-VILLARD
2012-09-01 12:37   ` [PATCH 11/18] command: add ln support Jean-Christophe PLAGNIOL-VILLARD
2012-09-01 12:37   ` [PATCH 12/18] ls: add symlink support to -l Jean-Christophe PLAGNIOL-VILLARD
2012-09-01 12:37   ` [PATCH 13/18] dirname: add -V option to return only path related to the mountpoint Jean-Christophe PLAGNIOL-VILLARD
2012-09-01 12:37   ` [PATCH 14/18] recursive_action: add ACTION_FOLLOWLINKS support Jean-Christophe PLAGNIOL-VILLARD
2012-09-01 12:37   ` [PATCH 15/18] envfs: introduce version major and minor Jean-Christophe PLAGNIOL-VILLARD
2012-09-01 12:37   ` Jean-Christophe PLAGNIOL-VILLARD [this message]
2012-09-01 12:37   ` [PATCH 17/18] envfs: add support of symlink Jean-Christophe PLAGNIOL-VILLARD
2012-09-01 12:37   ` [PATCH 18/18] defautenv: " Jean-Christophe PLAGNIOL-VILLARD
2012-09-03  8:35 ` [PATCH 00/18 v2] fs: add symlink and readlink support Sascha Hauer
2012-09-03  9:40   ` Jean-Christophe PLAGNIOL-VILLARD
  -- strict thread matches above, loose matches on Subject: below --
2012-09-03 10:04 [PATCH 00/18 v3] " Jean-Christophe PLAGNIOL-VILLARD
2012-09-03 10:08 ` [PATCH 01/18] fs: add " Jean-Christophe PLAGNIOL-VILLARD
2012-09-03 10:08   ` [PATCH 16/18] envfs: add support of variable inode size Jean-Christophe PLAGNIOL-VILLARD
2012-08-24  4:46 [PATCH 00/18] fs: add symlink and readlink support Jean-Christophe PLAGNIOL-VILLARD
2012-08-24  4:50 ` [PATCH 01/18] fs: add " Jean-Christophe PLAGNIOL-VILLARD
2012-08-24  4:50   ` [PATCH 16/18] envfs: add support of variable inode size Jean-Christophe PLAGNIOL-VILLARD

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1346503053-21862-16-git-send-email-plagnioj@jcrosoft.com \
    --to=plagnioj@jcrosoft.com \
    --cc=barebox@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox