From 02e1ca67027e6fbbc9e854ac9def183745488022 Mon Sep 17 00:00:00 2001 From: Pranith Kumar K Date: Mon, 14 Mar 2016 10:59:38 +0530 Subject: dht/afr/client/posix: Fail mkdir without gfid-req Do not allow directory creations without gfids as after the directories are created, operations on them fail anyway. So it is better to fail mkdir. >BUG: 1317361 >Change-Id: I8f8e3b38bbded1960b7215bac0432500f7e78038 >Signed-off-by: Pranith Kumar K >Reviewed-on: http://review.gluster.org/13690 >Smoke: Gluster Build System >Reviewed-by: Krutika Dhananjay >CentOS-regression: Gluster Build System >NetBSD-regression: NetBSD Build System >(cherry picked from commit b246b07896fefb261c9fb07f3f29f0d03b81b88d) Change-Id: Ibf9c84add7265e3e1755a37958e1de38307624b2 BUG: 1332372 Signed-off-by: Pranith Kumar K Reviewed-on: http://review.gluster.org/14188 Smoke: Gluster Build System NetBSD-regression: NetBSD Build System CentOS-regression: Gluster Build System --- xlators/cluster/afr/src/afr-dir-write.c | 18 ++++++++++++------ xlators/cluster/dht/src/dht-common.c | 8 ++++++++ xlators/protocol/client/src/client-messages.h | 10 +++++++++- xlators/protocol/client/src/client-rpc-fops.c | 9 +++++++++ xlators/protocol/server/src/server-rpc-fops.c | 7 +++++-- xlators/storage/posix/src/posix.c | 10 +++++++++- 6 files changed, 52 insertions(+), 10 deletions(-) diff --git a/xlators/cluster/afr/src/afr-dir-write.c b/xlators/cluster/afr/src/afr-dir-write.c index 921b73c295d..bd2427696a5 100644 --- a/xlators/cluster/afr/src/afr-dir-write.c +++ b/xlators/cluster/afr/src/afr-dir-write.c @@ -752,13 +752,19 @@ afr_mkdir (call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode, local->cont.mkdir.mode = mode; local->umask = umask; - if (xdata) - local->xdata_req = dict_copy_with_ref (xdata, NULL); - else - local->xdata_req = dict_new (); + if (!xdata || !dict_get (xdata, "gfid-req")) { + op_errno = EPERM; + gf_msg_callingfn (this->name, GF_LOG_WARNING, op_errno, + AFR_MSG_GFID_NULL, "mkdir: %s is received " + "without gfid-req %p", loc->path, xdata); + goto out; + } - if (!local->xdata_req) - goto out; + local->xdata_req = dict_copy_with_ref (xdata, NULL); + if (!local->xdata_req) { + op_errno = ENOMEM; + goto out; + } local->op = GF_FOP_MKDIR; local->transaction.wind = afr_mkdir_wind; diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index 0cad65dee26..b40962ef690 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -7348,6 +7348,14 @@ dht_mkdir (call_frame_t *frame, xlator_t *this, conf = this->private; + if (!params || !dict_get (params, "gfid-req")) { + op_errno = EPERM; + gf_msg_callingfn (this->name, GF_LOG_WARNING, op_errno, + DHT_MSG_GFID_NULL, "mkdir: %s is received " + "without gfid-req %p", loc->path, params); + goto err; + } + dht_get_du_info (frame, this, loc); local = dht_local_init (frame, loc, NULL, GF_FOP_MKDIR); diff --git a/xlators/protocol/client/src/client-messages.h b/xlators/protocol/client/src/client-messages.h index 923917643bf..ea7727e8d1b 100644 --- a/xlators/protocol/client/src/client-messages.h +++ b/xlators/protocol/client/src/client-messages.h @@ -45,7 +45,7 @@ */ #define GLFS_PC_BASE GLFS_MSGID_COMP_PC -#define GLFS_PC_NUM_MESSAGES 63 +#define GLFS_PC_NUM_MESSAGES 65 #define GLFS_PC_MSGID_END (GLFS_PC_BASE + GLFS_NUM_MESSAGES + 1) /* Messages with message IDs */ #define glfs_msg_start_x GLFS_PC_BASE, "Invalid: Start of messages" @@ -618,6 +618,14 @@ * */ +/*! + * @messageid + * @diagnosis + * @recommendedaction + * + */ +#define PC_MSG_GFID_NULL (GLFS_PC_BASE + 65) + /*------------*/ #define glfs_msg_end_x GLFS_MSGID_END, "Invalid: End of messages" diff --git a/xlators/protocol/client/src/client-rpc-fops.c b/xlators/protocol/client/src/client-rpc-fops.c index 2e2851685fa..19b7cf6b0e9 100644 --- a/xlators/protocol/client/src/client-rpc-fops.c +++ b/xlators/protocol/client/src/client-rpc-fops.c @@ -4065,6 +4065,15 @@ client3_3_mkdir (call_frame_t *frame, xlator_t *this, args = data; + if (!args->xdata || !dict_get (args->xdata, "gfid-req")) { + op_errno = EPERM; + gf_msg_callingfn (this->name, GF_LOG_WARNING, op_errno, + PC_MSG_GFID_NULL, "mkdir: %s is received " + "without gfid-req %p", args->loc->path, + args->xdata); + goto unwind; + } + local = mem_get0 (this->local_pool); if (!local) { op_errno = ENOMEM; diff --git a/xlators/protocol/server/src/server-rpc-fops.c b/xlators/protocol/server/src/server-rpc-fops.c index 25ffc0d9e73..954374b6011 100644 --- a/xlators/protocol/server/src/server-rpc-fops.c +++ b/xlators/protocol/server/src/server-rpc-fops.c @@ -496,20 +496,23 @@ server_mkdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, server_state_t *state = NULL; inode_t *link_inode = NULL; rpcsvc_request_t *req = NULL; + client_t *client = NULL; GF_PROTOCOL_DICT_SERIALIZE (this, xdata, &rsp.xdata.xdata_val, rsp.xdata.xdata_len, op_errno, out); state = CALL_STATE (frame); + client = frame->root->client; if (op_ret < 0) { gf_msg (this->name, fop_log_level (GF_FOP_MKDIR, op_errno), op_errno, PS_MSG_DIR_INFO, - "%"PRId64": MKDIR %s (%s/%s) ==> (%s)", + "%"PRId64": MKDIR %s (%s/%s) client: %s", frame->root->unique, (state->loc.path) ? state->loc.path : "", uuid_utoa (state->resolve.pargfid), - state->resolve.bname, strerror (op_errno)); + state->resolve.bname, + (!client || !client->client_uid) ? "-":client->client_uid); goto out; } diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c index 3197ee0ddde..c2644116eb1 100644 --- a/xlators/storage/posix/src/posix.c +++ b/xlators/storage/posix/src/posix.c @@ -1392,7 +1392,8 @@ posix_mkdir (call_frame_t *frame, xlator_t *this, SET_FS_ID (frame->root->uid, gid); - op_ret = dict_get_ptr (xdata, "gfid-req", &uuid_req); + if (xdata) + op_ret = dict_get_ptr (xdata, "gfid-req", &uuid_req); if (uuid_req && !gf_uuid_is_null (uuid_req)) { op_ret = posix_istat (this, uuid_req, NULL, &stbuf); if ((op_ret == 0) && IA_ISDIR (stbuf.ia_type)) { @@ -1413,6 +1414,13 @@ posix_mkdir (call_frame_t *frame, xlator_t *this, uuid_utoa (uuid_req), gfid_path ? gfid_path : ""); } + } else if (!uuid_req && frame->root->pid != GF_SERVER_PID_TRASH) { + op_ret = -1; + op_errno = EPERM; + gf_msg_callingfn (this->name, GF_LOG_WARNING, op_errno, + P_MSG_NULL_GFID, "mkdir (%s): is issued without " + "gfid-req %p", loc->path, xdata); + goto out; } op_ret = posix_pstat (this, loc->pargfid, par_path, &preparent); -- cgit