^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) * namei.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Create and rename file, directory, symlinks
^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) * Portions of this code from linux/fs/ext3/dir.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * Copyright (C) 1992, 1993, 1994, 1995
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * Remy Card (card@masi.ibp.fr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * Laboratoire MASI - Institut Blaise pascal
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * Universite Pierre et Marie Curie (Paris VI)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * linux/fs/minix/dir.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) * Copyright (C) 1991, 1992 Linux Torvalds
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <linux/fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include <linux/highmem.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include <linux/quotaops.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include <linux/iversion.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #include <cluster/masklog.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include "ocfs2.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #include "alloc.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #include "dcache.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #include "dir.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #include "dlmglue.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #include "extent_map.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #include "file.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #include "inode.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #include "journal.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #include "namei.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #include "suballoc.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #include "super.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #include "symlink.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #include "sysfile.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #include "uptodate.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #include "xattr.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #include "acl.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #include "ocfs2_trace.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #include "buffer_head_io.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) static int ocfs2_mknod_locked(struct ocfs2_super *osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) struct inode *dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) dev_t dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) struct buffer_head **new_fe_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) struct buffer_head *parent_fe_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) handle_t *handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) struct ocfs2_alloc_context *inode_ac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) static int ocfs2_prepare_orphan_dir(struct ocfs2_super *osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) struct inode **ret_orphan_dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) u64 blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) struct ocfs2_dir_lookup_result *lookup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) bool dio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) static int ocfs2_orphan_add(struct ocfs2_super *osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) handle_t *handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) struct buffer_head *fe_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) struct ocfs2_dir_lookup_result *lookup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) struct inode *orphan_dir_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) bool dio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) static int ocfs2_create_symlink_data(struct ocfs2_super *osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) handle_t *handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) const char *symname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) static int ocfs2_double_lock(struct ocfs2_super *osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) struct buffer_head **bh1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) struct inode *inode1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) struct buffer_head **bh2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) struct inode *inode2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) int rename);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) static void ocfs2_double_unlock(struct inode *inode1, struct inode *inode2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) /* An orphan dir name is an 8 byte value, printed as a hex string */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) #define OCFS2_ORPHAN_NAMELEN ((int)(2 * sizeof(u64)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) static struct dentry *ocfs2_lookup(struct inode *dir, struct dentry *dentry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) unsigned int flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) u64 blkno;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) struct inode *inode = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) struct dentry *ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) struct ocfs2_inode_info *oi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) trace_ocfs2_lookup(dir, dentry, dentry->d_name.len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) (unsigned long long)OCFS2_I(dir)->ip_blkno, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) if (dentry->d_name.len > OCFS2_MAX_FILENAME_LEN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) ret = ERR_PTR(-ENAMETOOLONG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) status = ocfs2_inode_lock_nested(dir, NULL, 0, OI_LS_PARENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) if (status != -ENOENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) ret = ERR_PTR(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) status = ocfs2_lookup_ino_from_name(dir, dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) dentry->d_name.len, &blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) if (status < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) goto bail_add;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) inode = ocfs2_iget(OCFS2_SB(dir->i_sb), blkno, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) if (IS_ERR(inode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) ret = ERR_PTR(-EACCES);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) goto bail_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) oi = OCFS2_I(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) /* Clear any orphaned state... If we were able to look up the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) * inode from a directory, it certainly can't be orphaned. We
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) * might have the bad state from a node which intended to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) * orphan this inode but crashed before it could commit the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) * unlink. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) spin_lock(&oi->ip_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) oi->ip_flags &= ~OCFS2_INODE_MAYBE_ORPHANED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) spin_unlock(&oi->ip_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) bail_add:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) ret = d_splice_alias(inode, dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) if (inode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) * If d_splice_alias() finds a DCACHE_DISCONNECTED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) * dentry, it will d_move() it on top of ourse. The
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) * return value will indicate this however, so in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) * those cases, we switch them around for the locking
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) * code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) * NOTE: This dentry already has ->d_op set from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) * ocfs2_get_parent() and ocfs2_get_dentry()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) if (!IS_ERR_OR_NULL(ret))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) dentry = ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) status = ocfs2_dentry_attach_lock(dentry, inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) OCFS2_I(dir)->ip_blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) ret = ERR_PTR(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) goto bail_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) ocfs2_dentry_attach_gen(dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) bail_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) /* Don't drop the cluster lock until *after* the d_add --
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) * unlink on another node will message us to remove that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) * dentry under this lock so otherwise we can race this with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) * the downconvert thread and have a stale dentry. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) ocfs2_inode_unlock(dir, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) bail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) trace_ocfs2_lookup_ret(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) static struct inode *ocfs2_get_init_inode(struct inode *dir, umode_t mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) struct inode *inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) inode = new_inode(dir->i_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) if (!inode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) mlog(ML_ERROR, "new_inode failed!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) return ERR_PTR(-ENOMEM);
^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) /* populate as many fields early on as possible - many of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) * these are used by the support functions here and in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) * callers. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) if (S_ISDIR(mode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) set_nlink(inode, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) inode_init_owner(inode, dir, mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) status = dquot_initialize(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) return ERR_PTR(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) return inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) static void ocfs2_cleanup_add_entry_failure(struct ocfs2_super *osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) struct dentry *dentry, struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) struct ocfs2_dentry_lock *dl = dentry->d_fsdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) ocfs2_simple_drop_lockres(osb, &dl->dl_lockres);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) ocfs2_lock_res_free(&dl->dl_lockres);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) BUG_ON(dl->dl_count != 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) spin_lock(&dentry_attach_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) dentry->d_fsdata = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) spin_unlock(&dentry_attach_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) kfree(dl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) iput(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) static int ocfs2_mknod(struct inode *dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) struct dentry *dentry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) umode_t mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) dev_t dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) int status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) struct buffer_head *parent_fe_bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) handle_t *handle = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) struct ocfs2_super *osb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) struct ocfs2_dinode *dirfe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) struct buffer_head *new_fe_bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) struct inode *inode = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) struct ocfs2_alloc_context *inode_ac = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) struct ocfs2_alloc_context *data_ac = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) struct ocfs2_alloc_context *meta_ac = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) int want_clusters = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) int want_meta = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) int xattr_credits = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) struct ocfs2_security_xattr_info si = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) .enable = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) int did_quota_inode = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) struct ocfs2_dir_lookup_result lookup = { NULL, };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) sigset_t oldset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) int did_block_signals = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) struct ocfs2_dentry_lock *dl = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) trace_ocfs2_mknod(dir, dentry, dentry->d_name.len, dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) (unsigned long long)OCFS2_I(dir)->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) (unsigned long)dev, mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) status = dquot_initialize(dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) /* get our super block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) osb = OCFS2_SB(dir->i_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) status = ocfs2_inode_lock(dir, &parent_fe_bh, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) if (status != -ENOENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) if (S_ISDIR(mode) && (dir->i_nlink >= ocfs2_link_max(osb))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) status = -EMLINK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) dirfe = (struct ocfs2_dinode *) parent_fe_bh->b_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) if (!ocfs2_read_links_count(dirfe)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) /* can't make a file in a deleted directory. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) status = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) status = ocfs2_check_dir_for_entry(dir, dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) dentry->d_name.len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) /* get a spot inside the dir. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) status = ocfs2_prepare_dir_for_insert(osb, dir, parent_fe_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) dentry->d_name.len, &lookup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) /* reserve an inode spot */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) status = ocfs2_reserve_new_inode(osb, &inode_ac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) if (status != -ENOSPC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) inode = ocfs2_get_init_inode(dir, mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) if (IS_ERR(inode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) status = PTR_ERR(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) inode = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) /* get security xattr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) status = ocfs2_init_security_get(inode, dir, &dentry->d_name, &si);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) if (status == -EOPNOTSUPP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) si.enable = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) /* calculate meta data/clusters for setting security and acl xattr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) status = ocfs2_calc_xattr_init(dir, parent_fe_bh, mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) &si, &want_clusters,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) &xattr_credits, &want_meta);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) /* Reserve a cluster if creating an extent based directory. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) if (S_ISDIR(mode) && !ocfs2_supports_inline_data(osb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) want_clusters += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) /* Dir indexing requires extra space as well */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) if (ocfs2_supports_indexed_dirs(osb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) want_meta++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) status = ocfs2_reserve_new_metadata_blocks(osb, want_meta, &meta_ac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) if (status != -ENOSPC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) status = ocfs2_reserve_clusters(osb, want_clusters, &data_ac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) if (status != -ENOSPC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) handle = ocfs2_start_trans(osb, ocfs2_mknod_credits(osb->sb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) S_ISDIR(mode),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) xattr_credits));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) if (IS_ERR(handle)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) status = PTR_ERR(handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) handle = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) /* Starting to change things, restart is no longer possible. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) ocfs2_block_signals(&oldset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) did_block_signals = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) status = dquot_alloc_inode(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) did_quota_inode = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) /* do the real work now. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) status = ocfs2_mknod_locked(osb, dir, inode, dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) &new_fe_bh, parent_fe_bh, handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) inode_ac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) if (S_ISDIR(mode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) status = ocfs2_fill_new_dir(osb, handle, dir, inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) new_fe_bh, data_ac, meta_ac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) status = ocfs2_journal_access_di(handle, INODE_CACHE(dir),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) parent_fe_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) OCFS2_JOURNAL_ACCESS_WRITE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) ocfs2_add_links_count(dirfe, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) ocfs2_journal_dirty(handle, parent_fe_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) inc_nlink(dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) status = ocfs2_init_acl(handle, inode, dir, new_fe_bh, parent_fe_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) meta_ac, data_ac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) goto roll_back;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) if (si.enable) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) status = ocfs2_init_security_set(handle, inode, new_fe_bh, &si,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) meta_ac, data_ac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) goto roll_back;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) * Do this before adding the entry to the directory. We add
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) * also set d_op after success so that ->d_iput() will cleanup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) * the dentry lock even if ocfs2_add_entry() fails below.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) status = ocfs2_dentry_attach_lock(dentry, inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) OCFS2_I(dir)->ip_blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) goto roll_back;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) dl = dentry->d_fsdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) status = ocfs2_add_entry(handle, dentry, inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) OCFS2_I(inode)->ip_blkno, parent_fe_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) &lookup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) goto roll_back;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) insert_inode_hash(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) d_instantiate(dentry, inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) roll_back:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) if (status < 0 && S_ISDIR(mode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) ocfs2_add_links_count(dirfe, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) drop_nlink(dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) leave:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) if (status < 0 && did_quota_inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) dquot_free_inode(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) if (handle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) ocfs2_commit_trans(osb, handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) ocfs2_inode_unlock(dir, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) if (did_block_signals)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) ocfs2_unblock_signals(&oldset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) brelse(new_fe_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) brelse(parent_fe_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) kfree(si.value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) ocfs2_free_dir_lookup_result(&lookup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) if (inode_ac)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) ocfs2_free_alloc_context(inode_ac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) if (data_ac)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) ocfs2_free_alloc_context(data_ac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) if (meta_ac)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) ocfs2_free_alloc_context(meta_ac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) * We should call iput after the i_mutex of the bitmap been
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) * unlocked in ocfs2_free_alloc_context, or the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) * ocfs2_delete_inode will mutex_lock again.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) if ((status < 0) && inode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) if (dl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) ocfs2_cleanup_add_entry_failure(osb, dentry, inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) OCFS2_I(inode)->ip_flags |= OCFS2_INODE_SKIP_ORPHAN_DIR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) clear_nlink(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) iput(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) static int __ocfs2_mknod_locked(struct inode *dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) dev_t dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) struct buffer_head **new_fe_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) struct buffer_head *parent_fe_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) handle_t *handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) struct ocfs2_alloc_context *inode_ac,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) u64 fe_blkno, u64 suballoc_loc, u16 suballoc_bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) int status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) struct ocfs2_super *osb = OCFS2_SB(dir->i_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) struct ocfs2_dinode *fe = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) struct ocfs2_extent_list *fel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) u16 feat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) struct ocfs2_inode_info *oi = OCFS2_I(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) struct timespec64 ts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) *new_fe_bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) /* populate as many fields early on as possible - many of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) * these are used by the support functions here and in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) * callers. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) inode->i_ino = ino_from_blkno(osb->sb, fe_blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) oi->ip_blkno = fe_blkno;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) spin_lock(&osb->osb_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) inode->i_generation = osb->s_next_generation++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) spin_unlock(&osb->osb_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) *new_fe_bh = sb_getblk(osb->sb, fe_blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) if (!*new_fe_bh) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) status = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) ocfs2_set_new_buffer_uptodate(INODE_CACHE(inode), *new_fe_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) status = ocfs2_journal_access_di(handle, INODE_CACHE(inode),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) *new_fe_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) OCFS2_JOURNAL_ACCESS_CREATE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) fe = (struct ocfs2_dinode *) (*new_fe_bh)->b_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) memset(fe, 0, osb->sb->s_blocksize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) fe->i_generation = cpu_to_le32(inode->i_generation);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) fe->i_fs_generation = cpu_to_le32(osb->fs_generation);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) fe->i_blkno = cpu_to_le64(fe_blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) fe->i_suballoc_loc = cpu_to_le64(suballoc_loc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) fe->i_suballoc_bit = cpu_to_le16(suballoc_bit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) fe->i_suballoc_slot = cpu_to_le16(inode_ac->ac_alloc_slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) fe->i_uid = cpu_to_le32(i_uid_read(inode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) fe->i_gid = cpu_to_le32(i_gid_read(inode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) fe->i_mode = cpu_to_le16(inode->i_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) fe->id1.dev1.i_rdev = cpu_to_le64(huge_encode_dev(dev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) ocfs2_set_links_count(fe, inode->i_nlink);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) fe->i_last_eb_blk = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) strcpy(fe->i_signature, OCFS2_INODE_SIGNATURE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) fe->i_flags |= cpu_to_le32(OCFS2_VALID_FL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) ktime_get_real_ts64(&ts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) fe->i_atime = fe->i_ctime = fe->i_mtime =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) cpu_to_le64(ts.tv_sec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) fe->i_mtime_nsec = fe->i_ctime_nsec = fe->i_atime_nsec =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) cpu_to_le32(ts.tv_nsec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) fe->i_dtime = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) * If supported, directories start with inline data. If inline
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) * isn't supported, but indexing is, we start them as indexed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) feat = le16_to_cpu(fe->i_dyn_features);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) if (S_ISDIR(inode->i_mode) && ocfs2_supports_inline_data(osb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) fe->i_dyn_features = cpu_to_le16(feat | OCFS2_INLINE_DATA_FL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) fe->id2.i_data.id_count = cpu_to_le16(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) ocfs2_max_inline_data_with_xattr(osb->sb, fe));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) fel = &fe->id2.i_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) fel->l_tree_depth = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) fel->l_next_free_rec = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) fel->l_count = cpu_to_le16(ocfs2_extent_recs_per_inode(osb->sb));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) ocfs2_journal_dirty(handle, *new_fe_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) ocfs2_populate_inode(inode, fe, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) ocfs2_ci_set_new(osb, INODE_CACHE(inode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) if (!ocfs2_mount_local(osb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) status = ocfs2_create_new_inode_locks(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) if (status < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) ocfs2_update_inode_fsync_trans(handle, inode, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) leave:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) if (*new_fe_bh) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) brelse(*new_fe_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) *new_fe_bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) }
^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) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) static int ocfs2_mknod_locked(struct ocfs2_super *osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) struct inode *dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) dev_t dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) struct buffer_head **new_fe_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) struct buffer_head *parent_fe_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) handle_t *handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) struct ocfs2_alloc_context *inode_ac)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) int status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) u64 suballoc_loc, fe_blkno = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) u16 suballoc_bit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) *new_fe_bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) status = ocfs2_claim_new_inode(handle, dir, parent_fe_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) inode_ac, &suballoc_loc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) &suballoc_bit, &fe_blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) status = __ocfs2_mknod_locked(dir, inode, dev, new_fe_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) parent_fe_bh, handle, inode_ac,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) fe_blkno, suballoc_loc, suballoc_bit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) u64 bg_blkno = ocfs2_which_suballoc_group(fe_blkno, suballoc_bit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) int tmp = ocfs2_free_suballoc_bits(handle, inode_ac->ac_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) inode_ac->ac_bh, suballoc_bit, bg_blkno, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) if (tmp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) mlog_errno(tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) static int ocfs2_mkdir(struct inode *dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) struct dentry *dentry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) umode_t mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) trace_ocfs2_mkdir(dir, dentry, dentry->d_name.len, dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) OCFS2_I(dir)->ip_blkno, mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) ret = ocfs2_mknod(dir, dentry, mode | S_IFDIR, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) mlog_errno(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) static int ocfs2_create(struct inode *dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) struct dentry *dentry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) umode_t mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) bool excl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) trace_ocfs2_create(dir, dentry, dentry->d_name.len, dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) (unsigned long long)OCFS2_I(dir)->ip_blkno, mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) ret = ocfs2_mknod(dir, dentry, mode | S_IFREG, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) mlog_errno(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) static int ocfs2_link(struct dentry *old_dentry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) struct inode *dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) struct dentry *dentry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) handle_t *handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) struct inode *inode = d_inode(old_dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) struct inode *old_dir = d_inode(old_dentry->d_parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) struct buffer_head *fe_bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) struct buffer_head *old_dir_bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) struct buffer_head *parent_fe_bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) struct ocfs2_dinode *fe = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) struct ocfs2_super *osb = OCFS2_SB(dir->i_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) struct ocfs2_dir_lookup_result lookup = { NULL, };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) sigset_t oldset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) u64 old_de_ino;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) trace_ocfs2_link((unsigned long long)OCFS2_I(inode)->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) old_dentry->d_name.len, old_dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) dentry->d_name.len, dentry->d_name.name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) if (S_ISDIR(inode->i_mode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) err = dquot_initialize(dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) mlog_errno(err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) err = ocfs2_double_lock(osb, &old_dir_bh, old_dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) &parent_fe_bh, dir, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) if (err != -ENOENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) mlog_errno(err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) /* make sure both dirs have bhs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) * get an extra ref on old_dir_bh if old==new */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) if (!parent_fe_bh) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) if (old_dir_bh) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) parent_fe_bh = old_dir_bh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) get_bh(parent_fe_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) mlog(ML_ERROR, "%s: no old_dir_bh!\n", osb->uuid_str);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) err = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) if (!dir->i_nlink) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) err = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) err = ocfs2_lookup_ino_from_name(old_dir, old_dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) old_dentry->d_name.len, &old_de_ino);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) err = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) * Check whether another node removed the source inode while we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) * were in the vfs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) if (old_de_ino != OCFS2_I(inode)->ip_blkno) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) err = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) err = ocfs2_check_dir_for_entry(dir, dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) dentry->d_name.len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) err = ocfs2_prepare_dir_for_insert(osb, dir, parent_fe_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) dentry->d_name.len, &lookup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) mlog_errno(err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) err = ocfs2_inode_lock(inode, &fe_bh, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) if (err != -ENOENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) mlog_errno(err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) fe = (struct ocfs2_dinode *) fe_bh->b_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) if (ocfs2_read_links_count(fe) >= ocfs2_link_max(osb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) err = -EMLINK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) goto out_unlock_inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) handle = ocfs2_start_trans(osb, ocfs2_link_credits(osb->sb));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) if (IS_ERR(handle)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) err = PTR_ERR(handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) handle = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) mlog_errno(err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) goto out_unlock_inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) /* Starting to change things, restart is no longer possible. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) ocfs2_block_signals(&oldset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) err = ocfs2_journal_access_di(handle, INODE_CACHE(inode), fe_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) OCFS2_JOURNAL_ACCESS_WRITE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) mlog_errno(err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) goto out_commit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) inc_nlink(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) inode->i_ctime = current_time(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) ocfs2_set_links_count(fe, inode->i_nlink);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) fe->i_ctime = cpu_to_le64(inode->i_ctime.tv_sec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) fe->i_ctime_nsec = cpu_to_le32(inode->i_ctime.tv_nsec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) ocfs2_journal_dirty(handle, fe_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) err = ocfs2_add_entry(handle, dentry, inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) OCFS2_I(inode)->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) parent_fe_bh, &lookup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) ocfs2_add_links_count(fe, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) drop_nlink(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) mlog_errno(err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) goto out_commit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) err = ocfs2_dentry_attach_lock(dentry, inode, OCFS2_I(dir)->ip_blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) mlog_errno(err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) goto out_commit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) ihold(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) d_instantiate(dentry, inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) out_commit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) ocfs2_commit_trans(osb, handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) ocfs2_unblock_signals(&oldset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) out_unlock_inode:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) ocfs2_inode_unlock(inode, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) ocfs2_double_unlock(old_dir, dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) brelse(fe_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) brelse(parent_fe_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) brelse(old_dir_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) ocfs2_free_dir_lookup_result(&lookup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) mlog_errno(err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) * Takes and drops an exclusive lock on the given dentry. This will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) * force other nodes to drop it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) static int ocfs2_remote_dentry_delete(struct dentry *dentry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) ret = ocfs2_dentry_lock(dentry, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) mlog_errno(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) ocfs2_dentry_unlock(dentry, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) return ret;
^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) static inline int ocfs2_inode_is_unlinkable(struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) if (S_ISDIR(inode->i_mode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) if (inode->i_nlink == 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) if (inode->i_nlink == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) static int ocfs2_unlink(struct inode *dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) struct dentry *dentry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) int child_locked = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) bool is_unlinkable = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) struct inode *inode = d_inode(dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) struct inode *orphan_dir = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) struct ocfs2_super *osb = OCFS2_SB(dir->i_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) u64 blkno;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) struct ocfs2_dinode *fe = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) struct buffer_head *fe_bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) struct buffer_head *parent_node_bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) handle_t *handle = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) char orphan_name[OCFS2_ORPHAN_NAMELEN + 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) struct ocfs2_dir_lookup_result lookup = { NULL, };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) struct ocfs2_dir_lookup_result orphan_insert = { NULL, };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) trace_ocfs2_unlink(dir, dentry, dentry->d_name.len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) (unsigned long long)OCFS2_I(dir)->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) (unsigned long long)OCFS2_I(inode)->ip_blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) status = dquot_initialize(dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) BUG_ON(d_inode(dentry->d_parent) != dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) if (inode == osb->root_inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) status = ocfs2_inode_lock_nested(dir, &parent_node_bh, 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) OI_LS_PARENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) if (status != -ENOENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) status = ocfs2_find_files_on_disk(dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) dentry->d_name.len, &blkno, dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) &lookup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) if (status != -ENOENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) if (OCFS2_I(inode)->ip_blkno != blkno) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) status = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) trace_ocfs2_unlink_noent(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) (unsigned long long)OCFS2_I(inode)->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) (unsigned long long)blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) OCFS2_I(inode)->ip_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) status = ocfs2_inode_lock(inode, &fe_bh, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) if (status != -ENOENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) child_locked = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) if (S_ISDIR(inode->i_mode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) if (inode->i_nlink != 2 || !ocfs2_empty_dir(inode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) status = -ENOTEMPTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) status = ocfs2_remote_dentry_delete(dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) /* This remote delete should succeed under all normal
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) * circumstances. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) if (ocfs2_inode_is_unlinkable(inode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) status = ocfs2_prepare_orphan_dir(osb, &orphan_dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) OCFS2_I(inode)->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) orphan_name, &orphan_insert,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) is_unlinkable = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) handle = ocfs2_start_trans(osb, ocfs2_unlink_credits(osb->sb));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) if (IS_ERR(handle)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) status = PTR_ERR(handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) handle = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) status = ocfs2_journal_access_di(handle, INODE_CACHE(inode), fe_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) OCFS2_JOURNAL_ACCESS_WRITE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) fe = (struct ocfs2_dinode *) fe_bh->b_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) /* delete the name from the parent dir */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) status = ocfs2_delete_entry(handle, dir, &lookup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) if (S_ISDIR(inode->i_mode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) drop_nlink(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) drop_nlink(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) ocfs2_set_links_count(fe, inode->i_nlink);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) ocfs2_journal_dirty(handle, fe_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) dir->i_ctime = dir->i_mtime = current_time(dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) if (S_ISDIR(inode->i_mode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) drop_nlink(dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) status = ocfs2_mark_inode_dirty(handle, dir, parent_node_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) if (S_ISDIR(inode->i_mode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) inc_nlink(dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) if (is_unlinkable) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) status = ocfs2_orphan_add(osb, handle, inode, fe_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) orphan_name, &orphan_insert, orphan_dir, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) if (status < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) leave:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) if (handle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) ocfs2_commit_trans(osb, handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) if (orphan_dir) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) /* This was locked for us in ocfs2_prepare_orphan_dir() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) ocfs2_inode_unlock(orphan_dir, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) inode_unlock(orphan_dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) iput(orphan_dir);
^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) if (child_locked)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) ocfs2_inode_unlock(inode, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) ocfs2_inode_unlock(dir, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) brelse(fe_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) brelse(parent_node_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) ocfs2_free_dir_lookup_result(&orphan_insert);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) ocfs2_free_dir_lookup_result(&lookup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) if (status && (status != -ENOTEMPTY) && (status != -ENOENT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) static int ocfs2_check_if_ancestor(struct ocfs2_super *osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) u64 src_inode_no, u64 dest_inode_no)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) int ret = 0, i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) u64 parent_inode_no = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) u64 child_inode_no = src_inode_no;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) struct inode *child_inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) #define MAX_LOOKUP_TIMES 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) child_inode = ocfs2_iget(osb, child_inode_no, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) if (IS_ERR(child_inode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) ret = PTR_ERR(child_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) ret = ocfs2_inode_lock(child_inode, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) iput(child_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) if (ret != -ENOENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) mlog_errno(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) ret = ocfs2_lookup_ino_from_name(child_inode, "..", 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) &parent_inode_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) ocfs2_inode_unlock(child_inode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) iput(child_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) ret = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) if (parent_inode_no == dest_inode_no) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) ret = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) if (parent_inode_no == osb->root_inode->i_ino) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) break;
^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) child_inode_no = parent_inode_no;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) if (++i >= MAX_LOOKUP_TIMES) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) mlog(ML_NOTICE, "max lookup times reached, filesystem "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) "may have nested directories, "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) "src inode: %llu, dest inode: %llu.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) (unsigned long long)src_inode_no,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) (unsigned long long)dest_inode_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) * The only place this should be used is rename and link!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) * if they have the same id, then the 1st one is the only one locked.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) static int ocfs2_double_lock(struct ocfs2_super *osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) struct buffer_head **bh1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) struct inode *inode1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) struct buffer_head **bh2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) struct inode *inode2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) int rename)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) int inode1_is_ancestor, inode2_is_ancestor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) struct ocfs2_inode_info *oi1 = OCFS2_I(inode1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) struct ocfs2_inode_info *oi2 = OCFS2_I(inode2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) trace_ocfs2_double_lock((unsigned long long)oi1->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) (unsigned long long)oi2->ip_blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) if (*bh1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) *bh1 = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) if (*bh2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) *bh2 = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) /* we always want to lock the one with the lower lockid first.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) * and if they are nested, we lock ancestor first */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) if (oi1->ip_blkno != oi2->ip_blkno) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) inode1_is_ancestor = ocfs2_check_if_ancestor(osb, oi2->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) oi1->ip_blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) if (inode1_is_ancestor < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) status = inode1_is_ancestor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) inode2_is_ancestor = ocfs2_check_if_ancestor(osb, oi1->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) oi2->ip_blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) if (inode2_is_ancestor < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) status = inode2_is_ancestor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) if ((inode1_is_ancestor == 1) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) (oi1->ip_blkno < oi2->ip_blkno &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) inode2_is_ancestor == 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) /* switch id1 and id2 around */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) swap(bh2, bh1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) swap(inode2, inode1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) /* lock id2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) status = ocfs2_inode_lock_nested(inode2, bh2, 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) rename == 1 ? OI_LS_RENAME1 : OI_LS_PARENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) if (status != -ENOENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) /* lock id1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) status = ocfs2_inode_lock_nested(inode1, bh1, 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) rename == 1 ? OI_LS_RENAME2 : OI_LS_PARENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) * An error return must mean that no cluster locks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) * were held on function exit.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) if (oi1->ip_blkno != oi2->ip_blkno) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) ocfs2_inode_unlock(inode2, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) brelse(*bh2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) *bh2 = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) if (status != -ENOENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) trace_ocfs2_double_lock_end(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) (unsigned long long)oi1->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) (unsigned long long)oi2->ip_blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) bail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) static void ocfs2_double_unlock(struct inode *inode1, struct inode *inode2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) ocfs2_inode_unlock(inode1, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) if (inode1 != inode2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) ocfs2_inode_unlock(inode2, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) static int ocfs2_rename(struct inode *old_dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) struct dentry *old_dentry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) struct inode *new_dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) struct dentry *new_dentry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) unsigned int flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) int status = 0, rename_lock = 0, parents_locked = 0, target_exists = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) int old_child_locked = 0, new_child_locked = 0, update_dot_dot = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) struct inode *old_inode = d_inode(old_dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) struct inode *new_inode = d_inode(new_dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) struct inode *orphan_dir = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) struct ocfs2_dinode *newfe = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) char orphan_name[OCFS2_ORPHAN_NAMELEN + 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) struct buffer_head *newfe_bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) struct buffer_head *old_inode_bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) struct ocfs2_super *osb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) u64 newfe_blkno, old_de_ino;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) handle_t *handle = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) struct buffer_head *old_dir_bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) struct buffer_head *new_dir_bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) u32 old_dir_nlink = old_dir->i_nlink;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) struct ocfs2_dinode *old_di;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) struct ocfs2_dir_lookup_result old_inode_dot_dot_res = { NULL, };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) struct ocfs2_dir_lookup_result target_lookup_res = { NULL, };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) struct ocfs2_dir_lookup_result old_entry_lookup = { NULL, };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) struct ocfs2_dir_lookup_result orphan_insert = { NULL, };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) struct ocfs2_dir_lookup_result target_insert = { NULL, };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) bool should_add_orphan = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) if (flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) /* At some point it might be nice to break this function up a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) * bit. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) trace_ocfs2_rename(old_dir, old_dentry, new_dir, new_dentry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) old_dentry->d_name.len, old_dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) new_dentry->d_name.len, new_dentry->d_name.name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) status = dquot_initialize(old_dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) status = dquot_initialize(new_dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) osb = OCFS2_SB(old_dir->i_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) if (new_inode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) if (!igrab(new_inode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) BUG();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) /* Assume a directory hierarchy thusly:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) * a/b/c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) * a/d
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) * a,b,c, and d are all directories.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) * from cwd of 'a' on both nodes:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) * node1: mv b/c d
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) * node2: mv d b/c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) * And that's why, just like the VFS, we need a file system
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) * rename lock. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) if (old_dir != new_dir && S_ISDIR(old_inode->i_mode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) status = ocfs2_rename_lock(osb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) rename_lock = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) /* here we cannot guarantee the inodes haven't just been
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) * changed, so check if they are nested again */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) status = ocfs2_check_if_ancestor(osb, new_dir->i_ino,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) old_inode->i_ino);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) } else if (status == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) status = -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) trace_ocfs2_rename_not_permitted(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) (unsigned long long)old_inode->i_ino,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) (unsigned long long)new_dir->i_ino);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) /* if old and new are the same, this'll just do one lock. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) status = ocfs2_double_lock(osb, &old_dir_bh, old_dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) &new_dir_bh, new_dir, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) parents_locked = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) if (!new_dir->i_nlink) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) status = -EACCES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) /* make sure both dirs have bhs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) * get an extra ref on old_dir_bh if old==new */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) if (!new_dir_bh) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) if (old_dir_bh) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) new_dir_bh = old_dir_bh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) get_bh(new_dir_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) mlog(ML_ERROR, "no old_dir_bh!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) status = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) * Aside from allowing a meta data update, the locking here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) * also ensures that the downconvert thread on other nodes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) * won't have to concurrently downconvert the inode and the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) * dentry locks.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) status = ocfs2_inode_lock_nested(old_inode, &old_inode_bh, 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) OI_LS_PARENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) if (status != -ENOENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) old_child_locked = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) status = ocfs2_remote_dentry_delete(old_dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) if (S_ISDIR(old_inode->i_mode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) u64 old_inode_parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) update_dot_dot = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) status = ocfs2_find_files_on_disk("..", 2, &old_inode_parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) old_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) &old_inode_dot_dot_res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) status = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) if (old_inode_parent != OCFS2_I(old_dir)->ip_blkno) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) status = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) if (!new_inode && new_dir != old_dir &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) new_dir->i_nlink >= ocfs2_link_max(osb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) status = -EMLINK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) status = ocfs2_lookup_ino_from_name(old_dir, old_dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) old_dentry->d_name.len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) &old_de_ino);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) status = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) * Check for inode number is _not_ due to possible IO errors.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) * We might rmdir the source, keep it as pwd of some process
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) * and merrily kill the link to whatever was created under the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) * same name. Goodbye sticky bit ;-<
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) if (old_de_ino != OCFS2_I(old_inode)->ip_blkno) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) status = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) /* check if the target already exists (in which case we need
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) * to delete it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) status = ocfs2_find_files_on_disk(new_dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) new_dentry->d_name.len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) &newfe_blkno, new_dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) &target_lookup_res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) /* The only error we allow here is -ENOENT because the new
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) * file not existing is perfectly valid. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) if ((status < 0) && (status != -ENOENT)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) /* If we cannot find the file specified we should just */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) /* return the error... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) if (status == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) target_exists = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) if (!target_exists && new_inode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) * Target was unlinked by another node while we were
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) * waiting to get to ocfs2_rename(). There isn't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) * anything we can do here to help the situation, so
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) * bubble up the appropriate error.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) status = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) /* In case we need to overwrite an existing file, we blow it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) * away first */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) if (target_exists) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) /* VFS didn't think there existed an inode here, but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) * someone else in the cluster must have raced our
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) * rename to create one. Today we error cleanly, in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) * the future we should consider calling iget to build
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) * a new struct inode for this entry. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) if (!new_inode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) status = -EACCES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) trace_ocfs2_rename_target_exists(new_dentry->d_name.len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) new_dentry->d_name.name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) if (OCFS2_I(new_inode)->ip_blkno != newfe_blkno) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) status = -EACCES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) trace_ocfs2_rename_disagree(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) (unsigned long long)OCFS2_I(new_inode)->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) (unsigned long long)newfe_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) OCFS2_I(new_inode)->ip_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) status = ocfs2_inode_lock(new_inode, &newfe_bh, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) if (status != -ENOENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) new_child_locked = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) status = ocfs2_remote_dentry_delete(new_dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) newfe = (struct ocfs2_dinode *) newfe_bh->b_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) trace_ocfs2_rename_over_existing(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) (unsigned long long)newfe_blkno, newfe_bh, newfe_bh ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) (unsigned long long)newfe_bh->b_blocknr : 0ULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) if (S_ISDIR(new_inode->i_mode) || (new_inode->i_nlink == 1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) status = ocfs2_prepare_orphan_dir(osb, &orphan_dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) OCFS2_I(new_inode)->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) orphan_name, &orphan_insert,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) should_add_orphan = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) BUG_ON(d_inode(new_dentry->d_parent) != new_dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) status = ocfs2_check_dir_for_entry(new_dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) new_dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) new_dentry->d_name.len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) status = ocfs2_prepare_dir_for_insert(osb, new_dir, new_dir_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) new_dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) new_dentry->d_name.len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) &target_insert);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) handle = ocfs2_start_trans(osb, ocfs2_rename_credits(osb->sb));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) if (IS_ERR(handle)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) status = PTR_ERR(handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) handle = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) if (target_exists) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) if (S_ISDIR(new_inode->i_mode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) if (new_inode->i_nlink != 2 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) !ocfs2_empty_dir(new_inode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) status = -ENOTEMPTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) status = ocfs2_journal_access_di(handle, INODE_CACHE(new_inode),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) newfe_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) OCFS2_JOURNAL_ACCESS_WRITE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) /* change the dirent to point to the correct inode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) status = ocfs2_update_entry(new_dir, handle, &target_lookup_res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) old_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) inode_inc_iversion(new_dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) if (S_ISDIR(new_inode->i_mode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) ocfs2_set_links_count(newfe, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) ocfs2_add_links_count(newfe, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) ocfs2_journal_dirty(handle, newfe_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) if (should_add_orphan) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) status = ocfs2_orphan_add(osb, handle, new_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) newfe_bh, orphan_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) &orphan_insert, orphan_dir, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) /* if the name was not found in new_dir, add it now */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) status = ocfs2_add_entry(handle, new_dentry, old_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) OCFS2_I(old_inode)->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) new_dir_bh, &target_insert);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) old_inode->i_ctime = current_time(old_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) mark_inode_dirty(old_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) status = ocfs2_journal_access_di(handle, INODE_CACHE(old_inode),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) old_inode_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) OCFS2_JOURNAL_ACCESS_WRITE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) if (status >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) old_di = (struct ocfs2_dinode *) old_inode_bh->b_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) old_di->i_ctime = cpu_to_le64(old_inode->i_ctime.tv_sec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) old_di->i_ctime_nsec = cpu_to_le32(old_inode->i_ctime.tv_nsec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) ocfs2_journal_dirty(handle, old_inode_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) * Now that the name has been added to new_dir, remove the old name.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) * We don't keep any directory entry context around until now
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) * because the insert might have changed the type of directory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) * we're dealing with.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) status = ocfs2_find_entry(old_dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) old_dentry->d_name.len, old_dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) &old_entry_lookup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) if (!is_journal_aborted(osb->journal->j_journal)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) ocfs2_error(osb->sb, "new entry %.*s is added, but old entry %.*s "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) "is not deleted.",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) new_dentry->d_name.len, new_dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) old_dentry->d_name.len, old_dentry->d_name.name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) status = ocfs2_delete_entry(handle, old_dir, &old_entry_lookup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) if (!is_journal_aborted(osb->journal->j_journal)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) ocfs2_error(osb->sb, "new entry %.*s is added, but old entry %.*s "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) "is not deleted.",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) new_dentry->d_name.len, new_dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) old_dentry->d_name.len, old_dentry->d_name.name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) if (new_inode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) drop_nlink(new_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) new_inode->i_ctime = current_time(new_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) old_dir->i_ctime = old_dir->i_mtime = current_time(old_dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) if (update_dot_dot) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) status = ocfs2_update_entry(old_inode, handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) &old_inode_dot_dot_res, new_dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) drop_nlink(old_dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) if (new_inode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) drop_nlink(new_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) inc_nlink(new_dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) mark_inode_dirty(new_dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) mark_inode_dirty(old_dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) ocfs2_mark_inode_dirty(handle, old_dir, old_dir_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) if (new_inode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) mark_inode_dirty(new_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) ocfs2_mark_inode_dirty(handle, new_inode, newfe_bh);
^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) if (old_dir != new_dir) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) /* Keep the same times on both directories.*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) new_dir->i_ctime = new_dir->i_mtime = old_dir->i_ctime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) * This will also pick up the i_nlink change from the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) * block above.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) ocfs2_mark_inode_dirty(handle, new_dir, new_dir_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) if (old_dir_nlink != old_dir->i_nlink) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) if (!old_dir_bh) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) mlog(ML_ERROR, "need to change nlink for old dir "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) "%llu from %d to %d but bh is NULL!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) (unsigned long long)OCFS2_I(old_dir)->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) (int)old_dir_nlink, old_dir->i_nlink);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) struct ocfs2_dinode *fe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) status = ocfs2_journal_access_di(handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) INODE_CACHE(old_dir),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) old_dir_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) OCFS2_JOURNAL_ACCESS_WRITE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) fe = (struct ocfs2_dinode *) old_dir_bh->b_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) ocfs2_set_links_count(fe, old_dir->i_nlink);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) ocfs2_journal_dirty(handle, old_dir_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) ocfs2_dentry_move(old_dentry, new_dentry, old_dir, new_dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) bail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) if (handle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) ocfs2_commit_trans(osb, handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) if (orphan_dir) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) /* This was locked for us in ocfs2_prepare_orphan_dir() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) ocfs2_inode_unlock(orphan_dir, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) inode_unlock(orphan_dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) iput(orphan_dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) if (new_child_locked)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) ocfs2_inode_unlock(new_inode, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) if (old_child_locked)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) ocfs2_inode_unlock(old_inode, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) if (parents_locked)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) ocfs2_double_unlock(old_dir, new_dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) if (rename_lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) ocfs2_rename_unlock(osb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) if (new_inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) sync_mapping_buffers(old_inode->i_mapping);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) iput(new_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) ocfs2_free_dir_lookup_result(&target_lookup_res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) ocfs2_free_dir_lookup_result(&old_entry_lookup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) ocfs2_free_dir_lookup_result(&old_inode_dot_dot_res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) ocfs2_free_dir_lookup_result(&orphan_insert);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) ocfs2_free_dir_lookup_result(&target_insert);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) brelse(newfe_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) brelse(old_inode_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) brelse(old_dir_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) brelse(new_dir_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) * we expect i_size = strlen(symname). Copy symname into the file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) * data, including the null terminator.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) static int ocfs2_create_symlink_data(struct ocfs2_super *osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) handle_t *handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) const char *symname)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) struct buffer_head **bhs = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) const char *c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) struct super_block *sb = osb->sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) u64 p_blkno, p_blocks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) int virtual, blocks, status, i, bytes_left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) bytes_left = i_size_read(inode) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) /* we can't trust i_blocks because we're actually going to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) * write i_size + 1 bytes. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) blocks = (bytes_left + sb->s_blocksize - 1) >> sb->s_blocksize_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) trace_ocfs2_create_symlink_data((unsigned long long)inode->i_blocks,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) i_size_read(inode), blocks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) /* Sanity check -- make sure we're going to fit. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) if (bytes_left >
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) ocfs2_clusters_to_bytes(sb, OCFS2_I(inode)->ip_clusters)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) status = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) bhs = kcalloc(blocks, sizeof(struct buffer_head *), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) if (!bhs) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) status = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) status = ocfs2_extent_map_get_blocks(inode, 0, &p_blkno, &p_blocks,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) /* links can never be larger than one cluster so we know this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) * is all going to be contiguous, but do a sanity check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) * anyway. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) if ((p_blocks << sb->s_blocksize_bits) < bytes_left) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) status = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) virtual = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) while(bytes_left > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) c = &symname[virtual * sb->s_blocksize];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) bhs[virtual] = sb_getblk(sb, p_blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) if (!bhs[virtual]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) status = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) ocfs2_set_new_buffer_uptodate(INODE_CACHE(inode),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) bhs[virtual]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) status = ocfs2_journal_access(handle, INODE_CACHE(inode),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) bhs[virtual],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) OCFS2_JOURNAL_ACCESS_CREATE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) memset(bhs[virtual]->b_data, 0, sb->s_blocksize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) memcpy(bhs[virtual]->b_data, c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) (bytes_left > sb->s_blocksize) ? sb->s_blocksize :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) bytes_left);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) ocfs2_journal_dirty(handle, bhs[virtual]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) virtual++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) p_blkno++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) bytes_left -= sb->s_blocksize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) bail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) if (bhs) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) for(i = 0; i < blocks; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) brelse(bhs[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) kfree(bhs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) static int ocfs2_symlink(struct inode *dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) struct dentry *dentry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) const char *symname)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) int status, l, credits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) u64 newsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) struct ocfs2_super *osb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) struct inode *inode = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) struct super_block *sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) struct buffer_head *new_fe_bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) struct buffer_head *parent_fe_bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) struct ocfs2_dinode *fe = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) struct ocfs2_dinode *dirfe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) handle_t *handle = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) struct ocfs2_alloc_context *inode_ac = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) struct ocfs2_alloc_context *data_ac = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) struct ocfs2_alloc_context *xattr_ac = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) int want_clusters = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) int xattr_credits = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) struct ocfs2_security_xattr_info si = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) .enable = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) int did_quota = 0, did_quota_inode = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) struct ocfs2_dir_lookup_result lookup = { NULL, };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) sigset_t oldset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) int did_block_signals = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) struct ocfs2_dentry_lock *dl = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) trace_ocfs2_symlink_begin(dir, dentry, symname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) dentry->d_name.len, dentry->d_name.name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) status = dquot_initialize(dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) sb = dir->i_sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) osb = OCFS2_SB(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) l = strlen(symname) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) credits = ocfs2_calc_symlink_credits(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) /* lock the parent directory */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) status = ocfs2_inode_lock(dir, &parent_fe_bh, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) if (status != -ENOENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) dirfe = (struct ocfs2_dinode *) parent_fe_bh->b_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) if (!ocfs2_read_links_count(dirfe)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) /* can't make a file in a deleted directory. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) status = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) status = ocfs2_check_dir_for_entry(dir, dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) dentry->d_name.len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) status = ocfs2_prepare_dir_for_insert(osb, dir, parent_fe_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) dentry->d_name.len, &lookup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) status = ocfs2_reserve_new_inode(osb, &inode_ac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) if (status != -ENOSPC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) inode = ocfs2_get_init_inode(dir, S_IFLNK | S_IRWXUGO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) if (IS_ERR(inode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) status = PTR_ERR(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) inode = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) /* get security xattr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) status = ocfs2_init_security_get(inode, dir, &dentry->d_name, &si);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) if (status == -EOPNOTSUPP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) si.enable = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) /* calculate meta data/clusters for setting security xattr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) if (si.enable) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) status = ocfs2_calc_security_init(dir, &si, &want_clusters,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) &xattr_credits, &xattr_ac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) /* don't reserve bitmap space for fast symlinks. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) if (l > ocfs2_fast_symlink_chars(sb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) want_clusters += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) status = ocfs2_reserve_clusters(osb, want_clusters, &data_ac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) if (status != -ENOSPC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) handle = ocfs2_start_trans(osb, credits + xattr_credits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) if (IS_ERR(handle)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) status = PTR_ERR(handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) handle = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) /* Starting to change things, restart is no longer possible. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) ocfs2_block_signals(&oldset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) did_block_signals = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) status = dquot_alloc_inode(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) did_quota_inode = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) trace_ocfs2_symlink_create(dir, dentry, dentry->d_name.len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) (unsigned long long)OCFS2_I(dir)->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) inode->i_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) status = ocfs2_mknod_locked(osb, dir, inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) 0, &new_fe_bh, parent_fe_bh, handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) inode_ac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) fe = (struct ocfs2_dinode *) new_fe_bh->b_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) inode->i_rdev = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) newsize = l - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) inode->i_op = &ocfs2_symlink_inode_operations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) inode_nohighmem(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) if (l > ocfs2_fast_symlink_chars(sb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) u32 offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) status = dquot_alloc_space_nodirty(inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) ocfs2_clusters_to_bytes(osb->sb, 1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) did_quota = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) inode->i_mapping->a_ops = &ocfs2_aops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) status = ocfs2_add_inode_data(osb, inode, &offset, 1, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) new_fe_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) handle, data_ac, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) if (status != -ENOSPC && status != -EINTR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) mlog(ML_ERROR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) "Failed to extend file to %llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) (unsigned long long)newsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) status = -ENOSPC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) i_size_write(inode, newsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) inode->i_blocks = ocfs2_inode_sector_count(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) inode->i_mapping->a_ops = &ocfs2_fast_symlink_aops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) memcpy((char *) fe->id2.i_symlink, symname, l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) i_size_write(inode, newsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) inode->i_blocks = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) status = ocfs2_mark_inode_dirty(handle, inode, new_fe_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) if (!ocfs2_inode_is_fast_symlink(inode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) status = ocfs2_create_symlink_data(osb, handle, inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) symname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) if (si.enable) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) status = ocfs2_init_security_set(handle, inode, new_fe_bh, &si,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) xattr_ac, data_ac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) * Do this before adding the entry to the directory. We add
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) * also set d_op after success so that ->d_iput() will cleanup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) * the dentry lock even if ocfs2_add_entry() fails below.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) status = ocfs2_dentry_attach_lock(dentry, inode, OCFS2_I(dir)->ip_blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) dl = dentry->d_fsdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) status = ocfs2_add_entry(handle, dentry, inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) le64_to_cpu(fe->i_blkno), parent_fe_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) &lookup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) insert_inode_hash(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) d_instantiate(dentry, inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) bail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) if (status < 0 && did_quota)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) dquot_free_space_nodirty(inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) ocfs2_clusters_to_bytes(osb->sb, 1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) if (status < 0 && did_quota_inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) dquot_free_inode(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) if (handle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) ocfs2_commit_trans(osb, handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) ocfs2_inode_unlock(dir, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) if (did_block_signals)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) ocfs2_unblock_signals(&oldset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) brelse(new_fe_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) brelse(parent_fe_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) kfree(si.value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) ocfs2_free_dir_lookup_result(&lookup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) if (inode_ac)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) ocfs2_free_alloc_context(inode_ac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) if (data_ac)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) ocfs2_free_alloc_context(data_ac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) if (xattr_ac)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) ocfs2_free_alloc_context(xattr_ac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) if ((status < 0) && inode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) if (dl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) ocfs2_cleanup_add_entry_failure(osb, dentry, inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) OCFS2_I(inode)->ip_flags |= OCFS2_INODE_SKIP_ORPHAN_DIR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) clear_nlink(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) iput(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) static int ocfs2_blkno_stringify(u64 blkno, char *name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) int status, namelen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) namelen = snprintf(name, OCFS2_ORPHAN_NAMELEN + 1, "%016llx",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) (long long)blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) if (namelen <= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) if (namelen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) status = namelen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) status = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) if (namelen != OCFS2_ORPHAN_NAMELEN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) status = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) trace_ocfs2_blkno_stringify(blkno, name, namelen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) bail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) if (status < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) static int ocfs2_lookup_lock_orphan_dir(struct ocfs2_super *osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) struct inode **ret_orphan_dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) struct buffer_head **ret_orphan_dir_bh)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) struct inode *orphan_dir_inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) struct buffer_head *orphan_dir_bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) orphan_dir_inode = ocfs2_get_system_file_inode(osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) ORPHAN_DIR_SYSTEM_INODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) osb->slot_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) if (!orphan_dir_inode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) ret = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) mlog_errno(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) inode_lock(orphan_dir_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) ret = ocfs2_inode_lock(orphan_dir_inode, &orphan_dir_bh, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) inode_unlock(orphan_dir_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) iput(orphan_dir_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) mlog_errno(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) *ret_orphan_dir = orphan_dir_inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) *ret_orphan_dir_bh = orphan_dir_bh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) static int __ocfs2_prepare_orphan_dir(struct inode *orphan_dir_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122) struct buffer_head *orphan_dir_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) u64 blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) struct ocfs2_dir_lookup_result *lookup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) bool dio)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129) struct ocfs2_super *osb = OCFS2_SB(orphan_dir_inode->i_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) int namelen = dio ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) (OCFS2_DIO_ORPHAN_PREFIX_LEN + OCFS2_ORPHAN_NAMELEN) :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) OCFS2_ORPHAN_NAMELEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) if (dio) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) ret = snprintf(name, OCFS2_DIO_ORPHAN_PREFIX_LEN + 1, "%s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) OCFS2_DIO_ORPHAN_PREFIX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) if (ret != OCFS2_DIO_ORPHAN_PREFIX_LEN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) mlog_errno(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) ret = ocfs2_blkno_stringify(blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) name + OCFS2_DIO_ORPHAN_PREFIX_LEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) ret = ocfs2_blkno_stringify(blkno, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) mlog_errno(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) ret = ocfs2_prepare_dir_for_insert(osb, orphan_dir_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) orphan_dir_bh, name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) namelen, lookup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) mlog_errno(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) * ocfs2_prepare_orphan_dir() - Prepare an orphan directory for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) * insertion of an orphan.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) * @osb: ocfs2 file system
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) * @ret_orphan_dir: Orphan dir inode - returned locked!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) * @blkno: Actual block number of the inode to be inserted into orphan dir.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) * @lookup: dir lookup result, to be passed back into functions like
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) * ocfs2_orphan_add
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) * Returns zero on success and the ret_orphan_dir, name and lookup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173) * fields will be populated.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) * Returns non-zero on failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) static int ocfs2_prepare_orphan_dir(struct ocfs2_super *osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) struct inode **ret_orphan_dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179) u64 blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) struct ocfs2_dir_lookup_result *lookup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) bool dio)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) struct inode *orphan_dir_inode = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) struct buffer_head *orphan_dir_bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) ret = ocfs2_lookup_lock_orphan_dir(osb, &orphan_dir_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189) &orphan_dir_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) mlog_errno(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) ret = __ocfs2_prepare_orphan_dir(orphan_dir_inode, orphan_dir_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) blkno, name, lookup, dio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198) mlog_errno(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) *ret_orphan_dir = orphan_dir_inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) brelse(orphan_dir_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) ocfs2_inode_unlock(orphan_dir_inode, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) inode_unlock(orphan_dir_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) iput(orphan_dir_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) mlog_errno(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) static int ocfs2_orphan_add(struct ocfs2_super *osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219) handle_t *handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) struct buffer_head *fe_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223) struct ocfs2_dir_lookup_result *lookup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224) struct inode *orphan_dir_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) bool dio)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) struct buffer_head *orphan_dir_bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) int status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) struct ocfs2_dinode *orphan_fe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) struct ocfs2_dinode *fe = (struct ocfs2_dinode *) fe_bh->b_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) int namelen = dio ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) (OCFS2_DIO_ORPHAN_PREFIX_LEN + OCFS2_ORPHAN_NAMELEN) :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) OCFS2_ORPHAN_NAMELEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) trace_ocfs2_orphan_add_begin(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) (unsigned long long)OCFS2_I(inode)->ip_blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238) status = ocfs2_read_inode_block(orphan_dir_inode, &orphan_dir_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) status = ocfs2_journal_access_di(handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) INODE_CACHE(orphan_dir_inode),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) orphan_dir_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) OCFS2_JOURNAL_ACCESS_WRITE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254) * We're going to journal the change of i_flags and i_orphaned_slot.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) * It's safe anyway, though some callers may duplicate the journaling.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) * Journaling within the func just make the logic look more
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) * straightforward.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259) status = ocfs2_journal_access_di(handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) INODE_CACHE(inode),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) fe_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) OCFS2_JOURNAL_ACCESS_WRITE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) /* we're a cluster, and nlink can change on disk from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) * underneath us... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) orphan_fe = (struct ocfs2_dinode *) orphan_dir_bh->b_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) if (S_ISDIR(inode->i_mode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272) ocfs2_add_links_count(orphan_fe, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) set_nlink(orphan_dir_inode, ocfs2_read_links_count(orphan_fe));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) ocfs2_journal_dirty(handle, orphan_dir_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) status = __ocfs2_add_entry(handle, orphan_dir_inode, name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) namelen, inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) OCFS2_I(inode)->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) orphan_dir_bh, lookup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282) goto rollback;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) if (dio) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) /* Update flag OCFS2_DIO_ORPHANED_FL and record the orphan
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) * slot.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) fe->i_flags |= cpu_to_le32(OCFS2_DIO_ORPHANED_FL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290) fe->i_dio_orphaned_slot = cpu_to_le16(osb->slot_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292) fe->i_flags |= cpu_to_le32(OCFS2_ORPHANED_FL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) OCFS2_I(inode)->ip_flags &= ~OCFS2_INODE_SKIP_ORPHAN_DIR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295) /* Record which orphan dir our inode now resides
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) * in. delete_inode will use this to determine which orphan
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) * dir to lock. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) fe->i_orphaned_slot = cpu_to_le16(osb->slot_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) ocfs2_journal_dirty(handle, fe_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) trace_ocfs2_orphan_add_end((unsigned long long)OCFS2_I(inode)->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) osb->slot_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306) rollback:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) if (S_ISDIR(inode->i_mode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309) ocfs2_add_links_count(orphan_fe, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) set_nlink(orphan_dir_inode, ocfs2_read_links_count(orphan_fe));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313) leave:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) brelse(orphan_dir_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) /* unlike orphan_add, we expect the orphan dir to already be locked here. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) int ocfs2_orphan_del(struct ocfs2_super *osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) handle_t *handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) struct inode *orphan_dir_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323) struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) struct buffer_head *orphan_dir_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) bool dio)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) char name[OCFS2_DIO_ORPHAN_PREFIX_LEN + OCFS2_ORPHAN_NAMELEN + 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328) struct ocfs2_dinode *orphan_fe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329) int status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) struct ocfs2_dir_lookup_result lookup = { NULL, };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332) if (dio) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) status = snprintf(name, OCFS2_DIO_ORPHAN_PREFIX_LEN + 1, "%s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) OCFS2_DIO_ORPHAN_PREFIX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335) if (status != OCFS2_DIO_ORPHAN_PREFIX_LEN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) status = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341) status = ocfs2_blkno_stringify(OCFS2_I(inode)->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) name + OCFS2_DIO_ORPHAN_PREFIX_LEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) status = ocfs2_blkno_stringify(OCFS2_I(inode)->ip_blkno, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350) trace_ocfs2_orphan_del(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) (unsigned long long)OCFS2_I(orphan_dir_inode)->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) name, strlen(name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) status = ocfs2_journal_access_di(handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355) INODE_CACHE(orphan_dir_inode),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) orphan_dir_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357) OCFS2_JOURNAL_ACCESS_WRITE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) /* find it's spot in the orphan directory */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364) status = ocfs2_find_entry(name, strlen(name), orphan_dir_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365) &lookup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371) /* remove it from the orphan directory */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372) status = ocfs2_delete_entry(handle, orphan_dir_inode, &lookup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378) /* do the i_nlink dance! :) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) orphan_fe = (struct ocfs2_dinode *) orphan_dir_bh->b_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) if (S_ISDIR(inode->i_mode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381) ocfs2_add_links_count(orphan_fe, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382) set_nlink(orphan_dir_inode, ocfs2_read_links_count(orphan_fe));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383) ocfs2_journal_dirty(handle, orphan_dir_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385) leave:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386) ocfs2_free_dir_lookup_result(&lookup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394) * ocfs2_prep_new_orphaned_file() - Prepare the orphan dir to receive a newly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395) * allocated file. This is different from the typical 'add to orphan dir'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396) * operation in that the inode does not yet exist. This is a problem because
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397) * the orphan dir stringifies the inode block number to come up with it's
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) * dirent. Obviously if the inode does not yet exist we have a chicken and egg
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399) * problem. This function works around it by calling deeper into the orphan
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) * and suballoc code than other callers. Use this only by necessity.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401) * @dir: The directory which this inode will ultimately wind up under - not the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402) * orphan dir!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403) * @dir_bh: buffer_head the @dir inode block
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404) * @orphan_name: string of length (CFS2_ORPHAN_NAMELEN + 1). Will be filled
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405) * with the string to be used for orphan dirent. Pass back to the orphan dir
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406) * code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407) * @ret_orphan_dir: orphan dir inode returned to be passed back into orphan
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408) * dir code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409) * @ret_di_blkno: block number where the new inode will be allocated.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410) * @orphan_insert: Dir insert context to be passed back into orphan dir code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411) * @ret_inode_ac: Inode alloc context to be passed back to the allocator.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413) * Returns zero on success and the ret_orphan_dir, name and lookup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) * fields will be populated.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416) * Returns non-zero on failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418) static int ocfs2_prep_new_orphaned_file(struct inode *dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419) struct buffer_head *dir_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) char *orphan_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421) struct inode **ret_orphan_dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422) u64 *ret_di_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423) struct ocfs2_dir_lookup_result *orphan_insert,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424) struct ocfs2_alloc_context **ret_inode_ac)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427) u64 di_blkno;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428) struct ocfs2_super *osb = OCFS2_SB(dir->i_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429) struct inode *orphan_dir = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) struct buffer_head *orphan_dir_bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431) struct ocfs2_alloc_context *inode_ac = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433) ret = ocfs2_lookup_lock_orphan_dir(osb, &orphan_dir, &orphan_dir_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435) mlog_errno(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439) /* reserve an inode spot */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440) ret = ocfs2_reserve_new_inode(osb, &inode_ac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442) if (ret != -ENOSPC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443) mlog_errno(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2444) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2445) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2447) ret = ocfs2_find_new_inode_loc(dir, dir_bh, inode_ac,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2448) &di_blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2449) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2450) mlog_errno(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2451) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2452) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2454) ret = __ocfs2_prepare_orphan_dir(orphan_dir, orphan_dir_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2455) di_blkno, orphan_name, orphan_insert,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2456) false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2457) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2458) mlog_errno(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2459) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2460) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2462) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2463) if (ret == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2464) *ret_orphan_dir = orphan_dir;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2465) *ret_di_blkno = di_blkno;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2466) *ret_inode_ac = inode_ac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2467) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2468) * orphan_name and orphan_insert are already up to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2469) * date via prepare_orphan_dir
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2470) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2471) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2472) /* Unroll reserve_new_inode* */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2473) if (inode_ac)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2474) ocfs2_free_alloc_context(inode_ac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2475)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2476) /* Unroll orphan dir locking */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2477) inode_unlock(orphan_dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2478) ocfs2_inode_unlock(orphan_dir, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2479) iput(orphan_dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2480) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2482) brelse(orphan_dir_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2483)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2484) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2485) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2486)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2487) int ocfs2_create_inode_in_orphan(struct inode *dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2488) int mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2489) struct inode **new_inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2490) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2491) int status, did_quota_inode = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2492) struct inode *inode = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2493) struct inode *orphan_dir = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2494) struct ocfs2_super *osb = OCFS2_SB(dir->i_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2495) handle_t *handle = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2496) char orphan_name[OCFS2_ORPHAN_NAMELEN + 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2497) struct buffer_head *parent_di_bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2498) struct buffer_head *new_di_bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2499) struct ocfs2_alloc_context *inode_ac = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2500) struct ocfs2_dir_lookup_result orphan_insert = { NULL, };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2501) u64 di_blkno, suballoc_loc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2502) u16 suballoc_bit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2504) status = ocfs2_inode_lock(dir, &parent_di_bh, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2505) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2506) if (status != -ENOENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2507) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2508) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2509) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2511) status = ocfs2_prep_new_orphaned_file(dir, parent_di_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2512) orphan_name, &orphan_dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2513) &di_blkno, &orphan_insert, &inode_ac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2514) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2515) if (status != -ENOSPC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2516) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2517) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2518) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2520) inode = ocfs2_get_init_inode(dir, mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2521) if (IS_ERR(inode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2522) status = PTR_ERR(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2523) inode = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2524) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2525) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2526) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2527)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2528) handle = ocfs2_start_trans(osb, ocfs2_mknod_credits(osb->sb, 0, 0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2529) if (IS_ERR(handle)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2530) status = PTR_ERR(handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2531) handle = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2532) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2533) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2534) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2536) status = dquot_alloc_inode(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2537) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2538) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2539) did_quota_inode = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2541) status = ocfs2_claim_new_inode_at_loc(handle, dir, inode_ac,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2542) &suballoc_loc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2543) &suballoc_bit, di_blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2544) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2545) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2546) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2547) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2549) clear_nlink(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2550) /* do the real work now. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2551) status = __ocfs2_mknod_locked(dir, inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2552) 0, &new_di_bh, parent_di_bh, handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2553) inode_ac, di_blkno, suballoc_loc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2554) suballoc_bit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2555) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2556) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2557) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2558) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2560) status = ocfs2_orphan_add(osb, handle, inode, new_di_bh, orphan_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2561) &orphan_insert, orphan_dir, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2562) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2563) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2564) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2565) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2566)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2567) /* get open lock so that only nodes can't remove it from orphan dir. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2568) status = ocfs2_open_lock(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2569) if (status < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2570) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2571)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2572) insert_inode_hash(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2573) leave:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2574) if (status < 0 && did_quota_inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2575) dquot_free_inode(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2576) if (handle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2577) ocfs2_commit_trans(osb, handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2578)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2579) if (orphan_dir) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2580) /* This was locked for us in ocfs2_prepare_orphan_dir() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2581) ocfs2_inode_unlock(orphan_dir, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2582) inode_unlock(orphan_dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2583) iput(orphan_dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2584) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2585)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2586) if ((status < 0) && inode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2587) clear_nlink(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2588) iput(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2589) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2590)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2591) if (inode_ac)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2592) ocfs2_free_alloc_context(inode_ac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2593)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2594) brelse(new_di_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2595)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2596) if (!status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2597) *new_inode = inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2598)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2599) ocfs2_free_dir_lookup_result(&orphan_insert);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2600)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2601) ocfs2_inode_unlock(dir, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2602) brelse(parent_di_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2603) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2604) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2605)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2606) int ocfs2_add_inode_to_orphan(struct ocfs2_super *osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2607) struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2608) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2609) char orphan_name[OCFS2_DIO_ORPHAN_PREFIX_LEN + OCFS2_ORPHAN_NAMELEN + 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2610) struct inode *orphan_dir_inode = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2611) struct ocfs2_dir_lookup_result orphan_insert = { NULL, };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2612) struct buffer_head *di_bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2613) int status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2614) handle_t *handle = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2615) struct ocfs2_dinode *di = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2616)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2617) status = ocfs2_inode_lock(inode, &di_bh, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2618) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2619) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2620) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2621) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2622)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2623) di = (struct ocfs2_dinode *) di_bh->b_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2624) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2625) * Another append dio crashed?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2626) * If so, manually recover it first.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2627) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2628) if (unlikely(di->i_flags & cpu_to_le32(OCFS2_DIO_ORPHANED_FL))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2629) status = ocfs2_truncate_file(inode, di_bh, i_size_read(inode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2630) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2631) if (status != -ENOSPC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2632) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2633) goto bail_unlock_inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2634) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2635)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2636) status = ocfs2_del_inode_from_orphan(osb, inode, di_bh, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2637) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2638) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2639) goto bail_unlock_inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2640) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2641) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2642)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2643) status = ocfs2_prepare_orphan_dir(osb, &orphan_dir_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2644) OCFS2_I(inode)->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2645) orphan_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2646) &orphan_insert,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2647) true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2648) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2649) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2650) goto bail_unlock_inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2651) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2653) handle = ocfs2_start_trans(osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2654) OCFS2_INODE_ADD_TO_ORPHAN_CREDITS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2655) if (IS_ERR(handle)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2656) status = PTR_ERR(handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2657) goto bail_unlock_orphan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2658) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2659)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2660) status = ocfs2_orphan_add(osb, handle, inode, di_bh, orphan_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2661) &orphan_insert, orphan_dir_inode, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2662) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2663) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2664)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2665) ocfs2_commit_trans(osb, handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2666)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2667) bail_unlock_orphan:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2668) ocfs2_inode_unlock(orphan_dir_inode, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2669) inode_unlock(orphan_dir_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2670) iput(orphan_dir_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2671)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2672) ocfs2_free_dir_lookup_result(&orphan_insert);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2674) bail_unlock_inode:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2675) ocfs2_inode_unlock(inode, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2676) brelse(di_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2677)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2678) bail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2679) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2680) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2681)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2682) int ocfs2_del_inode_from_orphan(struct ocfs2_super *osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2683) struct inode *inode, struct buffer_head *di_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2684) int update_isize, loff_t end)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2685) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2686) struct inode *orphan_dir_inode = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2687) struct buffer_head *orphan_dir_bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2688) struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2689) handle_t *handle = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2690) int status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2691)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2692) orphan_dir_inode = ocfs2_get_system_file_inode(osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2693) ORPHAN_DIR_SYSTEM_INODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2694) le16_to_cpu(di->i_dio_orphaned_slot));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2695) if (!orphan_dir_inode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2696) status = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2697) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2698) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2699) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2700)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2701) inode_lock(orphan_dir_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2702) status = ocfs2_inode_lock(orphan_dir_inode, &orphan_dir_bh, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2703) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2704) inode_unlock(orphan_dir_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2705) iput(orphan_dir_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2706) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2707) goto bail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2708) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2710) handle = ocfs2_start_trans(osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2711) OCFS2_INODE_DEL_FROM_ORPHAN_CREDITS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2712) if (IS_ERR(handle)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2713) status = PTR_ERR(handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2714) goto bail_unlock_orphan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2715) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2716)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2717) BUG_ON(!(di->i_flags & cpu_to_le32(OCFS2_DIO_ORPHANED_FL)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2719) status = ocfs2_orphan_del(osb, handle, orphan_dir_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2720) inode, orphan_dir_bh, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2721) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2722) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2723) goto bail_commit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2724) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2725)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2726) status = ocfs2_journal_access_di(handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2727) INODE_CACHE(inode),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2728) di_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2729) OCFS2_JOURNAL_ACCESS_WRITE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2730) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2731) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2732) goto bail_commit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2733) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2734)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2735) di->i_flags &= ~cpu_to_le32(OCFS2_DIO_ORPHANED_FL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2736) di->i_dio_orphaned_slot = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2737)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2738) if (update_isize) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2739) status = ocfs2_set_inode_size(handle, inode, di_bh, end);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2740) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2741) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2742) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2743) ocfs2_journal_dirty(handle, di_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2744)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2745) bail_commit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2746) ocfs2_commit_trans(osb, handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2747)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2748) bail_unlock_orphan:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2749) ocfs2_inode_unlock(orphan_dir_inode, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2750) inode_unlock(orphan_dir_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2751) brelse(orphan_dir_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2752) iput(orphan_dir_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2753)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2754) bail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2755) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2756) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2757)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2758) int ocfs2_mv_orphaned_inode_to_new(struct inode *dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2759) struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2760) struct dentry *dentry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2761) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2762) int status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2763) struct buffer_head *parent_di_bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2764) handle_t *handle = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2765) struct ocfs2_super *osb = OCFS2_SB(dir->i_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2766) struct ocfs2_dinode *dir_di, *di;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2767) struct inode *orphan_dir_inode = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2768) struct buffer_head *orphan_dir_bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2769) struct buffer_head *di_bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2770) struct ocfs2_dir_lookup_result lookup = { NULL, };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2771)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2772) trace_ocfs2_mv_orphaned_inode_to_new(dir, dentry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2773) dentry->d_name.len, dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2774) (unsigned long long)OCFS2_I(dir)->ip_blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2775) (unsigned long long)OCFS2_I(inode)->ip_blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2776)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2777) status = ocfs2_inode_lock(dir, &parent_di_bh, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2778) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2779) if (status != -ENOENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2780) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2781) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2782) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2783)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2784) dir_di = (struct ocfs2_dinode *) parent_di_bh->b_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2785) if (!dir_di->i_links_count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2786) /* can't make a file in a deleted directory. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2787) status = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2788) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2789) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2790)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2791) status = ocfs2_check_dir_for_entry(dir, dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2792) dentry->d_name.len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2793) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2794) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2795)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2796) /* get a spot inside the dir. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2797) status = ocfs2_prepare_dir_for_insert(osb, dir, parent_di_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2798) dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2799) dentry->d_name.len, &lookup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2800) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2801) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2802) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2803) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2804)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2805) orphan_dir_inode = ocfs2_get_system_file_inode(osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2806) ORPHAN_DIR_SYSTEM_INODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2807) osb->slot_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2808) if (!orphan_dir_inode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2809) status = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2810) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2811) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2812) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2813)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2814) inode_lock(orphan_dir_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2815)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2816) status = ocfs2_inode_lock(orphan_dir_inode, &orphan_dir_bh, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2817) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2818) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2819) inode_unlock(orphan_dir_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2820) iput(orphan_dir_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2821) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2822) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2823)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2824) status = ocfs2_read_inode_block(inode, &di_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2825) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2826) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2827) goto orphan_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2828) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2829)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2830) handle = ocfs2_start_trans(osb, ocfs2_rename_credits(osb->sb));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2831) if (IS_ERR(handle)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2832) status = PTR_ERR(handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2833) handle = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2834) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2835) goto orphan_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2836) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2837)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2838) status = ocfs2_journal_access_di(handle, INODE_CACHE(inode),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2839) di_bh, OCFS2_JOURNAL_ACCESS_WRITE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2840) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2841) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2842) goto out_commit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2843) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2844)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2845) status = ocfs2_orphan_del(osb, handle, orphan_dir_inode, inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2846) orphan_dir_bh, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2847) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2848) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2849) goto out_commit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2850) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2851)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2852) di = (struct ocfs2_dinode *)di_bh->b_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2853) di->i_flags &= ~cpu_to_le32(OCFS2_ORPHANED_FL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2854) di->i_orphaned_slot = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2855) set_nlink(inode, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2856) ocfs2_set_links_count(di, inode->i_nlink);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2857) ocfs2_update_inode_fsync_trans(handle, inode, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2858) ocfs2_journal_dirty(handle, di_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2859)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2860) status = ocfs2_add_entry(handle, dentry, inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2861) OCFS2_I(inode)->ip_blkno, parent_di_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2862) &lookup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2863) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2864) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2865) goto out_commit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2866) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2867)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2868) status = ocfs2_dentry_attach_lock(dentry, inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2869) OCFS2_I(dir)->ip_blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2870) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2871) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2872) goto out_commit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2873) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2874)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2875) d_instantiate(dentry, inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2876) status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2877) out_commit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2878) ocfs2_commit_trans(osb, handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2879) orphan_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2880) ocfs2_inode_unlock(orphan_dir_inode, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2881) inode_unlock(orphan_dir_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2882) iput(orphan_dir_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2883) leave:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2885) ocfs2_inode_unlock(dir, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2886)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2887) brelse(di_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2888) brelse(parent_di_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2889) brelse(orphan_dir_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2890)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2891) ocfs2_free_dir_lookup_result(&lookup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2892)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2893) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2894) mlog_errno(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2895)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2896) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2897) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2898)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2899) const struct inode_operations ocfs2_dir_iops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2900) .create = ocfs2_create,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2901) .lookup = ocfs2_lookup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2902) .link = ocfs2_link,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2903) .unlink = ocfs2_unlink,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2904) .rmdir = ocfs2_unlink,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2905) .symlink = ocfs2_symlink,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2906) .mkdir = ocfs2_mkdir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2907) .mknod = ocfs2_mknod,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2908) .rename = ocfs2_rename,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2909) .setattr = ocfs2_setattr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2910) .getattr = ocfs2_getattr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2911) .permission = ocfs2_permission,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2912) .listxattr = ocfs2_listxattr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2913) .fiemap = ocfs2_fiemap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2914) .get_acl = ocfs2_iop_get_acl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2915) .set_acl = ocfs2_iop_set_acl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2916) };