linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 06/14] Pramfs: Include files
@ 2009-06-13 13:21 Marco
  2009-06-13 14:04 ` Sam Ravnborg
  0 siblings, 1 reply; 28+ messages in thread
From: Marco @ 2009-06-13 13:21 UTC (permalink / raw)
  To: Linux FS Devel; +Cc: Linux Embedded, Linux Kernel, Daniel Walker

From: Marco Stornelli <marco.stornelli@gmail.com>

Include files.

Signed-off-by: Marco Stornelli <marco.stornelli@gmail.com>
---

diff -uprN linux-2.6.30-orig/fs/pramfs/pram_fs.h linux-2.6.30/fs/pramfs/pram_fs.h
--- linux-2.6.30-orig/fs/pramfs/pram_fs.h	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.30/fs/pramfs/pram_fs.h	2009-06-13 12:58:49.000000000 +0200
@@ -0,0 +1,388 @@
+/*
+ * FILE NAME include/linux/pram_fs.h
+ *
+ * BRIEF DESCRIPTION
+ *
+ * Definitions for the PRAMFS filesystem.
+ *
+ * Copyright 2009 Marco Stornelli <marco.stornelli@gmail.com>
+ * Copyright 2003 Sony Corporation
+ * Copyright 2003 Matsushita Electric Industrial Co., Ltd.
+ * 2003-2004 (c) MontaVista Software, Inc. , Steve Longerbeam
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+#ifndef _LINUX_PRAM_FS_H
+#define _LINUX_PRAM_FS_H
+
+#include <linux/types.h>
+
+#ifdef __KERNEL__
+#include <linux/sched.h>
+#include <linux/buffer_head.h>
+#include "pram_fs_sb.h"
+#endif
+
+/*
+ * The PRAM filesystem constants/structures
+ */
+
+/*
+ * Define PRAMFS_DEBUG to produce debug messages
+ */
+#define PRAMFS_DEBUG
+
+/*
+ * Debug code
+ */
+#ifdef __KERNEL__
+#define PFX "pramfs"
+#ifdef PRAMFS_DEBUG
+#define pram_dbg(format, arg...) \
+    printk(KERN_DEBUG PFX ": " format , ## arg)
+#else
+#define pram_dbg(format, arg...) do {} while (0)
+#endif
+#define pram_err(format, arg...) \
+    printk(KERN_ERR PFX ": " format , ## arg)
+#define pram_info(format, arg...) \
+    printk(KERN_INFO PFX ": " format , ## arg)
+#define pram_warn(format, arg...) \
+    printk(KERN_WARNING PFX ": " format , ## arg)
+#endif
+
+/*
+ * The PRAM file system magic number
+ */
+#define PRAM_SUPER_MAGIC	0xEFFA
+
+/*
+ * Maximal count of links to a file
+ */
+#define PRAM_LINK_MAX		32000
+
+#define PRAM_MIN_BLOCK_SIZE 512
+#define PRAM_MAX_BLOCK_SIZE 4096
+#define PRAM_DEF_BLOCK_SIZE 2048
+
+#define PRAM_INODE_SIZE 128 /* must be power of two */
+#define PRAM_INODE_BITS   7
+
+/*
+ * Structure of a directory entry in PRAMFS.
+ * Offsets are to the inode that holds the referenced dentry.
+ */
+struct pram_dentry {
+	off_t d_next;     /* next dentry in this directory */
+	off_t d_prev;     /* previous dentry in this directory */
+	off_t d_parent;   /* parent directory */
+	char       d_name[0];
+};
+
+
+/*
+ * Structure of an inode in PRAMFS
+ */
+struct pram_inode {
+	__u32   i_sum;          /* checksum of this inode */
+	__u32	i_uid;		/* Owner Uid */
+	__u32	i_gid;		/* Group Id */
+	__u16	i_mode;		/* File mode */
+	__u16	i_links_count;	/* Links count */
+	__u32	i_blocks;	/* Blocks count */
+	__u32	i_size;		/* Size of data in bytes */
+	__u32	i_atime;	/* Access time */
+	__u32	i_ctime;	/* Creation time */
+	__u32	i_mtime;	/* Modification time */
+	__u32	i_dtime;	/* Deletion Time */
+
+	union {
+		struct {
+			/*
+			 * ptr to row block of 2D block pointer array,
+			 * file block #'s 0 to (blocksize/4)^2 - 1.
+			 */
+			off_t row_block;
+		} reg;   /* regular file or symlink inode */
+		struct {
+			off_t head; /* first entry in this directory */
+			off_t tail; /* last entry in this directory */
+		} dir;
+		struct {
+			__u32 rdev; /* major/minor # */
+		} dev;   /* device inode */
+	} i_type;
+
+	struct pram_dentry i_d;
+};
+
+#define PRAM_NAME_LEN \
+    (PRAM_INODE_SIZE - offsetof(struct pram_inode, i_d.d_name) - 1)
+
+
+#define PRAM_SB_SIZE 128 /* must be power of two */
+#define PRAM_SB_BITS   7
+
+/*
+ * Structure of the super block in PRAMFS
+ */
+struct pram_super_block {
+	__u32   s_size;         /* total size of fs in bytes */
+	__u32   s_blocksize;    /* blocksize in bytes */
+	__u32	s_inodes_count;	/* total inodes count (used or free) */
+	__u32	s_free_inodes_count;/* free inodes count */
+	__u32   s_free_inode_hint;  /* start hint for locating free inodes */
+	__u32	s_blocks_count;	/* total data blocks count (used or free) */
+	__u32	s_free_blocks_count;/* free data blocks count */
+	__u32	s_free_blocknr_hint;/* free data blocks count */
+	off_t s_bitmap_start; /* data block in-use bitmap location */
+	__u32   s_bitmap_blocks;/* size of bitmap in number of blocks */
+	__u32	s_mtime;	/* Mount time */
+	__u32	s_wtime;	/* Write time */
+	__u16	s_magic;	/* Magic signature */
+	char	s_volume_name[16]; /* volume name */
+	__u32   s_sum;          /* checksum of this sb, including padding */
+};
+
+/* The root inode follows immediately after the redundant super block */
+#define PRAM_ROOT_INO PRAM_SB_SIZE
+
+#ifdef __KERNEL__
+
+/* Function Prototypes */
+
+#ifdef CONFIG_PRAMFS_XIP
+
+#define pram_read	xip_file_read
+#define pram_write	xip_file_write
+#define pram_mmap	xip_file_mmap
+#define pram_aio_read	NULL
+#define pram_aio_write	NULL
+#define pram_readpage	NULL
+#define pram_direct_IO	NULL
+
+#else
+
+#define pram_read	do_sync_read
+#define pram_write	do_sync_write
+#define pram_mmap	generic_file_mmap
+#define pram_aio_read	generic_file_aio_read
+#define pram_aio_write	generic_file_aio_write
+#define pram_direct_IO	__pram_direct_IO
+#define pram_readpage	__pram_readpage
+
+extern int pram_get_and_update_block(struct inode *inode, sector_t iblock,
+				     struct buffer_head *bh, int create);
+
+static inline int __pram_readpage(struct file *file, struct page *page)
+{
+	return block_read_full_page(page, pram_get_and_update_block);
+}
+
+/* file.c */
+extern ssize_t __pram_direct_IO(int rw, struct kiocb *iocb,
+			  const struct iovec *iov,
+			  loff_t offset, unsigned long nr_segs);
+
+
+#endif /* CONFIG_PRAMFS_XIP */
+
+/* balloc.c */
+extern void pram_init_bitmap(struct super_block *sb);
+extern void pram_free_block(struct super_block *sb, int blocknr);
+extern int pram_new_block(struct super_block *sb, int *blocknr, int zero);
+extern unsigned long pram_count_free_blocks(struct super_block *sb);
+
+/* dir.c */
+extern int pram_add_link(struct dentry *dentry, struct inode *inode);
+extern int pram_remove_link(struct inode *inode);
+
+/* inode.c */
+extern int pram_alloc_blocks(struct inode *inode, int file_blocknr, int num);
+extern off_t pram_find_data_block(struct inode *inode,
+					 int file_blocknr);
+extern struct inode *pram_fill_new_inode(struct super_block *sb,
+					   struct pram_inode *raw_inode);
+extern void pram_put_inode(struct inode *inode);
+extern void pram_delete_inode(struct inode *inode);
+extern struct inode *pram_new_inode(const struct inode *dir, int mode);
+extern void pram_read_inode(struct inode *inode);
+extern void pram_truncate(struct inode *inode);
+extern int pram_write_inode(struct inode *inode, int wait);
+extern void pram_dirty_inode(struct inode *inode);
+extern int pram_notify_change(struct dentry *dentry, struct iattr *attr);
+
+/* super.c */
+#ifdef CONFIG_PRAMFS_TEST
+extern struct pram_super_block *get_pram_super(void);
+#endif
+extern struct super_block *pram_read_super(struct super_block *sb,
+					      void *data,
+					      int silent);
+extern int pram_statfs(struct dentry *d, struct kstatfs *buf);
+extern int pram_remount(struct super_block *sb, int *flags, char *data);
+
+/* symlink.c */
+extern int pram_block_symlink(struct inode *inode,
+			       const char *symname, int len);
+
+
+#ifndef CONFIG_PRAMFS_NOWP
+extern void pram_writeable(void *vaddr, unsigned long size, int rw);
+
+#define wrprotect(addr, size) {\
+		spin_lock(&init_mm.page_table_lock);\
+		pram_writeable(addr, size, 0);\
+		spin_unlock(&init_mm.page_table_lock);\
+}
+
+#else
+
+#define wrprotect(addr, size) do {} while (0)
+
+#endif /* CONFIG PRAMFS_NOWP */
+
+/* Inline functions start here */
+
+static inline u32 pram_calc_checksum(u32 *buf, int n)
+{
+	u32 sum = 0;
+	while (n--)
+		sum += *buf++;
+	return sum;
+}
+
+/* If this is part of a read-modify-write of the super block,
+   pram_lock_super() before calling! */
+static inline struct pram_super_block *
+pram_get_super(struct super_block *sb)
+{
+	struct pram_sb_info *sbi = (struct pram_sb_info *)sb->s_fs_info;
+	return (struct pram_super_block *)sbi->virt_addr;
+}
+
+/* pram_lock_super() before calling! */
+static inline void pram_sync_super(struct pram_super_block *ps)
+{
+	ps->s_wtime = get_seconds();
+	ps->s_sum = 0;
+	ps->s_sum -= pram_calc_checksum((u32 *)ps, PRAM_SB_SIZE>>2);
+}
+
+/* pram_lock_inode() before calling! */
+static inline void pram_sync_inode(struct pram_inode *pi)
+{
+	/* pi->i_mtime = CURRENT_TIME; */
+	pi->i_sum = 0;
+	pi->i_sum -= pram_calc_checksum((u32 *)pi, PRAM_INODE_SIZE>>2);
+}
+
+#ifndef CONFIG_PRAMFS_NOWP
+#define pram_lock_range(p, len, flags) {\
+	spin_lock_irqsave(&init_mm.page_table_lock, flags);\
+	pram_writeable((p), (len), 1);\
+}
+
+#define pram_unlock_range(p, len, flags) {\
+	pram_writeable((p), (len), 0);\
+	spin_unlock_irqrestore(&init_mm.page_table_lock, flags);\
+}
+#else
+#define pram_lock_range(p, len, flags) do {} while (0)
+#define pram_unlock_range(p, len, flags) do {} while (0)
+#endif
+
+/* write protection for super block */
+#define pram_lock_super(ps, flags) \
+	pram_lock_range((ps), PRAM_SB_SIZE, flags)
+#define pram_unlock_super(ps, flags) {\
+	pram_sync_super(ps);\
+	pram_unlock_range((ps), PRAM_SB_SIZE, flags);\
+}
+
+/* write protection for inode metadata */
+#define pram_lock_inode(pi, flags) \
+	pram_lock_range((pi), PRAM_INODE_SIZE, flags)
+#define pram_unlock_inode(pi, flags) {\
+	pram_sync_inode(pi);\
+	pram_unlock_range((pi), PRAM_SB_SIZE, flags);\
+}
+
+/* write protection for a data block */
+#define pram_lock_block(sb, bp, flags) \
+	pram_lock_range((bp), (sb)->s_blocksize, flags)
+#define pram_unlock_block(sb, bp, flags) \
+	pram_unlock_range((bp), (sb)->s_blocksize, flags)
+
+static inline void *
+pram_get_bitmap(struct super_block *sb)
+{
+	struct pram_super_block *ps = pram_get_super(sb);
+	return (void *)ps + ps->s_bitmap_start;
+}
+
+/* If this is part of a read-modify-write of the inode metadata,
+   pram_lock_inode() before calling! */
+static inline struct pram_inode *
+pram_get_inode(struct super_block *sb, off_t ino)
+{
+	struct pram_super_block *ps = pram_get_super(sb);
+	return ino ? (struct pram_inode *)((void *)ps + ino) : NULL;
+}
+
+static inline ino_t
+pram_get_inodenr(struct super_block *sb, struct pram_inode *pi)
+{
+	struct pram_super_block *ps = pram_get_super(sb);
+	return (ino_t)((unsigned long)pi - (unsigned long)ps);
+}
+
+static inline off_t
+pram_get_block_off(struct super_block *sb, unsigned long blocknr)
+{
+	struct pram_super_block *ps = pram_get_super(sb);
+	return (off_t)(ps->s_bitmap_start +
+			     (blocknr << sb->s_blocksize_bits));
+}
+
+static inline unsigned long
+pram_get_blocknr(struct super_block *sb, off_t block)
+{
+	struct pram_super_block *ps = pram_get_super(sb);
+	return (block - ps->s_bitmap_start) >> sb->s_blocksize_bits;
+}
+
+/* If this is part of a read-modify-write of the block,
+   pram_lock_block() before calling! */
+static inline void *
+pram_get_block(struct super_block *sb, off_t block)
+{
+	struct pram_super_block *ps = pram_get_super(sb);
+	return block ? ((void *)ps + block) : NULL;
+}
+
+
+/*
+ * Inodes and files operations
+ */
+
+/* dir.c */
+extern struct file_operations pram_dir_operations;
+
+/* file.c */
+extern struct inode_operations pram_file_inode_operations;
+extern struct file_operations pram_file_operations;
+
+/* inode.c */
+extern struct address_space_operations pram_aops;
+
+/* namei.c */
+extern struct inode_operations pram_dir_inode_operations;
+
+/* symlink.c */
+extern struct inode_operations pram_symlink_inode_operations;
+
+#endif	/* __KERNEL__ */
+
+#endif	/* _LINUX_PRAM_FS_H */
diff -uprN linux-2.6.30-orig/fs/pramfs/pram_fs_sb.h linux-2.6.30/fs/pramfs/pram_fs_sb.h
--- linux-2.6.30-orig/fs/pramfs/pram_fs_sb.h	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.30/fs/pramfs/pram_fs_sb.h	2009-06-13 12:59:17.000000000 +0200
@@ -0,0 +1,40 @@
+/*
+ * FILE NAME include/linux/pram_fs_sb.h
+ *
+ * Definitions for the PRAM filesystem.
+ *
+ * Copyright 2009 Marco Stornelli <marco.stornelli@gmail.com>
+ * Copyright 2003 Sony Corporation
+ * Copyright 2003 Matsushita Electric Industrial Co., Ltd.
+ * 2003-2004 (c) MontaVista Software, Inc. , Steve Longerbeam
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef _LINUX_PRAM_FS_SB
+#define _LINUX_PRAM_FS_SB
+
+/*
+ * PRAM filesystem super-block data in memory
+ */
+struct pram_sb_info {
+	/*
+	 * base physical and virtual address of PRAMFS (which is also
+	 * the pointer to the super block)
+	 */
+	phys_addr_t phys_addr;
+	void *virt_addr;
+
+	/* Mount options */
+	unsigned long bpi;
+	unsigned long num_inodes;
+	unsigned long blocksize;
+	unsigned long initsize;
+	uid_t uid;		    /* Mount uid for root directory */
+	gid_t gid;		    /* Mount gid for root directory */
+	mode_t mode;		    /* Mount mode for root directory */
+};
+
+#endif	/* _LINUX_PRAM_FS_SB */
+


^ permalink raw reply	[flat|nested] 28+ messages in thread

end of thread, other threads:[~2009-06-24 16:49 UTC | newest]

Thread overview: 28+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-06-13 13:21 [PATCH 06/14] Pramfs: Include files Marco
2009-06-13 14:04 ` Sam Ravnborg
2009-06-13 22:59   ` Arnd Bergmann
2009-06-14  7:15     ` Marco
2009-06-21 17:07     ` Marco
2009-06-21 20:22       ` Arnd Bergmann
2009-06-22  6:23         ` Marco Stornelli
2009-06-22 11:17           ` Arnd Bergmann
2009-06-22 18:05             ` Marco
2009-06-22 18:33               ` Arnd Bergmann
2009-06-22 19:31                 ` Chris Simmonds
2009-06-22 20:30                   ` Sam Ravnborg
2009-06-22 22:00                     ` Tim Bird
2009-06-23  4:21                       ` Sam Ravnborg
2009-06-23 17:38                         ` Marco
2009-06-23 19:26                           ` Jörn Engel
2009-06-23 21:15                             ` David Woodhouse
2009-06-23 21:55                               ` Arnd Bergmann
2009-06-24  6:32                                 ` Marco Stornelli
2009-06-24 15:30                                   ` Arnd Bergmann
2009-06-24 16:49                                     ` Marco
2009-06-22 21:41                   ` Jörn Engel
2009-06-22 22:20                     ` David Woodhouse
2009-06-23  5:57                       ` Jörn Engel
2009-06-23  8:31                         ` David Woodhouse
2009-06-22 23:07                     ` Arnd Bergmann
2009-06-23  6:40                 ` Marco Stornelli
2009-06-14  7:15   ` Marco

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).