pramfs: headers
PATCH 8/17 pramfs: headers
From: Marco Stornelli <[email protected]>
Definitions for the PRAMFS filesystem.
Signed-off-by Marco Stornelli <[email protected]>
---
fs/pramfs/pram.h +283 -0
@@ -0,0 +1,283 @@ +/* +* BRIEF DESCRIPTION +* +* Definitions for the PRAMFS filesystem. +* +* Copyright 2009-2011 Marco Stornelli <[email protected]> +* 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 __PRAM_H +#define __PRAM_H + +#include <linux/buffer_head.h> +#include <linux/pram_fs.h> +#include <linux/pram_fs_sb.h> +#include <linux/crc16.h> +#include <linux/mutex.h> +#include <linux/rcupdate.h> +#include <linux/types.h> +#include "wprotect.h" + +/* +* Debug code +*/ +#ifdef pr_fmt +#undef pr_fmt +#define pr_fmt (fmt) KBUILD_MODNAME ": " fmt +#endif + +#define pram_dbg(s, args...) pr_debug(s, ## args) +#define pram_err(sb, s, args...) pram_error_mng(sb, s, ## args) +#define pram_warn(s, args...) pr_warning(s, ## args) +#define pram_info(s, args...) pr_info(s, ## args) + +#define pram_set_bit __test_and_set_bit_le +#define pram_clear_bit __test_and_clear_bit_le +#define pram_find_next_zero_bit find_next_zero_bit_le + +#define clear_opt (o, opt) (o &= ~PRAM_MOUNT_##opt) +#define set_opt (o, opt) (o |= PRAM_MOUNT_##opt) +#define test_opt (sb, opt) (PRAM_SB(sb)->s_mount_opt & PRAM_MOUNT_##opt) + +/* +* Pram inode flags +* +* PRAM_EOFBLOCKS_FL There are blocks allocated beyond eof +*/ +#define PRAM_EOFBLOCKS_FL 0x20000000 +/* Flags that should be inherited by new inodes from their parent. */ +#define PRAM_FL_INHERITED (FS_SECRM_FL | FS_UNRM_FL | FS_COMPR_FL |\ + FS_SYNC_FL | FS_NODUMP_FL | FS_NOATIME_FL | \ + FS_COMPRBLK_FL | FS_NOCOMP_FL | FS_JOURNAL_DATA_FL |\ + FS_NOTAIL_FL | FS_DIRSYNC_FL) +/* Flags that are appropriate for regular files (all but dir-specific ones). */ +#define PRAM_REG_FLMASK (~(FS_DIRSYNC_FL | FS_TOPDIR_FL)) +/* Flags that are appropriate for non-directories/regular files. */ +#define PRAM_OTHER_FLMASK (FS_NODUMP_FL | FS_NOATIME_FL) +#define PRAM_FL_USER_VISIBLE (FS_FL_USER_VISIBLE | PRAM_EOFBLOCKS_FL) + +/* Function Prototypes */ +extern void pram_error_mng (struct super_block *sb,const char *fmt, ...); + +/* file.c */ +extern ssize_t pram_direct_IO (int rw,struct kiocb *iocb, +const struct iovec *iov, +loff_t offset,unsigned long nr_segs); +extern int pram_mmap (struct file *file,struct vm_area_struct *vma); + +/* balloc.c */ +extern void pram_init_bitmap (struct super_block *sb); +extern void pram_free_block (struct super_block *sb,unsigned long blocknr); +extern int pram_new_block (struct super_block *sb,unsigned long *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); + +/* namei.c */ +extern struct dentry *pram_get_parent (struct dentry *child); + +/* inode.c */ +extern int pram_alloc_blocks (struct inode *inode,int file_blocknr, +unsigned int num); +extern u64 pram_find_data_block (struct inode *inode, +unsigned long file_blocknr); + +extern struct inode *pram_iget (struct super_block *sb,unsigned long ino); +extern void pram_put_inode (struct inode *inode); +extern void pram_evict_inode (struct inode *inode); +extern struct inode *pram_new_inode (struct inode *dir,umode_t mode, +const struct qstr *qstr); +extern int pram_update_inode (struct inode *inode); +extern int pram_write_inode (struct inode *inode,struct writeback_control *wbc); +extern void pram_dirty_inode (struct inode *inode,int flags); +extern int pram_notify_change (struct dentry *dentry,struct iattr *attr); +extern void pram_set_inode_flags (struct inode *inode,struct pram_inode *pi); +extern void pram_get_inode_flags (struct inode *inode,struct pram_inode *pi); +extern int pram_find_region (struct inode *inode,loff_t *offset,int hole); + +/* ioctl.c */ +extern long pram_ioctl (struct file *filp,unsigned int cmd,unsigned long arg); +#ifdef CONFIG_COMPAT +extern long pram_compat_ioctl (struct file *file,unsigned int cmd, +unsigned long arg); +#endif + +/* 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); + +/* Inline functions start here */ + +/* Mask out flags that are inappropriate for the given type of inode. */ +static inline __be32 pram_mask_flags (umode_t mode,__be32 flags) +{ + flags &=cpu_to_be32 (PRAM_FL_INHERITED ); +if (S_ISDIR (mode)) +return flags; +else if (S_ISREG (mode)) +return flags &cpu_to_be32 (PRAM_REG_FLMASK ); +else +return flags &cpu_to_be32 (PRAM_OTHER_FLMASK ); +} + +static inline int pram_calc_checksum (u8 *data,int n) +{ +u16 crc =0 ; + crc =crc16 (~0 , (__u8 *)data +sizeof (__be16), n -sizeof (__be16)); +if (*((__be16 *)data) ==cpu_to_be16 (crc)) +return 0 ; +else +return 1 ; +} + +struct pram_inode_vfs { +#ifdef CONFIG_PRAMFS_XATTR +/* +* Extended attributes can be read independently of the main file +* data. Taking i_mutex even when reading would cause contention +* between readers of EAs and writers of regular file data, so +* instead we synchronize on xattr_sem when reading or changing +* EAs. +*/ +struct rw_semaphore xattr_sem; +#endif +struct mutex i_meta_mutex; +struct mutex i_link_mutex; +struct inode vfs_inode; +}; + +static inline struct pram_sb_info *PRAM_SB (struct super_block *sb) +{ +return sb->s_fs_info; +} + +static inline struct pram_inode_vfs *PRAM_I (struct inode *inode) +{ + return container_of(inode, struct pram_inode_vfs, vfs_inode); +} + +/* If this is part of a read-modify-write of the super block, +pram_memunlock_super() before calling! */ +static inline struct pram_super_block * +pram_get_super (struct super_block *sb) +{ +struct pram_sb_info *sbi =PRAM_SB (sb); +return (struct pram_super_block *)sbi->virt_addr; +} + +static inline struct pram_super_block * +pram_get_redund_super (struct super_block *sb) +{ +struct pram_sb_info *sbi =PRAM_SB (sb); +return (struct pram_super_block *)(sbi->virt_addr +PRAM_SB_SIZE ); +} + +static inline void * +pram_get_bitmap (struct super_block *sb) +{ +struct pram_super_block *ps =pram_get_super (sb); +return (void *)ps +be64_to_cpu (ps->s_bitmap_start); +} + +/* If this is part of a read-modify-write of the inode metadata, +pram_memunlock_inode() before calling! */ +static inline struct pram_inode * +pram_get_inode (struct super_block *sb,u64 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 u64 +pram_get_block_off (struct super_block *sb,unsigned long blocknr) +{ +struct pram_super_block *ps =pram_get_super (sb); +return (u64)(be64_to_cpu (ps->s_bitmap_start) + + (blocknr << sb->s_blocksize_bits)); +} + +static inline unsigned long +pram_get_blocknr (struct super_block *sb,u64 block) +{ +struct pram_super_block *ps =pram_get_super (sb); +return (block -be64_to_cpu (ps->s_bitmap_start)) >> + sb->s_blocksize_bits; +} + +/* If this is part of a read-modify-write of the block, +pram_memunlock_block() before calling! */ +static inline void * +pram_get_block (struct super_block *sb,u64 block) +{ +struct pram_super_block *ps =pram_get_super (sb); +return block ? ((void *)ps + block) :NULL ; +} + +static inline unsigned long +pram_get_pfn (struct super_block *sb,u64 block) +{ +return (PRAM_SB (sb)->phys_addr + block) >>PAGE_SHIFT ; +} + +static inline void check_eof_blocks (struct inode *inode,loff_t size) +{ +struct pram_inode *pi =pram_get_inode (inode->i_sb, inode->i_ino); +if (unlikely (!pi)) +return ; +if ((pi->i_flags &cpu_to_be32 (PRAM_EOFBLOCKS_FL )) && + size + inode->i_sb->s_blocksize >= + (inode->i_blocks << inode->i_sb->s_blocksize_bits)) + pi->i_flags &=cpu_to_be32 (~PRAM_EOFBLOCKS_FL ); +} + +/* +* Inodes and files operations +*/ + +/* dir.c */ +extern const struct file_operations pram_dir_operations; + +/* file.c */ +extern const struct inode_operations pram_file_inode_operations; +extern const struct file_operations pram_file_operations; +extern const struct file_operations pram_xip_file_operations; + +/* inode.c */ +extern const struct address_space_operations pram_aops; +extern const struct address_space_operations pram_aops_xip; + +/* namei.c */ +extern const struct inode_operations pram_dir_inode_operations; +extern const struct inode_operations pram_special_inode_operations; + +/* symlink.c */ +extern const struct inode_operations pram_symlink_inode_operations; + +extern struct backing_dev_info pram_backing_dev_info; + +#endif /* __PRAM_H */
include/linux/magic.h +1 -0
@@ -38,6 +38,7 @@#define NCP_SUPER_MAGIC 0x564c/* Guess, what 0x564c is :-) */ #define NFS_SUPER_MAGIC 0x6969#define OPENPROM_SUPER_MAGIC 0x9fa1 +#define PRAM_SUPER_MAGIC 0xEFFA#define QNX4_SUPER_MAGIC 0x002f/* qnx4 fs detection */ #define QNX6_SUPER_MAGIC 0x68191122/* qnx6 fs detection */
include/linux/pram_fs.h +130 -0
130 lines not on this page · raw message
include/linux/pram_fs_sb.h +45 -0
45 lines not on this page · raw message
include/linux/fs.h +2 -0
@@ -424,6 +424,7 @@ struct kobject;struct pipe_inode_info ;struct poll_table_struct ;struct kstatfs ; +struct vm_fault ;struct vm_area_struct ;struct vfsmount ;struct cred ;
@@ -2445,6 +2446,7 @@ extern int nonseekable_open(struct inode#ifdef CONFIG_FS_XIP extern ssize_t xip_file_read (struct file *filp,char __user *buf,size_t len,loff_t *ppos); +extern int xip_file_fault (struct vm_area_struct *vma,struct vm_fault *vmf);extern int xip_file_mmap (struct file * file,struct vm_area_struct * vma);extern ssize_t xip_file_write (struct file *filp,const char __user *buf,size_t len,loff_t *ppos);