d1681e
From 7fa60ece3fda28ca03298196374617893861a09b Mon Sep 17 00:00:00 2001
d1681e
From: Raghavendra G <rgowdapp@redhat.com>
d1681e
Date: Fri, 25 May 2018 12:27:43 +0530
d1681e
Subject: [PATCH 290/305] performance/open-behind: open pending fds before
d1681e
 permission change
d1681e
d1681e
setattr, posix-acl and selinux changes on a file can revoke permission
d1681e
to open the file after permission changes. To prevent that, make sure
d1681e
the pending fd is opened before winding down setattr or setxattr (for
d1681e
posix-acl and selinux) calls.
d1681e
d1681e
>Change-Id: Ib0b91795d286072e445190f9a1b3b1e9cd363282
d1681e
>Signed-off-by: Raghavendra G <rgowdapp@redhat.com>
d1681e
>fixes: bz#1405147
d1681e
d1681e
upstream patch: https://review.gluster.org/#/c/20084/
d1681e
BUG: 1580120
d1681e
Change-Id: Id6a2beef00a9adb0dcb2169d3966cd2a1c3c8456
d1681e
Signed-off-by: Raghavendra G <rgowdapp@redhat.com>
d1681e
Reviewed-on: https://code.engineering.redhat.com/gerrit/140095
d1681e
Tested-by: RHGS Build Bot <nigelb@redhat.com>
d1681e
Reviewed-by: Xavi Hernandez <xhernandez@redhat.com>
d1681e
---
d1681e
 xlators/performance/open-behind/src/open-behind.c | 61 ++++++++++++++++++++++-
d1681e
 1 file changed, 60 insertions(+), 1 deletion(-)
d1681e
d1681e
diff --git a/xlators/performance/open-behind/src/open-behind.c b/xlators/performance/open-behind/src/open-behind.c
d1681e
index d6dcf6f..3be35bc 100644
d1681e
--- a/xlators/performance/open-behind/src/open-behind.c
d1681e
+++ b/xlators/performance/open-behind/src/open-behind.c
d1681e
@@ -14,6 +14,7 @@
d1681e
 #include "call-stub.h"
d1681e
 #include "defaults.h"
d1681e
 #include "open-behind-messages.h"
d1681e
+#include "glusterfs-acl.h"
d1681e
 
d1681e
 typedef struct ob_conf {
d1681e
 	gf_boolean_t  use_anonymous_fd; /* use anonymous FDs wherever safe
d1681e
@@ -811,6 +812,63 @@ err:
d1681e
 	return 0;
d1681e
 }
d1681e
 
d1681e
+int32_t
d1681e
+ob_setattr (call_frame_t *frame, xlator_t *this, loc_t *loc,
d1681e
+            struct iatt *stbuf, int32_t valid,	dict_t *xdata)
d1681e
+{
d1681e
+        fd_t        *fd   = NULL;
d1681e
+	call_stub_t *stub = NULL;
d1681e
+
d1681e
+        stub = fop_setattr_stub (frame, default_setattr_resume, loc, stbuf,
d1681e
+                                 valid, xdata);
d1681e
+        if (!stub)
d1681e
+                goto err;
d1681e
+
d1681e
+        fd = fd_lookup (loc->inode, 0);
d1681e
+
d1681e
+        open_and_resume (this, fd, stub);
d1681e
+        if (fd)
d1681e
+                fd_unref (fd);
d1681e
+
d1681e
+	return 0;
d1681e
+err:
d1681e
+        STACK_UNWIND_STRICT (setattr, frame, -1, ENOMEM, NULL, NULL, NULL);
d1681e
+        return 0;
d1681e
+}
d1681e
+
d1681e
+
d1681e
+int32_t
d1681e
+ob_setxattr (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict,
d1681e
+             int32_t flags, dict_t *xdata)
d1681e
+{
d1681e
+        fd_t         *fd           = NULL;
d1681e
+	call_stub_t  *stub         = NULL;
d1681e
+        gf_boolean_t  access_xattr = _gf_false;
d1681e
+
d1681e
+        if (dict_get (dict, POSIX_ACL_DEFAULT_XATTR)
d1681e
+            || dict_get (dict, POSIX_ACL_ACCESS_XATTR)
d1681e
+            || dict_get (dict, GF_SELINUX_XATTR_KEY))
d1681e
+                access_xattr = _gf_true;
d1681e
+
d1681e
+        if (!access_xattr)
d1681e
+                return default_setxattr (frame, this, loc, dict, flags, xdata);
d1681e
+
d1681e
+        stub = fop_setxattr_stub (frame, default_setxattr_resume, loc, dict,
d1681e
+                                  flags, xdata);
d1681e
+        if (!stub)
d1681e
+                goto err;
d1681e
+
d1681e
+        fd = fd_lookup (loc->inode, 0);
d1681e
+
d1681e
+        open_and_resume (this, fd, stub);
d1681e
+        if (fd)
d1681e
+                fd_unref (fd);
d1681e
+
d1681e
+	return 0;
d1681e
+err:
d1681e
+        STACK_UNWIND_STRICT (setxattr, frame, -1, ENOMEM, NULL);
d1681e
+        return 0;
d1681e
+}
d1681e
 
d1681e
 int
d1681e
 ob_release (xlator_t *this, fd_t *fd)
d1681e
@@ -976,7 +1034,6 @@ fini (xlator_t *this)
d1681e
 	return;
d1681e
 }
d1681e
 
d1681e
-
d1681e
 struct xlator_fops fops = {
d1681e
         .open        = ob_open,
d1681e
         .readv       = ob_readv,
d1681e
@@ -986,12 +1043,14 @@ struct xlator_fops fops = {
d1681e
 	.fstat       = ob_fstat,
d1681e
 	.ftruncate   = ob_ftruncate,
d1681e
 	.fsetxattr   = ob_fsetxattr,
d1681e
+        .setxattr    = ob_setxattr,
d1681e
 	.fgetxattr   = ob_fgetxattr,
d1681e
 	.fremovexattr = ob_fremovexattr,
d1681e
 	.finodelk    = ob_finodelk,
d1681e
 	.fentrylk    = ob_fentrylk,
d1681e
 	.fxattrop    = ob_fxattrop,
d1681e
 	.fsetattr    = ob_fsetattr,
d1681e
+        .setattr     = ob_setattr,
d1681e
 	.fallocate   = ob_fallocate,
d1681e
 	.discard     = ob_discard,
d1681e
         .zerofill    = ob_zerofill,
d1681e
-- 
d1681e
1.8.3.1
d1681e