^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 */