diff options
Diffstat (limited to 'xlators')
| -rw-r--r-- | xlators/protocol/client/src/client3_1-fops.c | 350 | ||||
| -rw-r--r-- | xlators/protocol/server/src/server3_1-fops.c | 557 | 
2 files changed, 200 insertions, 707 deletions
diff --git a/xlators/protocol/client/src/client3_1-fops.c b/xlators/protocol/client/src/client3_1-fops.c index e28079ff7..fe928aecd 100644 --- a/xlators/protocol/client/src/client3_1-fops.c +++ b/xlators/protocol/client/src/client3_1-fops.c @@ -836,9 +836,6 @@ client3_1_getxattr_cbk (struct rpc_req *req, struct iovec *iov, int count,  {          call_frame_t      *frame    = NULL;          dict_t            *dict     = NULL; -        char              *buf      = NULL; -        int                dict_len = 0; -        int                op_ret   = 0;          int                op_errno = EINVAL;          gfs3_getxattr_rsp  rsp      = {0,};          int                ret      = 0; @@ -852,7 +849,7 @@ client3_1_getxattr_cbk (struct rpc_req *req, struct iovec *iov, int count,          frame->local = NULL;          if (-1 == req->rpc_status) { -                op_ret   = -1; +                rsp.op_ret = -1;                  op_errno = ENOTCONN;                  goto out;          } @@ -860,35 +857,17 @@ client3_1_getxattr_cbk (struct rpc_req *req, struct iovec *iov, int count,          ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gfs3_getxattr_rsp);          if (ret < 0) {                  gf_log (this->name, GF_LOG_ERROR, "XDR decoding failed"); -                op_ret   = -1; +                rsp.op_ret = -1;                  op_errno = EINVAL;                  goto out;          }          op_errno = gf_error_to_errno (rsp.op_errno); -        op_ret = rsp.op_ret; -        if (-1 != op_ret) { -                op_ret = -1; -                dict_len = rsp.dict.dict_len; - -                if (dict_len > 0) { -                        dict = dict_new(); -                        buf = memdup (rsp.dict.dict_val, rsp.dict.dict_len); - -                        GF_VALIDATE_OR_GOTO (frame->this->name, dict, out); -                        GF_VALIDATE_OR_GOTO (frame->this->name, buf, out); - -                        ret = dict_unserialize (buf, dict_len, &dict); -                        if (ret < 0) { -                                gf_log (frame->this->name, GF_LOG_WARNING, -                                        "failed to unserialize xattr dict"); -                                op_errno = EINVAL; -                                goto out; -                        } -                        dict->extra_free = buf; -                        buf = NULL; -                } -                op_ret = 0; +        if (-1 != rsp.op_ret) { +                GF_PROTOCOL_DICT_UNSERIALIZE (frame->this, dict, +                                              (rsp.dict.dict_val), +                                              (rsp.dict.dict_len), rsp.op_ret, +                                              op_errno, out);          }  out: @@ -898,7 +877,7 @@ out:                          strerror (op_errno),                          (local) ? local->loc.path : "--");          } -        STACK_UNWIND_STRICT (getxattr, frame, op_ret, op_errno, dict); +        STACK_UNWIND_STRICT (getxattr, frame, rsp.op_ret, op_errno, dict);          if (rsp.dict.dict_val) {                  /* don't use GF_FREE, this memory was allocated by libc @@ -907,9 +886,6 @@ out:                  rsp.dict.dict_val = NULL;          } -        if (buf) -                GF_FREE (buf); -          if (dict)                  dict_unref (dict); @@ -923,12 +899,9 @@ client3_1_fgetxattr_cbk (struct rpc_req *req, struct iovec *iov, int count,                           void *myframe)  {          call_frame_t       *frame    = NULL; -        char               *buf      = NULL;          dict_t             *dict     = NULL;          gfs3_fgetxattr_rsp  rsp      = {0,};          int                 ret      = 0; -        int                 dict_len = 0; -        int                 op_ret   = 0;          int                 op_errno = EINVAL;          clnt_local_t     *local    = NULL;          xlator_t         *this       = NULL; @@ -940,41 +913,24 @@ client3_1_fgetxattr_cbk (struct rpc_req *req, struct iovec *iov, int count,          frame->local = NULL;          if (-1 == req->rpc_status) { -                op_ret   = -1; +                rsp.op_ret = -1;                  op_errno = ENOTCONN;                  goto out;          }          ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gfs3_fgetxattr_rsp);          if (ret < 0) {                  gf_log (this->name, GF_LOG_ERROR, "XDR decoding failed"); -                op_ret   = -1; +                rsp.op_ret = -1;                  op_errno = EINVAL;                  goto out;          }          op_errno = gf_error_to_errno (rsp.op_errno); -        op_ret = rsp.op_ret; -        if (-1 != op_ret) { -                op_ret = -1; -                dict_len = rsp.dict.dict_len; - -                if (dict_len > 0) { -                        dict = dict_new(); -                        GF_VALIDATE_OR_GOTO (frame->this->name, dict, out); -                        buf = memdup (rsp.dict.dict_val, rsp.dict.dict_len); -                        GF_VALIDATE_OR_GOTO (frame->this->name, buf, out); - -                        ret = dict_unserialize (buf, dict_len, &dict); -                        if (ret < 0) { -                                gf_log (frame->this->name, GF_LOG_WARNING, -                                        "failed to unserialize xattr dict"); -                                op_errno = EINVAL; -                                goto out; -                        } -                        dict->extra_free = buf; -                        buf = NULL; -                } -                op_ret = 0; +        if (-1 != rsp.op_ret) { +                GF_PROTOCOL_DICT_UNSERIALIZE (frame->this, dict, +                                              (rsp.dict.dict_val), +                                              (rsp.dict.dict_len), rsp.op_ret, +                                              op_errno, out);          }  out:          if (rsp.op_ret == -1) { @@ -982,7 +938,7 @@ out:                          "remote operation failed: %s",                          strerror (op_errno));          } -        STACK_UNWIND_STRICT (fgetxattr, frame, op_ret, op_errno, dict); +        STACK_UNWIND_STRICT (fgetxattr, frame, rsp.op_ret, op_errno, dict);          if (rsp.dict.dict_val) {                  /* don't use GF_FREE, this memory was allocated by libc                   */ @@ -990,9 +946,6 @@ out:                  rsp.dict.dict_val = NULL;          } -        if (buf) -                GF_FREE (buf); -          if (dict)                  dict_unref (dict); @@ -1399,11 +1352,8 @@ client3_1_xattrop_cbk (struct rpc_req *req, struct iovec *iov, int count,  {          call_frame_t     *frame    = NULL;          dict_t           *dict     = NULL; -        char             *buf      = NULL;          gfs3_xattrop_rsp  rsp      = {0,};          int               ret      = 0; -        int               op_ret   = 0; -        int               dict_len = 0;          int               op_errno = EINVAL;          clnt_local_t   *local    = NULL;          xlator_t         *this       = NULL; @@ -1415,41 +1365,24 @@ client3_1_xattrop_cbk (struct rpc_req *req, struct iovec *iov, int count,          frame->local = NULL;          if (-1 == req->rpc_status) { -                op_ret   = -1; +                rsp.op_ret = -1;                  op_errno = ENOTCONN;                  goto out;          }          ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gfs3_xattrop_rsp);          if (ret < 0) {                  gf_log (this->name, GF_LOG_ERROR, "XDR decoding failed"); -                op_ret   = -1; +                rsp.op_ret = -1;                  op_errno = EINVAL;                  goto out;          }          op_errno = rsp.op_errno; -        op_ret   = rsp.op_ret; -        if (-1 != op_ret) { -                op_ret = -1; -                dict_len = rsp.dict.dict_len; - -                if (dict_len > 0) { -                        dict = dict_new(); -                        GF_VALIDATE_OR_GOTO (frame->this->name, dict, out); - -                        buf = memdup (rsp.dict.dict_val, rsp.dict.dict_len); -                        GF_VALIDATE_OR_GOTO (frame->this->name, buf, out); -                        op_ret = dict_unserialize (buf, dict_len, &dict); -                        if (op_ret < 0) { -                                gf_log (frame->this->name, GF_LOG_WARNING, -                                        "failed to unserialize xattr dict"); -                                op_errno = EINVAL; -                                goto out; -                        } -                        dict->extra_free = buf; -                        buf = NULL; -                } -                op_ret = 0; +        if (-1 != rsp.op_ret) { +                GF_PROTOCOL_DICT_UNSERIALIZE (frame->this, dict, +                                              (rsp.dict.dict_val), +                                              (rsp.dict.dict_len), rsp.op_ret, +                                              op_errno, out);          }  out: @@ -1460,7 +1393,7 @@ out:                          strerror (gf_error_to_errno (rsp.op_errno)),                          (local) ? local->loc.path : "--");          } -        STACK_UNWIND_STRICT (xattrop, frame, op_ret, +        STACK_UNWIND_STRICT (xattrop, frame, rsp.op_ret,                               gf_error_to_errno (op_errno), dict);          if (rsp.dict.dict_val) { @@ -1470,9 +1403,6 @@ out:                  rsp.dict.dict_val = NULL;          } -        if (buf) -                GF_FREE (buf); -          if (dict)                  dict_unref (dict); @@ -1487,11 +1417,8 @@ client3_1_fxattrop_cbk (struct rpc_req *req, struct iovec *iov, int count,  {          call_frame_t      *frame    = NULL;          dict_t            *dict     = NULL; -        char              *buf      = NULL;          gfs3_fxattrop_rsp  rsp      = {0,};          int                ret      = 0; -        int                op_ret   = 0; -        int                dict_len = 0;          int                op_errno = 0;          clnt_local_t    *local    = NULL;          xlator_t         *this       = NULL; @@ -1503,41 +1430,24 @@ client3_1_fxattrop_cbk (struct rpc_req *req, struct iovec *iov, int count,          frame->local = NULL;          if (-1 == req->rpc_status) { -                op_ret   = -1; +                rsp.op_ret   = -1;                  op_errno = ENOTCONN;                  goto out;          }          ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gfs3_fxattrop_rsp);          if (ret < 0) { -                op_ret = -1; +                rsp.op_ret = -1;                  op_errno = EINVAL;                  gf_log (this->name, GF_LOG_ERROR, "XDR decoding failed");                  goto out;          }          op_errno = rsp.op_errno; -        op_ret   = rsp.op_ret; -        if (-1 != op_ret) { -                op_ret = -1; -                dict_len = rsp.dict.dict_len; - -                if (dict_len > 0) { -                        dict = dict_new(); -                        GF_VALIDATE_OR_GOTO (frame->this->name, dict, out); - -                        buf = memdup (rsp.dict.dict_val, rsp.dict.dict_len); -                        GF_VALIDATE_OR_GOTO (frame->this->name, buf, out); -                        op_ret = dict_unserialize (buf, dict_len, &dict); -                        if (op_ret < 0) { -                                gf_log (frame->this->name, GF_LOG_WARNING, -                                        "failed to unserialize xattr dict"); -                                op_errno = EINVAL; -                                goto out; -                        } -                        dict->extra_free = buf; -                        buf = NULL; -                } -                op_ret = 0; +        if (-1 != rsp.op_ret) { +                GF_PROTOCOL_DICT_UNSERIALIZE (frame->this, dict, +                                              (rsp.dict.dict_val), +                                              (rsp.dict.dict_len), rsp.op_ret, +                                              op_errno, out);          }  out: @@ -1547,7 +1457,7 @@ out:                          "remote operation failed: %s",                          strerror (gf_error_to_errno (rsp.op_errno)));          } -        STACK_UNWIND_STRICT (fxattrop, frame, op_ret, +        STACK_UNWIND_STRICT (fxattrop, frame, rsp.op_ret,                               gf_error_to_errno (op_errno), dict);          if (rsp.dict.dict_val) { @@ -1557,9 +1467,6 @@ out:                  rsp.dict.dict_val = NULL;          } -        if (buf) -                GF_FREE (buf); -          if (dict)                  dict_unref (dict); @@ -2211,8 +2118,7 @@ client3_1_lookup_cbk (struct rpc_req *req, struct iovec *iov, int count,          int              op_errno   = EINVAL;          dict_t          *xattr      = NULL;          inode_t         *inode      = NULL; -        char            *buf        = NULL; -        xlator_t         *this       = NULL; +        xlator_t        *this       = NULL;          this = THIS; @@ -2244,25 +2150,9 @@ client3_1_lookup_cbk (struct rpc_req *req, struct iovec *iov, int count,          rsp.op_ret = -1;          gf_stat_to_iatt (&rsp.stat, &stbuf); -        if (rsp.dict.dict_len > 0) { -                xattr = dict_new(); -                GF_VALIDATE_OR_GOTO (frame->this->name, xattr, out); - -                buf = memdup (rsp.dict.dict_val, rsp.dict.dict_len); -                GF_VALIDATE_OR_GOTO (frame->this->name, buf, out); - -                ret = dict_unserialize (buf, rsp.dict.dict_len, &xattr); -                if (ret < 0) { -                        gf_log (frame->this->name, GF_LOG_WARNING, -                                "%s (%s): failed to unserialize dictionary", -                                local->loc.path, uuid_utoa (inode->gfid)); -                        op_errno = EINVAL; -                        goto out; -                } - -                xattr->extra_free = buf; -                buf = NULL; -        } +        GF_PROTOCOL_DICT_UNSERIALIZE (frame->this, xattr, (rsp.dict.dict_val), +                                      (rsp.dict.dict_len), rsp.op_ret, +                                      op_errno, out);          if ((!uuid_is_null (inode->gfid))              && (uuid_compare (stbuf.ia_gfid, inode->gfid) != 0)) { @@ -2301,11 +2191,6 @@ out:                  /* don't use GF_FREE, this memory was allocated by libc                   */                  free (rsp.dict.dict_val); -                rsp.dict.dict_val = NULL; -        } - -        if (buf) { -                GF_FREE (buf);          }          return 0; @@ -2560,7 +2445,6 @@ client3_1_lookup (call_frame_t *frame, xlator_t *this,          clnt_args_t     *args              = NULL;          gfs3_lookup_req  req               = {{0,},};          int              ret               = 0; -        size_t           dict_len          = 0;          int              op_errno          = ESTALE;          data_t          *content           = NULL;          struct iovec     vector[MAX_IOVEC] = {{0}, }; @@ -2626,15 +2510,10 @@ client3_1_lookup (call_frame_t *frame, xlator_t *this,                          rsp_iobref = NULL;                  } -                ret = dict_allocate_and_serialize (args->dict, -                                                   &req.dict.dict_val, -                                                   &dict_len); -                if (ret < 0) { -                        gf_log (this->name, GF_LOG_WARNING, -                                "failed to get serialized length of dict"); -                        op_errno = EINVAL; -                        goto unwind; -                } +                GF_PROTOCOL_DICT_SERIALIZE (this, args->dict, +                                            (&req.dict.dict_val), +                                            req.dict.dict_len, +                                            op_errno, unwind);          }          req.path          = (char *)args->loc->path; @@ -2642,7 +2521,6 @@ client3_1_lookup (call_frame_t *frame, xlator_t *this,                  req.bname         = (char *)args->loc->name;          else                  req.bname = ""; -        req.dict.dict_len = dict_len;          ret = client_submit_request (this, &req, frame, conf->fops,                                       GFS3_OP_LOOKUP, client3_1_lookup_cbk, @@ -3030,7 +2908,6 @@ client3_1_symlink (call_frame_t *frame, xlator_t *this,          clnt_conf_t      *conf     = NULL;          clnt_args_t      *args     = NULL;          gfs3_symlink_req  req      = {{0,},}; -        size_t            dict_len = 0;          int               ret      = 0;          int               op_errno = ESTALE; @@ -3061,18 +2938,9 @@ client3_1_symlink (call_frame_t *frame, xlator_t *this,          req.path     = (char *)args->loc->path;          req.linkname = (char *)args->linkname;          req.bname    = (char *)args->loc->name; -        if (args->dict) { -                ret = dict_allocate_and_serialize (args->dict, -                                                   &req.dict.dict_val, -                                                   &dict_len); -                if (ret < 0) { -                        gf_log (this->name, GF_LOG_WARNING, -                                "failed to get serialized length of dict"); -                        op_errno = EINVAL; -                        goto unwind; -                } -        } -        req.dict.dict_len = dict_len; + +        GF_PROTOCOL_DICT_SERIALIZE (this, args->dict, (&req.dict.dict_val), +                                    req.dict.dict_len, op_errno, unwind);          conf = this->private; @@ -3237,7 +3105,6 @@ client3_1_mknod (call_frame_t *frame, xlator_t *this,          clnt_conf_t    *conf     = NULL;          clnt_args_t    *args     = NULL;          gfs3_mknod_req  req      = {{0,},}; -        size_t          dict_len = 0;          int             ret      = 0;          int             op_errno = ESTALE; @@ -3271,17 +3138,11 @@ client3_1_mknod (call_frame_t *frame, xlator_t *this,          req.mode   = args->mode;          req.dev    = args->rdev;          if (args->dict) { -                ret = dict_allocate_and_serialize (args->dict, -                                                   &req.dict.dict_val, -                                                   &dict_len); -                if (ret < 0) { -                        gf_log (this->name, GF_LOG_WARNING, -                                "failed to get serialized length of dict"); -                        op_errno = EINVAL; -                        goto unwind; -                } +                GF_PROTOCOL_DICT_SERIALIZE (this, args->dict, +                                            (&req.dict.dict_val), +                                            req.dict.dict_len, +                                            op_errno, unwind);          } -        req.dict.dict_len = dict_len;          conf = this->private; @@ -3321,7 +3182,6 @@ client3_1_mkdir (call_frame_t *frame, xlator_t *this,          clnt_conf_t    *conf     = NULL;          clnt_args_t    *args     = NULL;          gfs3_mkdir_req  req      = {{0,},}; -        size_t          dict_len = 0;          int             ret      = 0;          int             op_errno = ESTALE; @@ -3354,17 +3214,11 @@ client3_1_mkdir (call_frame_t *frame, xlator_t *this,          req.bname = (char *)args->loc->name;          req.mode  = args->mode;          if (args->dict) { -                ret = dict_allocate_and_serialize (args->dict, -                                                   &req.dict.dict_val, -                                                   &dict_len); -                if (ret < 0) { -                        gf_log (this->name, GF_LOG_WARNING, -                                "failed to get serialized length of dict"); -                        op_errno = EINVAL; -                        goto unwind; -                } +                GF_PROTOCOL_DICT_SERIALIZE (this, args->dict, +                                            (&req.dict.dict_val), +                                            req.dict.dict_len, +                                            op_errno, unwind);          } -        req.dict.dict_len = dict_len;          conf = this->private; @@ -3403,7 +3257,6 @@ client3_1_create (call_frame_t *frame, xlator_t *this,          clnt_conf_t     *conf     = NULL;          clnt_args_t     *args     = NULL;          gfs3_create_req  req      = {{0,},}; -        size_t           dict_len = 0;          int              ret      = 0;          int              op_errno = ESTALE; @@ -3439,17 +3292,11 @@ client3_1_create (call_frame_t *frame, xlator_t *this,          req.mode  = args->mode;          req.flags = gf_flags_from_flags (args->flags);          if (args->dict) { -                ret = dict_allocate_and_serialize (args->dict, -                                                   &req.dict.dict_val, -                                                   &dict_len); -                if (ret < 0) { -                        gf_log (this->name, GF_LOG_WARNING, -                                "failed to get serialized length of dict"); -                        op_errno = EINVAL; -                        goto unwind; -                } +                GF_PROTOCOL_DICT_SERIALIZE (this, args->dict, +                                            (&req.dict.dict_val), +                                            req.dict.dict_len, +                                            op_errno, unwind);          } -        req.dict.dict_len = dict_len;          conf = this->private; @@ -3977,7 +3824,6 @@ client3_1_setxattr (call_frame_t *frame, xlator_t *this,          clnt_args_t       *args     = NULL;          gfs3_setxattr_req  req      = {{0,},};          int                ret      = 0; -        size_t             dict_len = 0;          int                op_errno = ESTALE;          if (!frame || !this || !data) @@ -3997,17 +3843,12 @@ client3_1_setxattr (call_frame_t *frame, xlator_t *this,                                         !uuid_is_null (*((uuid_t*)req.gfid)),                                         unwind, op_errno, EINVAL);          if (args->dict) { -                ret = dict_allocate_and_serialize (args->dict, -                                                   &req.dict.dict_val, -                                                   &dict_len); -                if (ret < 0) { -                        gf_log (this->name, GF_LOG_WARNING, -                                "failed to get serialized dict"); -                        op_errno = EINVAL; -                        goto unwind; -                } -                req.dict.dict_len = dict_len; +                GF_PROTOCOL_DICT_SERIALIZE (this, args->dict, +                                            (&req.dict.dict_val), +                                            req.dict.dict_len, +                                            op_errno, unwind);          } +          req.flags = args->flags;          req.path  = (char *)args->loc->path; @@ -4047,7 +3888,6 @@ client3_1_fsetxattr (call_frame_t *frame, xlator_t *this,          gfs3_fsetxattr_req  req      = {{0,},};          int                 op_errno = ESTALE;          int                 ret      = 0; -        size_t              dict_len = 0;          if (!frame || !this || !data)                  goto unwind; @@ -4062,15 +3902,10 @@ client3_1_fsetxattr (call_frame_t *frame, xlator_t *this,          memcpy (req.gfid, args->fd->inode->gfid, 16);          if (args->dict) { -                ret = dict_allocate_and_serialize (args->dict, -                                                   &req.dict.dict_val, -                                                   &dict_len); -                if (ret < 0) { -                        gf_log (this->name, GF_LOG_WARNING, -                                "failed to get serialized dict"); -                        goto unwind; -                } -                req.dict.dict_len = dict_len; +                GF_PROTOCOL_DICT_SERIALIZE (this, args->dict, +                                            (&req.dict.dict_val), +                                            req.dict.dict_len, +                                            op_errno, unwind);          }          ret = client_submit_request (this, &req, frame, conf->fops, @@ -4207,7 +4042,7 @@ client3_1_getxattr (call_frame_t *frame, xlator_t *this,          gfs3_getxattr_req  req        = {{0,},};          dict_t            *dict       = NULL;          int                ret        = 0; -        int32_t            op_ret     = 0; +        int32_t            op_ret     = -1;          int                op_errno   = ESTALE;          int                count      = 0;          clnt_local_t      *local      = NULL; @@ -4217,14 +4052,12 @@ client3_1_getxattr (call_frame_t *frame, xlator_t *this,          struct iovec       vector[MAX_IOVEC] = {{0}, };          if (!frame || !this || !data) { -                op_ret   = -1;                  op_errno = 0;                  goto unwind;          }          args = data;          if (!(args->loc && args->loc->inode)) { -                op_ret   = -1;                  op_errno = EINVAL;                  goto unwind;          } @@ -4232,7 +4065,6 @@ client3_1_getxattr (call_frame_t *frame, xlator_t *this,          local = GF_CALLOC (1, sizeof (*local),                             gf_client_mt_clnt_local_t);          if (!local) { -                op_ret = -1;                  op_errno = ENOMEM;                  goto unwind;          } @@ -4240,7 +4072,6 @@ client3_1_getxattr (call_frame_t *frame, xlator_t *this,          rsp_iobref = iobref_new ();          if (rsp_iobref == NULL) { -                op_ret = -1;                  op_errno = ENOMEM;                  goto unwind;          } @@ -4248,7 +4079,6 @@ client3_1_getxattr (call_frame_t *frame, xlator_t *this,                          /* TODO: what is the size we should send ? */          rsp_iobuf = iobuf_get (this->ctx->iobuf_pool);          if (rsp_iobuf == NULL) { -                op_ret = -1;                  op_errno = ENOMEM;                  goto unwind;          } @@ -4290,7 +4120,6 @@ client3_1_getxattr (call_frame_t *frame, xlator_t *this,                          if (ret) {                                  gf_log (this->name, GF_LOG_WARNING,                                          "Client dump locks failed"); -                                op_ret = -1;                                  op_errno = EINVAL;                          } @@ -4308,14 +4137,14 @@ client3_1_getxattr (call_frame_t *frame, xlator_t *this,                                       NULL, 0, local->iobref,                                       (xdrproc_t)xdr_gfs3_getxattr_req);          if (ret) { -                op_ret   = -1;                  op_errno = ENOTCONN;                  goto unwind;          }          return 0;  unwind: -        gf_log (this->name, GF_LOG_WARNING, "failed to send the fop: %s", strerror (op_errno)); +        gf_log (this->name, GF_LOG_WARNING, "failed to send the fop: %s", +                strerror (op_errno));          local = frame->local;          frame->local = NULL;          client_local_wipe (local); @@ -4343,7 +4172,6 @@ client3_1_xattrop (call_frame_t *frame, xlator_t *this,          clnt_args_t      *args       = NULL;          gfs3_xattrop_req  req        = {{0,},};          int               ret        = 0; -        size_t            dict_len   = 0;          int               op_errno   = ESTALE;          int               count      = 0;          clnt_local_t   *local      = NULL; @@ -4400,17 +4228,12 @@ client3_1_xattrop (call_frame_t *frame, xlator_t *this,                                         !uuid_is_null (*((uuid_t*)req.gfid)),                                         unwind, op_errno, EINVAL);          if (args->dict) { -                ret = dict_allocate_and_serialize (args->dict, -                                                   &req.dict.dict_val, -                                                   &dict_len); -                if (ret < 0) { -                        gf_log (this->name, GF_LOG_WARNING, -                                "failed to get serialized dict"); -                        op_errno = EINVAL; -                        goto unwind; -                } -                req.dict.dict_len = dict_len; +                GF_PROTOCOL_DICT_SERIALIZE (this, args->dict, +                                            (&req.dict.dict_val), +                                            req.dict.dict_len, +                                            op_errno, unwind);          } +          req.flags = args->flags;          req.path  = (char *)args->loc->path; @@ -4467,7 +4290,6 @@ client3_1_fxattrop (call_frame_t *frame, xlator_t *this,          gfs3_fxattrop_req  req        = {{0,},};          int                op_errno   = ESTALE;          int                ret        = 0; -        size_t             dict_len   = 0;          int                count      = 0;          clnt_local_t    *local      = NULL;          struct iobref     *rsp_iobref = NULL; @@ -4519,15 +4341,10 @@ client3_1_fxattrop (call_frame_t *frame, xlator_t *this,          rsp_iobref = NULL;          if (args->dict) { -                ret = dict_allocate_and_serialize (args->dict, -                                                   &req.dict.dict_val, -                                                   &dict_len); -                if (ret < 0) { -                        gf_log (this->name, GF_LOG_WARNING, -                                "failed to get serialized dict"); -                        goto unwind; -                } -                req.dict.dict_len = dict_len; +                GF_PROTOCOL_DICT_SERIALIZE (this, args->dict, +                                            (&req.dict.dict_val), +                                            req.dict.dict_len, +                                            op_errno, unwind);          }          ret = client_submit_request (this, &req, frame, conf->fops, @@ -5155,7 +4972,6 @@ client3_1_readdirp (call_frame_t *frame, xlator_t *this,          struct iovec     *rsphdr            = NULL;          struct iovec      vector[MAX_IOVEC] = {{0}, };          clnt_local_t     *local             = NULL; -        size_t            dict_len          = 0;          if (!frame || !this || !data)                  goto unwind; @@ -5209,16 +5025,10 @@ client3_1_readdirp (call_frame_t *frame, xlator_t *this,          memcpy (req.gfid, args->fd->inode->gfid, 16);          if (args->dict) { -                ret = dict_allocate_and_serialize (args->dict, -                                                   &req.dict.dict_val, -                                                   &dict_len); -                if (ret < 0) { -                        gf_log (this->name, GF_LOG_WARNING, -                                "failed to get serialized dict"); -                        op_errno = EINVAL; -                        goto unwind; -                } -                req.dict.dict_len = dict_len; +                GF_PROTOCOL_DICT_SERIALIZE (this, args->dict, +                                            (&req.dict.dict_val), +                                            req.dict.dict_len, +                                            op_errno, unwind);          }          ret = client_submit_request (this, &req, frame, conf->fops, diff --git a/xlators/protocol/server/src/server3_1-fops.c b/xlators/protocol/server/src/server3_1-fops.c index 79aede074..62aca398d 100644 --- a/xlators/protocol/server/src/server3_1-fops.c +++ b/xlators/protocol/server/src/server3_1-fops.c @@ -72,7 +72,6 @@ server_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          inode_t          *link_inode = NULL;          loc_t             fresh_loc  = {0,};          gfs3_lookup_rsp   rsp        = {0,}; -        int32_t           ret        = -1;          uuid_t            rootgfid   = {0,};          state = CALL_STATE(frame); @@ -94,36 +93,10 @@ server_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          }          if ((op_ret >= 0) && dict) { -                rsp.dict.dict_len = dict_serialized_length (dict); -                if (rsp.dict.dict_len < 0) { -                        gf_log (this->name, GF_LOG_ERROR, -                                "%s (%s): failed to get serialized " -                                "length of reply dict", -                                state->loc.path, uuid_utoa (state->loc.inode->gfid)); -                        op_ret   = -1; -                        op_errno = EINVAL; -                        rsp.dict.dict_len = 0; -                        goto out; -                } - -                rsp.dict.dict_val = GF_CALLOC (1, rsp.dict.dict_len, -                                               gf_server_mt_rsp_buf_t); -                if (!rsp.dict.dict_val) { -                        op_ret = -1; -                        op_errno = ENOMEM; -                        rsp.dict.dict_len = 0; -                        goto out; -                } -                ret = dict_serialize (dict, rsp.dict.dict_val); -                if (ret < 0) { -                        gf_log (this->name, GF_LOG_ERROR, -                                "%s (%s): failed to serialize reply dict", -                                state->loc.path, uuid_utoa (state->loc.inode->gfid)); -                        op_ret = -1; -                        op_errno = -ret; -                        rsp.dict.dict_len = 0; -                        goto out; -                } +                GF_PROTOCOL_DICT_SERIALIZE (this, dict, +                                            (&rsp.dict.dict_val), +                                            rsp.dict.dict_len, +                                            op_errno, out);          }          gf_stat_from_iatt (&rsp.postparent, postparent); @@ -723,50 +696,23 @@ server_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                       int32_t op_ret, int32_t op_errno, dict_t *dict)  {          gfs3_getxattr_rsp  rsp   = {0,}; -        int32_t            len   = 0; -        int32_t            ret   = -1;          rpcsvc_request_t  *req   = NULL;          server_state_t    *state = NULL;          state = CALL_STATE (frame);          if (op_ret >= 0) { -                len = dict_serialized_length (dict); -                if (len < 0) { -                        gf_log (this->name, GF_LOG_ERROR, -                                "%s (%s): failed to get serialized length of " -                                "reply dict", state->loc.path, -                                uuid_utoa (state->resolve.gfid)); -                        op_ret   = -1; -                        op_errno = EINVAL; -                        len = 0; -                        goto out; -                } - -                rsp.dict.dict_val = GF_CALLOC (len, sizeof (char), -                                               gf_server_mt_rsp_buf_t); -                if (!rsp.dict.dict_val) { -                        op_ret = -1; -                        op_errno = ENOMEM; -                        len = 0; -                        goto out; -                } -                ret = dict_serialize (dict, rsp.dict.dict_val); -                if (ret < 0) { -                        gf_log (this->name, GF_LOG_ERROR, -                                "%s (%s): failed to serialize reply dict", -                                state->loc.path, uuid_utoa (state->resolve.gfid)); -                        op_ret   = -1; -                        op_errno = EINVAL; -                        len = 0; -                } +                GF_PROTOCOL_DICT_SERIALIZE (this, dict, +                                            (&rsp.dict.dict_val), +                                            rsp.dict.dict_len, +                                            op_errno, out);          }  out:          req               = frame->local;          rsp.op_ret        = op_ret;          rsp.op_errno      = gf_errno_to_error (op_errno); -        rsp.dict.dict_len = len; +          if (op_ret == -1)                  gf_log (this->name, GF_LOG_INFO,                          "%"PRId64": GETXATTR %s (%s) ==> %"PRId32" (%s)", @@ -788,41 +734,16 @@ server_fgetxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                        int32_t op_ret, int32_t op_errno, dict_t *dict)  {          gfs3_fgetxattr_rsp  rsp   = {0,}; -        int32_t             len   = 0; -        int32_t             ret   = -1;          server_state_t     *state = NULL;          rpcsvc_request_t   *req   = NULL;          state = CALL_STATE (frame);          if (op_ret >= 0) { -                len = dict_serialized_length (dict); -                if (len < 0) { -                        gf_log (this->name, GF_LOG_ERROR, -                                "%s (%s): failed to get serialized " -                                "length of reply dict", -                                state->loc.path, uuid_utoa (state->resolve.gfid)); -                        op_ret   = -1; -                        op_errno = EINVAL; -                        len = 0; -                        goto out; -                } -                rsp.dict.dict_val = GF_CALLOC (1, len, gf_server_mt_rsp_buf_t); -                if (!rsp.dict.dict_val) { -                        op_ret = -1; -                        op_errno = ENOMEM; -                        len = 0; -                        goto out; -                } -                ret = dict_serialize (dict, rsp.dict.dict_val); -                if (ret < 0) { -                        gf_log (this->name, GF_LOG_ERROR, -                                "%s (%s): failed to serialize reply dict", -                                state->loc.path, uuid_utoa (state->resolve.gfid)); -                        op_ret = -1; -                        op_errno = -ret; -                        len = 0; -                } +                GF_PROTOCOL_DICT_SERIALIZE (this, dict, +                                            (&rsp.dict.dict_val), +                                            rsp.dict.dict_len, +                                            op_errno, out);          }  out: @@ -830,7 +751,7 @@ out:          rsp.op_ret        = op_ret;          rsp.op_errno      = gf_errno_to_error (op_errno); -        rsp.dict.dict_len = len; +          if (op_ret == -1)                  gf_log (this->name, GF_LOG_INFO,                          "%"PRId64": FGETXATTR %"PRId64" (%s) ==> %"PRId32" (%s)", @@ -1600,8 +1521,6 @@ server_xattrop_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                      int32_t op_ret, int32_t op_errno, dict_t *dict)  {          gfs3_xattrop_rsp  rsp   = {0,}; -        int32_t           len   = 0; -        int32_t           ret   = -1;          server_state_t   *state = NULL;          rpcsvc_request_t *req   = NULL; @@ -1617,42 +1536,17 @@ server_xattrop_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          }          if ((op_ret >= 0) && dict) { -                len = dict_serialized_length (dict); -                if (len < 0) { -                        gf_log (this->name, GF_LOG_ERROR, -                                "%s (%s): failed to get serialized length" -                                " for reply dict", -                                state->loc.path, -                                uuid_utoa (state->loc.inode->gfid)); -                        op_ret = -1; -                        op_errno = EINVAL; -                        len = 0; -                        goto out; -                } -                rsp.dict.dict_val = GF_CALLOC (1, len, gf_server_mt_rsp_buf_t); -                if (!rsp.dict.dict_val) { -                        op_ret = -1; -                        op_errno = ENOMEM; -                        len = 0; -                        goto out; -                } -                ret = dict_serialize (dict, rsp.dict.dict_val); -                if (ret < 0) { -                        gf_log (this->name, GF_LOG_ERROR, -                                "%s (%s): failed to serialize reply dict", -                                state->loc.path, -                                uuid_utoa (state->loc.inode->gfid)); -                        op_ret = -1; -                        op_errno = -ret; -                        len = 0; -                } +                GF_PROTOCOL_DICT_SERIALIZE (this, dict, +                                            (&rsp.dict.dict_val), +                                            rsp.dict.dict_len, +                                            op_errno, out);          }  out:          req               = frame->local;          rsp.op_ret        = op_ret;          rsp.op_errno      = gf_errno_to_error (op_errno); -        rsp.dict.dict_len = len; +          if (op_ret == -1)                  gf_log (this->name, GF_LOG_INFO,                          "%"PRId64": XATTROP %s (%s) ==> %"PRId32" (%s)", @@ -1675,8 +1569,6 @@ server_fxattrop_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                       int32_t op_ret, int32_t op_errno, dict_t *dict)  {          gfs3_xattrop_rsp  rsp   = {0,}; -        int32_t           len   = 0; -        int32_t           ret   = -1;          server_state_t   *state = NULL;          rpcsvc_request_t *req   = NULL; @@ -1692,42 +1584,17 @@ server_fxattrop_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          }          if ((op_ret >= 0) && dict) { -                len = dict_serialized_length (dict); -                if (len < 0) { -                        gf_log (this->name, GF_LOG_ERROR, -                                "fd - %"PRId64" (%s): failed to get " -                                "serialized length for reply dict", -                                state->resolve.fd_no, -                                uuid_utoa (state->fd->inode->gfid)); -                        op_ret = -1; -                        op_errno = EINVAL; -                        len = 0; -                        goto out; -                } -                rsp.dict.dict_val = GF_CALLOC (1, len, gf_server_mt_rsp_buf_t); -                if (!rsp.dict.dict_val) { -                        op_ret = -1; -                        op_errno = ENOMEM; -                        len = 0; -                        goto out; -                } -                ret = dict_serialize (dict, rsp.dict.dict_val); -                if (ret < 0) { -                        gf_log (this->name, GF_LOG_ERROR, -                                "fd - %"PRId64" (%s): failed to serialize " -                                "reply dict", state->resolve.fd_no, -                                uuid_utoa (state->fd->inode->gfid)); -                        op_ret = -1; -                        op_errno = -ret; -                        len = 0; -                } +                GF_PROTOCOL_DICT_SERIALIZE (this, dict, +                                            (&rsp.dict.dict_val), +                                            rsp.dict.dict_len, +                                            op_errno, out);          }  out:          req               = frame->local;          rsp.op_ret        = op_ret;          rsp.op_errno      = gf_errno_to_error (op_errno); -        rsp.dict.dict_len = len; +          if (op_ret == -1)                  gf_log (this->name, GF_LOG_INFO,                          "%"PRId64": FXATTROP %"PRId64" (%s) ==> %"PRId32" (%s)", @@ -2913,12 +2780,12 @@ out:  int  server_create (rpcsvc_request_t *req)  { -        server_state_t      *state                  = NULL; -        call_frame_t        *frame                  = NULL; -        dict_t              *params                 = NULL; -        char                *buf                    = NULL; -        gfs3_create_req      args                   = {{0,},}; -        int                  ret                    = -1; +        server_state_t  *state    = NULL; +        call_frame_t    *frame    = NULL; +        dict_t          *params   = NULL; +        gfs3_create_req  args     = {{0,},}; +        int              ret      = -1; +        int              op_errno = 0;          if (!req)                  return ret; @@ -2945,32 +2812,14 @@ server_create (rpcsvc_request_t *req)                  req->rpc_err = GARBAGE_ARGS;                  goto out;          } -        if (args.dict.dict_len) { -                /* Unserialize the dictionary */ -                params = dict_new (); - -                buf = memdup (args.dict.dict_val, args.dict.dict_len); -                if (buf == NULL) { -                        goto out; -                } -                ret = dict_unserialize (buf, args.dict.dict_len, -                                        ¶ms); -                if (ret < 0) { -                        gf_log (state->conn->bound_xl->name, GF_LOG_ERROR, -                                "%"PRId64": %s (%s): failed to " -                                "unserialize req-buffer to dictionary", -                                frame->root->unique, state->resolve.path, -                                uuid_utoa (state->resolve.gfid)); -                        goto out; -                } +        /* Unserialize the dictionary */ +        GF_PROTOCOL_DICT_UNSERIALIZE (state->conn->bound_xl, params, +                                      (args.dict.dict_val), +                                      (args.dict.dict_len), ret, +                                      op_errno, out); -                state->params = params; - -                params->extra_free = buf; - -                buf = NULL; -        } +        state->params = params;          state->resolve.bname  = gf_strdup (args.bname);          state->mode           = args.mode; @@ -2993,13 +2842,12 @@ server_create (rpcsvc_request_t *req)          return ret;  out: +        if (op_errno) +                req->rpc_err = GARBAGE_ARGS; +          if (params)                  dict_unref (params); -        if (buf) { -                GF_FREE (buf); -        } -          /* memory allocated by libc, don't use GF_FREE */          if (args.dict.dict_val != NULL) {                  free (args.dict.dict_val); @@ -3516,9 +3364,9 @@ server_setxattr (rpcsvc_request_t *req)          dict_t              *dict                  = NULL;          call_frame_t        *frame                 = NULL;          server_connection_t *conn                  = NULL; -        char                *buf                   = NULL;          gfs3_setxattr_req    args                  = {{0,},};          int32_t              ret                   = -1; +        int                  op_errno = 0;          if (!req)                  return ret; @@ -3552,26 +3400,12 @@ server_setxattr (rpcsvc_request_t *req)          state->flags            = args.flags;          memcpy (state->resolve.gfid, args.gfid, 16); -        if (args.dict.dict_len) { -                dict = dict_new (); -                buf = memdup (args.dict.dict_val, args.dict.dict_len); -                GF_VALIDATE_OR_GOTO (conn->bound_xl->name, buf, out); - -                ret = dict_unserialize (buf, args.dict.dict_len, &dict); -                if (ret < 0) { -                        gf_log (conn->bound_xl->name, GF_LOG_ERROR, -                                "%"PRId64": %s (%s): failed to " -                                "unserialize request buffer to dictionary", -                                frame->root->unique, state->loc.path, -                                uuid_utoa (state->resolve.gfid)); -                        goto err; -                } +        GF_PROTOCOL_DICT_UNSERIALIZE (state->conn->bound_xl, dict, +                                      (args.dict.dict_val), +                                      (args.dict.dict_len), ret, +                                      op_errno, out); -                dict->extra_free = buf; -                buf = NULL; - -                state->dict = dict; -        } +        state->dict = dict;          /* There can be some commands hidden in key, check and proceed */          gf_server_check_setxattr_cmd (frame, dict); @@ -3580,17 +3414,14 @@ server_setxattr (rpcsvc_request_t *req)          resolve_and_resume (frame, server_setxattr_resume);          return ret; -err: +out:          if (dict)                  dict_unref (dict); -        server_setxattr_cbk (frame, NULL, frame->this, -1, EINVAL); -        ret = 0; -out: -        if (buf) -                GF_FREE (buf); -        return ret; +        if (op_errno) +                req->rpc_err = GARBAGE_ARGS; +        return ret;  } @@ -3602,9 +3433,9 @@ server_fsetxattr (rpcsvc_request_t *req)          dict_t              *dict                 = NULL;          server_connection_t *conn                 = NULL;          call_frame_t        *frame                = NULL; -        char                *buf                  = NULL;          gfs3_fsetxattr_req   args                 = {{0,},};          int32_t              ret                  = -1; +        int                  op_errno = 0;          if (!req)                  return ret; @@ -3638,38 +3469,22 @@ server_fsetxattr (rpcsvc_request_t *req)          state->flags             = args.flags;          memcpy (state->resolve.gfid, args.gfid, 16); -        if (args.dict.dict_len) { -                dict = dict_new (); -                buf = memdup (args.dict.dict_val, args.dict.dict_len); -                GF_VALIDATE_OR_GOTO (conn->bound_xl->name, buf, out); - -                ret = dict_unserialize (buf, args.dict.dict_len, &dict); -                if (ret < 0) { -                        gf_log (conn->bound_xl->name, GF_LOG_ERROR, -                                "%"PRId64": %s (%s): failed to " -                                "unserialize request buffer to dictionary", -                                frame->root->unique, state->loc.path, -                                uuid_utoa (state->resolve.gfid)); -                        goto err; -                } -                dict->extra_free = buf; -                buf = NULL; -                state->dict = dict; -        } +        GF_PROTOCOL_DICT_UNSERIALIZE (state->conn->bound_xl, dict, +                                      (args.dict.dict_val), +                                      (args.dict.dict_len), ret, +                                      op_errno, out); + +        state->dict = dict;          ret = 0;          resolve_and_resume (frame, server_fsetxattr_resume);          return ret; -err: +out:          if (dict)                  dict_unref (dict); - -        server_setxattr_cbk (frame, NULL, frame->this, -1, EINVAL); -        ret = 0; -out: -        if (buf) -                GF_FREE (buf); +        if (op_errno) +                req->rpc_err = GARBAGE_ARGS;          return ret;  } @@ -3682,9 +3497,9 @@ server_fxattrop (rpcsvc_request_t *req)          server_state_t      *state                = NULL;          server_connection_t *conn                 = NULL;          call_frame_t        *frame                = NULL; -        char                *buf                   = NULL;          gfs3_fxattrop_req    args                 = {{0,},};          int32_t              ret                  = -1; +        int              op_errno = 0;          if (!req)                  return ret; @@ -3718,40 +3533,24 @@ server_fxattrop (rpcsvc_request_t *req)          state->flags           = args.flags;          memcpy (state->resolve.gfid, args.gfid, 16); -        if (args.dict.dict_len) { -                /* Unserialize the dictionary */ -                dict = dict_new (); - -                buf = memdup (args.dict.dict_val, args.dict.dict_len); -                GF_VALIDATE_OR_GOTO (conn->bound_xl->name, buf, out); - -                ret = dict_unserialize (buf, args.dict.dict_len, &dict); -                if (ret < 0) { -                        gf_log (conn->bound_xl->name, GF_LOG_ERROR, -                                "fd - %"PRId64" (%s): failed to unserialize " -                                "request buffer to dictionary", -                                state->resolve.fd_no, -                                uuid_utoa (state->fd->inode->gfid)); -                        goto fail; -                } -                dict->extra_free = buf; -                buf = NULL; +        GF_PROTOCOL_DICT_UNSERIALIZE (state->conn->bound_xl, dict, +                                      (args.dict.dict_val), +                                      (args.dict.dict_len), ret, +                                      op_errno, out); -                state->dict = dict; -        } +        state->dict = dict;          ret = 0;          resolve_and_resume (frame, server_fxattrop_resume);          return ret; -fail: +out:          if (dict)                  dict_unref (dict); +        if (op_errno) +                req->rpc_err = GARBAGE_ARGS; -        server_fxattrop_cbk (frame, NULL, frame->this, -1, EINVAL, NULL); -        ret = 0; -out:          return ret;  } @@ -3764,9 +3563,9 @@ server_xattrop (rpcsvc_request_t *req)          server_state_t      *state                 = NULL;          server_connection_t *conn                  = NULL;          call_frame_t        *frame                 = NULL; -        char                *buf                   = NULL;          gfs3_xattrop_req     args                  = {{0,},};          int32_t              ret                   = -1; +        int              op_errno = 0;          if (!req)                  return ret; @@ -3800,39 +3599,24 @@ server_xattrop (rpcsvc_request_t *req)          state->flags           = args.flags;          memcpy (state->resolve.gfid, args.gfid, 16); -        if (args.dict.dict_len) { -                /* Unserialize the dictionary */ -                dict = dict_new (); - -                buf = memdup (args.dict.dict_val, args.dict.dict_len); -                GF_VALIDATE_OR_GOTO (conn->bound_xl->name, buf, out); - -                ret = dict_unserialize (buf, args.dict.dict_len, &dict); -                if (ret < 0) { -                        gf_log (conn->bound_xl->name, GF_LOG_ERROR, -                                "fd - %"PRId64" (%s): failed to unserialize " -                                "request buffer to dictionary", -                                state->resolve.fd_no, -                                uuid_utoa (state->fd->inode->gfid)); -                        goto fail; -                } -                dict->extra_free = buf; -                buf = NULL; +        GF_PROTOCOL_DICT_UNSERIALIZE (state->conn->bound_xl, dict, +                                      (args.dict.dict_val), +                                      (args.dict.dict_len), ret, +                                      op_errno, out); -                state->dict = dict; -        } +        state->dict = dict;          ret = 0;          resolve_and_resume (frame, server_xattrop_resume);          return ret; -fail: +out:          if (dict)                  dict_unref (dict); -        server_xattrop_cbk (frame, NULL, frame->this, -1, EINVAL, NULL); -        ret = 0; -out: +        if (op_errno) +                req->rpc_err = GARBAGE_ARGS; +          return ret;  } @@ -4075,10 +3859,11 @@ server_readdirp (rpcsvc_request_t *req)  {          server_state_t      *state        = NULL;          call_frame_t        *frame        = NULL; -        char                *buf          = NULL;          gfs3_readdirp_req    args         = {{0,},};          size_t               headers_size = 0;          int                  ret          = -1; +        int              op_errno = 0; +          if (!req)                  return ret; @@ -4119,32 +3904,18 @@ server_readdirp (rpcsvc_request_t *req)          state->offset = args.offset;          memcpy (state->resolve.gfid, args.gfid, 16); -        if (args.dict.dict_len) { -                /* Unserialize the dictionary */ -                state->dict = dict_new (); - -                buf = memdup (args.dict.dict_val, args.dict.dict_len); -                if (buf == NULL) { -                        goto out; -                } +        GF_PROTOCOL_DICT_UNSERIALIZE (state->conn->bound_xl, state->dict, +                                      (args.dict.dict_val), +                                      (args.dict.dict_len), ret, +                                      op_errno, out); -                ret = dict_unserialize (buf, args.dict.dict_len, -                                        &state->dict); -                if (ret < 0) { -                        gf_log (state->conn->bound_xl->name, GF_LOG_ERROR, -                                "%"PRId64": failed to unserialize req-buffer " -                                " to dictionary", frame->root->unique); -                        goto out; -                } - -                state->dict->extra_free = buf; - -                buf = NULL; -        }          ret = 0;          resolve_and_resume (frame, server_readdirp_resume);  out: +        if (op_errno) +                req->rpc_err = GARBAGE_ARGS; +          return ret;  } @@ -4254,9 +4025,9 @@ server_mknod (rpcsvc_request_t *req)          server_state_t      *state                  = NULL;          call_frame_t        *frame                  = NULL;          dict_t              *params                 = NULL; -        char                *buf                    = NULL;          gfs3_mknod_req       args                   = {{0,},};          int                  ret                    = -1; +        int              op_errno = 0;          if (!req)                  return ret; @@ -4284,32 +4055,12 @@ server_mknod (rpcsvc_request_t *req)                  goto out;          } -        if (args.dict.dict_len) { -                /* Unserialize the dictionary */ -                params = dict_new (); - -                buf = memdup (args.dict.dict_val, args.dict.dict_len); -                if (buf == NULL) { -                        goto out; -                } - -                ret = dict_unserialize (buf, args.dict.dict_len, -                                        ¶ms); -                if (ret < 0) { -                        gf_log (state->conn->bound_xl->name, GF_LOG_ERROR, -                                "%"PRId64": %s (%s): failed to " -                                "unserialize req-buffer to dictionary", -                                frame->root->unique, state->resolve.path, -                                uuid_utoa (state->resolve.gfid)); -                        goto out; -                } - -                state->params = params; - -                params->extra_free = buf; +        GF_PROTOCOL_DICT_UNSERIALIZE (state->conn->bound_xl, params, +                                      (args.dict.dict_val), +                                      (args.dict.dict_len), ret, +                                      op_errno, out); -                buf = NULL; -        } +        state->params = params;          state->resolve.type    = RESOLVE_NOT;          memcpy (state->resolve.pargfid, args.pargfid, 16); @@ -4328,13 +4079,12 @@ server_mknod (rpcsvc_request_t *req)          return ret;  out: +        if (op_errno) +                req->rpc_err = GARBAGE_ARGS; +          if (params)                  dict_unref (params); -        if (buf) { -                GF_FREE (buf); -        } -          /* memory allocated by libc, don't use GF_FREE */          if (args.dict.dict_val != NULL) {                  free (args.dict.dict_val); @@ -4351,9 +4101,9 @@ server_mkdir (rpcsvc_request_t *req)          server_state_t      *state                  = NULL;          call_frame_t        *frame                  = NULL;          dict_t              *params                 = NULL; -        char                *buf                    = NULL;          gfs3_mkdir_req       args                   = {{0,},};          int                  ret                    = -1; +        int              op_errno = 0;          if (!req)                  return ret; @@ -4380,32 +4130,12 @@ server_mkdir (rpcsvc_request_t *req)                  req->rpc_err = GARBAGE_ARGS;                  goto out;          } -        if (args.dict.dict_len) { -                /* Unserialize the dictionary */ -                params = dict_new (); - -                buf = memdup (args.dict.dict_val, args.dict.dict_len); -                if (buf == NULL) { -                        goto out; -                } - -                ret = dict_unserialize (buf, args.dict.dict_len, -                                        ¶ms); -                if (ret < 0) { -                        gf_log (state->conn->bound_xl->name, GF_LOG_ERROR, -                                "%"PRId64": %s (%s): failed to " -                                "unserialize req-buffer to dictionary", -                                frame->root->unique, state->resolve.path, -                                uuid_utoa (state->resolve.gfid)); -                        goto out; -                } +        GF_PROTOCOL_DICT_UNSERIALIZE (state->conn->bound_xl, params, +                                      (args.dict.dict_val), +                                      (args.dict.dict_len), ret, +                                      op_errno, out); -                state->params = params; - -                params->extra_free = buf; - -                buf = NULL; -        } +        state->params = params;          state->resolve.type    = RESOLVE_NOT;          memcpy (state->resolve.pargfid, args.pargfid, 16); @@ -4423,13 +4153,12 @@ server_mkdir (rpcsvc_request_t *req)          return ret;  out: +        if (op_errno) +                req->rpc_err = GARBAGE_ARGS; +          if (params)                  dict_unref (params); -        if (buf) { -                GF_FREE (buf); -        } -          if (args.dict.dict_val != NULL) {                  /* memory allocated by libc, don't use GF_FREE */                  free (args.dict.dict_val); @@ -4787,9 +4516,9 @@ server_symlink (rpcsvc_request_t *req)          server_state_t      *state                 = NULL;          call_frame_t        *frame                 = NULL;          dict_t              *params                = NULL; -        char                *buf                   = NULL;          gfs3_symlink_req     args                  = {{0,},};          int                  ret                   = -1; +        int              op_errno = 0;          if (!req)                  return ret; @@ -4818,32 +4547,12 @@ server_symlink (rpcsvc_request_t *req)                  goto out;          } -        if (args.dict.dict_len) { -                /* Unserialize the dictionary */ -                params = dict_new (); +        GF_PROTOCOL_DICT_UNSERIALIZE (state->conn->bound_xl, params, +                                      (args.dict.dict_val), +                                      (args.dict.dict_len), ret, +                                      op_errno, out); -                buf = memdup (args.dict.dict_val, args.dict.dict_len); -                if (buf == NULL) { -                        goto out; -                } - -                ret = dict_unserialize (buf, args.dict.dict_len, -                                        ¶ms); -                if (ret < 0) { -                        gf_log (state->conn->bound_xl->name, GF_LOG_ERROR, -                                "%"PRId64": %s (%s): failed to " -                                "unserialize req-buffer to dictionary", -                                frame->root->unique, state->resolve.path, -                                uuid_utoa (state->resolve.gfid)); -                        goto out; -                } - -                state->params = params; - -                params->extra_free = buf; - -                buf = NULL; -        } +        state->params = params;          state->resolve.type   = RESOLVE_NOT;          memcpy (state->resolve.pargfid, args.pargfid, 16); @@ -4859,13 +4568,12 @@ server_symlink (rpcsvc_request_t *req)          }          return ret;  out: +        if (op_errno) +                req->rpc_err = GARBAGE_ARGS; +          if (params)                  dict_unref (params); -        if (buf) { -                GF_FREE (buf); -        } -          /* memory allocated by libc, don't use GF_FREE */          if (args.dict.dict_val != NULL) {                  free (args.dict.dict_val); @@ -5139,9 +4847,9 @@ server_lookup (rpcsvc_request_t *req)          server_connection_t *conn                   = NULL;          server_state_t      *state                  = NULL;          dict_t              *xattr_req              = NULL; -        char                *buf                    = NULL;          gfs3_lookup_req      args                   = {{0,},};          int                  ret                    = -1; +        int              op_errno = 0;          GF_VALIDATE_OR_GOTO ("server", req, err); @@ -5184,32 +4892,11 @@ server_lookup (rpcsvc_request_t *req)                  memcpy (state->resolve.gfid, args.gfid, 16);          } -        if (args.dict.dict_len) { -                /* Unserialize the dictionary */ -                xattr_req = dict_new (); - -                buf = memdup (args.dict.dict_val, args.dict.dict_len); -                if (buf == NULL) { -                        goto out; -                } - -                ret = dict_unserialize (buf, args.dict.dict_len, -                                        &xattr_req); -                if (ret < 0) { -                        gf_log (conn->bound_xl->name, GF_LOG_ERROR, -                                "%"PRId64": %s (%s): failed to " -                                "unserialize req-buffer to dictionary", -                                frame->root->unique, state->resolve.path, -                                uuid_utoa (state->resolve.gfid)); -                        goto out; -                } - -                state->dict = xattr_req; - -                xattr_req->extra_free = buf; - -                buf = NULL; -        } +        GF_PROTOCOL_DICT_UNSERIALIZE (state->conn->bound_xl, xattr_req, +                                      (args.dict.dict_val), +                                      (args.dict.dict_len), ret, +                                      op_errno, out); +        state->dict = xattr_req;          ret = 0;          resolve_and_resume (frame, server_lookup_resume); @@ -5219,10 +4906,6 @@ out:          if (xattr_req)                  dict_unref (xattr_req); -        if (buf) { -                GF_FREE (buf); -        } -          server_lookup_cbk (frame, NULL, frame->this, -1, EINVAL, NULL, NULL,                             NULL, NULL);          ret = 0;  | 
