]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - include/linux/jbd2.h
mm/memory_hotplug: export generic_online_page()
[linux.git] / include / linux / jbd2.h
index 1dd2703a8e26495c3b3b2d0e1afaca0daa9a2040..29dce6ff6bae88fd8c367a47b0fca1eb0f790481 100644 (file)
@@ -313,7 +313,6 @@ enum jbd_state_bits {
        BH_Revoked,             /* Has been revoked from the log */
        BH_RevokeValid,         /* Revoked flag is valid */
        BH_JBDDirty,            /* Is dirty but journaled */
-       BH_State,               /* Pins most journal_head state */
        BH_JournalHead,         /* Pins bh->b_private and jh->b_bh */
        BH_Shadow,              /* IO on shadow buffer is running */
        BH_Verified,            /* Metadata block has been verified ok */
@@ -342,26 +341,6 @@ static inline struct journal_head *bh2jh(struct buffer_head *bh)
        return bh->b_private;
 }
 
-static inline void jbd_lock_bh_state(struct buffer_head *bh)
-{
-       bit_spin_lock(BH_State, &bh->b_state);
-}
-
-static inline int jbd_trylock_bh_state(struct buffer_head *bh)
-{
-       return bit_spin_trylock(BH_State, &bh->b_state);
-}
-
-static inline int jbd_is_locked_bh_state(struct buffer_head *bh)
-{
-       return bit_spin_is_locked(BH_State, &bh->b_state);
-}
-
-static inline void jbd_unlock_bh_state(struct buffer_head *bh)
-{
-       bit_spin_unlock(BH_State, &bh->b_state);
-}
-
 static inline void jbd_lock_bh_journal_head(struct buffer_head *bh)
 {
        bit_spin_lock(BH_JournalHead, &bh->b_state);
@@ -477,7 +456,9 @@ struct jbd2_revoke_table_s;
  * @h_transaction: Which compound transaction is this update a part of?
  * @h_journal: Which journal handle belongs to - used iff h_reserved set.
  * @h_rsv_handle: Handle reserved for finishing the logical operation.
- * @h_buffer_credits: Number of remaining buffers we are allowed to dirty.
+ * @h_total_credits: Number of remaining buffers we are allowed to add to
+       journal. These are dirty buffers and revoke descriptor blocks.
+ * @h_revoke_credits: Number of remaining revoke records available for handle
  * @h_ref: Reference count on this handle.
  * @h_err: Field for caller's use to track errors through large fs operations.
  * @h_sync: Flag for sync-on-close.
@@ -487,7 +468,8 @@ struct jbd2_revoke_table_s;
  * @h_type: For handle statistics.
  * @h_line_no: For handle statistics.
  * @h_start_jiffies: Handle Start time.
- * @h_requested_credits: Holds @h_buffer_credits after handle is started.
+ * @h_requested_credits: Holds @h_total_credits after handle is started.
+ * @h_revoke_credits_requested: Holds @h_revoke_credits after handle is started.
  * @saved_alloc_context: Saved context while transaction is open.
  **/
 
@@ -504,7 +486,9 @@ struct jbd2_journal_handle
        };
 
        handle_t                *h_rsv_handle;
-       int                     h_buffer_credits;
+       int                     h_total_credits;
+       int                     h_revoke_credits;
+       int                     h_revoke_credits_requested;
        int                     h_ref;
        int                     h_err;
 
