Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /* SPDX-License-Identifier: GPL-2.0-or-later */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /* -*- mode: c; c-basic-offset: 8; -*-
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * vim: noexpandtab sw=8 ts=8 sts=0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  * journal.h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  * Defines journalling api and structures.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9)  * Copyright (C) 2003, 2005 Oracle.  All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #ifndef OCFS2_JOURNAL_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #define OCFS2_JOURNAL_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #include <linux/fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) #include <linux/jbd2.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) enum ocfs2_journal_state {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) 	OCFS2_JOURNAL_FREE = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) 	OCFS2_JOURNAL_LOADED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) 	OCFS2_JOURNAL_IN_SHUTDOWN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) struct ocfs2_super;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) struct ocfs2_dinode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28)  * The recovery_list is a simple linked list of node numbers to recover.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29)  * It is protected by the recovery_lock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) struct ocfs2_recovery_map {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 	unsigned int rm_used;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 	unsigned int *rm_entries;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) struct ocfs2_journal {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 	enum ocfs2_journal_state   j_state;    /* Journals current state   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 	journal_t                 *j_journal; /* The kernels journal type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	struct inode              *j_inode;   /* Kernel inode pointing to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 					       * this journal             */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 	struct ocfs2_super        *j_osb;     /* pointer to the super
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 					       * block for the node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 					       * we're currently
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 					       * running on -- not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 					       * necessarily the super
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 					       * block from the node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 					       * which we usually run
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 					       * from (recovery,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 					       * etc)                     */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	struct buffer_head        *j_bh;      /* Journal disk inode block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	atomic_t                  j_num_trans; /* Number of transactions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 					        * currently in the system. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	spinlock_t                j_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 	unsigned long             j_trans_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	struct rw_semaphore       j_trans_barrier;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	wait_queue_head_t         j_checkpointed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	/* both fields protected by j_lock*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	struct list_head          j_la_cleanups;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	struct work_struct        j_recovery_work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) extern spinlock_t trans_inc_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) /* wrap j_trans_id so we never have it equal to zero. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) static inline unsigned long ocfs2_inc_trans_id(struct ocfs2_journal *j)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	unsigned long old_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	spin_lock(&trans_inc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 	old_id = j->j_trans_id++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 	if (unlikely(!j->j_trans_id))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 		j->j_trans_id = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 	spin_unlock(&trans_inc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 	return old_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) static inline void ocfs2_set_ci_lock_trans(struct ocfs2_journal *journal,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 					   struct ocfs2_caching_info *ci)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 	spin_lock(&trans_inc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	ci->ci_last_trans = journal->j_trans_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 	spin_unlock(&trans_inc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) /* Used to figure out whether it's safe to drop a metadata lock on an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89)  * cached object. Returns true if all the object's changes have been
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90)  * checkpointed to disk. You should be holding the spinlock on the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91)  * metadata lock while calling this to be sure that nobody can take
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92)  * the lock and put it on another transaction. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) static inline int ocfs2_ci_fully_checkpointed(struct ocfs2_caching_info *ci)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	struct ocfs2_journal *journal =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 		OCFS2_SB(ocfs2_metadata_cache_get_super(ci))->journal;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 	spin_lock(&trans_inc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 	ret = time_after(journal->j_trans_id, ci->ci_last_trans);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 	spin_unlock(&trans_inc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) /* convenience function to check if an object backed by struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)  * ocfs2_caching_info  is still new (has never hit disk) Will do you a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)  * favor and set created_trans = 0 when you've
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)  * been checkpointed.  returns '1' if the ci is still new. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) static inline int ocfs2_ci_is_new(struct ocfs2_caching_info *ci)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 	struct ocfs2_journal *journal =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 		OCFS2_SB(ocfs2_metadata_cache_get_super(ci))->journal;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 	spin_lock(&trans_inc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 	ret = !(time_after(journal->j_trans_id, ci->ci_created_trans));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 	if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 		ci->ci_created_trans = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 	spin_unlock(&trans_inc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) /* Wrapper for inodes so we can check system files */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) static inline int ocfs2_inode_is_new(struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 	/* System files are never "new" as they're written out by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 	 * mkfs. This helps us early during mount, before we have the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 	 * journal open and j_trans_id could be junk. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 	if (OCFS2_I(inode)->ip_flags & OCFS2_INODE_SYSTEM_FILE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 	return ocfs2_ci_is_new(INODE_CACHE(inode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) static inline void ocfs2_ci_set_new(struct ocfs2_super *osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 				    struct ocfs2_caching_info *ci)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 	spin_lock(&trans_inc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 	ci->ci_created_trans = osb->journal->j_trans_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 	spin_unlock(&trans_inc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) /* Exported only for the journal struct init code in super.c. Do not call. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) void ocfs2_orphan_scan_init(struct ocfs2_super *osb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) void ocfs2_orphan_scan_start(struct ocfs2_super *osb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) void ocfs2_orphan_scan_stop(struct ocfs2_super *osb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) void ocfs2_complete_recovery(struct work_struct *work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) void ocfs2_wait_for_recovery(struct ocfs2_super *osb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) int ocfs2_recovery_init(struct ocfs2_super *osb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) void ocfs2_recovery_exit(struct ocfs2_super *osb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) int ocfs2_compute_replay_slots(struct ocfs2_super *osb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)  *  Journal Control:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)  *  Initialize, Load, Shutdown, Wipe a journal.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)  *  ocfs2_journal_init     - Initialize journal structures in the OSB.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)  *  ocfs2_journal_load     - Load the given journal off disk. Replay it if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)  *                          there's transactions still in there.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)  *  ocfs2_journal_shutdown - Shutdown a journal, this will flush all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)  *                          uncommitted, uncheckpointed transactions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)  *  ocfs2_journal_wipe     - Wipe transactions from a journal. Optionally
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)  *                          zero out each block.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)  *  ocfs2_recovery_thread  - Perform recovery on a node. osb is our own osb.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)  *  ocfs2_mark_dead_nodes - Start recovery on nodes we won't get a heartbeat
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)  *                          event on.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)  *  ocfs2_start_checkpoint - Kick the commit thread to do a checkpoint.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) void   ocfs2_set_journal_params(struct ocfs2_super *osb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) int    ocfs2_journal_init(struct ocfs2_journal *journal,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 			  int *dirty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) void   ocfs2_journal_shutdown(struct ocfs2_super *osb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) int    ocfs2_journal_wipe(struct ocfs2_journal *journal,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 			  int full);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) int    ocfs2_journal_load(struct ocfs2_journal *journal, int local,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 			  int replayed);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) int    ocfs2_check_journals_nolocks(struct ocfs2_super *osb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) void   ocfs2_recovery_thread(struct ocfs2_super *osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 			     int node_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) int    ocfs2_mark_dead_nodes(struct ocfs2_super *osb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) void   ocfs2_complete_mount_recovery(struct ocfs2_super *osb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) void ocfs2_complete_quota_recovery(struct ocfs2_super *osb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) static inline void ocfs2_start_checkpoint(struct ocfs2_super *osb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 	wake_up(&osb->checkpoint_event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) static inline void ocfs2_checkpoint_inode(struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 	if (ocfs2_mount_local(osb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 	if (!ocfs2_ci_fully_checkpointed(INODE_CACHE(inode))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 		/* WARNING: This only kicks off a single
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 		 * checkpoint. If someone races you and adds more
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 		 * metadata to the journal, you won't know, and will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 		 * wind up waiting *a lot* longer than necessary. Right
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 		 * now we only use this in clear_inode so that's
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 		 * OK. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 		ocfs2_start_checkpoint(osb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 		wait_event(osb->journal->j_checkpointed,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 			   ocfs2_ci_fully_checkpointed(INODE_CACHE(inode)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)  *  Transaction Handling:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214)  *  Manage the lifetime of a transaction handle.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216)  *  ocfs2_start_trans      - Begin a transaction. Give it an upper estimate of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)  *                          the number of blocks that will be changed during
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)  *                          this handle.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219)  *  ocfs2_commit_trans - Complete a handle. It might return -EIO if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)  *                       the journal was aborted. The majority of paths don't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)  *                       check the return value as an error there comes too
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222)  *                       late to do anything (and will be picked up in a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)  *                       later transaction).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224)  *  ocfs2_extend_trans     - Extend a handle by nblocks credits. This may
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)  *                          commit the handle to disk in the process, but will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226)  *                          not release any locks taken during the transaction.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)  *  ocfs2_journal_access* - Notify the handle that we want to journal this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228)  *                          buffer. Will have to call ocfs2_journal_dirty once
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)  *                          we've actually dirtied it. Type is one of . or .
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)  *                          Always call the specific flavor of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231)  *                          ocfs2_journal_access_*() unless you intend to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)  *                          manage the checksum by hand.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233)  *  ocfs2_journal_dirty    - Mark a journalled buffer as having dirty data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)  *  ocfs2_jbd2_inode_add_write  - Mark an inode with range so that its data goes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)  *                                out before the current handle commits.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) /* You must always start_trans with a number of buffs > 0, but it's
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239)  * perfectly legal to go through an entire transaction without having
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240)  * dirtied any buffers. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) handle_t		    *ocfs2_start_trans(struct ocfs2_super *osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 					       int max_buffs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) int			     ocfs2_commit_trans(struct ocfs2_super *osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 						handle_t *handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) int			     ocfs2_extend_trans(handle_t *handle, int nblocks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) int			     ocfs2_allocate_extend_trans(handle_t *handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 						int thresh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250)  * Define an arbitrary limit for the amount of data we will anticipate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)  * writing to any given transaction.  For unbounded transactions such as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252)  * fallocate(2) we can write more than this, but we always
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253)  * start off at the maximum transaction size and grow the transaction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254)  * optimistically as we go.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) #define OCFS2_MAX_TRANS_DATA	64U
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259)  * Create access is for when we get a newly created buffer and we're
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260)  * not gonna read it off disk, but rather fill it ourselves.  Right
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261)  * now, we don't do anything special with this (it turns into a write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262)  * request), but this is a good placeholder in case we do...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)  * Write access is for when we read a block off disk and are going to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265)  * modify it. This way the journalling layer knows it may need to make
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266)  * a copy of that block (if it's part of another, uncommitted
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267)  * transaction) before we do so.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) #define OCFS2_JOURNAL_ACCESS_CREATE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) #define OCFS2_JOURNAL_ACCESS_WRITE  1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) #define OCFS2_JOURNAL_ACCESS_UNDO   2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) /* ocfs2_inode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) int ocfs2_journal_access_di(handle_t *handle, struct ocfs2_caching_info *ci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 			    struct buffer_head *bh, int type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) /* ocfs2_extent_block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) int ocfs2_journal_access_eb(handle_t *handle, struct ocfs2_caching_info *ci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 			    struct buffer_head *bh, int type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) /* ocfs2_refcount_block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) int ocfs2_journal_access_rb(handle_t *handle, struct ocfs2_caching_info *ci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 			    struct buffer_head *bh, int type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) /* ocfs2_group_desc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) int ocfs2_journal_access_gd(handle_t *handle, struct ocfs2_caching_info *ci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) 			    struct buffer_head *bh, int type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) /* ocfs2_xattr_block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) int ocfs2_journal_access_xb(handle_t *handle, struct ocfs2_caching_info *ci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) 			    struct buffer_head *bh, int type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) /* quota blocks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) int ocfs2_journal_access_dq(handle_t *handle, struct ocfs2_caching_info *ci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 			    struct buffer_head *bh, int type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) /* dirblock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) int ocfs2_journal_access_db(handle_t *handle, struct ocfs2_caching_info *ci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 			    struct buffer_head *bh, int type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) /* ocfs2_dx_root_block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) int ocfs2_journal_access_dr(handle_t *handle, struct ocfs2_caching_info *ci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 			    struct buffer_head *bh, int type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) /* ocfs2_dx_leaf */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) int ocfs2_journal_access_dl(handle_t *handle, struct ocfs2_caching_info *ci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) 			    struct buffer_head *bh, int type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) /* Anything that has no ecc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) int ocfs2_journal_access(handle_t *handle, struct ocfs2_caching_info *ci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) 			 struct buffer_head *bh, int type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306)  * A word about the journal_access/journal_dirty "dance". It is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)  * entirely legal to journal_access a buffer more than once (as long
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308)  * as the access type is the same -- I'm not sure what will happen if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309)  * access type is different but this should never happen anyway) It is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310)  * also legal to journal_dirty a buffer more than once. In fact, you
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311)  * can even journal_access a buffer after you've done a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312)  * journal_access/journal_dirty pair. The only thing you cannot do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313)  * however, is journal_dirty a buffer which you haven't yet passed to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314)  * journal_access at least once.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316)  * That said, 99% of the time this doesn't matter and this is what the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317)  * path looks like:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319)  *	<read a bh>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320)  *	ocfs2_journal_access(handle, bh,	OCFS2_JOURNAL_ACCESS_WRITE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321)  *	<modify the bh>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322)  * 	ocfs2_journal_dirty(handle, bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) void ocfs2_journal_dirty(handle_t *handle, struct buffer_head *bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327)  *  Credit Macros:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328)  *  Convenience macros to calculate number of credits needed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330)  *  For convenience sake, I have a set of macros here which calculate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)  *  the *maximum* number of sectors which will be changed for various
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332)  *  metadata updates.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) /* simple file updates like chmod, etc. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) #define OCFS2_INODE_UPDATE_CREDITS 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) /* extended attribute block update */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) #define OCFS2_XATTR_BLOCK_UPDATE_CREDITS 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) /* Update of a single quota block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) #define OCFS2_QUOTA_BLOCK_UPDATE_CREDITS 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) /* global quotafile inode update, data block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) #define OCFS2_QINFO_WRITE_CREDITS (OCFS2_INODE_UPDATE_CREDITS + \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) 				   OCFS2_QUOTA_BLOCK_UPDATE_CREDITS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) #define OCFS2_LOCAL_QINFO_WRITE_CREDITS OCFS2_QUOTA_BLOCK_UPDATE_CREDITS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350)  * The two writes below can accidentally see global info dirty due
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351)  * to set_info() quotactl so make them prepared for the writes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) /* quota data block, global info */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) /* Write to local quota file */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) #define OCFS2_QWRITE_CREDITS (OCFS2_QINFO_WRITE_CREDITS + \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) 			      OCFS2_QUOTA_BLOCK_UPDATE_CREDITS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) /* global quota data block, local quota data block, global quota inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359)  * global quota info */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) #define OCFS2_QSYNC_CREDITS (OCFS2_QINFO_WRITE_CREDITS + \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) 			     2 * OCFS2_QUOTA_BLOCK_UPDATE_CREDITS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) static inline int ocfs2_quota_trans_credits(struct super_block *sb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 	int credits = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) 	if (OCFS2_HAS_RO_COMPAT_FEATURE(sb, OCFS2_FEATURE_RO_COMPAT_USRQUOTA))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 		credits += OCFS2_QWRITE_CREDITS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) 	if (OCFS2_HAS_RO_COMPAT_FEATURE(sb, OCFS2_FEATURE_RO_COMPAT_GRPQUOTA))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) 		credits += OCFS2_QWRITE_CREDITS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) 	return credits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) /* group extend. inode update and last group update. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) #define OCFS2_GROUP_EXTEND_CREDITS	(OCFS2_INODE_UPDATE_CREDITS + 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) /* group add. inode update and the new group update. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) #define OCFS2_GROUP_ADD_CREDITS	(OCFS2_INODE_UPDATE_CREDITS + 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) /* get one bit out of a suballocator: dinode + group descriptor +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381)  * prev. group desc. if we relink. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) #define OCFS2_SUBALLOC_ALLOC (3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) static inline int ocfs2_inline_to_extents_credits(struct super_block *sb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) 	return OCFS2_SUBALLOC_ALLOC + OCFS2_INODE_UPDATE_CREDITS +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) 	       ocfs2_quota_trans_credits(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) /* dinode + group descriptor update. We don't relink on free yet. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) #define OCFS2_SUBALLOC_FREE  (2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) #define OCFS2_TRUNCATE_LOG_UPDATE OCFS2_INODE_UPDATE_CREDITS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) #define OCFS2_TRUNCATE_LOG_FLUSH_ONE_REC (OCFS2_SUBALLOC_FREE 		      \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) 					 + OCFS2_TRUNCATE_LOG_UPDATE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) static inline int ocfs2_remove_extent_credits(struct super_block *sb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) 	return OCFS2_TRUNCATE_LOG_UPDATE + OCFS2_INODE_UPDATE_CREDITS +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) 	       ocfs2_quota_trans_credits(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) /* data block for new dir/symlink, allocation of directory block, dx_root
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404)  * update for free list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) #define OCFS2_DIR_LINK_ADDITIONAL_CREDITS (1 + OCFS2_SUBALLOC_ALLOC + 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) static inline int ocfs2_add_dir_index_credits(struct super_block *sb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) 	/* 1 block for index, 2 allocs (data, metadata), 1 clusters
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) 	 * worth of blocks for initial extent. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) 	return 1 + 2 * OCFS2_SUBALLOC_ALLOC +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) 		ocfs2_clusters_to_blocks(sb, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) /* parent fe, parent block, new file entry, index leaf, inode alloc fe, inode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416)  * alloc group descriptor + mkdir/symlink blocks + dir blocks + xattr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417)  * blocks + quota update */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) static inline int ocfs2_mknod_credits(struct super_block *sb, int is_dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) 				      int xattr_credits)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) 	int dir_credits = OCFS2_DIR_LINK_ADDITIONAL_CREDITS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) 	if (is_dir)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) 		dir_credits += ocfs2_add_dir_index_credits(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) 	return 4 + OCFS2_SUBALLOC_ALLOC + dir_credits + xattr_credits +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) 	       ocfs2_quota_trans_credits(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) /* local alloc metadata change + main bitmap updates */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) #define OCFS2_WINDOW_MOVE_CREDITS (OCFS2_INODE_UPDATE_CREDITS                 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) 				  + OCFS2_SUBALLOC_ALLOC + OCFS2_SUBALLOC_FREE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) /* used when we don't need an allocation change for a dir extend. One
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435)  * for the dinode, one for the new block. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) #define OCFS2_SIMPLE_DIR_EXTEND_CREDITS (2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) /* file update (nlink, etc) + directory mtime/ctime + dir entry block + quota
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439)  * update on dir + index leaf + dx root update for free list +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440)  * previous dirblock update in the free list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) static inline int ocfs2_link_credits(struct super_block *sb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) 	return 2 * OCFS2_INODE_UPDATE_CREDITS + 4 +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) 	       ocfs2_quota_trans_credits(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) /* inode + dir inode (if we unlink a dir), + dir entry block + orphan
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448)  * dir inode link + dir inode index leaf + dir index root */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) static inline int ocfs2_unlink_credits(struct super_block *sb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) 	/* The quota update from ocfs2_link_credits is unused here... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) 	return 2 * OCFS2_INODE_UPDATE_CREDITS + 3 + ocfs2_link_credits(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) /* dinode + orphan dir dinode + inode alloc dinode + orphan dir entry +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456)  * inode alloc group descriptor + orphan dir index root +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457)  * orphan dir index leaf */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) #define OCFS2_DELETE_INODE_CREDITS (3 * OCFS2_INODE_UPDATE_CREDITS + 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) /* dinode + orphan dir dinode + extent tree leaf block + orphan dir entry +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461)  * orphan dir index root + orphan dir index leaf */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) #define OCFS2_INODE_ADD_TO_ORPHAN_CREDITS  (2 * OCFS2_INODE_UPDATE_CREDITS + 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) #define OCFS2_INODE_DEL_FROM_ORPHAN_CREDITS  OCFS2_INODE_ADD_TO_ORPHAN_CREDITS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) /* dinode update, old dir dinode update, new dir dinode update, old
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466)  * dir dir entry, new dir dir entry, dir entry update for renaming
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467)  * directory + target unlink + 3 x dir index leaves */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) static inline int ocfs2_rename_credits(struct super_block *sb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) 	return 3 * OCFS2_INODE_UPDATE_CREDITS + 6 + ocfs2_unlink_credits(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) /* global bitmap dinode, group desc., relinked group,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474)  * suballocator dinode, group desc., relinked group,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475)  * dinode, xattr block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) #define OCFS2_XATTR_BLOCK_CREATE_CREDITS (OCFS2_SUBALLOC_ALLOC * 2 + \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) 					  + OCFS2_INODE_UPDATE_CREDITS \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) 					  + OCFS2_XATTR_BLOCK_UPDATE_CREDITS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) /* inode update, removal of dx root block from allocator */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) #define OCFS2_DX_ROOT_REMOVE_CREDITS (OCFS2_INODE_UPDATE_CREDITS +	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) 				      OCFS2_SUBALLOC_FREE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) static inline int ocfs2_calc_dxi_expand_credits(struct super_block *sb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) 	int credits = 1 + OCFS2_SUBALLOC_ALLOC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) 	credits += ocfs2_clusters_to_blocks(sb, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) 	credits += ocfs2_quota_trans_credits(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) 	return credits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) /* inode update, new refcount block and its allocation credits. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) #define OCFS2_REFCOUNT_TREE_CREATE_CREDITS (OCFS2_INODE_UPDATE_CREDITS + 1 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) 					    + OCFS2_SUBALLOC_ALLOC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) /* inode and the refcount block update. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) #define OCFS2_REFCOUNT_TREE_SET_CREDITS (OCFS2_INODE_UPDATE_CREDITS + 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502)  * inode and the refcount block update.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503)  * It doesn't include the credits for sub alloc change.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504)  * So if we need to free the bit, OCFS2_SUBALLOC_FREE needs to be added.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) #define OCFS2_REFCOUNT_TREE_REMOVE_CREDITS (OCFS2_INODE_UPDATE_CREDITS + 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) /* 2 metadata alloc, 2 new blocks and root refcount block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) #define OCFS2_EXPAND_REFCOUNT_TREE_CREDITS (OCFS2_SUBALLOC_ALLOC * 2 + 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512)  * Please note that the caller must make sure that root_el is the root
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513)  * of extent tree. So for an inode, it should be &fe->id2.i_list. Otherwise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514)  * the result may be wrong.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) static inline int ocfs2_calc_extend_credits(struct super_block *sb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) 					    struct ocfs2_extent_list *root_el)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) 	int bitmap_blocks, sysfile_bitmap_blocks, extent_blocks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) 	/* bitmap dinode, group desc. + relinked group. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) 	bitmap_blocks = OCFS2_SUBALLOC_ALLOC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) 	/* we might need to shift tree depth so lets assume an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) 	 * absolute worst case of complete fragmentation.  Even with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) 	 * that, we only need one update for the dinode, and then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) 	 * however many metadata chunks needed * a remaining suballoc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) 	 * alloc. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) 	sysfile_bitmap_blocks = 1 +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) 		(OCFS2_SUBALLOC_ALLOC - 1) * ocfs2_extend_meta_needed(root_el);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) 	/* this does not include *new* metadata blocks, which are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) 	 * accounted for in sysfile_bitmap_blocks. root_el +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) 	 * prev. last_eb_blk + blocks along edge of tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) 	 * calc_symlink_credits passes because we just need 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) 	 * credit for the dinode there. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) 	extent_blocks = 1 + 1 + le16_to_cpu(root_el->l_tree_depth);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) 	return bitmap_blocks + sysfile_bitmap_blocks + extent_blocks +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) 	       ocfs2_quota_trans_credits(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) static inline int ocfs2_calc_symlink_credits(struct super_block *sb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) 	int blocks = ocfs2_mknod_credits(sb, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) 	/* links can be longer than one block so we may update many
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) 	 * within our single allocated extent. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) 	blocks += ocfs2_clusters_to_blocks(sb, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) 	return blocks + ocfs2_quota_trans_credits(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) static inline int ocfs2_calc_group_alloc_credits(struct super_block *sb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) 						 unsigned int cpg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) 	int blocks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) 	int bitmap_blocks = OCFS2_SUBALLOC_ALLOC + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) 	/* parent inode update + new block group header + bitmap inode update
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) 	   + bitmap blocks affected */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) 	blocks = 1 + 1 + 1 + bitmap_blocks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) 	return blocks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566)  * Allocating a discontiguous block group requires the credits from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567)  * ocfs2_calc_group_alloc_credits() as well as enough credits to fill
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568)  * the group descriptor's extent list.  The caller already has started
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569)  * the transaction with ocfs2_calc_group_alloc_credits().  They extend
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570)  * it with these credits.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) static inline int ocfs2_calc_bg_discontig_credits(struct super_block *sb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) 	return ocfs2_extent_recs_per_gd(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) static inline int ocfs2_jbd2_inode_add_write(handle_t *handle, struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) 					     loff_t start_byte, loff_t length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) 	return jbd2_journal_inode_ranged_write(handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) 					       &OCFS2_I(inode)->ip_jinode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) 					       start_byte, length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) static inline int ocfs2_begin_ordered_truncate(struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) 					       loff_t new_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) 	return jbd2_journal_begin_ordered_truncate(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) 				OCFS2_SB(inode->i_sb)->journal->j_journal,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) 				&OCFS2_I(inode)->ip_jinode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) 				new_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) static inline void ocfs2_update_inode_fsync_trans(handle_t *handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) 						  struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) 						  int datasync)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) 	struct ocfs2_inode_info *oi = OCFS2_I(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) 	if (!is_handle_aborted(handle)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) 		oi->i_sync_tid = handle->h_transaction->t_tid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) 		if (datasync)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) 			oi->i_datasync_tid = handle->h_transaction->t_tid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) #endif /* OCFS2_JOURNAL_H */