From d03f5eaca769dc2962427023d48bdbfdb902ea4d Mon Sep 17 00:00:00 2001 From: Jinshan Xiong Date: Mon, 14 Nov 2016 14:51:39 -0800 Subject: [PATCH] LU-8559 llite: fix ll_create_nd for non HAVE_IOP_ATOMIC_OPEN Invoke ll_new_node() with LUSTRE_OPC_CREATE for non HAVE_IOP_ATOMIC_OPEN case so that it can recognize volatile file name. Signed-off-by: Jinshan Xiong Change-Id: Ia38d353844dc4852dbaa308fe26f450108a009ea Reviewed-on: http://review.whamcloud.com/23758 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: wangdi Reviewed-by: Oleg Drokin --- lustre/llite/namei.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/lustre/llite/namei.c b/lustre/llite/namei.c index b687d6e..abfdfe1 100644 --- a/lustre/llite/namei.c +++ b/lustre/llite/namei.c @@ -1139,6 +1139,8 @@ static int ll_create_nd(struct inode *dir, struct dentry *dentry, dentry->d_name.name, PFID(ll_inode2fid(dir)), dir, mode, want_excl); + /* Using mknod(2) to create a regular file is designed to not recognize + * volatile file name, so we use ll_mknod() here. */ rc = ll_mknod(dir, dentry, mode, 0); ll_stats_ops_tally(ll_i2sbi(dir), LPROC_LL_CREATE, 1); @@ -1161,19 +1163,26 @@ static int ll_create_nd(struct inode *dir, struct dentry *dentry, if (lld != NULL) it = lld->lld_it; - if (!it) - return ll_mknod(dir, dentry, mode, 0); + if (!it) { + /* LU-8559: use LUSTRE_OPC_CREATE for non atomic open case + * so that volatile file name is recoginized. + * Mknod(2), however, is designed to not recognize volatile + * file name to avoid inode leak under orphan directory until + * MDT reboot */ + return ll_new_node(dir, dentry, NULL, mode, 0, + LUSTRE_OPC_CREATE); + } lld->lld_it = NULL; - /* Was there an error? Propagate it! */ + /* Was there an error? Propagate it! */ if (it->it_status) { rc = it->it_status; - goto out; - } + goto out; + } rc = ll_create_it(dir, dentry, it); - if (nd && (nd->flags & LOOKUP_OPEN) && dentry->d_inode) { /* Open */ + if (nd && (nd->flags & LOOKUP_OPEN) && dentry->d_inode) { /* Open */ struct file *filp; nd->intent.open.file->private_data = it; -- 1.8.3.1