|
|
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 |
|