[RFC][STEP 1][PATCH v2 02/17] nilfs2: introduce xanode related declarations

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Vyacheslav Dubeyko <slava@xxxxxxxxxxx>
Subject: [RFC][STEP 1][PATCH v2 02/17] nilfs2: introduce xanode related declarations

This patch adds declaration of structures, macros and auxiliary
functions for xafile's xanodes.

Signed-off-by: Vyacheslav Dubeyko <slava@xxxxxxxxxxx>
CC: Ryusuke Konishi <konishi.ryusuke@xxxxxxxxxxxxx>
---
 fs/nilfs2/xafile.h |  139 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 139 insertions(+)
 create mode 100644 fs/nilfs2/xafile.h

diff --git a/fs/nilfs2/xafile.h b/fs/nilfs2/xafile.h
new file mode 100644
index 0000000..28faa1f
--- /dev/null
+++ b/fs/nilfs2/xafile.h
@@ -0,0 +1,139 @@
+/*
+ * xafile.h - NILFS extended attributes file (xafile) declarations.
+ *
+ * Copyright (C) 2005-2013 Nippon Telegraph and Telephone Corporation.
+ * Copyright (C) 2013 Vyacheslav Dubeyko <slava@xxxxxxxxxxx>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Vyacheslav Dubeyko <slava@xxxxxxxxxxx>
+ */
+
+#ifndef _NILFS_XAFILE_H
+#define _NILFS_XAFILE_H
+
+#include <linux/xattr.h>
+
+/* Magic number of xafile node */
+#define NILFS_XANODE_MAGIC		0x5841 /* XA */
+
+/* Xanode types */
+#define NILFS_UNKNOWN_XANODE_TYPE		0
+/* Temporary, numbers from 1 till 6 are simply reserved */
+#define NILFS_XATTR_TREE_XANODE_TYPE		7
+#define NILFS_XANODE_TYPE_MASK			0x000F
+
+/* Xanode's flags */
+#define NILFS_XANODE_CRC32_FLAG			0x0010
+#define NILFS_INDEX_XANODE_FLAG			0x0020
+#define NILFS_XANODE_FLAG_MASK			0xFFF0
+
+/*
+ * struct nilfs_tree_xanode_header - header of dedicated xanode
+ * @magic: magic number for identification
+ * @flags: xanode's flags
+ * @height: node height in the tree
+ * @log_index_keys: log2(index keys max count)
+ * @entries: count of entries in xanode
+ * @checksum: CRC32 of node
+ * @index_keys: current count of index keys
+ * @parent_node: node ID of a parent node
+ */
+struct nilfs_tree_xanode_header {
+	__le16 magic;
+	__le16 flags;
+	u8 height;
+#define NILFS_XANODE_MIN_INDEX_KEYS	4
+	u8 log_index_keys;
+	__le16 entries;
+	__le32 checksum;
+	__le32 index_keys;
+	__le64 parent_node;
+} __packed;
+
+union nilfs_xanode_header {
+	struct {
+		__le16 magic;
+		__le16 flags;
+	} __packed base_hdr;
+	struct nilfs_tree_xanode_header tree_hdr;
+};
+
+/* Xanode related declarations */
+#define BH_DATA(bh) \
+	((char *)(((struct buffer_head *)(bh))->b_data))
+#define BH_SIZE(bh) \
+	(((struct buffer_head *)(bh))->b_size)
+
+#define NILFS_XANODE_BEGIN(bh) \
+	BH_DATA(bh)
+#define NILFS_XANODE_END(bh) \
+	(BH_DATA(bh) + BH_SIZE(bh))
+#define NILFS_XANODE_HDR(hdr_ptr) \
+	((union nilfs_xanode_header *)(hdr_ptr))
+
+/* TODO: [REWORK] Temporary xanode size is fixed by 4 KB */
+#define NILFS_XANODE_SIZE			PAGE_CACHE_SIZE
+
+#define NILFS_XANODE_HDR_SIZE_MAX		32
+#define NILFS_XANODE_INDEX_KEY_SIZE_MAX		16
+#define NILFS_XANODE_LEAF_KEY_SIZE_MAX		32
+
+#define NILFS_XATTR_VALUE_LEN_MAX \
+	(NILFS_XANODE_SIZE - \
+	 (NILFS_XANODE_HDR_SIZE_MAX + \
+	  (NILFS_XANODE_MIN_INDEX_KEYS * NILFS_XANODE_INDEX_KEY_SIZE_MAX) + \
+	  NILFS_XANODE_LEAF_KEY_SIZE_MAX + \
+	  (XATTR_NAME_MAX + 1)))
+
+#define NILFS_XANODE_TYPE(hdr_ptr) \
+	(le16_to_cpu(NILFS_XANODE_HDR(hdr_ptr)->base_hdr.flags) & \
+	 NILFS_XANODE_TYPE_MASK)
+#define NILFS_XANODE_FLAGS(hdr_ptr) \
+	(le16_to_cpu(NILFS_XANODE_HDR(hdr_ptr)->base_hdr.flags) & \
+	 NILFS_XANODE_FLAG_MASK)
+#define NILFS_XANODE_SET_TYPE(type, hdr_ptr) \
+	(cpu_to_le16(NILFS_XANODE_FLAGS(hdr_ptr) | \
+	 ((u16)type & NILFS_XANODE_TYPE_MASK)))
+#define NILFS_XANODE_SET_FLAGS(flags, hdr_ptr) \
+	(cpu_to_le16((u16)flags | NILFS_XANODE_TYPE(hdr_ptr)))
+
+static inline
+size_t NILFS_XANODE_HDR_SIZE(union nilfs_xanode_header *hdr_ptr)
+{
+	switch (NILFS_XANODE_TYPE(hdr_ptr)) {
+	case NILFS_XATTR_TREE_XANODE_TYPE:
+		return sizeof(struct nilfs_tree_xanode_header);
+	};
+	BUG();
+}
+
+#define NILFS_XANODE_ENTRIES(hdr_ptr) \
+	(NILFS_XANODE_TYPE(hdr_ptr) == NILFS_XATTR_TREE_XANODE_TYPE ? \
+	 le16_to_cpu(NILFS_XANODE_HDR(hdr_ptr)->tree_hdr.entries) : \
+	 0)
+
+static inline
+void NILFS_XANODE_ADD_ENTRIES(__u16 val, union nilfs_xanode_header *hdr_ptr)
+{
+	switch (NILFS_XANODE_TYPE(hdr_ptr)) {
+	case NILFS_XATTR_TREE_XANODE_TYPE:
+		le16_add_cpu(&hdr_ptr->tree_hdr.entries, val);
+		return;
+	};
+	BUG();
+}
+
+#endif /* _NILFS_XAFILE_H */
-- 
1.7.9.5



--
To unsubscribe from this list: send the line "unsubscribe linux-nilfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Filesystem Development]     [Linux BTRFS]     [Linux CIFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]

  Powered by Linux