Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932137AbZFMN0w (ORCPT ); Sat, 13 Jun 2009 09:26:52 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1763634AbZFMNZv (ORCPT ); Sat, 13 Jun 2009 09:25:51 -0400 Received: from mail-bw0-f213.google.com ([209.85.218.213]:49807 "EHLO mail-bw0-f213.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1763611AbZFMNZl (ORCPT ); Sat, 13 Jun 2009 09:25:41 -0400 DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:user-agent:mime-version:to:cc:subject :content-type:content-transfer-encoding; b=ZmXKiHtZPktnfw6KEXyG0S7L7ekva4dig20sVX+x2tMh60uctom3QdyrEm/dC05Nd6 5x6zBLrRBIcKIhAwgih/q0k0+ZBA5UcZrEu7uk9ZmPXlG5BVKRe0FXJZmGqL1ppARhDv P2wb5FlYeJqT/dVbqaFU9hKiuyLPhTBwlbCHc= Message-ID: <4A33A7EC.6070008@gmail.com> Date: Sat, 13 Jun 2009 15:21:48 +0200 From: Marco User-Agent: Thunderbird 2.0.0.19 (X11/20081227) MIME-Version: 1.0 To: Linux FS Devel CC: Linux Embedded , Linux Kernel , Daniel Walker Subject: [PATCH 06/14] Pramfs: Include files Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 13279 Lines: 449 From: Marco Stornelli Include files. Signed-off-by: Marco Stornelli --- 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 + * 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 + +#ifdef __KERNEL__ +#include +#include +#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 + * 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 */ + -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/