diff options
Diffstat (limited to 'libglusterfs/src')
| -rw-r--r-- | libglusterfs/src/call-stub.c | 67 | ||||
| -rw-r--r-- | libglusterfs/src/call-stub.h | 16 | ||||
| -rw-r--r-- | libglusterfs/src/defaults.c | 33 | ||||
| -rw-r--r-- | libglusterfs/src/defaults.h | 18 | ||||
| -rw-r--r-- | libglusterfs/src/globals.c | 1 | ||||
| -rw-r--r-- | libglusterfs/src/glusterfs.h | 1 | ||||
| -rw-r--r-- | libglusterfs/src/syncop.c | 29 | ||||
| -rw-r--r-- | libglusterfs/src/syncop.h | 2 | ||||
| -rw-r--r-- | libglusterfs/src/xlator.c | 1 | ||||
| -rw-r--r-- | libglusterfs/src/xlator.h | 16 | 
10 files changed, 184 insertions, 0 deletions
diff --git a/libglusterfs/src/call-stub.c b/libglusterfs/src/call-stub.c index 2f07a0074c5..ac79cf0711c 100644 --- a/libglusterfs/src/call-stub.c +++ b/libglusterfs/src/call-stub.c @@ -2241,6 +2241,62 @@ out:  } +call_stub_t * +fop_zerofill_cbk_stub(call_frame_t *frame, fop_zerofill_cbk_t fn, +                     int32_t op_ret, int32_t op_errno, +                     struct iatt *statpre, struct iatt *statpost, +                     dict_t *xdata) +{ +        call_stub_t *stub = NULL; + +        GF_VALIDATE_OR_GOTO ("call-stub", frame, out); + +        stub = stub_new (frame, 0, GF_FOP_ZEROFILL); +        GF_VALIDATE_OR_GOTO ("call-stub", stub, out); + +        stub->fn_cbk.zerofill = fn; + +        stub->args_cbk.op_ret = op_ret; +        stub->args_cbk.op_errno = op_errno; + +        if (statpre) +                stub->args_cbk.prestat = *statpre; +        if (statpost) +                stub->args_cbk.poststat = *statpost; +        if (xdata) +                stub->args_cbk.xdata = dict_ref (xdata); +out: +        return stub; +} + +call_stub_t * +fop_zerofill_stub(call_frame_t *frame, fop_zerofill_t fn, fd_t *fd, +                 off_t offset, size_t len, dict_t *xdata) +{ +        call_stub_t *stub = NULL; + +        GF_VALIDATE_OR_GOTO ("call-stub", frame, out); +        GF_VALIDATE_OR_GOTO ("call-stub", fn, out); + +        stub = stub_new (frame, 1, GF_FOP_ZEROFILL); +        GF_VALIDATE_OR_GOTO ("call-stub", stub, out); + +        stub->fn.zerofill = fn; + +        if (fd) +                stub->args.fd = fd_ref (fd); + +        stub->args.offset = offset; +        stub->args.size = len; + +        if (xdata) +                stub->args.xdata = dict_ref (xdata); +out: +        return stub; + +} + +  static void  call_resume_wind (call_stub_t *stub)  { @@ -2468,6 +2524,12 @@ call_resume_wind (call_stub_t *stub)  				 stub->args.fd, stub->args.offset,  				 stub->args.size, stub->args.xdata);  		break; +        case GF_FOP_ZEROFILL: +                stub->fn.zerofill(stub->frame, stub->frame->this, +                                 stub->args.fd, stub->args.offset, +                                 stub->args.size, stub->args.xdata); +                break; +          default:                  gf_log_callingfn ("call-stub", GF_LOG_ERROR,                                    "Invalid value of FOP (%d)", @@ -2670,6 +2732,11 @@ call_resume_unwind (call_stub_t *stub)  		STUB_UNWIND(stub, discard, &stub->args_cbk.prestat,  			    &stub->args_cbk.poststat, stub->args_cbk.xdata);  		break; +        case GF_FOP_ZEROFILL: +                STUB_UNWIND(stub, zerofill, &stub->args_cbk.prestat, +                            &stub->args_cbk.poststat, stub->args_cbk.xdata); +                break; +          default:                  gf_log_callingfn ("call-stub", GF_LOG_ERROR,                                    "Invalid value of FOP (%d)", diff --git a/libglusterfs/src/call-stub.h b/libglusterfs/src/call-stub.h index f0872b1219a..45bef80443f 100644 --- a/libglusterfs/src/call-stub.h +++ b/libglusterfs/src/call-stub.h @@ -71,6 +71,7 @@ typedef struct {  		fop_fsetattr_t fsetattr;  		fop_fallocate_t fallocate;  		fop_discard_t discard; +                fop_zerofill_t zerofill;  	} fn;  	union { @@ -117,6 +118,7 @@ typedef struct {  		fop_fsetattr_cbk_t fsetattr;  		fop_fallocate_cbk_t fallocate;  		fop_discard_cbk_t discard; +                fop_zerofill_cbk_t zerofill;  	} fn_cbk;  	struct { @@ -745,6 +747,20 @@ fop_discard_cbk_stub(call_frame_t *frame,                       struct iatt *statpre, struct iatt *statpost,                       dict_t *xdata); +call_stub_t * +fop_zerofill_stub(call_frame_t *frame, +                 fop_zerofill_t fn, +                 fd_t *fd, +                 off_t offset, +                 size_t len, dict_t *xdata); + +call_stub_t * +fop_zerofill_cbk_stub(call_frame_t *frame, +                     fop_zerofill_cbk_t fn, +                     int32_t op_ret, int32_t op_errno, +                     struct iatt *statpre, struct iatt *statpost, +                     dict_t *xdata); +  void call_resume (call_stub_t *stub);  void call_stub_destroy (call_stub_t *stub);  void call_unwind_error (call_stub_t *stub, int op_ret, int op_errno); diff --git a/libglusterfs/src/defaults.c b/libglusterfs/src/defaults.c index a3c8d97f112..2ebb251504c 100644 --- a/libglusterfs/src/defaults.c +++ b/libglusterfs/src/defaults.c @@ -473,6 +473,17 @@ default_discard_cbk(call_frame_t *frame, void *cookie, xlator_t *this,  }  int32_t +default_zerofill_cbk(call_frame_t *frame, void *cookie, xlator_t *this, +                    int32_t op_ret, int32_t op_errno, struct iatt *pre, +                    struct iatt *post, dict_t *xdata) +{ +        STACK_UNWIND_STRICT(zerofill, frame, op_ret, op_errno, pre, +                           post, xdata); +        return 0; +} + + +int32_t  default_getspec_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                       int32_t op_ret, int32_t op_errno, char *spec_data)  { @@ -900,6 +911,17 @@ default_discard_resume(call_frame_t *frame, xlator_t *this, fd_t *fd,          return 0;  } +int32_t +default_zerofill_resume(call_frame_t *frame, xlator_t *this, fd_t *fd, +                       off_t offset, size_t len, dict_t *xdata) +{ +        STACK_WIND(frame, default_zerofill_cbk, FIRST_CHILD(this), +                   FIRST_CHILD(this)->fops->zerofill, fd, offset, len, +                   xdata); +        return 0; +} + +  /* FOPS */  int32_t @@ -1325,6 +1347,17 @@ default_discard(call_frame_t *frame, xlator_t *this, fd_t *fd,  }  int32_t +default_zerofill(call_frame_t *frame, xlator_t *this, fd_t *fd, +                off_t offset, size_t len, dict_t *xdata) +{ +        STACK_WIND_TAIL(frame, FIRST_CHILD(this), +                        FIRST_CHILD(this)->fops->zerofill, fd, offset, len, +                        xdata); +        return 0; +} + + +int32_t  default_forget (xlator_t *this, inode_t *inode)  {          gf_log_callingfn (this->name, GF_LOG_WARNING, "xlator does not " diff --git a/libglusterfs/src/defaults.h b/libglusterfs/src/defaults.h index f3cbb3a4bb7..0747027bc35 100644 --- a/libglusterfs/src/defaults.h +++ b/libglusterfs/src/defaults.h @@ -255,6 +255,13 @@ int32_t default_discard(call_frame_t *frame,  			off_t offset,  			size_t len, dict_t *xdata); +int32_t default_zerofill(call_frame_t *frame, +                        xlator_t *this, +                        fd_t *fd, +                        off_t offset, +                        size_t len, dict_t *xdata); + +  /* Resume */  int32_t default_getspec_resume (call_frame_t *frame,                                  xlator_t *this, @@ -477,6 +484,13 @@ int32_t default_discard_resume(call_frame_t *frame,  			       off_t offset,  			       size_t len, dict_t *xdata); +int32_t default_zerofill_resume(call_frame_t *frame, +                               xlator_t *this, +                               fd_t *fd, +                               off_t offset, +                               size_t len, dict_t *xdata); + +  /* _cbk */  int32_t @@ -695,6 +709,10 @@ int32_t default_discard_cbk(call_frame_t *frame, void *cookie, xlator_t *this,  			    int32_t op_ret, int32_t op_errno, struct iatt *pre,  			    struct iatt *post, dict_t *xdata); +int32_t default_zerofill_cbk(call_frame_t *frame, void *cookie, xlator_t *this, +                            int32_t op_ret, int32_t op_errno, struct iatt *pre, +                            struct iatt *post, dict_t *xdata); +  int32_t  default_getspec_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                       int32_t op_ret, int32_t op_errno, char *spec_data); diff --git a/libglusterfs/src/globals.c b/libglusterfs/src/globals.c index 1e4cbf0edeb..259c5c885f7 100644 --- a/libglusterfs/src/globals.c +++ b/libglusterfs/src/globals.c @@ -70,6 +70,7 @@ const char *gf_fop_list[GF_FOP_MAXVALUE] = {          [GF_FOP_FREMOVEXATTR]= "FREMOVEXATTR",  	[GF_FOP_FALLOCATE]   = "FALLOCATE",  	[GF_FOP_DISCARD]     = "DISCARD", +        [GF_FOP_ZEROFILL]     = "ZEROFILL",  };  /* THIS */ diff --git a/libglusterfs/src/glusterfs.h b/libglusterfs/src/glusterfs.h index b38d6d53e2c..474631e3ff9 100644 --- a/libglusterfs/src/glusterfs.h +++ b/libglusterfs/src/glusterfs.h @@ -212,6 +212,7 @@ typedef enum {          GF_FOP_FREMOVEXATTR,  	GF_FOP_FALLOCATE,  	GF_FOP_DISCARD, +        GF_FOP_ZEROFILL,          GF_FOP_MAXVALUE,  } glusterfs_fop_t; diff --git a/libglusterfs/src/syncop.c b/libglusterfs/src/syncop.c index 866dca50ea4..c1620bb7088 100644 --- a/libglusterfs/src/syncop.c +++ b/libglusterfs/src/syncop.c @@ -2173,6 +2173,35 @@ syncop_discard(xlator_t *subvol, fd_t *fd, off_t offset, size_t len)          return args.op_ret;  } +int +syncop_zerofill_cbk (call_frame_t *frame, void *cookie, xlator_t *this, +                    int op_ret, int op_errno, struct iatt *prebuf, +                    struct iatt *postbuf, dict_t *xdata) +{ +        struct syncargs *args = NULL; + +        args = cookie; + +        args->op_ret   = op_ret; +        args->op_errno = op_errno; + +        __wake (args); + +        return 0; +} + +int +syncop_zerofill(xlator_t *subvol, fd_t *fd, off_t offset, size_t len) +{ +        struct syncargs args = {0, }; + +        SYNCOP (subvol, (&args), syncop_zerofill_cbk, subvol->fops->zerofill, +                fd, offset, len, NULL); + +        errno = args.op_errno; +        return args.op_ret; +} +  int  syncop_lk_cbk (call_frame_t *frame, void *cookie, xlator_t *this, diff --git a/libglusterfs/src/syncop.h b/libglusterfs/src/syncop.h index 0fc9e14ba0f..f790981f0bc 100644 --- a/libglusterfs/src/syncop.h +++ b/libglusterfs/src/syncop.h @@ -403,6 +403,8 @@ int syncop_fallocate(xlator_t *subvol, fd_t *fd, int32_t keep_size, off_t offset  		     size_t len);  int syncop_discard(xlator_t *subvol, fd_t *fd, off_t offset, size_t len); +int syncop_zerofill(xlator_t *subvol, fd_t *fd, off_t offset, size_t len); +  int syncop_rename (xlator_t *subvol, loc_t *oldloc, loc_t *newloc);  int syncop_lk (xlator_t *subvol, fd_t *fd, int cmd, struct gf_flock *flock); diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c index d029475504a..483c588a9f1 100644 --- a/libglusterfs/src/xlator.c +++ b/libglusterfs/src/xlator.c @@ -81,6 +81,7 @@ fill_defaults (xlator_t *xl)          SET_DEFAULT_FOP (fsetattr);  	SET_DEFAULT_FOP (fallocate);  	SET_DEFAULT_FOP (discard); +        SET_DEFAULT_FOP (zerofill);          SET_DEFAULT_FOP (getspec); diff --git a/libglusterfs/src/xlator.h b/libglusterfs/src/xlator.h index d6296262a13..2f938c384fc 100644 --- a/libglusterfs/src/xlator.h +++ b/libglusterfs/src/xlator.h @@ -434,6 +434,14 @@ typedef int32_t (*fop_discard_cbk_t) (call_frame_t *frame,                                        struct iatt *preop_stbuf,                                        struct iatt *postop_stbuf, dict_t *xdata); +typedef int32_t (*fop_zerofill_cbk_t) (call_frame_t *frame, +                                      void *cookie, +                                      xlator_t *this, +                                      int32_t op_ret, +                                      int32_t op_errno, +                                      struct iatt *preop_stbuf, +                                      struct iatt *postop_stbuf, dict_t *xdata); +  typedef int32_t (*fop_lookup_t) (call_frame_t *frame,                                   xlator_t *this,                                   loc_t *loc, @@ -665,6 +673,12 @@ typedef int32_t (*fop_discard_t) (call_frame_t *frame,  				  off_t offset,  				  size_t len,                                    dict_t *xdata); +typedef int32_t (*fop_zerofill_t) (call_frame_t *frame, +                                  xlator_t *this, +                                  fd_t *fd, +                                  off_t offset, +                                  size_t len, +                                  dict_t *xdata);  struct xlator_fops {          fop_lookup_t         lookup; @@ -711,6 +725,7 @@ struct xlator_fops {          fop_getspec_t        getspec;  	fop_fallocate_t	     fallocate;  	fop_discard_t	     discard; +        fop_zerofill_t       zerofill;          /* these entries are used for a typechecking hack in STACK_WIND _only_ */          fop_lookup_cbk_t         lookup_cbk; @@ -757,6 +772,7 @@ struct xlator_fops {          fop_getspec_cbk_t        getspec_cbk;  	fop_fallocate_cbk_t	 fallocate_cbk;  	fop_discard_cbk_t	 discard_cbk; +        fop_zerofill_cbk_t       zerofill_cbk;  };  typedef int32_t (*cbk_forget_t) (xlator_t *this,  | 
