1df6c8
From d79660ccc65f163e0d9cf91cc13a199bec04d5f1 Mon Sep 17 00:00:00 2001
1df6c8
From: Xavi Hernandez Juan <xhernandez@redhat.com>
1df6c8
Date: Wed, 20 May 2020 12:55:43 +0000
1df6c8
Subject: [PATCH 378/379] Revert "open-behind: fix missing fd reference"
1df6c8
1df6c8
This reverts commit 30cbdf8c06145a0c290da42ecc0a7eae928200b7.
1df6c8
1df6c8
The patch is not complete because there have been some crash reports
1df6c8
upstream recently after the patch was released. A new patch that should
1df6c8
cover all corner cases is under review (), but it's a big change and it
1df6c8
could be risky to backport it without enough testing.
1df6c8
1df6c8
Since there exists a workaround to avoid the problem (disable
1df6c8
open-behind), for now we revert the patch.
1df6c8
1df6c8
Change-Id: I9cfc55623c33758cf5530b18f03c0d795b0f650b
1df6c8
BUG: 1830713
1df6c8
Signed-off-by: Xavi Hernandez <xhernandez@redhat.com>
1df6c8
Reviewed-on: https://code.engineering.redhat.com/gerrit/200952
1df6c8
Tested-by: RHGS Build Bot <nigelb@redhat.com>
1df6c8
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
1df6c8
---
1df6c8
 xlators/performance/open-behind/src/open-behind.c | 27 +++++++++--------------
1df6c8
 1 file changed, 11 insertions(+), 16 deletions(-)
1df6c8
1df6c8
diff --git a/xlators/performance/open-behind/src/open-behind.c b/xlators/performance/open-behind/src/open-behind.c
1df6c8
index 14ebc12..268c717 100644
1df6c8
--- a/xlators/performance/open-behind/src/open-behind.c
1df6c8
+++ b/xlators/performance/open-behind/src/open-behind.c
1df6c8
@@ -206,13 +206,8 @@ ob_fd_free(ob_fd_t *ob_fd)
1df6c8
     if (ob_fd->xdata)
1df6c8
         dict_unref(ob_fd->xdata);
1df6c8
 
1df6c8
-    if (ob_fd->open_frame) {
1df6c8
-        /* If we sill have a frame it means that background open has never
1df6c8
-         * been triggered. We need to release the pending reference. */
1df6c8
-        fd_unref(ob_fd->fd);
1df6c8
-
1df6c8
+    if (ob_fd->open_frame)
1df6c8
         STACK_DESTROY(ob_fd->open_frame->root);
1df6c8
-    }
1df6c8
 
1df6c8
     GF_FREE(ob_fd);
1df6c8
 }
1df6c8
@@ -302,7 +297,6 @@ ob_wake_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,
1df6c8
             call_resume(stub);
1df6c8
     }
1df6c8
 
1df6c8
-    /* The background open is completed. We can release the 'fd' reference. */
1df6c8
     fd_unref(fd);
1df6c8
 
1df6c8
     STACK_DESTROY(frame->root);
1df6c8
@@ -337,9 +331,7 @@ ob_fd_wake(xlator_t *this, fd_t *fd, ob_fd_t *ob_fd)
1df6c8
     }
1df6c8
 
1df6c8
     if (frame) {
1df6c8
-        /* We don't need to take a reference here. We already have a reference
1df6c8
-         * while the open is pending. */
1df6c8
-        frame->local = fd;
1df6c8
+        frame->local = fd_ref(fd);
1df6c8
 
1df6c8
         STACK_WIND(frame, ob_wake_cbk, FIRST_CHILD(this),
1df6c8
                    FIRST_CHILD(this)->fops->open, &ob_fd->loc, ob_fd->flags, fd,
1df6c8
@@ -353,12 +345,15 @@ void
1df6c8
 ob_inode_wake(xlator_t *this, struct list_head *ob_fds)
1df6c8
 {
1df6c8
     ob_fd_t *ob_fd = NULL, *tmp = NULL;
1df6c8
+    fd_t *fd = NULL;
1df6c8
 
1df6c8
     if (!list_empty(ob_fds)) {
1df6c8
         list_for_each_entry_safe(ob_fd, tmp, ob_fds, ob_fds_on_inode)
1df6c8
         {
1df6c8
             ob_fd_wake(this, ob_fd->fd, ob_fd);
1df6c8
+            fd = ob_fd->fd;
1df6c8
             ob_fd_free(ob_fd);
1df6c8
+            fd_unref(fd);
1df6c8
         }
1df6c8
     }
1df6c8
 }
1df6c8
@@ -370,7 +365,7 @@ ob_fd_copy(ob_fd_t *src, ob_fd_t *dst)
1df6c8
     if (!src || !dst)
1df6c8
         goto out;
1df6c8
 
1df6c8
-    dst->fd = src->fd;
1df6c8
+    dst->fd = __fd_ref(src->fd);
1df6c8
     dst->loc.inode = inode_ref(src->loc.inode);
1df6c8
     gf_uuid_copy(dst->loc.gfid, src->loc.gfid);
1df6c8
     dst->flags = src->flags;
1df6c8
@@ -514,6 +509,7 @@ ob_open_behind(call_frame_t *frame, xlator_t *this, loc_t *loc, int flags,
1df6c8
 
1df6c8
     ob_fd->ob_inode = ob_inode;
1df6c8
 
1df6c8
+    /* don't do fd_ref, it'll cause leaks */
1df6c8
     ob_fd->fd = fd;
1df6c8
 
1df6c8
     ob_fd->open_frame = copy_frame(frame);
1df6c8
@@ -543,16 +539,15 @@ ob_open_behind(call_frame_t *frame, xlator_t *this, loc_t *loc, int flags,
1df6c8
     }
1df6c8
     UNLOCK(&fd->inode->lock);
1df6c8
 
1df6c8
-    /* We take a reference while the background open is pending or being
1df6c8
-     * processed. If we finally wind the request in the foreground, then
1df6c8
-     * ob_fd_free() will take care of this additional reference. */
1df6c8
-    fd_ref(fd);
1df6c8
-
1df6c8
     if (!open_in_progress && !unlinked) {
1df6c8
+        fd_ref(fd);
1df6c8
+
1df6c8
         STACK_UNWIND_STRICT(open, frame, 0, 0, fd, xdata);
1df6c8
 
1df6c8
         if (!conf->lazy_open)
1df6c8
             ob_fd_wake(this, fd, NULL);
1df6c8
+
1df6c8
+        fd_unref(fd);
1df6c8
     } else {
1df6c8
         ob_fd_free(ob_fd);
1df6c8
         STACK_WIND(frame, default_open_cbk, FIRST_CHILD(this),
1df6c8
-- 
1df6c8
1.8.3.1
1df6c8