GFS2: Move generation number into "proper" part of inode
[safe/jmp/linux-2.6] / fs / gfs2 / incore.h
index 745dada..4ff1d7e 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) Sistina Software, Inc.  1997-2003 All rights reserved.
- * Copyright (C) 2004-2007 Red Hat, Inc.  All rights reserved.
+ * Copyright (C) 2004-2008 Red Hat, Inc.  All rights reserved.
  *
  * This copyrighted material is made available to anyone wishing to use,
  * modify, copy, or redistribute it subject to the terms and conditions
@@ -44,7 +44,6 @@ struct gfs2_log_header_host {
 
 struct gfs2_log_operations {
        void (*lo_add) (struct gfs2_sbd *sdp, struct gfs2_log_element *le);
-       void (*lo_incore_commit) (struct gfs2_sbd *sdp, struct gfs2_trans *tr);
        void (*lo_before_commit) (struct gfs2_sbd *sdp);
        void (*lo_after_commit) (struct gfs2_sbd *sdp, struct gfs2_ail *ai);
        void (*lo_before_scan) (struct gfs2_jdesc *jd,
@@ -70,7 +69,6 @@ struct gfs2_bitmap {
 };
 
 struct gfs2_rgrp_host {
-       u32 rg_flags;
        u32 rg_free;
        u32 rg_dinodes;
        u64 rg_igeneration;
@@ -79,7 +77,6 @@ struct gfs2_rgrp_host {
 struct gfs2_rgrpd {
        struct list_head rd_list;       /* Link with superblock */
        struct list_head rd_list_mru;
-       struct list_head rd_recent;     /* Recently used rgrps */
        struct gfs2_glock *rd_gl;       /* Glock for this rgrp */
        u64 rd_addr;                    /* grp block disk address */
        u64 rd_data0;                   /* first data location */
@@ -87,17 +84,17 @@ struct gfs2_rgrpd {
        u32 rd_data;                    /* num of data blocks in rgrp */
        u32 rd_bitbytes;                /* number of bytes in data bitmaps */
        struct gfs2_rgrp_host rd_rg;
-       u64 rd_rg_vn;
        struct gfs2_bitmap *rd_bits;
        unsigned int rd_bh_count;
        struct mutex rd_mutex;
        u32 rd_free_clone;
        struct gfs2_log_element rd_le;
-       u32 rd_last_alloc_data;
-       u32 rd_last_alloc_meta;
+       u32 rd_last_alloc;
        struct gfs2_sbd *rd_sbd;
-       unsigned long rd_flags;
-#define GFS2_RDF_CHECK        0x0001          /* Need to check for unlinked inodes */
+       unsigned char rd_flags;
+#define GFS2_RDF_CHECK        0x01      /* Need to check for unlinked inodes */
+#define GFS2_RDF_NOALLOC      0x02      /* rg prohibits allocation */
+#define GFS2_RDF_UPTODATE     0x04      /* rg is up to date */
 };
 
 enum gfs2_state_bits {
@@ -130,20 +127,20 @@ struct gfs2_bufdata {
 
 struct gfs2_glock_operations {
        void (*go_xmote_th) (struct gfs2_glock *gl);
-       void (*go_xmote_bh) (struct gfs2_glock *gl);
+       int (*go_xmote_bh) (struct gfs2_glock *gl, struct gfs2_holder *gh);
        void (*go_inval) (struct gfs2_glock *gl, int flags);
        int (*go_demote_ok) (struct gfs2_glock *gl);
        int (*go_lock) (struct gfs2_holder *gh);
        void (*go_unlock) (struct gfs2_holder *gh);
+       int (*go_dump)(struct seq_file *seq, const struct gfs2_glock *gl);
        const int go_type;
        const unsigned long go_min_hold_time;
 };
 
 enum {
        /* States */
-       HIF_HOLDER              = 6,
+       HIF_HOLDER              = 6,  /* Set for gh that "holds" the glock */
        HIF_FIRST               = 7,
-       HIF_ABORTED             = 9,
        HIF_WAIT                = 10,
 };
 
@@ -151,23 +148,25 @@ struct gfs2_holder {
        struct list_head gh_list;
 
        struct gfs2_glock *gh_gl;
-       pid_t gh_owner_pid;
+       struct pid *gh_owner_pid;
        unsigned int gh_state;
        unsigned gh_flags;
 
        int gh_error;
-       unsigned long gh_iflags;
+       unsigned long gh_iflags; /* HIF_... */
        unsigned long gh_ip;
 };
 
 enum {
-       GLF_LOCK                = 1,
-       GLF_STICKY              = 2,
-       GLF_DEMOTE              = 3,
-       GLF_PENDING_DEMOTE      = 4,
-       GLF_DIRTY               = 5,
-       GLF_DEMOTE_IN_PROGRESS  = 6,
-       GLF_LFLUSH              = 7,
+       GLF_LOCK                        = 1,
+       GLF_STICKY                      = 2,
+       GLF_DEMOTE                      = 3,
+       GLF_PENDING_DEMOTE              = 4,
+       GLF_DEMOTE_IN_PROGRESS          = 5,
+       GLF_DIRTY                       = 6,
+       GLF_LFLUSH                      = 7,
+       GLF_INVALIDATE_IN_PROGRESS      = 8,
+       GLF_REPLY_PENDING               = 9,
 };
 
 struct gfs2_glock {
@@ -179,26 +178,18 @@ struct gfs2_glock {
        spinlock_t gl_spin;
 
        unsigned int gl_state;
+       unsigned int gl_target;
+       unsigned int gl_reply;
        unsigned int gl_hash;
        unsigned int gl_demote_state; /* state requested by remote node */
        unsigned long gl_demote_time; /* time of first demote request */
-       pid_t gl_owner_pid;
-       unsigned long gl_ip;
        struct list_head gl_holders;
-       struct list_head gl_waiters1;   /* HIF_MUTEX */
-       struct list_head gl_waiters3;   /* HIF_PROMOTE */
-       int gl_waiters2;                /* GIF_DEMOTE */
 
        const struct gfs2_glock_operations *gl_ops;
-
-       struct gfs2_holder *gl_req_gh;
-       gfs2_glop_bh_t gl_req_bh;
-
        void *gl_lock;
        char *gl_lvb;
        atomic_t gl_lvb_count;
 
-       u64 gl_vn;
        unsigned long gl_stamp;
        unsigned long gl_tchange;
        void *gl_object;
@@ -213,6 +204,8 @@ struct gfs2_glock {
        struct delayed_work gl_work;
 };
 
+#define GFS2_MIN_LVB_SIZE 32   /* Min size of LVB that gfs2 supports */
+
 struct gfs2_alloc {
        /* Quota stuff */
 
@@ -237,18 +230,13 @@ enum {
        GIF_INVALID             = 0,
        GIF_QD_LOCKED           = 1,
        GIF_SW_PAGED            = 3,
+       GIF_USER                = 4, /* user inode, not metadata addr space */
 };
 
 struct gfs2_dinode_host {
        u64 di_size;            /* number of bytes in file */
-       u64 di_blocks;          /* number of blocks in file */
-       u64 di_goal_meta;       /* rgrp to alloc from next */
-       u64 di_goal_data;       /* data block goal */
-       u64 di_generation;      /* generation number for NFS */
        u32 di_flags;           /* GFS2_DIF_... */
-       u16 di_height;          /* height of metadata */
        /* These only apply to directories  */
-       u16 di_depth;           /* Number of bits in the table */
        u32 di_entries;         /* The number of entries in the directory */
        u64 di_eattr;           /* extended attribute block number */
 };
@@ -257,6 +245,7 @@ struct gfs2_inode {
        struct inode i_inode;
        u64 i_no_addr;
        u64 i_no_formal_ino;
+       u64 i_generation;
        unsigned long i_flags;          /* GIF_... */
 
        struct gfs2_dinode_host i_di; /* To be replaced by ref to block */
@@ -264,11 +253,11 @@ struct gfs2_inode {
        struct gfs2_glock *i_gl; /* Move into i_gh? */
        struct gfs2_holder i_iopen_gh;
        struct gfs2_holder i_gh; /* for prepare/commit_write only */
-       struct gfs2_alloc i_alloc;
-       u64 i_last_rg_alloc;
-
-       spinlock_t i_spin;
+       struct gfs2_alloc *i_alloc;
+       u64 i_goal;     /* goal block for allocations */
        struct rw_semaphore i_rw_mutex;
+       u8 i_height;
+       u8 i_depth;
 };
 
 /*
@@ -397,20 +386,21 @@ struct gfs2_statfs_change_host {
 #define GFS2_DATA_ORDERED      2
 
 struct gfs2_args {
-       char ar_lockproto[GFS2_LOCKNAME_LEN]; /* Name of the Lock Protocol */
-       char ar_locktable[GFS2_LOCKNAME_LEN]; /* Name of the Lock Table */
-       char ar_hostdata[GFS2_LOCKNAME_LEN]; /* Host specific data */
-       int ar_spectator; /* Don't get a journal because we're always RO */
-       int ar_ignore_local_fs; /* Don't optimize even if local_fs is 1 */
-       int ar_localflocks; /* Let the VFS do flock|fcntl locks for us */
-       int ar_localcaching; /* Local-style caching (dangerous on multihost) */
-       int ar_debug; /* Oops on errors instead of trying to be graceful */
-       int ar_upgrade; /* Upgrade ondisk/multihost format */
-       unsigned int ar_num_glockd; /* Number of glockd threads */
-       int ar_posix_acl; /* Enable posix acls */
-       int ar_quota; /* off/account/on */
-       int ar_suiddir; /* suiddir support */
-       int ar_data; /* ordered/writeback */
+       char ar_lockproto[GFS2_LOCKNAME_LEN];   /* Name of the Lock Protocol */
+       char ar_locktable[GFS2_LOCKNAME_LEN];   /* Name of the Lock Table */
+       char ar_hostdata[GFS2_LOCKNAME_LEN];    /* Host specific data */
+       unsigned int ar_spectator:1;            /* Don't get a journal */
+       unsigned int ar_ignore_local_fs:1;      /* Ignore optimisations */
+       unsigned int ar_localflocks:1;          /* Let the VFS do flock|fcntl */
+       unsigned int ar_localcaching:1;         /* Local caching */
+       unsigned int ar_debug:1;                /* Oops on errors */
+       unsigned int ar_upgrade:1;              /* Upgrade ondisk format */
+       unsigned int ar_posix_acl:1;            /* Enable posix acls */
+       unsigned int ar_quota:2;                /* off/account/on */
+       unsigned int ar_suiddir:1;              /* suiddir support */
+       unsigned int ar_data:2;                 /* ordered/writeback */
+       unsigned int ar_meta:1;                 /* mount metafs */
+       unsigned int ar_num_glockd;             /* Number of glockd threads */
 };
 
 struct gfs2_tune {
@@ -430,9 +420,7 @@ struct gfs2_tune {
        unsigned int gt_quota_scale_den; /* Denominator */
        unsigned int gt_quota_cache_secs;
        unsigned int gt_quota_quantum; /* Secs between syncs to quota file */
-       unsigned int gt_atime_quantum; /* Min secs between atime updates */
        unsigned int gt_new_files_jdata;
-       unsigned int gt_new_files_directio;
        unsigned int gt_max_readahead; /* Max bytes to read-ahead from disk */
        unsigned int gt_stall_secs; /* Detects trouble! */
        unsigned int gt_complain_secs;
@@ -444,7 +432,7 @@ enum {
        SDF_JOURNAL_CHECKED     = 0,
        SDF_JOURNAL_LIVE        = 1,
        SDF_SHUTDOWN            = 2,
-       SDF_NOATIME             = 3,
+       SDF_NOBARRIERS          = 3,
 };
 
 #define GFS2_FSNAME_LEN                256
@@ -473,7 +461,6 @@ struct gfs2_sb_host {
 
 struct gfs2_sbd {
        struct super_block *sd_vfs;
-       struct super_block *sd_vfs_meta;
        struct kobject sd_kobj;
        unsigned long sd_flags; /* SDF_... */
        struct gfs2_sb_host sd_sb;
@@ -491,9 +478,9 @@ struct gfs2_sbd {
        u32 sd_qc_per_block;
        u32 sd_max_dirres;      /* Max blocks needed to add a directory entry */
        u32 sd_max_height;      /* Max height of a file's metadata tree */
-       u64 sd_heightsize[GFS2_MAX_META_HEIGHT];
+       u64 sd_heightsize[GFS2_MAX_META_HEIGHT + 1];
        u32 sd_max_jheight; /* Max height of journaled file's meta tree */
-       u64 sd_jheightsize[GFS2_MAX_META_HEIGHT];
+       u64 sd_jheightsize[GFS2_MAX_META_HEIGHT + 1];
 
        struct gfs2_args sd_args;       /* Mount arguments */
        struct gfs2_tune sd_tune;       /* Filesystem tuning structure */
@@ -511,7 +498,9 @@ struct gfs2_sbd {
 
        /* Inode Stuff */
 
-       struct inode *sd_master_dir;
+       struct dentry *sd_master_dir;
+       struct dentry *sd_root_dir;
+
        struct inode *sd_jindex;
        struct inode *sd_inum_inode;
        struct inode *sd_statfs_inode;
@@ -534,12 +523,11 @@ struct gfs2_sbd {
 
        /* Resource group stuff */
 
-       u64 sd_rindex_vn;
+       int sd_rindex_uptodate;
        spinlock_t sd_rindex_spin;
        struct mutex sd_rindex_mutex;
        struct list_head sd_rindex_list;
        struct list_head sd_rindex_mru_list;
-       struct list_head sd_rindex_recent_list;
        struct gfs2_rgrpd *sd_rindex_forward;
        unsigned int sd_rgrps;
 
@@ -638,9 +626,6 @@ struct gfs2_sbd {
 
        /* Counters */
 
-       atomic_t sd_glock_count;
-       atomic_t sd_glock_held_count;
-       atomic_t sd_inode_count;
        atomic_t sd_reclaimed;
 
        char sd_fsname[GFS2_FSNAME_LEN];
@@ -650,7 +635,6 @@ struct gfs2_sbd {
        /* Debugging crud */
 
        unsigned long sd_last_warning;
-       struct vfsmount *sd_gfs2mnt;
        struct dentry *debugfs_dir;    /* debugfs directory */
        struct dentry *debugfs_dentry_glocks; /* for debugfs */
 };