]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - fs/hfsplus/hfsplus_fs.h
Merge tag 'v2.6.38' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[mv-sheeva.git] / fs / hfsplus / hfsplus_fs.h
index cb3653efb57a2dcf2285a19fcb7262cb7a1ba509..d6857523336d21412ec50bb0a8c8039526ab6adb 100644 (file)
 #define DBG_EXTENT     0x00000020
 #define DBG_BITMAP     0x00000040
 
-//#define DBG_MASK     (DBG_EXTENT|DBG_INODE|DBG_BNODE_MOD)
-//#define DBG_MASK     (DBG_BNODE_MOD|DBG_CAT_MOD|DBG_INODE)
-//#define DBG_MASK     (DBG_CAT_MOD|DBG_BNODE_REFS|DBG_INODE|DBG_EXTENT)
+#if 0
+#define DBG_MASK       (DBG_EXTENT|DBG_INODE|DBG_BNODE_MOD)
+#define DBG_MASK       (DBG_BNODE_MOD|DBG_CAT_MOD|DBG_INODE)
+#define DBG_MASK       (DBG_CAT_MOD|DBG_BNODE_REFS|DBG_INODE|DBG_EXTENT)
+#endif
 #define DBG_MASK       (0)
 
 #define dprint(flg, fmt, args...) \
