diff options
Diffstat (limited to 'libglusterfs')
-rw-r--r-- | libglusterfs/src/call-stub.c | 57 | ||||
-rw-r--r-- | libglusterfs/src/call-stub.h | 15 | ||||
-rw-r--r-- | libglusterfs/src/cluster-syncop.c | 26 | ||||
-rw-r--r-- | libglusterfs/src/cluster-syncop.h | 8 | ||||
-rw-r--r-- | libglusterfs/src/default-args.c | 40 | ||||
-rw-r--r-- | libglusterfs/src/default-args.h | 9 | ||||
-rw-r--r-- | libglusterfs/src/defaults-tmpl.c | 1 | ||||
-rw-r--r-- | libglusterfs/src/defaults.h | 25 | ||||
-rwxr-xr-x | libglusterfs/src/generator.py | 18 | ||||
-rw-r--r-- | libglusterfs/src/globals.c | 2 | ||||
-rw-r--r-- | libglusterfs/src/syncop.c | 49 | ||||
-rw-r--r-- | libglusterfs/src/syncop.h | 6 | ||||
-rw-r--r-- | libglusterfs/src/xlator.c | 1 | ||||
-rw-r--r-- | libglusterfs/src/xlator.h | 14 |
14 files changed, 271 insertions, 0 deletions
diff --git a/libglusterfs/src/call-stub.c b/libglusterfs/src/call-stub.c index 9aa67aab6c2..74a64294528 100644 --- a/libglusterfs/src/call-stub.c +++ b/libglusterfs/src/call-stub.c @@ -1968,6 +1968,47 @@ out: } +call_stub_t * +fop_put_stub (call_frame_t *frame, fop_put_t fn, + loc_t *loc, mode_t mode, mode_t umask, uint32_t flags, + struct iovec *vector, int32_t count, off_t offset, + struct iobref *iobref, dict_t *xattr, dict_t *xdata) +{ + call_stub_t *stub = NULL; + + GF_VALIDATE_OR_GOTO ("call-stub", frame, out); + GF_VALIDATE_OR_GOTO ("call-stub", vector, out); + + stub = stub_new (frame, 1, GF_FOP_PUT); + GF_VALIDATE_OR_GOTO ("call-stub", stub, out); + + stub->fn.put = fn; + args_put_store (&stub->args, loc, mode, umask, flags, vector, + count, offset, iobref, xattr, xdata); +out: + return stub; +} + +call_stub_t * +fop_put_cbk_stub (call_frame_t *frame, fop_put_cbk_t fn, + int32_t op_ret, int32_t op_errno, inode_t *inode, + struct iatt *buf, struct iatt *preparent, + struct iatt *postparent, dict_t *xdata) +{ + call_stub_t *stub = NULL; + + GF_VALIDATE_OR_GOTO ("call-stub", frame, out); + + stub = stub_new (frame, 0, GF_FOP_PUT); + GF_VALIDATE_OR_GOTO ("call-stub", stub, out); + + stub->fn_cbk.put = fn; + args_put_cbk_store (&stub->args_cbk, op_ret, op_errno, inode, + buf, preparent, postparent, xdata); +out: + return stub; +} + void call_resume_wind (call_stub_t *stub) { @@ -2226,6 +2267,14 @@ call_resume_wind (call_stub_t *stub) stub->args.xdata); break; + case GF_FOP_PUT: + stub->fn.put (stub->frame, stub->frame->this, + &stub->args.loc, stub->args.mode, stub->args.umask, + stub->args.flags, stub->args.vector, + stub->args.count, stub->args.offset, + stub->args.iobref, stub->args.xattr, + stub->args.xdata); + default: gf_msg_callingfn ("call-stub", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ENTRY, "Invalid value of FOP" @@ -2453,6 +2502,14 @@ call_resume_unwind (call_stub_t *stub) STUB_UNWIND (stub, setactivelk, stub->args_cbk.xdata); break; + case GF_FOP_PUT: + STUB_UNWIND (stub, put, stub->args_cbk.inode, + &stub->args_cbk.stat, + &stub->args_cbk.preparent, + &stub->args_cbk.postparent, + stub->args_cbk.xdata); + break; + default: gf_msg_callingfn ("call-stub", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ENTRY, "Invalid value of FOP" diff --git a/libglusterfs/src/call-stub.h b/libglusterfs/src/call-stub.h index 59868d414e3..4d86a517537 100644 --- a/libglusterfs/src/call-stub.h +++ b/libglusterfs/src/call-stub.h @@ -14,6 +14,7 @@ #include "xlator.h" #include "defaults.h" #include "default-args.h" +#include "stack.h" #include "list.h" typedef struct _call_stub { @@ -76,6 +77,7 @@ typedef struct _call_stub { fop_lease_t lease; fop_getactivelk_t getactivelk; fop_setactivelk_t setactivelk; + fop_put_t put; } fn; union { @@ -128,6 +130,7 @@ typedef struct _call_stub { fop_lease_cbk_t lease; fop_getactivelk_cbk_t getactivelk; fop_setactivelk_cbk_t setactivelk; + fop_put_cbk_t put; } fn_cbk; default_args_t args; @@ -761,6 +764,18 @@ call_stub_t * fop_setactivelk_cbk_stub (call_frame_t *frame, fop_setactivelk_cbk_t fn, int32_t op_ret, int32_t op_errno, dict_t *xdata); +call_stub_t * +fop_put_stub (call_frame_t *frame, fop_put_t fn, loc_t *loc, + mode_t mode, mode_t umask, uint32_t flags, + struct iovec *vector, int32_t count, off_t offset, + struct iobref *iobref, dict_t *xattr, dict_t *xdata); + +call_stub_t * +fop_put_cbk_stub (call_frame_t *frame, fop_put_cbk_t fn, int32_t op_ret, + int32_t op_errno, inode_t *inode, struct iatt *buf, + struct iatt *preparent, struct iatt *postparent, + dict_t *xdata); + void call_resume (call_stub_t *stub); void call_resume_keep_stub (call_stub_t *stub); void call_stub_destroy (call_stub_t *stub); diff --git a/libglusterfs/src/cluster-syncop.c b/libglusterfs/src/cluster-syncop.c index 50542eb7c16..aa9cea75ba3 100644 --- a/libglusterfs/src/cluster-syncop.c +++ b/libglusterfs/src/cluster-syncop.c @@ -304,6 +304,18 @@ cluster_writev_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t +cluster_put_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, inode_t *inode, + struct iatt *buf, struct iatt *preparent, + struct iatt *postparent, dict_t *xdata) +{ + FOP_CBK (put, frame, cookie, op_ret, op_errno, inode, buf, preparent, + postparent, xdata); + return 0; +} + + +int32_t cluster_flush_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret, int32_t op_errno, dict_t *xdata) @@ -686,6 +698,20 @@ cluster_writev (xlator_t **subvols, unsigned char *on, int numsubvols, } int32_t +cluster_put (xlator_t **subvols, unsigned char *on, int numsubvols, + default_args_cbk_t *replies, unsigned char *output, + call_frame_t *frame, xlator_t *this, loc_t *loc, + mode_t mode, mode_t umask, uint32_t flags, struct iovec *vector, + int32_t count, off_t offset, struct iobref *iobref, dict_t *xattr, + dict_t *xdata) +{ + FOP_ONLIST (subvols, on, numsubvols, replies, output, frame, put, loc, + mode, umask, flags, vector, count, offset, iobref, xattr, + xdata); + return cluster_fop_success_fill (replies, numsubvols, output); +} + +int32_t cluster_readv (xlator_t **subvols, unsigned char *on, int numsubvols, default_args_cbk_t *replies, unsigned char *output, call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, diff --git a/libglusterfs/src/cluster-syncop.h b/libglusterfs/src/cluster-syncop.h index b91a09ea681..9127dde6dfb 100644 --- a/libglusterfs/src/cluster-syncop.h +++ b/libglusterfs/src/cluster-syncop.h @@ -198,6 +198,14 @@ cluster_fsetattr (xlator_t **subvols, unsigned char *on, int numsubvols, call_frame_t *frame, xlator_t *this, fd_t *fd, struct iatt *stbuf, int32_t valid, dict_t *xdata); +int32_t +cluster_put (xlator_t **subvols, unsigned char *on, int numsubvols, + default_args_cbk_t *replies, unsigned char *output, + call_frame_t *frame, xlator_t *this, loc_t *loc, + mode_t mode, mode_t umask, uint32_t flags, struct iovec *vector, + int32_t count, off_t offset, struct iobref *iobref, dict_t *xattr, + dict_t *xdata); + void cluster_replies_wipe (default_args_cbk_t *replies, int num_subvols); diff --git a/libglusterfs/src/default-args.c b/libglusterfs/src/default-args.c index f40de2dae68..9ac0f400493 100644 --- a/libglusterfs/src/default-args.c +++ b/libglusterfs/src/default-args.c @@ -594,6 +594,46 @@ args_writev_cbk_store (default_args_cbk_t *args, } int +args_put_store (default_args_t *args, loc_t *loc, mode_t mode, mode_t umask, + uint32_t flags, struct iovec *vector, int32_t count, off_t off, + struct iobref *iobref, dict_t *xattr, dict_t *xdata) +{ + loc_copy (&args->loc, loc); + args->mode = mode; + args->umask = umask; + args->flags = flags; + args->vector = iov_dup (vector, count); + args->count = count; + args->offset = off; + args->iobref = iobref_ref (iobref); + if (xattr) + args->xattr = dict_ref (xattr); + if (xdata) + args->xdata = dict_ref (xdata); + return 0; +} + +int +args_put_cbk_store (default_args_cbk_t *args, int32_t op_ret, int32_t op_errno, + inode_t *inode, struct iatt *buf, struct iatt *preparent, + struct iatt *postparent, dict_t *xdata) +{ + args->op_ret = op_ret; + args->op_errno = op_errno; + if (op_ret >= 0) + args->stat = *buf; + if (inode) + args->inode = inode_ref (inode); + if (preparent) + args->preparent = *preparent; + if (postparent) + args->postparent = *postparent; + if (xdata) + args->xdata = dict_ref (xdata); + + return 0; +} +int args_flush_store (default_args_t *args, fd_t *fd, dict_t *xdata) { if (fd) diff --git a/libglusterfs/src/default-args.h b/libglusterfs/src/default-args.h index a2201dd4703..f97d8830de9 100644 --- a/libglusterfs/src/default-args.h +++ b/libglusterfs/src/default-args.h @@ -125,6 +125,10 @@ args_writev_cbk_store (default_args_cbk_t *args, int32_t op_ret, int32_t op_errno, struct iatt *prebuf, struct iatt *postbuf, dict_t *xdata); +int +args_put_cbk_store (default_args_cbk_t *args, int32_t op_ret, int32_t op_errno, + inode_t *inode, struct iatt *buf, struct iatt *preparent, + struct iatt *postparent, dict_t *xdata); int args_flush_cbk_store (default_args_cbk_t *args, @@ -349,6 +353,11 @@ args_writev_store (default_args_t *args, fd_t *fd, struct iovec *vector, struct iobref *iobref, dict_t *xdata); int +args_put_store (default_args_t *args, loc_t *loc, mode_t mode, mode_t umask, + uint32_t flags, struct iovec *vector, int32_t count, off_t off, + struct iobref *iobref, dict_t *xattr, dict_t *xdata); + +int args_flush_store (default_args_t *args, fd_t *fd, dict_t *xdata); int diff --git a/libglusterfs/src/defaults-tmpl.c b/libglusterfs/src/defaults-tmpl.c index d311972f0c0..21b99d9566c 100644 --- a/libglusterfs/src/defaults-tmpl.c +++ b/libglusterfs/src/defaults-tmpl.c @@ -81,6 +81,7 @@ struct xlator_fops _default_fops = { .getspec = default_getspec, .getactivelk = default_getactivelk, .setactivelk = default_setactivelk, + .put = default_put, }; struct xlator_fops *default_fops = &_default_fops; diff --git a/libglusterfs/src/defaults.h b/libglusterfs/src/defaults.h index 9b4f4828e91..c202dbe4941 100644 --- a/libglusterfs/src/defaults.h +++ b/libglusterfs/src/defaults.h @@ -354,6 +354,11 @@ int32_t default_setactivelk (call_frame_t *frame, xlator_t *this, loc_t *loc, lock_migration_info_t *locklist, dict_t *xdata); +int32_t +default_put (call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode, + mode_t umask, uint32_t flags, struct iovec *vector, int32_t count, + off_t off, struct iobref *iobref, dict_t *xattr, dict_t *xdata); + /* Resume */ int32_t default_getspec_resume (call_frame_t *frame, xlator_t *this, @@ -599,6 +604,12 @@ int32_t default_setactivelk_resume (call_frame_t *frame, xlator_t *this, loc_t *loc, lock_migration_info_t *locklist, dict_t *xdata); +int32_t +default_put_resume (call_frame_t *frame, xlator_t *this, loc_t *loc, + mode_t mode, mode_t umask, uint32_t flags, + struct iovec *vector, int32_t count, off_t off, + struct iobref *iobref, dict_t *xattr, dict_t *xdata); + /* _cbk_resume */ int32_t @@ -895,6 +906,12 @@ default_setactivelk_cbk_resume (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret, int32_t op_errno, dict_t *xdata); +int32_t +default_put_cbk_resume (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, inode_t *inode, + struct iatt *buf, struct iatt *preparent, + struct iatt *postparent, dict_t *xdata); + /* _CBK */ int32_t default_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this, @@ -1142,6 +1159,11 @@ int32_t default_setactivelk_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret, int32_t op_errno, dict_t *xdata); +int32_t +default_put_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, inode_t *inode, + struct iatt *buf, struct iatt *preparent, + struct iatt *postparent, dict_t *xdata); int32_t default_lookup_failure_cbk (call_frame_t *frame, int32_t op_errno); @@ -1296,6 +1318,9 @@ int32_t default_setactivelk_failure_cbk (call_frame_t *frame, int32_t op_errno); int32_t +default_put_failure_cbk (call_frame_t *frame, int32_t op_errno); + +int32_t default_mem_acct_init (xlator_t *this); void diff --git a/libglusterfs/src/generator.py b/libglusterfs/src/generator.py index 7bd4c21cb3a..d9262e473b7 100755 --- a/libglusterfs/src/generator.py +++ b/libglusterfs/src/generator.py @@ -557,6 +557,24 @@ ops['setactivelk'] = ( ('cbk-arg', 'xdata', 'dict_t *'), ) +ops['put'] = ( + ('fop-arg', 'loc', 'loc_t *', 'loc'), + ('fop-arg', 'mode', 'mode_t', 'mode'), + ('fop-arg', 'umask', 'mode_t', 'umask'), + ('fop-arg', 'flags', 'uint32_t', 'flags'), + ('fop-arg', 'vector', 'struct iovec *', 'vector'), + ('fop-arg', 'count', 'int32_t'), + ('fop-arg', 'off', 'off_t', 'offset'), + ('fop-arg', 'iobref', 'struct iobref *'), + ('fop-arg', 'dict', 'dict_t *', 'xattr'), + ('fop-arg', 'xdata', 'dict_t *', 'xdata'), + ('cbk-arg', 'inode', 'inode_t *'), + ('cbk-arg', 'buf', 'struct iatt *'), + ('cbk-arg', 'preparent', 'struct iatt *'), + ('cbk-arg', 'postparent', 'struct iatt *'), + ('cbk-arg', 'xdata', 'dict_t *'), +) + ##################################################################### xlator_cbks['forget'] = ( ('fn-arg', 'this', 'xlator_t *'), diff --git a/libglusterfs/src/globals.c b/libglusterfs/src/globals.c index 1c733840f46..1c574463123 100644 --- a/libglusterfs/src/globals.c +++ b/libglusterfs/src/globals.c @@ -11,6 +11,7 @@ #include <pthread.h> #include "glusterfs.h" +#include "globals.h" #include "xlator.h" #include "mem-pool.h" #include "syncop.h" @@ -73,6 +74,7 @@ const char *gf_fop_list[GF_FOP_MAXVALUE] = { [GF_FOP_COMPOUND] = "COMPOUND", [GF_FOP_GETACTIVELK] = "GETACTIVELK", [GF_FOP_SETACTIVELK] = "SETACTIVELK", + [GF_FOP_PUT] = "PUT", }; const char *gf_upcall_list[GF_UPCALL_FLAGS_MAXVALUE] = { diff --git a/libglusterfs/src/syncop.c b/libglusterfs/src/syncop.c index b36c88dc829..a4882f5eef2 100644 --- a/libglusterfs/src/syncop.c +++ b/libglusterfs/src/syncop.c @@ -2080,6 +2080,55 @@ syncop_create (xlator_t *subvol, loc_t *loc, int32_t flags, mode_t mode, } +int32_t +syncop_put_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, inode_t *inode, + struct iatt *buf, struct iatt *preparent, + struct iatt *postparent, dict_t *xdata) +{ + struct syncargs *args = NULL; + + args = cookie; + + args->op_ret = op_ret; + args->op_errno = op_errno; + if (xdata) + args->xdata = dict_ref (xdata); + + if (buf) + args->iatt1 = *buf; + + __wake (args); + + return 0; +} + +int +syncop_put (xlator_t *subvol, loc_t *loc, mode_t mode, mode_t umask, + uint32_t flags, struct iovec *vector, int32_t count, + off_t offset, struct iobref *iobref, dict_t *xattr, + struct iatt *iatt, dict_t *xdata_in, dict_t **xdata_out) +{ + struct syncargs args = {0, }; + + SYNCOP (subvol, (&args), syncop_put_cbk, subvol->fops->put, + loc, mode, umask, flags, (struct iovec *) vector, count, + offset, iobref, xattr, xdata_in); + + if (iatt) + *iatt = args.iatt1; + + if (xdata_out) + *xdata_out = args.xdata; + else if (args.xdata) + dict_unref (args.xdata); + + if (args.op_ret < 0) + return -args.op_errno; + return args.op_ret; + +} + int syncop_unlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int op_ret, int op_errno, struct iatt *preparent, diff --git a/libglusterfs/src/syncop.h b/libglusterfs/src/syncop.h index c64b483e85c..8f84cb7c4a4 100644 --- a/libglusterfs/src/syncop.h +++ b/libglusterfs/src/syncop.h @@ -563,4 +563,10 @@ syncop_setactivelk (xlator_t *subvol, loc_t *loc, lock_migration_info_t *locklist, dict_t *xdata_in, dict_t **xdata_out); +int +syncop_put (xlator_t *subvol, loc_t *loc, mode_t mode, mode_t umask, + uint32_t flags, struct iovec *vector, int32_t count, + off_t offset, struct iobref *iobref, dict_t *xattr, + struct iatt *iatt, dict_t *xdata_in, dict_t **xdata_out); + #endif /* _SYNCOP_H */ diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c index ed1d95d01e1..677dd6ce80f 100644 --- a/libglusterfs/src/xlator.c +++ b/libglusterfs/src/xlator.c @@ -103,6 +103,7 @@ fill_defaults (xlator_t *xl) SET_DEFAULT_FOP (lease); SET_DEFAULT_FOP (getactivelk); SET_DEFAULT_FOP (setactivelk); + SET_DEFAULT_FOP (put); SET_DEFAULT_FOP (getspec); diff --git a/libglusterfs/src/xlator.h b/libglusterfs/src/xlator.h index de353fe702d..a3115f09c52 100644 --- a/libglusterfs/src/xlator.h +++ b/libglusterfs/src/xlator.h @@ -465,6 +465,12 @@ typedef int32_t (*fop_setactivelk_cbk_t) (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret, int32_t op_errno, dict_t *xdata); +typedef int32_t (*fop_put_cbk_t) (call_frame_t *frame, void *cookie, + xlator_t *this, int32_t op_ret, + int32_t op_errno, inode_t *inode, + struct iatt *buf, struct iatt *preparent, + struct iatt *postparent, dict_t *xdata); + typedef int32_t (*fop_lookup_t) (call_frame_t *frame, xlator_t *this, loc_t *loc, @@ -725,6 +731,12 @@ typedef int32_t (*fop_setactivelk_t) (call_frame_t *frame, xlator_t *this, lock_migration_info_t *locklist, dict_t *xdata); +typedef int32_t (*fop_put_t) (call_frame_t *frame, xlator_t *this, loc_t *loc, + mode_t mode, mode_t umask, uint32_t flags, + struct iovec *vector, int32_t count, off_t offset, + struct iobref *iobref, dict_t *xattr, + dict_t *xdata); + /* WARNING: make sure the list is in order with FOP definition in `rpc/xdr/src/glusterfs-fops.x`. If it is not in order, mainly the metrics related feature would be broken */ @@ -786,6 +798,7 @@ struct xlator_fops { fop_compound_t compound; fop_getactivelk_t getactivelk; fop_setactivelk_t setactivelk; + fop_put_t put; /* these entries are used for a typechecking hack in STACK_WIND _only_ */ /* make sure to add _cbk variables only after defining regular fops as @@ -847,6 +860,7 @@ struct xlator_fops { fop_compound_cbk_t compound_cbk; fop_getactivelk_cbk_t getactivelk_cbk; fop_setactivelk_cbk_t setactivelk_cbk; + fop_put_cbk_t put_cbk; }; typedef int32_t (*cbk_forget_t) (xlator_t *this, |