Make checkpatch.pl shut up on fs/inode.c
[safe/jmp/linux-2.6] / fs / gfs2 / incore.h
index 478023e..399d1b9 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) Sistina Software, Inc.  1997-2003 All rights reserved.
- * Copyright (C) 2004-2006 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
@@ -12,6 +12,8 @@
 
 #include <linux/fs.h>
 #include <linux/workqueue.h>
+#include <linux/dlm.h>
+#include <linux/buffer_head.h>
 
 #define DIO_WAIT       0x00000010
 #define DIO_METADATA   0x00000020
@@ -26,6 +28,7 @@ struct gfs2_trans;
 struct gfs2_ail;
 struct gfs2_jdesc;
 struct gfs2_sbd;
+struct lm_lockops;
 
 typedef void (*gfs2_glop_bh_t) (struct gfs2_glock *gl, unsigned int ret);
 
@@ -44,7 +47,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,
@@ -69,35 +71,29 @@ struct gfs2_bitmap {
        u32 bi_len;
 };
 
-struct gfs2_rgrp_host {
-       u32 rg_flags;
-       u32 rg_free;
-       u32 rg_dinodes;
-       u64 rg_igeneration;
-};
-
 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 */
        u32 rd_length;                  /* length of rgrp header in fs blocks */
        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;
+       u32 rd_free;
+       u32 rd_free_clone;
+       u32 rd_dinodes;
+       u64 rd_igeneration;
        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;
        struct gfs2_sbd *rd_sbd;
