Whamcloud - gitweb
LU-8559 llite: fix ll_create_nd for non HAVE_IOP_ATOMIC_OPEN 58/23758/5
authorJinshan Xiong <jinshan.xiong@intel.com>
Mon, 14 Nov 2016 22:51:39 +0000 (14:51 -0800)
committerOleg Drokin <oleg.drokin@intel.com>
Wed, 23 Nov 2016 04:19:12 +0000 (04:19 +0000)
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 <jinshan.xiong@intel.com>
Change-Id: Ia38d353844dc4852dbaa308fe26f450108a009ea
Reviewed-on: http://review.whamcloud.com/23758
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: wangdi <di.wang@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/llite/namei.c

index b687d6e..abfdfe1 100644 (file)
@@ -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;