mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-01 08:04:22 +08:00
8ed6b23709
The following patches are reverted in this patch because these patches caused performance regression in the remote unlink() calls.ea455f8ab6
- ocfs2: Push out dropping of dentry lock to ocfs2_wqf7b1aa69be
- ocfs2: Fix deadlock on umount5fd1318937
- ocfs2: Don't oops in ocfs2_kill_sb on a failed mount Previous patches in this series removed the possible deadlocks from downconvert thread so the above patches shouldn't be needed anymore. The regression is caused because these patches delay the iput() in case of dentry unlocks. This also delays the unlocking of the open lockres. The open lockresource is required to test if the inode can be wiped from disk or not. When the deleting node does not get the open lock, it marks it as orphan (even though it is not in use by another node/process) and causes a journal checkpoint. This delays operations following the inode eviction. This also moves the inode to the orphaned inode which further causes more I/O and a lot of unneccessary orphans. The following script can be used to generate the load causing issues: declare -a create declare -a remove declare -a iterations=(1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384) unique="`mktemp -u XXXXX`" script="/tmp/idontknow-${unique}.sh" cat <<EOF > "${script}" for n in {1..8}; do mkdir -p test/dir\${n} eval touch test/dir\${n}/foo{1.."\$1"} done EOF chmod 700 "${script}" function fcreate () { exec 2>&1 /usr/bin/time --format=%E "${script}" "$1" } function fremove () { exec 2>&1 /usr/bin/time --format=%E ssh node2 "cd `pwd`; rm -Rf test*" } function fcp () { exec 2>&1 /usr/bin/time --format=%E ssh node3 "cd `pwd`; cp -R test test.new" } echo ------------------------------------------------- echo "| # files | create #s | copy #s | remove #s |" echo ------------------------------------------------- for ((x=0; x < ${#iterations[*]} ; x++)) do create[$x]="`fcreate ${iterations[$x]}`" copy[$x]="`fcp ${iterations[$x]}`" remove[$x]="`fremove`" printf "| %8d | %9s | %9s | %9s |\n" ${iterations[$x]} ${create[$x]} ${copy[$x]} ${remove[$x]} done rm "${script}" echo "------------------------" Signed-off-by: Srinivas Eeda <srinivas.eeda@oracle.com> Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com> Signed-off-by: Jan Kara <jack@suse.cz> Reviewed-by: Mark Fasheh <mfasheh@suse.de> Cc: Joel Becker <jlbec@evilplan.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
60 lines
1.8 KiB
C
60 lines
1.8 KiB
C
/* -*- mode: c; c-basic-offset: 8; -*-
|
|
* vim: noexpandtab sw=8 ts=8 sts=0:
|
|
*
|
|
* dcache.h
|
|
*
|
|
* Function prototypes
|
|
*
|
|
* Copyright (C) 2002, 2004 Oracle. All rights reserved.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public
|
|
* License along with this program; if not, write to the
|
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
* Boston, MA 021110-1307, USA.
|
|
*/
|
|
|
|
#ifndef OCFS2_DCACHE_H
|
|
#define OCFS2_DCACHE_H
|
|
|
|
extern const struct dentry_operations ocfs2_dentry_ops;
|
|
|
|
struct ocfs2_dentry_lock {
|
|
unsigned int dl_count;
|
|
u64 dl_parent_blkno;
|
|
|
|
/*
|
|
* The ocfs2_dentry_lock keeps an inode reference until
|
|
* dl_lockres has been destroyed. This is usually done in
|
|
* ->d_iput() anyway, so there should be minimal impact.
|
|
*/
|
|
struct inode *dl_inode;
|
|
struct ocfs2_lock_res dl_lockres;
|
|
};
|
|
|
|
int ocfs2_dentry_attach_lock(struct dentry *dentry, struct inode *inode,
|
|
u64 parent_blkno);
|
|
|
|
void ocfs2_dentry_lock_put(struct ocfs2_super *osb,
|
|
struct ocfs2_dentry_lock *dl);
|
|
|
|
struct dentry *ocfs2_find_local_alias(struct inode *inode, u64 parent_blkno,
|
|
int skip_unhashed);
|
|
|
|
void ocfs2_dentry_move(struct dentry *dentry, struct dentry *target,
|
|
struct inode *old_dir, struct inode *new_dir);
|
|
|
|
extern spinlock_t dentry_attach_lock;
|
|
void ocfs2_dentry_attach_gen(struct dentry *dentry);
|
|
|
|
#endif /* OCFS2_DCACHE_H */
|