-       unsigned long rd_flags;
-#define GFS2_RDF_CHECK        0x0001          /* Need to check for unlinked inodes */
+       unsigned int rd_bh_count;
+       u32 rd_last_alloc;
+       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 {
@@ -128,23 +124,44 @@ struct gfs2_bufdata {
        struct list_head bd_ail_gl_list;
 };
 
+/*
+ * Internally, we prefix things with gdlm_ and GDLM_ (for gfs-dlm) since a
+ * prefix of lock_dlm_ gets awkward.
+ */
+
+#define GDLM_STRNAME_BYTES     25
+#define GDLM_LVB_SIZE          32
+
+enum {
+       DFL_BLOCK_LOCKS         = 0,
+};
+
+struct lm_lockname {
+       u64 ln_number;
+       unsigned int ln_type;
+};
+
+#define lm_name_equal(name1, name2) \
+        (((name1)->ln_number == (name2)->ln_number) && \
+         ((name1)->ln_type == (name2)->ln_type))
+
+
 struct gfs2_glock_operations {
        void (*go_xmote_th) (struct gfs2_glock *gl);
-       void (*go_xmote_bh) (struct gfs2_glock *gl);
-       void (*go_drop_th) (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_demote_ok) (const 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,
 };
 
@@ -152,22 +169,26 @@ 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_LOCK                        = 1,
+       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,
+       GLF_INITIAL                     = 10,
+       GLF_FROZEN                      = 11,
 };
 
 struct gfs2_glock {
@@ -179,41 +200,33 @@ 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_req;
        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;
+       char gl_strname[GDLM_STRNAME_BYTES];
+       struct dlm_lksb gl_lksb;
+       char gl_lvb[32];
        unsigned long gl_tchange;
        void *gl_object;
 
-       struct list_head gl_reclaim;
+       struct list_head gl_lru;
 
        struct gfs2_sbd *gl_sbd;
 
        struct inode *gl_aspace;
-       struct gfs2_log_element gl_le;
        struct list_head gl_ail_list;
        atomic_t gl_ail_count;
        struct delayed_work gl_work;
 };
 
+#define GFS2_MIN_LVB_SIZE 32   /* Min size of LVB that gfs2 supports */
+
 struct gfs2_alloc {
        /* Quota stuff */
 
@@ -238,38 +251,29 @@ 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 */
-};
 
 struct gfs2_inode {
        struct inode i_inode;
        u64 i_no_addr;
        u64 i_no_formal_ino;
+       u64 i_generation;
+       u64 i_eattr;
+       loff_t i_disksize;
        unsigned long i_flags;          /* GIF_... */
-
-       struct gfs2_dinode_host i_di; /* To be replaced by ref to block */
-
        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;
+       struct list_head i_trunc_list;
+       u32 i_entries;
+       u32 i_diskflags;
+       u8 i_height;
+       u8 i_depth;
 };
 
 /*
@@ -305,7 +309,9 @@ enum {
 
 struct gfs2_quota_data {
        struct list_head qd_list;
-       unsigned int qd_count;
+       struct list_head qd_reclaim;
+
+       atomic_t qd_count;
 
        u32 qd_id;
        unsigned long qd_flags;         /* QDF_... */
@@ -325,7 +331,6 @@ struct gfs2_quota_data {
 
        u64 qd_sync_gen;
        unsigned long qd_last_warn;
-       unsigned long qd_last_touched;
 };
 
 struct gfs2_trans {
@@ -360,8 +365,17 @@ struct gfs2_ail {
        u64 ai_sync_gen;
 };
 
+struct gfs2_journal_extent {
+       struct list_head extent_list;
+
+       unsigned int lblock; /* First logical block */
+       u64 dblock; /* First disk block */
+       u64 blocks;
+};
+
 struct gfs2_jdesc {
        struct list_head jd_list;
+       struct list_head extent_list;
 
        struct inode *jd_inode;
        unsigned int jd_jid;
@@ -389,43 +403,38 @@ 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_discard:1;              /* discard requests */
 };
 
 struct gfs2_tune {
        spinlock_t gt_spin;
 
-       unsigned int gt_demote_secs; /* Cache retention for unheld glock */
        unsigned int gt_incore_log_blocks;
        unsigned int gt_log_flush_secs;
-       unsigned int gt_jindex_refresh_secs; /* Check for new journal index */
 
        unsigned int gt_recoverd_secs;
        unsigned int gt_logd_secs;
-       unsigned int gt_quotad_secs;
 
        unsigned int gt_quota_simul_sync; /* Max quotavals to sync at once */
        unsigned int gt_quota_warn_period; /* Secs between quota warn msgs */
        unsigned int gt_quota_scale_num; /* Numerator */
        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;
@@ -437,7 +446,7 @@ enum {
        SDF_JOURNAL_CHECKED     = 0,
        SDF_JOURNAL_LIVE        = 1,
        SDF_SHUTDOWN            = 2,
-       SDF_NOATIME             = 3,
+       SDF_NOBARRIERS          = 3,
 };
 
 #define GFS2_FSNAME_LEN                256
@@ -462,11 +471,35 @@ struct gfs2_sb_host {
 
        char sb_lockproto[GFS2_LOCKNAME_LEN];
        char sb_locktable[GFS2_LOCKNAME_LEN];
+       u8 sb_uuid[16];
+};
+
+/*
+ * lm_mount() return values
+ *
+ * ls_jid - the journal ID this node should use
+ * ls_first - this node is the first to mount the file system
+ * ls_lockspace - lock module's context for this file system
+ * ls_ops - lock module's functions
+ */
+
+struct lm_lockstruct {
+       u32 ls_id;
+       unsigned int ls_jid;
+       unsigned int ls_first;
+       unsigned int ls_first_done;
+       unsigned int ls_nodir;
+       const struct lm_lockops *ls_ops;
+       unsigned long ls_flags;
+       dlm_lockspace_t *ls_dlm;
+
+       int ls_recover_jid;
+       int ls_recover_jid_done;
+       int ls_recover_jid_status;
 };
 
 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;
@@ -484,9 +517,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 */
@@ -494,17 +527,15 @@ struct gfs2_sbd {
        /* Lock Stuff */
 
        struct lm_lockstruct sd_lockstruct;
-       struct list_head sd_reclaim_list;
-       spinlock_t sd_reclaim_lock;
-       wait_queue_head_t sd_reclaim_wq;
-       atomic_t sd_reclaim_count;
        struct gfs2_holder sd_live_gh;
        struct gfs2_glock *sd_rename_gl;
        struct gfs2_glock *sd_trans_gl;
 
        /* 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;
@@ -521,19 +552,16 @@ struct gfs2_sbd {
        /* StatFS stuff */
 
        spinlock_t sd_statfs_spin;
-       struct mutex sd_statfs_mutex;
        struct gfs2_statfs_change_host sd_statfs_master;
        struct gfs2_statfs_change_host sd_statfs_local;
-       unsigned long sd_statfs_sync_time;
 
        /* 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;
 
@@ -543,7 +571,6 @@ struct gfs2_sbd {
        spinlock_t sd_jindex_spin;
        struct mutex sd_jindex_mutex;
        unsigned int sd_journals;
-       unsigned long sd_jindex_refresh_time;
 
        struct gfs2_jdesc *sd_jdesc;
        struct gfs2_holder sd_journal_gh;
@@ -558,22 +585,21 @@ struct gfs2_sbd {
        struct task_struct *sd_recoverd_process;
        struct task_struct *sd_logd_process;
        struct task_struct *sd_quotad_process;
-       struct task_struct *sd_glockd_process[GFS2_GLOCKD_MAX];
-       unsigned int sd_glockd_num;
 
        /* Quota stuff */
 
        struct list_head sd_quota_list;
        atomic_t sd_quota_count;
-       spinlock_t sd_quota_spin;
        struct mutex sd_quota_mutex;
+       wait_queue_head_t sd_quota_wait;
+       struct list_head sd_trunc_list;
+       spinlock_t sd_trunc_lock;
 
        unsigned int sd_quota_slots;
        unsigned int sd_quota_chunks;
        unsigned char **sd_quota_bitmap;
 
        u64 sd_quota_sync_gen;
-       unsigned long sd_quota_sync_time;
 
        /* Log stuff */
 
@@ -584,20 +610,18 @@ struct gfs2_sbd {
        unsigned int sd_log_commited_databuf;
        unsigned int sd_log_commited_revoke;
 
-       unsigned int sd_log_num_gl;
        unsigned int sd_log_num_buf;
        unsigned int sd_log_num_revoke;
        unsigned int sd_log_num_rg;
        unsigned int sd_log_num_databuf;
 
-       struct list_head sd_log_le_gl;
        struct list_head sd_log_le_buf;
        struct list_head sd_log_le_revoke;
        struct list_head sd_log_le_rg;
        struct list_head sd_log_le_databuf;
        struct list_head sd_log_le_ordered;
 
-       unsigned int sd_log_blks_free;
+       atomic_t sd_log_blks_free;
        struct mutex sd_log_reserve_mutex;
 
        u64 sd_log_sequence;
@@ -632,13 +656,6 @@ struct gfs2_sbd {
        struct mutex sd_freeze_lock;
        unsigned int sd_freeze_count;
 
-       /* 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];
        char sd_table_name[GFS2_FSNAME_LEN];
        char sd_proto_name[GFS2_FSNAME_LEN];
@@ -646,7 +663,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 */
 };