-       if (flg & DBG_MASK) printk(fmt , ## args)
+       if (flg & DBG_MASK) \
+               printk(fmt , ## args)
 
 /* Runtime config options */
 #define HFSPLUS_DEF_CR_TYPE    0x3F3F3F3F  /* '????' */
@@ -37,7 +40,8 @@
 #define HFSPLUS_TYPE_DATA 0x00
 #define HFSPLUS_TYPE_RSRC 0xFF
 
-typedef int (*btree_keycmp)(const hfsplus_btree_key *, const hfsplus_btree_key *);
+typedef int (*btree_keycmp)(const hfsplus_btree_key *,
+               const hfsplus_btree_key *);
 
 #define NODE_HASH_SIZE 256
 
@@ -61,7 +65,6 @@ struct hfs_btree {
        unsigned int max_key_len;
        unsigned int depth;
 
-       //unsigned int map1_size, map_size;
        struct mutex tree_lock;
 
        unsigned int pages_per_bnode;
@@ -107,8 +110,8 @@ struct hfsplus_vh;
 struct hfs_btree;
 
 struct hfsplus_sb_info {
-       struct buffer_head *s_vhbh;
        struct hfsplus_vh *s_vhdr;
+       struct hfsplus_vh *s_backup_vhdr;
        struct hfs_btree *ext_tree;
        struct hfs_btree *cat_tree;
        struct hfs_btree *attr_tree;
@@ -118,7 +121,8 @@ struct hfsplus_sb_info {
 
        /* Runtime variables */
        u32 blockoffset;
-       u32 sect_count;
+       sector_t part_start;
+       sector_t sect_count;
        int fs_shift;
 
        /* immutable data from the volume header */
@@ -155,6 +159,12 @@ struct hfsplus_sb_info {
 #define HFSPLUS_SB_FORCE       2
 #define HFSPLUS_SB_HFSX                3
 #define HFSPLUS_SB_CASEFOLD    4
+#define HFSPLUS_SB_NOBARRIER   5
+
+static inline struct hfsplus_sb_info *HFSPLUS_SB(struct super_block *sb)
+{
+       return sb->s_fs_info;
+}
 
 
 struct hfsplus_inode_info {
@@ -170,7 +180,7 @@ struct hfsplus_inode_info {
        u32 cached_blocks;
        hfsplus_extent_rec first_extents;
        hfsplus_extent_rec cached_extents;
-       unsigned long flags;
+       unsigned int extent_state;
        struct mutex extents_lock;
 
        /*
@@ -184,6 +194,11 @@ struct hfsplus_inode_info {
         */
        u32 linkid;
 
+       /*
+        * Accessed using atomic bitops.
+        */
+       unsigned long flags;
+
        /*
         * Protected by i_mutex.
         */
@@ -195,12 +210,34 @@ struct hfsplus_inode_info {
        struct inode vfs_inode;
 };
 
-#define HFSPLUS_FLG_RSRC       0x0001
-#define HFSPLUS_FLG_EXT_DIRTY  0x0002
-#define HFSPLUS_FLG_EXT_NEW    0x0004
+#define HFSPLUS_EXT_DIRTY      0x0001
+#define HFSPLUS_EXT_NEW                0x0002
+
+#define HFSPLUS_I_RSRC         0       /* represents a resource fork */
+#define HFSPLUS_I_CAT_DIRTY    1       /* has changes in the catalog tree */
+#define HFSPLUS_I_EXT_DIRTY    2       /* has changes in the extent tree */
+#define HFSPLUS_I_ALLOC_DIRTY  3       /* has changes in the allocation file */
+
+#define HFSPLUS_IS_RSRC(inode) \
+       test_bit(HFSPLUS_I_RSRC, &HFSPLUS_I(inode)->flags)
+
+static inline struct hfsplus_inode_info *HFSPLUS_I(struct inode *inode)
+{
+       return list_entry(inode, struct hfsplus_inode_info, vfs_inode);
+}
 
-#define HFSPLUS_IS_DATA(inode)   (!(HFSPLUS_I(inode)->flags & HFSPLUS_FLG_RSRC))
-#define HFSPLUS_IS_RSRC(inode)   (HFSPLUS_I(inode)->flags & HFSPLUS_FLG_RSRC)
+/*
+ * Mark an inode dirty, and also mark the btree in which the
+ * specific type of metadata is stored.
+ * For data or metadata that gets written back by into the catalog btree
+ * by hfsplus_write_inode a plain mark_inode_dirty call is enough.
+ */
+static inline void hfsplus_mark_inode_dirty(struct inode *inode,
+               unsigned int flag)
+{
+       set_bit(flag, &HFSPLUS_I(inode)->flags);
+       mark_inode_dirty(inode);
+}
 
 struct hfs_find_data {
        /* filled by caller */
@@ -318,9 +355,12 @@ int hfs_brec_read(struct hfs_find_data *, void *, int);
 int hfs_brec_goto(struct hfs_find_data *, int);
 
 /* catalog.c */
-int hfsplus_cat_case_cmp_key(const hfsplus_btree_key *, const hfsplus_btree_key *);
-int hfsplus_cat_bin_cmp_key(const hfsplus_btree_key *, const hfsplus_btree_key *);
-void hfsplus_cat_build_key(struct super_block *sb, hfsplus_btree_key *, u32, struct qstr *);
+int hfsplus_cat_case_cmp_key(const hfsplus_btree_key *,
+               const hfsplus_btree_key *);
+int hfsplus_cat_bin_cmp_key(const hfsplus_btree_key *,
+               const hfsplus_btree_key *);
+void hfsplus_cat_build_key(struct super_block *sb,
+               hfsplus_btree_key *, u32, struct qstr *);
 int hfsplus_find_cat(struct super_block *, u32, struct hfs_find_data *);
 int hfsplus_create_cat(u32, struct inode *, struct qstr *, struct inode *);
 int hfsplus_delete_cat(u32, struct inode *, struct qstr *);
@@ -336,7 +376,8 @@ extern const struct file_operations hfsplus_dir_operations;
 int hfsplus_ext_cmp_key(const hfsplus_btree_key *, const hfsplus_btree_key *);
 void hfsplus_ext_write_extent(struct inode *);
 int hfsplus_get_block(struct inode *, sector_t, struct buffer_head *, int);
-int hfsplus_free_fork(struct super_block *, u32, struct hfsplus_fork_raw *, int);
+int hfsplus_free_fork(struct super_block *, u32,
+               struct hfsplus_fork_raw *, int);
 int hfsplus_file_extend(struct inode *);
 void hfsplus_file_truncate(struct inode *);
 
@@ -351,6 +392,7 @@ int hfsplus_cat_read_inode(struct inode *, struct hfs_find_data *);
 int hfsplus_cat_write_inode(struct inode *);
 struct inode *hfsplus_new_inode(struct super_block *, int);
 void hfsplus_delete_inode(struct inode *);
+int hfsplus_file_fsync(struct file *file, int datasync);
 
 /* ioctl.c */
 long hfsplus_ioctl(struct file *filp, unsigned int cmd, unsigned long arg);
@@ -362,6 +404,7 @@ ssize_t hfsplus_listxattr(struct dentry *dentry, char *buffer, size_t size);
 
 /* options.c */
 int hfsplus_parse_options(char *, struct hfsplus_sb_info *);
+int hfsplus_parse_options_remount(char *input, int *force);
 void hfsplus_fill_defaults(struct hfsplus_sb_info *);
 int hfsplus_show_options(struct seq_file *, struct vfsmount *);
 
@@ -375,45 +418,26 @@ extern u16 hfsplus_decompose_table[];
 extern u16 hfsplus_compose_table[];
 
 /* unicode.c */
-int hfsplus_strcasecmp(const struct hfsplus_unistr *, const struct hfsplus_unistr *);
-int hfsplus_strcmp(const struct hfsplus_unistr *, const struct hfsplus_unistr *);
-int hfsplus_uni2asc(struct super_block *, const struct hfsplus_unistr *, char *, int *);
-int hfsplus_asc2uni(struct super_block *, struct hfsplus_unistr *, const char *, int);
-int hfsplus_hash_dentry(struct dentry *dentry, struct qstr *str);
-int hfsplus_compare_dentry(struct dentry *dentry, struct qstr *s1, struct qstr *s2);
+int hfsplus_strcasecmp(const struct hfsplus_unistr *,
+               const struct hfsplus_unistr *);
+int hfsplus_strcmp(const struct hfsplus_unistr *,
+               const struct hfsplus_unistr *);
+int hfsplus_uni2asc(struct super_block *,
+               const struct hfsplus_unistr *, char *, int *);
+int hfsplus_asc2uni(struct super_block *,
+               struct hfsplus_unistr *, const char *, int);
+int hfsplus_hash_dentry(const struct dentry *dentry,
+               const struct inode *inode, struct qstr *str);
+int hfsplus_compare_dentry(const struct dentry *parent,
+               const struct inode *pinode,
+               const struct dentry *dentry, const struct inode *inode,
+               unsigned int len, const char *str, const struct qstr *name);
 
 /* wrapper.c */
 int hfsplus_read_wrapper(struct super_block *);
-
 int hfs_part_find(struct super_block *, sector_t *, sector_t *);
-
-/* access macros */
-static inline struct hfsplus_sb_info *HFSPLUS_SB(struct super_block *sb)
-{
-       return sb->s_fs_info;
-}
-
-static inline struct hfsplus_inode_info *HFSPLUS_I(struct inode *inode)
-{
-       return list_entry(inode, struct hfsplus_inode_info, vfs_inode);
-}
-
-#define sb_bread512(sb, sec, data) ({                  \
-       struct buffer_head *__bh;                       \
-       sector_t __block;                               \
-       loff_t __start;                                 \
-       int __offset;                                   \
-                                                       \
-       __start = (loff_t)(sec) << HFSPLUS_SECTOR_SHIFT;\
-       __block = __start >> (sb)->s_blocksize_bits;    \
-       __offset = __start & ((sb)->s_blocksize - 1);   \
-       __bh = sb_bread((sb), __block);                 \
-       if (likely(__bh != NULL))                       \
-               data = (void *)(__bh->b_data + __offset);\
-       else                                            \
-               data = NULL;                            \
-       __bh;                                           \
-})
+int hfsplus_submit_bio(struct block_device *bdev, sector_t sector,
+               void *data, int rw);
 
 /* time macros */
 #define __hfsp_mt2ut(t)                (be32_to_cpu(t) - 2082844800U)