@@ -556,9 +540,9 @@ struct transaction_chp_stats_s {
  *      ->jbd_lock_bh_journal_head()   (This is "innermost")
  *
  *    j_state_lock
- *    ->jbd_lock_bh_state()
+ *    ->b_state_lock
  *
- *    jbd_lock_bh_state()
+ *    b_state_lock
  *    ->j_list_lock
  *
  *    j_state_lock
@@ -688,6 +672,17 @@ struct transaction_s
         */
        atomic_t                t_outstanding_credits;
 
+       /*
+        * Number of revoke records for this transaction added by already
+        * stopped handles. [none]
+        */
+       atomic_t                t_outstanding_revokes;
+
+       /*
+        * How many handles used this transaction? [none]
+        */
+       atomic_t                t_handle_count;
+
        /*
         * Forward and backward links for the circular list of all transactions
         * awaiting checkpoint. [j_list_lock]
@@ -705,11 +700,6 @@ struct transaction_s
         */
        ktime_t                 t_start_time;
 
-       /*
-        * How many handles used this transaction? [none]
-        */
-       atomic_t                t_handle_count;
-
        /*
         * This transaction is being forced and some process is
         * waiting for it to finish.
@@ -1026,6 +1016,13 @@ struct journal_s
         */
        int                     j_max_transaction_buffers;
 
+       /**
+        * @j_revoke_records_per_block:
+        *
+        * Number of revoke records that fit in one descriptor block.
+        */
+       int                     j_revoke_records_per_block;
+
        /**
         * @j_commit_interval:
         *
@@ -1172,7 +1169,7 @@ struct journal_s
 #define jbd2_might_wait_for_commit(j) \
        do { \
                rwsem_acquire(&j->j_trans_commit_map, 0, 0, _THIS_IP_); \
-               rwsem_release(&j->j_trans_commit_map, 1, _THIS_IP_); \
+               rwsem_release(&j->j_trans_commit_map, _THIS_IP_); \
        } while (0)
 
 /* journal feature predicate functions */
@@ -1259,7 +1256,7 @@ JBD2_FEATURE_INCOMPAT_FUNCS(csum3,                CSUM_V3)
 
 /* Filing buffers */
 extern void jbd2_journal_unfile_buffer(journal_t *, struct journal_head *);
-extern void __jbd2_journal_refile_buffer(struct journal_head *);
+extern bool __jbd2_journal_refile_buffer(struct journal_head *);
 extern void jbd2_journal_refile_buffer(journal_t *, struct journal_head *);
 extern void __jbd2_journal_file_buffer(struct journal_head *, transaction_t *, int);
 extern void __journal_free_buffer(struct journal_head *bh);
@@ -1360,14 +1357,16 @@ static inline handle_t *journal_current_handle(void)
 
 extern handle_t *jbd2_journal_start(journal_t *, int nblocks);
 extern handle_t *jbd2__journal_start(journal_t *, int blocks, int rsv_blocks,
-                                    gfp_t gfp_mask, unsigned int type,
-                                    unsigned int line_no);
+                                    int revoke_records, gfp_t gfp_mask,
+                                    unsigned int type, unsigned int line_no);
 extern int      jbd2_journal_restart(handle_t *, int nblocks);
-extern int      jbd2__journal_restart(handle_t *, int nblocks, gfp_t gfp_mask);
+extern int      jbd2__journal_restart(handle_t *, int nblocks,
+                                      int revoke_records, gfp_t gfp_mask);
 extern int      jbd2_journal_start_reserved(handle_t *handle,
                                unsigned int type, unsigned int line_no);
 extern void     jbd2_journal_free_reserved(handle_t *handle);
-extern int      jbd2_journal_extend (handle_t *, int nblocks);
+extern int      jbd2_journal_extend(handle_t *handle, int nblocks,
+                                    int revoke_records);
 extern int      jbd2_journal_get_write_access(handle_t *, struct buffer_head *);
 extern int      jbd2_journal_get_create_access (handle_t *, struct buffer_head *);
 extern int      jbd2_journal_get_undo_access(handle_t *, struct buffer_head *);
@@ -1628,10 +1627,18 @@ static inline tid_t  jbd2_get_latest_transaction(journal_t *journal)
        return tid;
 }
 
-
 static inline int jbd2_handle_buffer_credits(handle_t *handle)
 {
-       return handle->h_buffer_credits;
+       journal_t *journal;
+
+       if (!handle->h_reserved)
+               journal = handle->h_transaction->t_journal;
+       else
+               journal = handle->h_journal;
+
+       return handle->h_total_credits -
+               DIV_ROUND_UP(handle->h_revoke_credits_requested,
+                            journal->j_revoke_records_per_block);
 }
 
 #ifdef __KERNEL__