Subversion Repositories shark

Rev

Blame | Last modification | View Log | RSS feed

#ifndef _AFFS_FS_I
#define _AFFS_FS_I

#include <linux/a.out.h>
#include <linux/fs.h>
#include <asm/semaphore.h>

#define AFFS_CACHE_SIZE         PAGE_SIZE
//#define AFFS_CACHE_SIZE               (4*4)

#define AFFS_MAX_PREALLOC       32
#define AFFS_LC_SIZE            (AFFS_CACHE_SIZE/sizeof(u32)/2)
#define AFFS_AC_SIZE            (AFFS_CACHE_SIZE/sizeof(struct affs_ext_key)/2)
#define AFFS_AC_MASK            (AFFS_AC_SIZE-1)

struct affs_ext_key {
        u32     ext;                            /* idx of the extended block */
        u32     key;                            /* block number */
};

/*
 * affs fs inode data in memory
 */

struct affs_inode_info {
        u32      i_opencnt;
        struct semaphore i_link_lock;           /* Protects internal inode access. */
        struct semaphore i_ext_lock;            /* Protects internal inode access. */
#define i_hash_lock i_ext_lock
        u32      i_blkcnt;                      /* block count */
        u32      i_extcnt;                      /* extended block count */
        u32     *i_lc;                          /* linear cache of extended blocks */
        u32      i_lc_size;
        u32      i_lc_shift;
        u32      i_lc_mask;
        struct affs_ext_key *i_ac;              /* associative cache of extended blocks */
        u32      i_ext_last;                    /* last accessed extended block */
        struct buffer_head *i_ext_bh;           /* bh of last extended block */
        loff_t   mmu_private;
        u32      i_protect;                     /* unused attribute bits */
        u32      i_lastalloc;                   /* last allocated block */
        int      i_pa_cnt;                      /* number of preallocated blocks */
#if 0
        s32      i_original;                    /* if != 0, this is the key of the original */
        u32      i_data[AFFS_MAX_PREALLOC];     /* preallocated blocks */
        int      i_cache_users;                 /* Cache cannot be freed while > 0 */
        unsigned char i_hlink;                  /* This is a fake */
        unsigned char i_pad;
        s32      i_parent;                      /* parent ino */
#endif
        struct inode vfs_inode;
};

/* short cut to get to the affs specific inode data */
static inline struct affs_inode_info *AFFS_I(struct inode *inode)
{
        return list_entry(inode, struct affs_inode_info, vfs_inode);
}

#endif