From 712735a0511bf23a1e04e790a59803155bbd8f65 Mon Sep 17 00:00:00 2001 From: Raghavendra Bhat Date: Fri, 15 May 2015 14:10:48 +0530 Subject: features/bit-rot-stub: implement mknod fop Backport of http://review.gluster.org/10790 With the absence of mknod() fop implementation in bitrot stub, further operations that trigger versioning resulted in crashes as they expect the inode context to be valid. Therefore, this patch implements mknod() following similar simantics to fops such as create(). Furthermore, bitrot stub test C program is fixed to stop lying and validate obj versions according to the versioning protocol. Change-Id: If76f252577445d1851d6c13c7e969e864e2183ef BUG: 1226139 Original-Author: Raghavendra Bhat Signed-off-by: Venky Shankar Reviewed-on: http://review.gluster.org/10987 Tested-by: NetBSD Build System Tested-by: Gluster Build System --- xlators/features/bit-rot/src/stub/bit-rot-stub.c | 51 ++++++++++++++++++++++++ 1 file changed, 51 insertions(+) (limited to 'xlators/features/bit-rot') diff --git a/xlators/features/bit-rot/src/stub/bit-rot-stub.c b/xlators/features/bit-rot/src/stub/bit-rot-stub.c index 1827f48c1c9..69e326b17e1 100644 --- a/xlators/features/bit-rot/src/stub/bit-rot-stub.c +++ b/xlators/features/bit-rot/src/stub/bit-rot-stub.c @@ -1647,6 +1647,10 @@ br_stub_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this, if (ret < 0) { ret = br_stub_init_inode_versions (this, fd, inode, version, _gf_true); + if (ret) { + op_ret = -1; + op_errno = EINVAL; + } } else { ctx = (br_stub_inode_ctx_t *)(long)ctx_addr; ret = br_stub_add_fd_to_inode (this, fd, ctx); @@ -1679,6 +1683,52 @@ unwind: return 0; } +int +br_stub_mknod_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int op_ret, int op_errno, inode_t *inode, + struct iatt *stbuf, struct iatt *preparent, + struct iatt *postparent, dict_t *xdata) +{ + int32_t ret = -1; + unsigned long version = BITROT_DEFAULT_CURRENT_VERSION; + + if (op_ret < 0) + goto unwind; + + ret = br_stub_init_inode_versions (this, NULL, inode, version, + _gf_true); + /** + * Like lookup, if init_inode_versions fail, return EINVAL + */ + if (ret) { + op_ret = -1; + op_errno = EINVAL; + } + +unwind: + STACK_UNWIND_STRICT (mknod, frame, op_ret, op_errno, + inode, stbuf, preparent, postparent, xdata); + return 0; +} + +int +br_stub_mknod (call_frame_t *frame, xlator_t *this, + loc_t *loc, mode_t mode, dev_t dev, mode_t umask, dict_t *xdata) +{ + GF_VALIDATE_OR_GOTO ("bit-rot-stub", this, unwind); + GF_VALIDATE_OR_GOTO (this->name, loc, unwind); + GF_VALIDATE_OR_GOTO (this->name, loc->inode, unwind); + + STACK_WIND (frame, br_stub_mknod_cbk, FIRST_CHILD (this), + FIRST_CHILD (this)->fops->mknod, + loc, mode, dev, umask, xdata); + return 0; +unwind: + STACK_UNWIND_STRICT (mknod, frame, -1, EINVAL, NULL, NULL, NULL, + NULL, NULL); + return 0; +} + /** }}} */ static inline int32_t @@ -2144,6 +2194,7 @@ struct xlator_fops fops = { .writev = br_stub_writev, .truncate = br_stub_truncate, .ftruncate = br_stub_ftruncate, + .mknod = br_stub_mknod, }; struct xlator_cbks cbks = { -- cgit