^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) * inode.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * vfs' aops, fops, dops and iops
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * Copyright (C) 2002, 2004 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) #include <linux/fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/highmem.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/pagemap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/quotaops.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/iversion.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <asm/byteorder.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <cluster/masklog.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include "ocfs2.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include "alloc.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include "dir.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include "blockcheck.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include "dlmglue.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include "extent_map.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include "file.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #include "heartbeat.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #include "inode.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #include "journal.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include "namei.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #include "suballoc.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #include "super.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #include "symlink.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #include "sysfile.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #include "uptodate.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #include "xattr.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #include "refcounttree.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #include "ocfs2_trace.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #include "filecheck.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #include "buffer_head_io.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) struct ocfs2_find_inode_args
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) u64 fi_blkno;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) unsigned long fi_ino;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) unsigned int fi_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) unsigned int fi_sysfile_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) static struct lock_class_key ocfs2_sysfile_lock_key[NUM_SYSTEM_INODES];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) static int ocfs2_read_locked_inode(struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) struct ocfs2_find_inode_args *args);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) static int ocfs2_init_locked_inode(struct inode *inode, void *opaque);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) static int ocfs2_find_actor(struct inode *inode, void *opaque);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) static int ocfs2_truncate_for_delete(struct ocfs2_super *osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) struct buffer_head *fe_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) static int ocfs2_filecheck_read_inode_block_full(struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) struct buffer_head **bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) int flags, int type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) static int ocfs2_filecheck_validate_inode_block(struct super_block *sb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) struct buffer_head *bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) static int ocfs2_filecheck_repair_inode_block(struct super_block *sb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) struct buffer_head *bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) void ocfs2_set_inode_flags(struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) unsigned int flags = OCFS2_I(inode)->ip_attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) inode->i_flags &= ~(S_IMMUTABLE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) S_SYNC | S_APPEND | S_NOATIME | S_DIRSYNC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) if (flags & OCFS2_IMMUTABLE_FL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) inode->i_flags |= S_IMMUTABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) if (flags & OCFS2_SYNC_FL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) inode->i_flags |= S_SYNC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) if (flags & OCFS2_APPEND_FL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) inode->i_flags |= S_APPEND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) if (flags & OCFS2_NOATIME_FL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) inode->i_flags |= S_NOATIME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) if (flags & OCFS2_DIRSYNC_FL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) inode->i_flags |= S_DIRSYNC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) /* Propagate flags from i_flags to OCFS2_I(inode)->ip_attr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) void ocfs2_get_inode_flags(struct ocfs2_inode_info *oi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) unsigned int flags = oi->vfs_inode.i_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) oi->ip_attr &= ~(OCFS2_SYNC_FL|OCFS2_APPEND_FL|
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) OCFS2_IMMUTABLE_FL|OCFS2_NOATIME_FL|OCFS2_DIRSYNC_FL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) if (flags & S_SYNC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) oi->ip_attr |= OCFS2_SYNC_FL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) if (flags & S_APPEND)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) oi->ip_attr |= OCFS2_APPEND_FL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) if (flags & S_IMMUTABLE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) oi->ip_attr |= OCFS2_IMMUTABLE_FL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) if (flags & S_NOATIME)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) oi->ip_attr |= OCFS2_NOATIME_FL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) if (flags & S_DIRSYNC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) oi->ip_attr |= OCFS2_DIRSYNC_FL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) struct inode *ocfs2_ilookup(struct super_block *sb, u64 blkno)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) struct ocfs2_find_inode_args args;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) args.fi_blkno = blkno;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) args.fi_flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) args.fi_ino = ino_from_blkno(sb, blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) args.fi_sysfile_type = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) return ilookup5(sb, blkno, ocfs2_find_actor, &args);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) struct inode *ocfs2_iget(struct ocfs2_super *osb, u64 blkno, unsigned flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) int sysfile_type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) int rc = -ESTALE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) struct inode *inode = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) struct super_block *sb = osb->sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) struct ocfs2_find_inode_args args;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) journal_t *journal = OCFS2_SB(sb)->journal->j_journal;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) trace_ocfs2_iget_begin((unsigned long long)blkno, flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) sysfile_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) /* Ok. By now we've either got the offsets passed to us by the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) * caller, or we just pulled them off the bh. Lets do some
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) * sanity checks to make sure they're OK. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) if (blkno == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) inode = ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) mlog_errno(PTR_ERR(inode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) args.fi_blkno = blkno;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) args.fi_flags = flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) args.fi_ino = ino_from_blkno(sb, blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) args.fi_sysfile_type = sysfile_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) inode = iget5_locked(sb, args.fi_ino, ocfs2_find_actor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) ocfs2_init_locked_inode, &args);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) /* inode was *not* in the inode cache. 2.6.x requires
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) * us to do our own read_inode call and unlock it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) * afterwards. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) if (inode == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) inode = ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) mlog_errno(PTR_ERR(inode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) trace_ocfs2_iget5_locked(inode->i_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) if (inode->i_state & I_NEW) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) rc = ocfs2_read_locked_inode(inode, &args);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) unlock_new_inode(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) if (is_bad_inode(inode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) iput(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) inode = ERR_PTR(rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) * Set transaction id's of transactions that have to be committed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) * to finish f[data]sync. We set them to currently running transaction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) * as we cannot be sure that the inode or some of its metadata isn't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) * part of the transaction - the inode could have been reclaimed and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) * now it is reread from disk.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) if (journal) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) transaction_t *transaction;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) tid_t tid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) struct ocfs2_inode_info *oi = OCFS2_I(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) read_lock(&journal->j_state_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) if (journal->j_running_transaction)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) transaction = journal->j_running_transaction;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) transaction = journal->j_committing_transaction;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) if (transaction)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) tid = transaction->t_tid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) tid = journal->j_commit_sequence;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) read_unlock(&journal->j_state_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) oi->i_sync_tid = tid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) oi->i_datasync_tid = tid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) bail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) if (!IS_ERR(inode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) trace_ocfs2_iget_end(inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) (unsigned long long)OCFS2_I(inode)->ip_blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) return inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) * here's how inodes get read from disk:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) * iget5_locked -> find_actor -> OCFS2_FIND_ACTOR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) * found? : return the in-memory inode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) * not found? : get_new_inode -> OCFS2_INIT_LOCKED_INODE
^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) static int ocfs2_find_actor(struct inode *inode, void *opaque)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) struct ocfs2_find_inode_args *args = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) struct ocfs2_inode_info *oi = OCFS2_I(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) args = opaque;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) mlog_bug_on_msg(!inode, "No inode in find actor!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) trace_ocfs2_find_actor(inode, inode->i_ino, opaque, args->fi_blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) if (oi->ip_blkno != args->fi_blkno)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) ret = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) bail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) * initialize the new inode, but don't do anything that would cause
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) * us to sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) * return 0 on success, 1 on failure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) static int ocfs2_init_locked_inode(struct inode *inode, void *opaque)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) struct ocfs2_find_inode_args *args = opaque;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) static struct lock_class_key ocfs2_quota_ip_alloc_sem_key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) ocfs2_file_ip_alloc_sem_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) inode->i_ino = args->fi_ino;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) OCFS2_I(inode)->ip_blkno = args->fi_blkno;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) if (args->fi_sysfile_type != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) lockdep_set_class(&inode->i_rwsem,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) &ocfs2_sysfile_lock_key[args->fi_sysfile_type]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) if (args->fi_sysfile_type == USER_QUOTA_SYSTEM_INODE ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) args->fi_sysfile_type == GROUP_QUOTA_SYSTEM_INODE ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) args->fi_sysfile_type == LOCAL_USER_QUOTA_SYSTEM_INODE ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) args->fi_sysfile_type == LOCAL_GROUP_QUOTA_SYSTEM_INODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) lockdep_set_class(&OCFS2_I(inode)->ip_alloc_sem,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) &ocfs2_quota_ip_alloc_sem_key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) lockdep_set_class(&OCFS2_I(inode)->ip_alloc_sem,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) &ocfs2_file_ip_alloc_sem_key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) void ocfs2_populate_inode(struct inode *inode, struct ocfs2_dinode *fe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) int create_ino)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) struct super_block *sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) struct ocfs2_super *osb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) int use_plocks = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) sb = inode->i_sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) osb = OCFS2_SB(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) if ((osb->s_mount_opt & OCFS2_MOUNT_LOCALFLOCKS) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) ocfs2_mount_local(osb) || !ocfs2_stack_supports_plocks())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) use_plocks = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) * These have all been checked by ocfs2_read_inode_block() or set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) * by ocfs2_mknod_locked(), so a failure is a code bug.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) BUG_ON(!OCFS2_IS_VALID_DINODE(fe)); /* This means that read_inode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) cannot create a superblock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) inode today. change if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) that is needed. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) BUG_ON(!(fe->i_flags & cpu_to_le32(OCFS2_VALID_FL)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) BUG_ON(le32_to_cpu(fe->i_fs_generation) != osb->fs_generation);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) OCFS2_I(inode)->ip_clusters = le32_to_cpu(fe->i_clusters);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) OCFS2_I(inode)->ip_attr = le32_to_cpu(fe->i_attr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) OCFS2_I(inode)->ip_dyn_features = le16_to_cpu(fe->i_dyn_features);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) inode_set_iversion(inode, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) inode->i_generation = le32_to_cpu(fe->i_generation);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) inode->i_rdev = huge_decode_dev(le64_to_cpu(fe->id1.dev1.i_rdev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) inode->i_mode = le16_to_cpu(fe->i_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) i_uid_write(inode, le32_to_cpu(fe->i_uid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) i_gid_write(inode, le32_to_cpu(fe->i_gid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) /* Fast symlinks will have i_size but no allocated clusters. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) if (S_ISLNK(inode->i_mode) && !fe->i_clusters) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) inode->i_blocks = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) inode->i_mapping->a_ops = &ocfs2_fast_symlink_aops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) inode->i_blocks = ocfs2_inode_sector_count(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) inode->i_mapping->a_ops = &ocfs2_aops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) inode->i_atime.tv_sec = le64_to_cpu(fe->i_atime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) inode->i_atime.tv_nsec = le32_to_cpu(fe->i_atime_nsec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) inode->i_mtime.tv_sec = le64_to_cpu(fe->i_mtime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) inode->i_mtime.tv_nsec = le32_to_cpu(fe->i_mtime_nsec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) inode->i_ctime.tv_sec = le64_to_cpu(fe->i_ctime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) inode->i_ctime.tv_nsec = le32_to_cpu(fe->i_ctime_nsec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) if (OCFS2_I(inode)->ip_blkno != le64_to_cpu(fe->i_blkno))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) mlog(ML_ERROR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) "ip_blkno %llu != i_blkno %llu!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) (unsigned long long)OCFS2_I(inode)->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) (unsigned long long)le64_to_cpu(fe->i_blkno));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) set_nlink(inode, ocfs2_read_links_count(fe));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) trace_ocfs2_populate_inode(OCFS2_I(inode)->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) le32_to_cpu(fe->i_flags));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) if (fe->i_flags & cpu_to_le32(OCFS2_SYSTEM_FL)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) OCFS2_I(inode)->ip_flags |= OCFS2_INODE_SYSTEM_FILE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) inode->i_flags |= S_NOQUOTA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) if (fe->i_flags & cpu_to_le32(OCFS2_LOCAL_ALLOC_FL)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) OCFS2_I(inode)->ip_flags |= OCFS2_INODE_BITMAP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) } else if (fe->i_flags & cpu_to_le32(OCFS2_BITMAP_FL)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) OCFS2_I(inode)->ip_flags |= OCFS2_INODE_BITMAP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) } else if (fe->i_flags & cpu_to_le32(OCFS2_QUOTA_FL)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) inode->i_flags |= S_NOQUOTA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) } else if (fe->i_flags & cpu_to_le32(OCFS2_SUPER_BLOCK_FL)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) /* we can't actually hit this as read_inode can't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) * handle superblocks today ;-) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) BUG();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) switch (inode->i_mode & S_IFMT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) case S_IFREG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) if (use_plocks)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) inode->i_fop = &ocfs2_fops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) inode->i_fop = &ocfs2_fops_no_plocks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) inode->i_op = &ocfs2_file_iops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) i_size_write(inode, le64_to_cpu(fe->i_size));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) case S_IFDIR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) inode->i_op = &ocfs2_dir_iops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) if (use_plocks)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) inode->i_fop = &ocfs2_dops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) inode->i_fop = &ocfs2_dops_no_plocks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) i_size_write(inode, le64_to_cpu(fe->i_size));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) OCFS2_I(inode)->ip_dir_lock_gen = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) case S_IFLNK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) inode->i_op = &ocfs2_symlink_inode_operations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) inode_nohighmem(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) i_size_write(inode, le64_to_cpu(fe->i_size));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) inode->i_op = &ocfs2_special_file_iops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) init_special_inode(inode, inode->i_mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) inode->i_rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) if (create_ino) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) inode->i_ino = ino_from_blkno(inode->i_sb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) le64_to_cpu(fe->i_blkno));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) * If we ever want to create system files from kernel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) * the generation argument to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) * ocfs2_inode_lock_res_init() will have to change.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) BUG_ON(le32_to_cpu(fe->i_flags) & OCFS2_SYSTEM_FL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) ocfs2_inode_lock_res_init(&OCFS2_I(inode)->ip_inode_lockres,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) OCFS2_LOCK_TYPE_META, 0, inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) ocfs2_inode_lock_res_init(&OCFS2_I(inode)->ip_open_lockres,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) OCFS2_LOCK_TYPE_OPEN, 0, inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) ocfs2_inode_lock_res_init(&OCFS2_I(inode)->ip_rw_lockres,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) OCFS2_LOCK_TYPE_RW, inode->i_generation,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) ocfs2_set_inode_flags(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) OCFS2_I(inode)->ip_last_used_slot = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) OCFS2_I(inode)->ip_last_used_group = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) if (S_ISDIR(inode->i_mode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) ocfs2_resv_set_type(&OCFS2_I(inode)->ip_la_data_resv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) OCFS2_RESV_FLAG_DIR);
^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) static int ocfs2_read_locked_inode(struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) struct ocfs2_find_inode_args *args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) struct super_block *sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) struct ocfs2_super *osb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) struct ocfs2_dinode *fe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) struct buffer_head *bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) int status, can_lock, lock_level = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) u32 generation = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) status = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) sb = inode->i_sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) osb = OCFS2_SB(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) * To improve performance of cold-cache inode stats, we take
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) * the cluster lock here if possible.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) * Generally, OCFS2 never trusts the contents of an inode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) * unless it's holding a cluster lock, so taking it here isn't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) * a correctness issue as much as it is a performance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) * improvement.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) * There are three times when taking the lock is not a good idea:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) * 1) During startup, before we have initialized the DLM.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) * 2) If we are reading certain system files which never get
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) * cluster locks (local alloc, truncate log).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) * 3) If the process doing the iget() is responsible for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) * orphan dir recovery. We're holding the orphan dir lock and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) * can get into a deadlock with another process on another
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) * node in ->delete_inode().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) * #1 and #2 can be simply solved by never taking the lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) * here for system files (which are the only type we read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) * during mount). It's a heavier approach, but our main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) * concern is user-accessible files anyway.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) * #3 works itself out because we'll eventually take the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) * cluster lock before trusting anything anyway.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) can_lock = !(args->fi_flags & OCFS2_FI_FLAG_SYSFILE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) && !(args->fi_flags & OCFS2_FI_FLAG_ORPHAN_RECOVERY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) && !ocfs2_mount_local(osb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) trace_ocfs2_read_locked_inode(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) (unsigned long long)OCFS2_I(inode)->ip_blkno, can_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) * To maintain backwards compatibility with older versions of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) * ocfs2-tools, we still store the generation value for system
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) * files. The only ones that actually matter to userspace are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) * the journals, but it's easier and inexpensive to just flag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) * all system files similarly.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) if (args->fi_flags & OCFS2_FI_FLAG_SYSFILE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) generation = osb->fs_generation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) ocfs2_inode_lock_res_init(&OCFS2_I(inode)->ip_inode_lockres,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) OCFS2_LOCK_TYPE_META,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) generation, inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) ocfs2_inode_lock_res_init(&OCFS2_I(inode)->ip_open_lockres,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) OCFS2_LOCK_TYPE_OPEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) 0, inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) if (can_lock) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) status = ocfs2_open_lock(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) make_bad_inode(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) status = ocfs2_inode_lock(inode, NULL, lock_level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) make_bad_inode(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) if (args->fi_flags & OCFS2_FI_FLAG_ORPHAN_RECOVERY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) status = ocfs2_try_open_lock(inode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) make_bad_inode(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) }
^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) if (can_lock) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) if (args->fi_flags & OCFS2_FI_FLAG_FILECHECK_CHK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) status = ocfs2_filecheck_read_inode_block_full(inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) &bh, OCFS2_BH_IGNORE_CACHE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) else if (args->fi_flags & OCFS2_FI_FLAG_FILECHECK_FIX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) status = ocfs2_filecheck_read_inode_block_full(inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) &bh, OCFS2_BH_IGNORE_CACHE, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) status = ocfs2_read_inode_block_full(inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) &bh, OCFS2_BH_IGNORE_CACHE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) status = ocfs2_read_blocks_sync(osb, args->fi_blkno, 1, &bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) * If buffer is in jbd, then its checksum may not have been
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) * computed as yet.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) if (!status && !buffer_jbd(bh)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) if (args->fi_flags & OCFS2_FI_FLAG_FILECHECK_CHK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) status = ocfs2_filecheck_validate_inode_block(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) osb->sb, bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) else if (args->fi_flags & OCFS2_FI_FLAG_FILECHECK_FIX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) status = ocfs2_filecheck_repair_inode_block(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) osb->sb, bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) status = ocfs2_validate_inode_block(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) osb->sb, bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) status = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) fe = (struct ocfs2_dinode *) bh->b_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) * This is a code bug. Right now the caller needs to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) * understand whether it is asking for a system file inode or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) * not so the proper lock names can be built.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) mlog_bug_on_msg(!!(fe->i_flags & cpu_to_le32(OCFS2_SYSTEM_FL)) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) !!(args->fi_flags & OCFS2_FI_FLAG_SYSFILE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) "Inode %llu: system file state is ambiguous\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) (unsigned long long)args->fi_blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) if (S_ISCHR(le16_to_cpu(fe->i_mode)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) S_ISBLK(le16_to_cpu(fe->i_mode)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) inode->i_rdev = huge_decode_dev(le64_to_cpu(fe->id1.dev1.i_rdev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) ocfs2_populate_inode(inode, fe, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) BUG_ON(args->fi_blkno != le64_to_cpu(fe->i_blkno));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) if (buffer_dirty(bh) && !buffer_jbd(bh)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) if (can_lock) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) ocfs2_inode_unlock(inode, lock_level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) lock_level = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) ocfs2_inode_lock(inode, NULL, lock_level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) status = ocfs2_write_block(osb, bh, INODE_CACHE(inode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) bail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) if (can_lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) ocfs2_inode_unlock(inode, lock_level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) if (status < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) make_bad_inode(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) brelse(bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) void ocfs2_sync_blockdev(struct super_block *sb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) sync_blockdev(sb->s_bdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) static int ocfs2_truncate_for_delete(struct ocfs2_super *osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) struct buffer_head *fe_bh)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) int status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) struct ocfs2_dinode *fe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) handle_t *handle = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) fe = (struct ocfs2_dinode *) fe_bh->b_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) * This check will also skip truncate of inodes with inline
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) * data and fast symlinks.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) if (fe->i_clusters) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) if (ocfs2_should_order_data(inode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) ocfs2_begin_ordered_truncate(inode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) handle = ocfs2_start_trans(osb, OCFS2_INODE_UPDATE_CREDITS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) if (IS_ERR(handle)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) status = PTR_ERR(handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) handle = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) goto out;
^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) status = ocfs2_journal_access_di(handle, INODE_CACHE(inode),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) fe_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) OCFS2_JOURNAL_ACCESS_WRITE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) i_size_write(inode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) status = ocfs2_mark_inode_dirty(handle, inode, fe_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) ocfs2_commit_trans(osb, handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) handle = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) status = ocfs2_commit_truncate(osb, inode, fe_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) if (status < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) if (handle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) ocfs2_commit_trans(osb, handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) static int ocfs2_remove_inode(struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) struct buffer_head *di_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) struct inode *orphan_dir_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) struct buffer_head *orphan_dir_bh)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) struct inode *inode_alloc_inode = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) struct buffer_head *inode_alloc_bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) handle_t *handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) struct ocfs2_dinode *di = (struct ocfs2_dinode *) di_bh->b_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) inode_alloc_inode =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) ocfs2_get_system_file_inode(osb, INODE_ALLOC_SYSTEM_INODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) le16_to_cpu(di->i_suballoc_slot));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) if (!inode_alloc_inode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) status = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) inode_lock(inode_alloc_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) status = ocfs2_inode_lock(inode_alloc_inode, &inode_alloc_bh, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) inode_unlock(inode_alloc_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) handle = ocfs2_start_trans(osb, OCFS2_DELETE_INODE_CREDITS +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) ocfs2_quota_trans_credits(inode->i_sb));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) if (IS_ERR(handle)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) status = PTR_ERR(handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) goto bail_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) if (!(OCFS2_I(inode)->ip_flags & OCFS2_INODE_SKIP_ORPHAN_DIR)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) status = ocfs2_orphan_del(osb, handle, orphan_dir_inode, inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) orphan_dir_bh, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) goto bail_commit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) /* set the inodes dtime */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) status = ocfs2_journal_access_di(handle, INODE_CACHE(inode), di_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) OCFS2_JOURNAL_ACCESS_WRITE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) goto bail_commit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) di->i_dtime = cpu_to_le64(ktime_get_real_seconds());
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) di->i_flags &= cpu_to_le32(~(OCFS2_VALID_FL | OCFS2_ORPHANED_FL));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) ocfs2_journal_dirty(handle, di_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) ocfs2_remove_from_cache(INODE_CACHE(inode), di_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) dquot_free_inode(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) status = ocfs2_free_dinode(handle, inode_alloc_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) inode_alloc_bh, di);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) if (status < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) bail_commit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) ocfs2_commit_trans(osb, handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) bail_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) ocfs2_inode_unlock(inode_alloc_inode, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) inode_unlock(inode_alloc_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) brelse(inode_alloc_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) bail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) iput(inode_alloc_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) * Serialize with orphan dir recovery. If the process doing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) * recovery on this orphan dir does an iget() with the dir
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) * i_mutex held, we'll deadlock here. Instead we detect this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) * and exit early - recovery will wipe this inode for us.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) static int ocfs2_check_orphan_recovery_state(struct ocfs2_super *osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) int slot)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) spin_lock(&osb->osb_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) if (ocfs2_node_map_test_bit(osb, &osb->osb_recovering_orphan_dirs, slot)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) ret = -EDEADLK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) /* This signals to the orphan recovery process that it should
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) * wait for us to handle the wipe. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) osb->osb_orphan_wipes[slot]++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) spin_unlock(&osb->osb_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) trace_ocfs2_check_orphan_recovery_state(slot, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) static void ocfs2_signal_wipe_completion(struct ocfs2_super *osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) int slot)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) spin_lock(&osb->osb_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) osb->osb_orphan_wipes[slot]--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) spin_unlock(&osb->osb_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) wake_up(&osb->osb_wipe_event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) static int ocfs2_wipe_inode(struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) struct buffer_head *di_bh)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) int status, orphaned_slot = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) struct inode *orphan_dir_inode = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) struct buffer_head *orphan_dir_bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) struct ocfs2_dinode *di = (struct ocfs2_dinode *) di_bh->b_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) if (!(OCFS2_I(inode)->ip_flags & OCFS2_INODE_SKIP_ORPHAN_DIR)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) orphaned_slot = le16_to_cpu(di->i_orphaned_slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) status = ocfs2_check_orphan_recovery_state(osb, orphaned_slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) orphan_dir_inode = ocfs2_get_system_file_inode(osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) ORPHAN_DIR_SYSTEM_INODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) orphaned_slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) if (!orphan_dir_inode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) status = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) /* Lock the orphan dir. The lock will be held for the entire
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) * delete_inode operation. We do this now to avoid races with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) * recovery completion on other nodes. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) inode_lock(orphan_dir_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) status = ocfs2_inode_lock(orphan_dir_inode, &orphan_dir_bh, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) inode_unlock(orphan_dir_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) /* we do this while holding the orphan dir lock because we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) * don't want recovery being run from another node to try an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) * inode delete underneath us -- this will result in two nodes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) * truncating the same file! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) status = ocfs2_truncate_for_delete(osb, inode, di_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) goto bail_unlock_dir;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) /* Remove any dir index tree */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) if (S_ISDIR(inode->i_mode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) status = ocfs2_dx_dir_truncate(inode, di_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) goto bail_unlock_dir;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) /*Free extended attribute resources associated with this inode.*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) status = ocfs2_xattr_remove(inode, di_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) goto bail_unlock_dir;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) status = ocfs2_remove_refcount_tree(inode, di_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) goto bail_unlock_dir;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) status = ocfs2_remove_inode(inode, di_bh, orphan_dir_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) orphan_dir_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) if (status < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) bail_unlock_dir:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) if (OCFS2_I(inode)->ip_flags & OCFS2_INODE_SKIP_ORPHAN_DIR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) ocfs2_inode_unlock(orphan_dir_inode, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) inode_unlock(orphan_dir_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) brelse(orphan_dir_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) bail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) iput(orphan_dir_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) ocfs2_signal_wipe_completion(osb, orphaned_slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) /* There is a series of simple checks that should be done before a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) * trylock is even considered. Encapsulate those in this function. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) static int ocfs2_inode_is_valid_to_delete(struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) struct ocfs2_inode_info *oi = OCFS2_I(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) trace_ocfs2_inode_is_valid_to_delete(current, osb->dc_task,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) (unsigned long long)oi->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) oi->ip_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) /* We shouldn't be getting here for the root directory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) * inode.. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) if (inode == osb->root_inode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) mlog(ML_ERROR, "Skipping delete of root inode.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) * If we're coming from downconvert_thread we can't go into our own
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) * voting [hello, deadlock city!] so we cannot delete the inode. But
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) * since we dropped last inode ref when downconverting dentry lock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) * we cannot have the file open and thus the node doing unlink will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) * take care of deleting the inode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) if (current == osb->dc_task)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) spin_lock(&oi->ip_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) /* OCFS2 *never* deletes system files. This should technically
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) * never get here as system file inodes should always have a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) * positive link count. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) if (oi->ip_flags & OCFS2_INODE_SYSTEM_FILE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) mlog(ML_ERROR, "Skipping delete of system file %llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) (unsigned long long)oi->ip_blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) goto bail_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) ret = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) bail_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) spin_unlock(&oi->ip_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) bail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) /* Query the cluster to determine whether we should wipe an inode from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) * disk or not.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) * Requires the inode to have the cluster lock. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) static int ocfs2_query_inode_wipe(struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) struct buffer_head *di_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) int *wipe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) int status = 0, reason = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) struct ocfs2_inode_info *oi = OCFS2_I(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) struct ocfs2_dinode *di;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) *wipe = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) trace_ocfs2_query_inode_wipe_begin((unsigned long long)oi->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) inode->i_nlink);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) /* While we were waiting for the cluster lock in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) * ocfs2_delete_inode, another node might have asked to delete
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) * the inode. Recheck our flags to catch this. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) if (!ocfs2_inode_is_valid_to_delete(inode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) reason = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) /* Now that we have an up to date inode, we can double check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) * the link count. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) if (inode->i_nlink)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) /* Do some basic inode verification... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) di = (struct ocfs2_dinode *) di_bh->b_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) if (!(di->i_flags & cpu_to_le32(OCFS2_ORPHANED_FL)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) !(oi->ip_flags & OCFS2_INODE_SKIP_ORPHAN_DIR)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) * Inodes in the orphan dir must have ORPHANED_FL. The only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) * inodes that come back out of the orphan dir are reflink
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) * targets. A reflink target may be moved out of the orphan
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) * dir between the time we scan the directory and the time we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) * process it. This would lead to HAS_REFCOUNT_FL being set but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) * ORPHANED_FL not.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) if (di->i_dyn_features & cpu_to_le16(OCFS2_HAS_REFCOUNT_FL)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) reason = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) /* for lack of a better error? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) status = -EEXIST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) mlog(ML_ERROR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) "Inode %llu (on-disk %llu) not orphaned! "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) "Disk flags 0x%x, inode flags 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) (unsigned long long)oi->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) (unsigned long long)le64_to_cpu(di->i_blkno),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) le32_to_cpu(di->i_flags), oi->ip_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) /* has someone already deleted us?! baaad... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) if (di->i_dtime) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) status = -EEXIST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) * This is how ocfs2 determines whether an inode is still live
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) * within the cluster. Every node takes a shared read lock on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) * the inode open lock in ocfs2_read_locked_inode(). When we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) * get to ->delete_inode(), each node tries to convert it's
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) * lock to an exclusive. Trylocks are serialized by the inode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) * meta data lock. If the upconvert succeeds, we know the inode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) * is no longer live and can be deleted.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) * Though we call this with the meta data lock held, the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) * trylock keeps us from ABBA deadlock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) status = ocfs2_try_open_lock(inode, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) if (status == -EAGAIN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) reason = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) *wipe = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) trace_ocfs2_query_inode_wipe_succ(le16_to_cpu(di->i_orphaned_slot));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) bail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) trace_ocfs2_query_inode_wipe_end(status, reason);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) /* Support function for ocfs2_delete_inode. Will help us keep the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) * inode data in a consistent state for clear_inode. Always truncates
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) * pages, optionally sync's them first. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) static void ocfs2_cleanup_delete_inode(struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) int sync_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) trace_ocfs2_cleanup_delete_inode(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) (unsigned long long)OCFS2_I(inode)->ip_blkno, sync_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) if (sync_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) filemap_write_and_wait(inode->i_mapping);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) truncate_inode_pages_final(&inode->i_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) static void ocfs2_delete_inode(struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) int wipe, status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) sigset_t oldset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) struct buffer_head *di_bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) struct ocfs2_dinode *di = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) trace_ocfs2_delete_inode(inode->i_ino,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) (unsigned long long)OCFS2_I(inode)->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) is_bad_inode(inode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) /* When we fail in read_inode() we mark inode as bad. The second test
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) * catches the case when inode allocation fails before allocating
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) * a block for inode. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) if (is_bad_inode(inode) || !OCFS2_I(inode)->ip_blkno)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) if (!ocfs2_inode_is_valid_to_delete(inode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) /* It's probably not necessary to truncate_inode_pages
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) * here but we do it for safety anyway (it will most
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) * likely be a no-op anyway) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) ocfs2_cleanup_delete_inode(inode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) dquot_initialize(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) /* We want to block signals in delete_inode as the lock and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) * messaging paths may return us -ERESTARTSYS. Which would
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) * cause us to exit early, resulting in inodes being orphaned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) * forever. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) ocfs2_block_signals(&oldset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) * Synchronize us against ocfs2_get_dentry. We take this in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) * shared mode so that all nodes can still concurrently
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) * process deletes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) status = ocfs2_nfs_sync_lock(OCFS2_SB(inode->i_sb), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) mlog(ML_ERROR, "getting nfs sync lock(PR) failed %d\n", status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) ocfs2_cleanup_delete_inode(inode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) goto bail_unblock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) /* Lock down the inode. This gives us an up to date view of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) * it's metadata (for verification), and allows us to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) * serialize delete_inode on multiple nodes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) * Even though we might be doing a truncate, we don't take the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) * allocation lock here as it won't be needed - nobody will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) * have the file open.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) status = ocfs2_inode_lock(inode, &di_bh, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) if (status != -ENOENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) ocfs2_cleanup_delete_inode(inode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) goto bail_unlock_nfs_sync;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) di = (struct ocfs2_dinode *)di_bh->b_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) /* Skip inode deletion and wait for dio orphan entry recovered
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) * first */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) if (unlikely(di->i_flags & cpu_to_le32(OCFS2_DIO_ORPHANED_FL))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) ocfs2_cleanup_delete_inode(inode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) goto bail_unlock_inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) /* Query the cluster. This will be the final decision made
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) * before we go ahead and wipe the inode. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) status = ocfs2_query_inode_wipe(inode, di_bh, &wipe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) if (!wipe || status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) /* Error and remote inode busy both mean we won't be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) * removing the inode, so they take almost the same
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) * path. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) if (status < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) /* Someone in the cluster has disallowed a wipe of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) * this inode, or it was never completely
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) * orphaned. Write out the pages and exit now. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) ocfs2_cleanup_delete_inode(inode, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) goto bail_unlock_inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) ocfs2_cleanup_delete_inode(inode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) status = ocfs2_wipe_inode(inode, di_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) if (status != -EDEADLK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) goto bail_unlock_inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) * Mark the inode as successfully deleted.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) * This is important for ocfs2_clear_inode() as it will check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) * this flag and skip any checkpointing work
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) * ocfs2_stuff_meta_lvb() also uses this flag to invalidate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) * the LVB for other nodes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) OCFS2_I(inode)->ip_flags |= OCFS2_INODE_DELETED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) bail_unlock_inode:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) ocfs2_inode_unlock(inode, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) brelse(di_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) bail_unlock_nfs_sync:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) ocfs2_nfs_sync_unlock(OCFS2_SB(inode->i_sb), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) bail_unblock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) ocfs2_unblock_signals(&oldset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) bail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) static void ocfs2_clear_inode(struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) struct ocfs2_inode_info *oi = OCFS2_I(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) clear_inode(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) trace_ocfs2_clear_inode((unsigned long long)oi->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) inode->i_nlink);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) mlog_bug_on_msg(osb == NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) "Inode=%lu\n", inode->i_ino);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) dquot_drop(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) /* To preven remote deletes we hold open lock before, now it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) * is time to unlock PR and EX open locks. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) ocfs2_open_unlock(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) /* Do these before all the other work so that we don't bounce
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) * the downconvert thread while waiting to destroy the locks. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) ocfs2_mark_lockres_freeing(osb, &oi->ip_rw_lockres);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) ocfs2_mark_lockres_freeing(osb, &oi->ip_inode_lockres);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) ocfs2_mark_lockres_freeing(osb, &oi->ip_open_lockres);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) ocfs2_resv_discard(&osb->osb_la_resmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) &oi->ip_la_data_resv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) ocfs2_resv_init_once(&oi->ip_la_data_resv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) /* We very well may get a clear_inode before all an inodes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) * metadata has hit disk. Of course, we can't drop any cluster
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) * locks until the journal has finished with it. The only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) * exception here are successfully wiped inodes - their
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) * metadata can now be considered to be part of the system
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) * inodes from which it came. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) if (!(oi->ip_flags & OCFS2_INODE_DELETED))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) ocfs2_checkpoint_inode(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) mlog_bug_on_msg(!list_empty(&oi->ip_io_markers),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) "Clear inode of %llu, inode has io markers\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) (unsigned long long)oi->ip_blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) mlog_bug_on_msg(!list_empty(&oi->ip_unwritten_list),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) "Clear inode of %llu, inode has unwritten extents\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) (unsigned long long)oi->ip_blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) ocfs2_extent_map_trunc(inode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) status = ocfs2_drop_inode_locks(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) if (status < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) ocfs2_lock_res_free(&oi->ip_rw_lockres);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) ocfs2_lock_res_free(&oi->ip_inode_lockres);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) ocfs2_lock_res_free(&oi->ip_open_lockres);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) ocfs2_metadata_cache_exit(INODE_CACHE(inode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) mlog_bug_on_msg(INODE_CACHE(inode)->ci_num_cached,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) "Clear inode of %llu, inode has %u cache items\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) (unsigned long long)oi->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) INODE_CACHE(inode)->ci_num_cached);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) mlog_bug_on_msg(!(INODE_CACHE(inode)->ci_flags & OCFS2_CACHE_FL_INLINE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) "Clear inode of %llu, inode has a bad flag\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) (unsigned long long)oi->ip_blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) mlog_bug_on_msg(spin_is_locked(&oi->ip_lock),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) "Clear inode of %llu, inode is locked\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) (unsigned long long)oi->ip_blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) mlog_bug_on_msg(!mutex_trylock(&oi->ip_io_mutex),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) "Clear inode of %llu, io_mutex is locked\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) (unsigned long long)oi->ip_blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) mutex_unlock(&oi->ip_io_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) * down_trylock() returns 0, down_write_trylock() returns 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) * kernel 1, world 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) mlog_bug_on_msg(!down_write_trylock(&oi->ip_alloc_sem),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) "Clear inode of %llu, alloc_sem is locked\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) (unsigned long long)oi->ip_blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) up_write(&oi->ip_alloc_sem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) mlog_bug_on_msg(oi->ip_open_count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) "Clear inode of %llu has open count %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) (unsigned long long)oi->ip_blkno, oi->ip_open_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) /* Clear all other flags. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) oi->ip_flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) oi->ip_dir_start_lookup = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) oi->ip_blkno = 0ULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) * ip_jinode is used to track txns against this inode. We ensure that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) * the journal is flushed before journal shutdown. Thus it is safe to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) * have inodes get cleaned up after journal shutdown.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) jbd2_journal_release_jbd_inode(osb->journal->j_journal,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) &oi->ip_jinode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) void ocfs2_evict_inode(struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) if (!inode->i_nlink ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) (OCFS2_I(inode)->ip_flags & OCFS2_INODE_MAYBE_ORPHANED)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) ocfs2_delete_inode(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) truncate_inode_pages_final(&inode->i_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) ocfs2_clear_inode(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) /* Called under inode_lock, with no more references on the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) * struct inode, so it's safe here to check the flags field
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) * and to manipulate i_nlink without any other locks. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) int ocfs2_drop_inode(struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) struct ocfs2_inode_info *oi = OCFS2_I(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) trace_ocfs2_drop_inode((unsigned long long)oi->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) inode->i_nlink, oi->ip_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) assert_spin_locked(&inode->i_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) inode->i_state |= I_WILL_FREE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) spin_unlock(&inode->i_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) write_inode_now(inode, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) spin_lock(&inode->i_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) WARN_ON(inode->i_state & I_NEW);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) inode->i_state &= ~I_WILL_FREE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) * This is called from our getattr.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) int ocfs2_inode_revalidate(struct dentry *dentry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) struct inode *inode = d_inode(dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) int status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) trace_ocfs2_inode_revalidate(inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) inode ? (unsigned long long)OCFS2_I(inode)->ip_blkno : 0ULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) inode ? (unsigned long long)OCFS2_I(inode)->ip_flags : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) if (!inode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) status = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) spin_lock(&OCFS2_I(inode)->ip_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) if (OCFS2_I(inode)->ip_flags & OCFS2_INODE_DELETED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) spin_unlock(&OCFS2_I(inode)->ip_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) status = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) spin_unlock(&OCFS2_I(inode)->ip_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) /* Let ocfs2_inode_lock do the work of updating our struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) * inode for us. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) status = ocfs2_inode_lock(inode, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) if (status != -ENOENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) ocfs2_inode_unlock(inode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) bail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) * Updates a disk inode from a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) * struct inode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) * Only takes ip_lock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) int ocfs2_mark_inode_dirty(handle_t *handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) struct buffer_head *bh)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) struct ocfs2_dinode *fe = (struct ocfs2_dinode *) bh->b_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) trace_ocfs2_mark_inode_dirty((unsigned long long)OCFS2_I(inode)->ip_blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) status = ocfs2_journal_access_di(handle, INODE_CACHE(inode), bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) OCFS2_JOURNAL_ACCESS_WRITE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) spin_lock(&OCFS2_I(inode)->ip_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) fe->i_clusters = cpu_to_le32(OCFS2_I(inode)->ip_clusters);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) ocfs2_get_inode_flags(OCFS2_I(inode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) fe->i_attr = cpu_to_le32(OCFS2_I(inode)->ip_attr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) fe->i_dyn_features = cpu_to_le16(OCFS2_I(inode)->ip_dyn_features);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) spin_unlock(&OCFS2_I(inode)->ip_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) fe->i_size = cpu_to_le64(i_size_read(inode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) ocfs2_set_links_count(fe, inode->i_nlink);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) fe->i_uid = cpu_to_le32(i_uid_read(inode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) fe->i_gid = cpu_to_le32(i_gid_read(inode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) fe->i_mode = cpu_to_le16(inode->i_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) fe->i_atime = cpu_to_le64(inode->i_atime.tv_sec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) fe->i_atime_nsec = cpu_to_le32(inode->i_atime.tv_nsec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) fe->i_ctime = cpu_to_le64(inode->i_ctime.tv_sec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) fe->i_ctime_nsec = cpu_to_le32(inode->i_ctime.tv_nsec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) fe->i_mtime = cpu_to_le64(inode->i_mtime.tv_sec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) fe->i_mtime_nsec = cpu_to_le32(inode->i_mtime.tv_nsec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) ocfs2_journal_dirty(handle, bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) ocfs2_update_inode_fsync_trans(handle, inode, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) leave:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) * Updates a struct inode from a disk inode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) * does no i/o, only takes ip_lock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) void ocfs2_refresh_inode(struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) struct ocfs2_dinode *fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) spin_lock(&OCFS2_I(inode)->ip_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) OCFS2_I(inode)->ip_clusters = le32_to_cpu(fe->i_clusters);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) OCFS2_I(inode)->ip_attr = le32_to_cpu(fe->i_attr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) OCFS2_I(inode)->ip_dyn_features = le16_to_cpu(fe->i_dyn_features);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) ocfs2_set_inode_flags(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) i_size_write(inode, le64_to_cpu(fe->i_size));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) set_nlink(inode, ocfs2_read_links_count(fe));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) i_uid_write(inode, le32_to_cpu(fe->i_uid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) i_gid_write(inode, le32_to_cpu(fe->i_gid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) inode->i_mode = le16_to_cpu(fe->i_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) if (S_ISLNK(inode->i_mode) && le32_to_cpu(fe->i_clusters) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) inode->i_blocks = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) inode->i_blocks = ocfs2_inode_sector_count(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) inode->i_atime.tv_sec = le64_to_cpu(fe->i_atime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) inode->i_atime.tv_nsec = le32_to_cpu(fe->i_atime_nsec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) inode->i_mtime.tv_sec = le64_to_cpu(fe->i_mtime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) inode->i_mtime.tv_nsec = le32_to_cpu(fe->i_mtime_nsec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) inode->i_ctime.tv_sec = le64_to_cpu(fe->i_ctime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) inode->i_ctime.tv_nsec = le32_to_cpu(fe->i_ctime_nsec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) spin_unlock(&OCFS2_I(inode)->ip_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) int ocfs2_validate_inode_block(struct super_block *sb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) struct buffer_head *bh)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) struct ocfs2_dinode *di = (struct ocfs2_dinode *)bh->b_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) trace_ocfs2_validate_inode_block((unsigned long long)bh->b_blocknr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) BUG_ON(!buffer_uptodate(bh));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) * If the ecc fails, we return the error but otherwise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) * leave the filesystem running. We know any error is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) * local to this block.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) rc = ocfs2_validate_meta_ecc(sb, bh->b_data, &di->i_check);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) mlog(ML_ERROR, "Checksum failed for dinode %llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) (unsigned long long)bh->b_blocknr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) * Errors after here are fatal.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) rc = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) if (!OCFS2_IS_VALID_DINODE(di)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) rc = ocfs2_error(sb, "Invalid dinode #%llu: signature = %.*s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) (unsigned long long)bh->b_blocknr, 7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) di->i_signature);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) if (le64_to_cpu(di->i_blkno) != bh->b_blocknr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) rc = ocfs2_error(sb, "Invalid dinode #%llu: i_blkno is %llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) (unsigned long long)bh->b_blocknr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) (unsigned long long)le64_to_cpu(di->i_blkno));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) if (!(di->i_flags & cpu_to_le32(OCFS2_VALID_FL))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) rc = ocfs2_error(sb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) "Invalid dinode #%llu: OCFS2_VALID_FL not set\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) (unsigned long long)bh->b_blocknr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) if (le32_to_cpu(di->i_fs_generation) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) OCFS2_SB(sb)->fs_generation) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) rc = ocfs2_error(sb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) "Invalid dinode #%llu: fs_generation is %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) (unsigned long long)bh->b_blocknr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) le32_to_cpu(di->i_fs_generation));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) bail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) static int ocfs2_filecheck_validate_inode_block(struct super_block *sb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) struct buffer_head *bh)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) int rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) struct ocfs2_dinode *di = (struct ocfs2_dinode *)bh->b_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) trace_ocfs2_filecheck_validate_inode_block(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) (unsigned long long)bh->b_blocknr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) BUG_ON(!buffer_uptodate(bh));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) * Call ocfs2_validate_meta_ecc() first since it has ecc repair
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) * function, but we should not return error immediately when ecc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) * validation fails, because the reason is quite likely the invalid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) * inode number inputed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) rc = ocfs2_validate_meta_ecc(sb, bh->b_data, &di->i_check);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) mlog(ML_ERROR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) "Filecheck: checksum failed for dinode %llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) (unsigned long long)bh->b_blocknr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) rc = -OCFS2_FILECHECK_ERR_BLOCKECC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) if (!OCFS2_IS_VALID_DINODE(di)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) mlog(ML_ERROR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) "Filecheck: invalid dinode #%llu: signature = %.*s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) (unsigned long long)bh->b_blocknr, 7, di->i_signature);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) rc = -OCFS2_FILECHECK_ERR_INVALIDINO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) } else if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) if (le64_to_cpu(di->i_blkno) != bh->b_blocknr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) mlog(ML_ERROR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) "Filecheck: invalid dinode #%llu: i_blkno is %llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) (unsigned long long)bh->b_blocknr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) (unsigned long long)le64_to_cpu(di->i_blkno));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) rc = -OCFS2_FILECHECK_ERR_BLOCKNO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) if (!(di->i_flags & cpu_to_le32(OCFS2_VALID_FL))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) mlog(ML_ERROR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) "Filecheck: invalid dinode #%llu: OCFS2_VALID_FL "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) "not set\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) (unsigned long long)bh->b_blocknr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) rc = -OCFS2_FILECHECK_ERR_VALIDFLAG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) if (le32_to_cpu(di->i_fs_generation) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) OCFS2_SB(sb)->fs_generation) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) mlog(ML_ERROR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) "Filecheck: invalid dinode #%llu: fs_generation is %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) (unsigned long long)bh->b_blocknr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) le32_to_cpu(di->i_fs_generation));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) rc = -OCFS2_FILECHECK_ERR_GENERATION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) bail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) static int ocfs2_filecheck_repair_inode_block(struct super_block *sb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) struct buffer_head *bh)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) int changed = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) struct ocfs2_dinode *di = (struct ocfs2_dinode *)bh->b_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) if (!ocfs2_filecheck_validate_inode_block(sb, bh))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) trace_ocfs2_filecheck_repair_inode_block(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) (unsigned long long)bh->b_blocknr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) if (ocfs2_is_hard_readonly(OCFS2_SB(sb)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) ocfs2_is_soft_readonly(OCFS2_SB(sb))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) mlog(ML_ERROR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) "Filecheck: cannot repair dinode #%llu "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) "on readonly filesystem\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) (unsigned long long)bh->b_blocknr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) return -OCFS2_FILECHECK_ERR_READONLY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) if (buffer_jbd(bh)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) mlog(ML_ERROR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) "Filecheck: cannot repair dinode #%llu, "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) "its buffer is in jbd\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) (unsigned long long)bh->b_blocknr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) return -OCFS2_FILECHECK_ERR_INJBD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) if (!OCFS2_IS_VALID_DINODE(di)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) /* Cannot fix invalid inode block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) return -OCFS2_FILECHECK_ERR_INVALIDINO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) if (!(di->i_flags & cpu_to_le32(OCFS2_VALID_FL))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) /* Cannot just add VALID_FL flag back as a fix,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) * need more things to check here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) return -OCFS2_FILECHECK_ERR_VALIDFLAG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) if (le64_to_cpu(di->i_blkno) != bh->b_blocknr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) di->i_blkno = cpu_to_le64(bh->b_blocknr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) changed = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) mlog(ML_ERROR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) "Filecheck: reset dinode #%llu: i_blkno to %llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) (unsigned long long)bh->b_blocknr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) (unsigned long long)le64_to_cpu(di->i_blkno));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) if (le32_to_cpu(di->i_fs_generation) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) OCFS2_SB(sb)->fs_generation) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) di->i_fs_generation = cpu_to_le32(OCFS2_SB(sb)->fs_generation);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) changed = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) mlog(ML_ERROR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) "Filecheck: reset dinode #%llu: fs_generation to %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) (unsigned long long)bh->b_blocknr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) le32_to_cpu(di->i_fs_generation));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) if (changed || ocfs2_validate_meta_ecc(sb, bh->b_data, &di->i_check)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) ocfs2_compute_meta_ecc(sb, bh->b_data, &di->i_check);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) mark_buffer_dirty(bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) mlog(ML_ERROR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) "Filecheck: reset dinode #%llu: compute meta ecc\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) (unsigned long long)bh->b_blocknr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) ocfs2_filecheck_read_inode_block_full(struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) struct buffer_head **bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) int flags, int type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) struct buffer_head *tmp = *bh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) if (!type) /* Check inode block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) rc = ocfs2_read_blocks(INODE_CACHE(inode),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) OCFS2_I(inode)->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) 1, &tmp, flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) ocfs2_filecheck_validate_inode_block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) else /* Repair inode block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) rc = ocfs2_read_blocks(INODE_CACHE(inode),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) OCFS2_I(inode)->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) 1, &tmp, flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) ocfs2_filecheck_repair_inode_block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) /* If ocfs2_read_blocks() got us a new bh, pass it up. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) if (!rc && !*bh)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) *bh = tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) int ocfs2_read_inode_block_full(struct inode *inode, struct buffer_head **bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) int flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) struct buffer_head *tmp = *bh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) rc = ocfs2_read_blocks(INODE_CACHE(inode), OCFS2_I(inode)->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) 1, &tmp, flags, ocfs2_validate_inode_block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) /* If ocfs2_read_blocks() got us a new bh, pass it up. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) if (!rc && !*bh)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) *bh = tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) int ocfs2_read_inode_block(struct inode *inode, struct buffer_head **bh)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) return ocfs2_read_inode_block_full(inode, bh, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) static u64 ocfs2_inode_cache_owner(struct ocfs2_caching_info *ci)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) struct ocfs2_inode_info *oi = cache_info_to_inode(ci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) return oi->ip_blkno;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) static struct super_block *ocfs2_inode_cache_get_super(struct ocfs2_caching_info *ci)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) struct ocfs2_inode_info *oi = cache_info_to_inode(ci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) return oi->vfs_inode.i_sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) static void ocfs2_inode_cache_lock(struct ocfs2_caching_info *ci)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) struct ocfs2_inode_info *oi = cache_info_to_inode(ci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) spin_lock(&oi->ip_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) static void ocfs2_inode_cache_unlock(struct ocfs2_caching_info *ci)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) struct ocfs2_inode_info *oi = cache_info_to_inode(ci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) spin_unlock(&oi->ip_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) static void ocfs2_inode_cache_io_lock(struct ocfs2_caching_info *ci)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) struct ocfs2_inode_info *oi = cache_info_to_inode(ci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) mutex_lock(&oi->ip_io_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) static void ocfs2_inode_cache_io_unlock(struct ocfs2_caching_info *ci)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) struct ocfs2_inode_info *oi = cache_info_to_inode(ci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) mutex_unlock(&oi->ip_io_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) const struct ocfs2_caching_operations ocfs2_inode_caching_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) .co_owner = ocfs2_inode_cache_owner,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) .co_get_super = ocfs2_inode_cache_get_super,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) .co_cache_lock = ocfs2_inode_cache_lock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) .co_cache_unlock = ocfs2_inode_cache_unlock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) .co_io_lock = ocfs2_inode_cache_io_lock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) .co_io_unlock = ocfs2_inode_cache_io_unlock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661)