2012-02-17 12:59:20 +08:00
|
|
|
/*
|
|
|
|
* QNX6 file system, Linux implementation.
|
|
|
|
*
|
|
|
|
* Version : 1.0.0
|
|
|
|
*
|
|
|
|
* History :
|
|
|
|
*
|
|
|
|
* 01-02-2012 by Kai Bankett (chaosman@ontika.net) : first release.
|
|
|
|
* 16-02-2012 page map extension by Al Viro
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2014-08-09 05:23:05 +08:00
|
|
|
#ifdef pr_fmt
|
|
|
|
#undef pr_fmt
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
|
|
|
|
2012-02-17 12:59:20 +08:00
|
|
|
#include <linux/fs.h>
|
|
|
|
#include <linux/pagemap.h>
|
|
|
|
|
|
|
|
typedef __u16 __bitwise __fs16;
|
|
|
|
typedef __u32 __bitwise __fs32;
|
|
|
|
typedef __u64 __bitwise __fs64;
|
|
|
|
|
|
|
|
#include <linux/qnx6_fs.h>
|
|
|
|
|
|
|
|
struct qnx6_sb_info {
|
|
|
|
struct buffer_head *sb_buf; /* superblock buffer */
|
|
|
|
struct qnx6_super_block *sb; /* our superblock */
|
|
|
|
int s_blks_off; /* blkoffset fs-startpoint */
|
|
|
|
int s_ptrbits; /* indirect pointer bitfield */
|
|
|
|
unsigned long s_mount_opt; /* all mount options */
|
|
|
|
int s_bytesex; /* holds endianess info */
|
|
|
|
struct inode * inodes;
|
|
|
|
struct inode * longfile;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct qnx6_inode_info {
|
|
|
|
__fs32 di_block_ptr[QNX6_NO_DIRECT_POINTERS];
|
|
|
|
__u8 di_filelevels;
|
|
|
|
__u32 i_dir_start_lookup;
|
|
|
|
struct inode vfs_inode;
|
|
|
|
};
|
|
|
|
|
|
|
|
extern struct inode *qnx6_iget(struct super_block *sb, unsigned ino);
|
|
|
|
extern struct dentry *qnx6_lookup(struct inode *dir, struct dentry *dentry,
|
2012-06-11 05:13:09 +08:00
|
|
|
unsigned int flags);
|
2012-02-17 12:59:20 +08:00
|
|
|
|
|
|
|
#ifdef CONFIG_QNX6FS_DEBUG
|
|
|
|
extern void qnx6_superblock_debug(struct qnx6_super_block *,
|
|
|
|
struct super_block *);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
extern const struct inode_operations qnx6_dir_inode_operations;
|
|
|
|
extern const struct file_operations qnx6_dir_operations;
|
|
|
|
|
|
|
|
static inline struct qnx6_sb_info *QNX6_SB(struct super_block *sb)
|
|
|
|
{
|
|
|
|
return sb->s_fs_info;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline struct qnx6_inode_info *QNX6_I(struct inode *inode)
|
|
|
|
{
|
|
|
|
return container_of(inode, struct qnx6_inode_info, vfs_inode);
|
|
|
|
}
|
|
|
|
|
|
|
|
#define clear_opt(o, opt) (o &= ~(QNX6_MOUNT_##opt))
|
|
|
|
#define set_opt(o, opt) (o |= (QNX6_MOUNT_##opt))
|
|
|
|
#define test_opt(sb, opt) (QNX6_SB(sb)->s_mount_opt & \
|
|
|
|
QNX6_MOUNT_##opt)
|
|
|
|
enum {
|
|
|
|
BYTESEX_LE,
|
|
|
|
BYTESEX_BE,
|
|
|
|
};
|
|
|
|
|
|
|
|
static inline __u64 fs64_to_cpu(struct qnx6_sb_info *sbi, __fs64 n)
|
|
|
|
{
|
|
|
|
if (sbi->s_bytesex == BYTESEX_LE)
|
|
|
|
return le64_to_cpu((__force __le64)n);
|
|
|
|
else
|
|
|
|
return be64_to_cpu((__force __be64)n);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline __fs64 cpu_to_fs64(struct qnx6_sb_info *sbi, __u64 n)
|
|
|
|
{
|
|
|
|
if (sbi->s_bytesex == BYTESEX_LE)
|
|
|
|
return (__force __fs64)cpu_to_le64(n);
|
|
|
|
else
|
|
|
|
return (__force __fs64)cpu_to_be64(n);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline __u32 fs32_to_cpu(struct qnx6_sb_info *sbi, __fs32 n)
|
|
|
|
{
|
|
|
|
if (sbi->s_bytesex == BYTESEX_LE)
|
|
|
|
return le32_to_cpu((__force __le32)n);
|
|
|
|
else
|
|
|
|
return be32_to_cpu((__force __be32)n);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline __fs32 cpu_to_fs32(struct qnx6_sb_info *sbi, __u32 n)
|
|
|
|
{
|
|
|
|
if (sbi->s_bytesex == BYTESEX_LE)
|
|
|
|
return (__force __fs32)cpu_to_le32(n);
|
|
|
|
else
|
|
|
|
return (__force __fs32)cpu_to_be32(n);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline __u16 fs16_to_cpu(struct qnx6_sb_info *sbi, __fs16 n)
|
|
|
|
{
|
|
|
|
if (sbi->s_bytesex == BYTESEX_LE)
|
|
|
|
return le16_to_cpu((__force __le16)n);
|
|
|
|
else
|
|
|
|
return be16_to_cpu((__force __be16)n);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline __fs16 cpu_to_fs16(struct qnx6_sb_info *sbi, __u16 n)
|
|
|
|
{
|
|
|
|
if (sbi->s_bytesex == BYTESEX_LE)
|
|
|
|
return (__force __fs16)cpu_to_le16(n);
|
|
|
|
else
|
|
|
|
return (__force __fs16)cpu_to_be16(n);
|
|
|
|
}
|
|
|
|
|
|
|
|
extern struct qnx6_super_block *qnx6_mmi_fill_super(struct super_block *s,
|
|
|
|
int silent);
|
|
|
|
|
|
|
|
static inline void qnx6_put_page(struct page *page)
|
|
|
|
{
|
|
|
|
kunmap(page);
|
mm, fs: get rid of PAGE_CACHE_* and page_cache_{get,release} macros
PAGE_CACHE_{SIZE,SHIFT,MASK,ALIGN} macros were introduced *long* time
ago with promise that one day it will be possible to implement page
cache with bigger chunks than PAGE_SIZE.
This promise never materialized. And unlikely will.
We have many places where PAGE_CACHE_SIZE assumed to be equal to
PAGE_SIZE. And it's constant source of confusion on whether
PAGE_CACHE_* or PAGE_* constant should be used in a particular case,
especially on the border between fs and mm.
Global switching to PAGE_CACHE_SIZE != PAGE_SIZE would cause to much
breakage to be doable.
Let's stop pretending that pages in page cache are special. They are
not.
The changes are pretty straight-forward:
- <foo> << (PAGE_CACHE_SHIFT - PAGE_SHIFT) -> <foo>;
- <foo> >> (PAGE_CACHE_SHIFT - PAGE_SHIFT) -> <foo>;
- PAGE_CACHE_{SIZE,SHIFT,MASK,ALIGN} -> PAGE_{SIZE,SHIFT,MASK,ALIGN};
- page_cache_get() -> get_page();
- page_cache_release() -> put_page();
This patch contains automated changes generated with coccinelle using
script below. For some reason, coccinelle doesn't patch header files.
I've called spatch for them manually.
The only adjustment after coccinelle is revert of changes to
PAGE_CAHCE_ALIGN definition: we are going to drop it later.
There are few places in the code where coccinelle didn't reach. I'll
fix them manually in a separate patch. Comments and documentation also
will be addressed with the separate patch.
virtual patch
@@
expression E;
@@
- E << (PAGE_CACHE_SHIFT - PAGE_SHIFT)
+ E
@@
expression E;
@@
- E >> (PAGE_CACHE_SHIFT - PAGE_SHIFT)
+ E
@@
@@
- PAGE_CACHE_SHIFT
+ PAGE_SHIFT
@@
@@
- PAGE_CACHE_SIZE
+ PAGE_SIZE
@@
@@
- PAGE_CACHE_MASK
+ PAGE_MASK
@@
expression E;
@@
- PAGE_CACHE_ALIGN(E)
+ PAGE_ALIGN(E)
@@
expression E;
@@
- page_cache_get(E)
+ get_page(E)
@@
expression E;
@@
- page_cache_release(E)
+ put_page(E)
Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Acked-by: Michal Hocko <mhocko@suse.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2016-04-01 20:29:47 +08:00
|
|
|
put_page(page);
|
2012-02-17 12:59:20 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
extern unsigned qnx6_find_entry(int len, struct inode *dir, const char *name,
|
|
|
|
struct page **res_page);
|