gfs2: Force withdraw to replay journals and wait for it to finish
[linux-2.6-microblaze.git] / fs / gfs2 / incore.h
index 3072707..8cd564b 100644 (file)
@@ -242,6 +242,7 @@ struct gfs2_glock_operations {
        void (*go_dump)(struct seq_file *seq, struct gfs2_glock *gl,
                        const char *fs_id_buf);
        void (*go_callback)(struct gfs2_glock *gl, bool remote);
+       void (*go_free)(struct gfs2_glock *gl);
        const int go_type;
        const unsigned long go_flags;
 #define GLOF_ASPACE 1 /* address space attached */
@@ -343,6 +344,7 @@ enum {
        GLF_OBJECT                      = 14, /* Used only for tracing */
        GLF_BLOCKING                    = 15,
        GLF_INODE_CREATING              = 16, /* Inode creation occurring */
+       GLF_FREEING                     = 18, /* Wait for glock to be freed */
 };
 
 struct gfs2_glock {
@@ -619,6 +621,10 @@ enum {
        SDF_FORCE_AIL_FLUSH     = 9,
        SDF_FS_FROZEN           = 10,
        SDF_WITHDRAWING         = 11, /* Will withdraw eventually */
+       SDF_WITHDRAW_IN_PROG    = 12, /* Withdraw is in progress */
+       SDF_REMOTE_WITHDRAW     = 13, /* Performing remote recovery */
+       SDF_WITHDRAW_RECOVERY   = 14, /* Wait for journal recovery when we are
+                                        withdrawing */
 };
 
 enum gfs2_freeze_state {
@@ -769,6 +775,7 @@ struct gfs2_sbd {
        struct gfs2_jdesc *sd_jdesc;
        struct gfs2_holder sd_journal_gh;
        struct gfs2_holder sd_jinode_gh;
+       struct gfs2_glock *sd_jinode_gl;
 
        struct gfs2_holder sd_sc_gh;
        struct gfs2_holder sd_qc_gh;
@@ -830,6 +837,7 @@ struct gfs2_sbd {
        struct bio *sd_log_bio;
        wait_queue_head_t sd_log_flush_wait;
        int sd_log_error; /* First log error */
+       wait_queue_head_t sd_withdraw_wait;
 
        atomic_t sd_reserving_log;
        wait_queue_head_t sd_reserving_log_wait;
@@ -853,6 +861,7 @@ struct gfs2_sbd {
 
        unsigned long sd_last_warning;
        struct dentry *debugfs_dir;    /* debugfs directory */
+       unsigned long sd_glock_dqs_held;
 };
 
 static inline void gfs2_glstats_inc(struct gfs2_glock *gl, int which)