summaryrefslogtreecommitdiffstats
path: root/xlators/protocol/server
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/protocol/server')
-rw-r--r--xlators/protocol/server/src/server-handshake.c9
-rw-r--r--xlators/protocol/server/src/server.c63
-rw-r--r--xlators/protocol/server/src/server.h3
-rw-r--r--xlators/protocol/server/src/server3_1-fops.c132
4 files changed, 131 insertions, 76 deletions
diff --git a/xlators/protocol/server/src/server-handshake.c b/xlators/protocol/server/src/server-handshake.c
index fc22fffe4f0..694853417d6 100644
--- a/xlators/protocol/server/src/server-handshake.c
+++ b/xlators/protocol/server/src/server-handshake.c
@@ -326,7 +326,8 @@ fail:
rsp.op_ret = ret;
server_submit_reply (NULL, req, &rsp, NULL, 0, NULL,
- (gfs_serialize_t)xdr_serialize_getspec_rsp);
+ (gfs_serialize_t)xdr_serialize_getspec_rsp,
+ (xdrproc_t)xdr_gf_getspec_rsp);
return 0;
}
@@ -620,7 +621,8 @@ fail:
rsp.op_errno = gf_errno_to_error (op_errno);
server_submit_reply (NULL, req, &rsp, NULL, 0, NULL,
- (gfs_serialize_t)xdr_serialize_setvolume_rsp);
+ (gfs_serialize_t)xdr_serialize_setvolume_rsp,
+ (xdrproc_t)xdr_gf_setvolume_rsp);
if (args.dict.dict_val)
@@ -650,7 +652,8 @@ server_ping (rpcsvc_request_t *req)
rsp.op_ret = 0;
server_submit_reply (NULL, req, &rsp, NULL, 0, NULL,
- xdr_serialize_common_rsp);
+ xdr_serialize_common_rsp,
+ (xdrproc_t)xdr_gf_common_rsp);
return 0;
}
diff --git a/xlators/protocol/server/src/server.c b/xlators/protocol/server/src/server.c
index 28df5c5dcc8..32ecc4d8c9b 100644
--- a/xlators/protocol/server/src/server.c
+++ b/xlators/protocol/server/src/server.c
@@ -38,39 +38,46 @@
struct iobuf *
gfs_serialize_reply (rpcsvc_request_t *req, void *arg, gfs_serialize_t sfunc,
- struct iovec *outmsg)
+ struct iovec *outmsg, xdrproc_t xdrproc)
{
- struct iobuf *iob = NULL;
- ssize_t retlen = -1;
+ struct iobuf *iob = NULL;
+ ssize_t retlen = 0;
+ ssize_t xdr_size = 0;
GF_VALIDATE_OR_GOTO ("server", req, ret);
/* First, get the io buffer into which the reply in arg will
* be serialized.
*/
- iob = iobuf_get (req->svc->ctx->iobuf_pool);
- if (!iob) {
- gf_log_callingfn ("", GF_LOG_ERROR, "Failed to get iobuf");
- goto ret;
- }
-
- iobuf_to_iovec (iob, outmsg);
- /* Use the given serializer to translate the give C structure in arg
- * to XDR format which will be written into the buffer in outmsg.
- */
- /* retlen is used to received the error since size_t is unsigned and we
- * need -1 for error notification during encoding.
- */
- retlen = sfunc (*outmsg, arg);
- if (retlen == -1) {
- /* Failed to Encode 'GlusterFS' msg in RPC is not exactly
- failure of RPC return values.. client should get
- notified about this, so there are no missing frames */
- gf_log_callingfn ("", GF_LOG_ERROR, "Failed to encode message");
- req->rpc_err = GARBAGE_ARGS;
- retlen = 0;
+ if (arg && xdrproc) {
+ xdr_size = xdr_sizeof (xdrproc, arg);
+ iob = iobuf_get2 (req->svc->ctx->iobuf_pool, xdr_size);
+ if (!iob) {
+ gf_log_callingfn (THIS->name, GF_LOG_ERROR,
+ "Failed to get iobuf");
+ goto ret;
+ };
+
+ iobuf_to_iovec (iob, outmsg);
+ /* Use the given serializer to translate the give C structure in arg
+ * to XDR format which will be written into the buffer in outmsg.
+ */
+ /* retlen is used to received the error since size_t is unsigned and we
+ * need -1 for error notification during encoding.
+ */
+ retlen = -1;
+ if (sfunc) {
+ retlen = sfunc (*outmsg, arg);
+ if (retlen == -1) {
+ /* Failed to Encode 'GlusterFS' msg in RPC is not exactly
+ failure of RPC return values.. client should get
+ notified about this, so there are no missing frames */
+ gf_log_callingfn ("", GF_LOG_ERROR, "Failed to encode message");
+ req->rpc_err = GARBAGE_ARGS;
+ retlen = 0;
+ }
+ }
}
-
outmsg->iov_len = retlen;
ret:
if (retlen == -1) {
@@ -83,11 +90,11 @@ ret:
-/* Generic reply function for NFSv3 specific replies. */
int
server_submit_reply (call_frame_t *frame, rpcsvc_request_t *req, void *arg,
struct iovec *payload, int payloadcount,
- struct iobref *iobref, gfs_serialize_t sfunc)
+ struct iobref *iobref, gfs_serialize_t sfunc,
+ xdrproc_t xdrproc)
{
struct iobuf *iob = NULL;
int ret = -1;
@@ -111,7 +118,7 @@ server_submit_reply (call_frame_t *frame, rpcsvc_request_t *req, void *arg,
new_iobref = 1;
}
- iob = gfs_serialize_reply (req, arg, sfunc, &rsp);
+ iob = gfs_serialize_reply (req, arg, sfunc, &rsp, xdrproc);
if (!iob) {
gf_log ("", GF_LOG_ERROR, "Failed to serialize reply");
goto ret;
diff --git a/xlators/protocol/server/src/server.h b/xlators/protocol/server/src/server.h
index 0ca8b29f363..9c7459fb1ad 100644
--- a/xlators/protocol/server/src/server.h
+++ b/xlators/protocol/server/src/server.h
@@ -198,7 +198,8 @@ typedef ssize_t (*gfs_serialize_t) (struct iovec outmsg, void *args);
int
server_submit_reply (call_frame_t *frame, rpcsvc_request_t *req, void *arg,
struct iovec *payload, int payloadcount,
- struct iobref *iobref, gfs_serialize_t sfunc);
+ struct iobref *iobref, gfs_serialize_t sfunc,
+ xdrproc_t xdrproc);
int xdr_to_glusterfs_req (rpcsvc_request_t *req, void *arg,
gfs_serialize_t sfunc);
diff --git a/xlators/protocol/server/src/server3_1-fops.c b/xlators/protocol/server/src/server3_1-fops.c
index 0eaefab4c4a..a4666343eb0 100644
--- a/xlators/protocol/server/src/server3_1-fops.c
+++ b/xlators/protocol/server/src/server3_1-fops.c
@@ -55,7 +55,8 @@ server_statfs_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
}
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_statfs_rsp);
+ xdr_serialize_statfs_rsp,
+ (xdrproc_t)xdr_gfs3_statfs_rsp);
return 0;
}
@@ -170,7 +171,8 @@ out:
}
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- (gfs_serialize_t)xdr_serialize_lookup_rsp);
+ (gfs_serialize_t)xdr_serialize_lookup_rsp,
+ (xdrproc_t)xdr_gfs3_lookup_rsp);
if (rsp.dict.dict_val)
GF_FREE (rsp.dict.dict_val);
@@ -221,7 +223,8 @@ server_lk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
}
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_lk_rsp);
+ xdr_serialize_lk_rsp,
+ (xdrproc_t)xdr_gfs3_lk_rsp);
return 0;
}
@@ -261,7 +264,8 @@ server_inodelk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
}
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_common_rsp);
+ xdr_serialize_common_rsp,
+ (xdrproc_t)xdr_gf_common_rsp);
return 0;
}
@@ -303,7 +307,8 @@ server_finodelk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
}
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_common_rsp);
+ xdr_serialize_common_rsp,
+ (xdrproc_t)xdr_gf_common_rsp);
return 0;
}
@@ -342,7 +347,8 @@ server_entrylk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
}
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_common_rsp);
+ xdr_serialize_common_rsp,
+ (xdrproc_t)xdr_gf_common_rsp);
return 0;
}
@@ -381,7 +387,8 @@ server_fentrylk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
}
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_common_rsp);
+ xdr_serialize_common_rsp,
+ (xdrproc_t)xdr_gf_common_rsp);
return 0;
}
@@ -409,7 +416,8 @@ server_access_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
op_ret, strerror (op_errno));
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_common_rsp);
+ xdr_serialize_common_rsp,
+ (xdrproc_t)xdr_gf_common_rsp);
return 0;
}
@@ -451,7 +459,8 @@ server_rmdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
}
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_rmdir_rsp);
+ xdr_serialize_rmdir_rsp,
+ (xdrproc_t)xdr_gfs3_rmdir_rsp);
return 0;
}
@@ -490,7 +499,8 @@ server_mkdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
}
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_mkdir_rsp);
+ xdr_serialize_mkdir_rsp,
+ (xdrproc_t)xdr_gfs3_mkdir_rsp);
return 0;
}
@@ -529,7 +539,8 @@ server_mknod_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
}
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_mknod_rsp);
+ xdr_serialize_mknod_rsp,
+ (xdrproc_t)xdr_gfs3_mknod_rsp);
return 0;
@@ -559,7 +570,8 @@ server_fsyncdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
}
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_common_rsp);
+ xdr_serialize_common_rsp,
+ (xdrproc_t)xdr_gf_common_rsp);
return 0;
}
@@ -596,7 +608,8 @@ unwind:
rsp.op_errno = gf_errno_to_error (op_errno);
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_readdir_rsp);
+ xdr_serialize_readdir_rsp,
+ (xdrproc_t)xdr_gfs3_readdir_rsp);
readdir_rsp_cleanup (&rsp);
@@ -617,7 +630,8 @@ server_releasedir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
rsp.op_errno = gf_errno_to_error (op_errno);
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_common_rsp);
+ xdr_serialize_common_rsp,
+ (xdrproc_t)xdr_gf_common_rsp);
return 0;
}
@@ -655,7 +669,8 @@ server_opendir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
rsp.op_errno = gf_errno_to_error (op_errno);
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_opendir_rsp);
+ xdr_serialize_opendir_rsp,
+ (xdrproc_t)xdr_gfs3_opendir_rsp);
return 0;
}
@@ -681,7 +696,8 @@ server_removexattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
op_ret, strerror (op_errno));
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_common_rsp);
+ xdr_serialize_common_rsp,
+ (xdrproc_t)xdr_gf_common_rsp);
return 0;
}
@@ -742,7 +758,8 @@ out:
state->name, op_ret, strerror (op_errno));
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_getxattr_rsp);
+ xdr_serialize_getxattr_rsp,
+ (xdrproc_t)xdr_gfs3_getxattr_rsp);
if (rsp.dict.dict_val)
GF_FREE (rsp.dict.dict_val);
@@ -806,7 +823,8 @@ out:
state->name, op_ret, strerror (op_errno));
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_fgetxattr_rsp);
+ xdr_serialize_fgetxattr_rsp,
+ (xdrproc_t)xdr_gfs3_fgetxattr_rsp);
if (rsp.dict.dict_val)
GF_FREE (rsp.dict.dict_val);
@@ -835,7 +853,8 @@ server_setxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
state->loc.inode ? state->loc.inode->ino : 0,
op_ret, strerror (op_errno));
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_common_rsp);
+ xdr_serialize_common_rsp,
+ (xdrproc_t)xdr_gf_common_rsp);
return 0;
}
@@ -863,7 +882,8 @@ server_fsetxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
strerror (op_errno));
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_common_rsp);
+ xdr_serialize_common_rsp,
+ (xdrproc_t)xdr_gf_common_rsp);
return 0;
}
@@ -917,7 +937,8 @@ server_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
op_ret, strerror (op_errno));
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_rename_rsp);
+ xdr_serialize_rename_rsp,
+ (xdrproc_t)xdr_gfs3_rename_rsp);
return 0;
}
@@ -966,7 +987,8 @@ server_unlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
}
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_unlink_rsp);
+ xdr_serialize_unlink_rsp,
+ (xdrproc_t)xdr_gfs3_unlink_rsp);
return 0;
}
@@ -1006,7 +1028,8 @@ server_symlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
}
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_symlink_rsp);
+ xdr_serialize_symlink_rsp,
+ (xdrproc_t)xdr_gfs3_symlink_rsp);
return 0;
}
@@ -1051,7 +1074,8 @@ server_link_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
op_ret, strerror (op_errno));
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_link_rsp);
+ xdr_serialize_link_rsp,
+ (xdrproc_t)xdr_gfs3_link_rsp);
return 0;
}
@@ -1084,7 +1108,8 @@ server_truncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
}
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_truncate_rsp);
+ xdr_serialize_truncate_rsp,
+ (xdrproc_t)xdr_gfs3_truncate_rsp);
return 0;
}
@@ -1115,7 +1140,8 @@ server_fstat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
}
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_fstat_rsp);
+ xdr_serialize_fstat_rsp,
+ (xdrproc_t)xdr_gfs3_fstat_rsp);
return 0;
}
@@ -1148,7 +1174,8 @@ server_ftruncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
}
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_ftruncate_rsp);
+ xdr_serialize_ftruncate_rsp,
+ (xdrproc_t)xdr_gfs3_ftruncate_rsp);
return 0;
}
@@ -1176,7 +1203,8 @@ server_flush_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
}
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_common_rsp);
+ xdr_serialize_common_rsp,
+ (xdrproc_t)xdr_gf_common_rsp);
return 0;
@@ -1210,7 +1238,8 @@ server_fsync_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
}
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_fsync_rsp);
+ xdr_serialize_fsync_rsp,
+ (xdrproc_t)xdr_gfs3_fsync_rsp);
return 0;
}
@@ -1242,7 +1271,8 @@ server_writev_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
}
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_writev_rsp);
+ xdr_serialize_writev_rsp,
+ (xdrproc_t)xdr_gfs3_write_rsp);
return 0;
}
@@ -1276,7 +1306,8 @@ server_readv_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
}
server_submit_reply (frame, req, &rsp, vector, count, iobref,
- xdr_serialize_readv_rsp);
+ xdr_serialize_readv_rsp,
+ (xdrproc_t)xdr_gfs3_read_rsp);
return 0;
}
@@ -1310,7 +1341,8 @@ server_rchecksum_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
strerror (op_errno));
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_rchecksum_rsp);
+ xdr_serialize_rchecksum_rsp,
+ (xdrproc_t)xdr_gfs3_rchecksum_rsp);
return 0;
}
@@ -1348,7 +1380,8 @@ server_open_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
rsp.op_errno = gf_errno_to_error (op_errno);
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_open_rsp);
+ xdr_serialize_open_rsp,
+ (xdrproc_t)xdr_gfs3_open_rsp);
return 0;
}
@@ -1426,7 +1459,8 @@ out:
rsp.op_errno = gf_errno_to_error (op_errno);
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_create_rsp);
+ xdr_serialize_create_rsp,
+ (xdrproc_t)xdr_gfs3_create_rsp);
return 0;
}
@@ -1463,7 +1497,8 @@ server_readlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
rsp.path = "";
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_readlink_rsp);
+ xdr_serialize_readlink_rsp,
+ (xdrproc_t)xdr_gfs3_readlink_rsp);
return 0;
}
@@ -1494,7 +1529,8 @@ server_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
}
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_stat_rsp);
+ xdr_serialize_stat_rsp,
+ (xdrproc_t)xdr_gfs3_stat_rsp);
return 0;
}
@@ -1528,7 +1564,8 @@ server_setattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
}
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_setattr_rsp);
+ xdr_serialize_setattr_rsp,
+ (xdrproc_t)xdr_gfs3_setattr_rsp);
return 0;
}
@@ -1562,7 +1599,8 @@ server_fsetattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
rsp.op_errno = gf_errno_to_error (op_errno);
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_fsetattr_rsp);
+ xdr_serialize_fsetattr_rsp,
+ (xdrproc_t)xdr_gfs3_fsetattr_rsp);
return 0;
}
@@ -1632,7 +1670,8 @@ out:
op_ret, strerror (op_errno));
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_xattrop_rsp);
+ xdr_serialize_xattrop_rsp,
+ (xdrproc_t)xdr_gfs3_xattrop_rsp);
if (rsp.dict.dict_val)
GF_FREE (rsp.dict.dict_val);
@@ -1706,7 +1745,8 @@ out:
strerror (op_errno));
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_fxattrop_rsp);
+ xdr_serialize_fxattrop_rsp,
+ (xdrproc_t)xdr_gfs3_fxattrop_rsp);
if (rsp.dict.dict_val)
GF_FREE (rsp.dict.dict_val);
@@ -1749,7 +1789,8 @@ out:
rsp.op_errno = gf_errno_to_error (op_errno);
server_submit_reply (frame, req, &rsp, NULL, 0, NULL,
- xdr_serialize_readdirp_rsp);
+ xdr_serialize_readdirp_rsp,
+ (xdrproc_t)xdr_gfs3_readdirp_rsp);
readdirp_rsp_cleanup (&rsp);
@@ -3158,7 +3199,8 @@ server_release (rpcsvc_request_t *req)
gf_fd_put (conn->fdtable, args.fd);
server_submit_reply (NULL, req, &rsp, NULL, 0, NULL,
- xdr_serialize_common_rsp);
+ xdr_serialize_common_rsp,
+ (xdrproc_t)xdr_gf_common_rsp);
ret = 0;
out:
return ret;
@@ -3182,7 +3224,8 @@ server_releasedir (rpcsvc_request_t *req)
gf_fd_put (conn->fdtable, args.fd);
server_submit_reply (NULL, req, &rsp, NULL, 0, NULL,
- xdr_serialize_common_rsp);
+ xdr_serialize_common_rsp,
+ (xdrproc_t)xdr_gf_common_rsp);
ret = 0;
out:
return ret;
@@ -5017,7 +5060,8 @@ server_null (rpcsvc_request_t *req)
rsp.op_ret = 0;
server_submit_reply (NULL, req, &rsp, NULL, 0, NULL,
- (gfs_serialize_t)xdr_serialize_common_rsp);
+ (gfs_serialize_t)xdr_serialize_common_rsp,
+ (xdrproc_t)xdr_gf_common_rsp);
return 0;
}