From d7ecaaa1ed0f88869812ea17cb64a102a74c8c1c Mon Sep 17 00:00:00 2001 From: Amar Tumballi Date: Tue, 17 Jan 2012 05:57:24 +0530 Subject: core: add 'fremovexattr()' fop so operations can be done on fd for extended attribute removal Change-Id: Ie026f1b53793aeb4ae33e96ea5408c7a97f34bf6 Signed-off-by: Amar Tumballi BUG: 766571 Reviewed-on: http://review.gluster.com/778 Tested-by: Gluster Build System Reviewed-by: Anand Avati --- libglusterfs/src/call-stub.c | 76 ++++++++++++++++++++++++++++++++++++++++++++ libglusterfs/src/call-stub.h | 26 +++++++++++++++ libglusterfs/src/defaults.c | 27 ++++++++++++++++ libglusterfs/src/defaults.h | 14 ++++++++ libglusterfs/src/glusterfs.h | 1 + libglusterfs/src/syncop.c | 28 ++++++++++++++++ libglusterfs/src/syncop.h | 1 + libglusterfs/src/syscall.c | 26 +++++++++++++++ libglusterfs/src/syscall.h | 3 ++ libglusterfs/src/xlator.c | 1 + libglusterfs/src/xlator.h | 13 ++++++++ 11 files changed, 216 insertions(+) (limited to 'libglusterfs') diff --git a/libglusterfs/src/call-stub.c b/libglusterfs/src/call-stub.c index 8b28dc9bec6..24ca3825b0d 100644 --- a/libglusterfs/src/call-stub.c +++ b/libglusterfs/src/call-stub.c @@ -1463,6 +1463,48 @@ out: return stub; } +call_stub_t * +fop_fremovexattr_stub (call_frame_t *frame, + fop_fremovexattr_t fn, + fd_t *fd, + const char *name) +{ + call_stub_t *stub = NULL; + + GF_VALIDATE_OR_GOTO ("call-stub", frame, out); + GF_VALIDATE_OR_GOTO ("call-stub", fd, out); + GF_VALIDATE_OR_GOTO ("call-stub", name, out); + + stub = stub_new (frame, 1, GF_FOP_FREMOVEXATTR); + GF_VALIDATE_OR_GOTO ("call-stub", stub, out); + + stub->args.fremovexattr.fn = fn; + stub->args.fremovexattr.fd = fd_ref (fd); + stub->args.fremovexattr.name = gf_strdup (name); +out: + return stub; +} + + +call_stub_t * +fop_fremovexattr_cbk_stub (call_frame_t *frame, + fop_fremovexattr_cbk_t fn, + int32_t op_ret, + int32_t op_errno) +{ + call_stub_t *stub = NULL; + + GF_VALIDATE_OR_GOTO ("call-stub", frame, out); + + stub = stub_new (frame, 0, GF_FOP_FREMOVEXATTR); + GF_VALIDATE_OR_GOTO ("call-stub", stub, out); + + stub->args.fremovexattr_cbk.fn = fn; + stub->args.fremovexattr_cbk.op_ret = op_ret; + stub->args.fremovexattr_cbk.op_errno = op_errno; +out: + return stub; +} call_stub_t * fop_lk_stub (call_frame_t *frame, @@ -2303,6 +2345,15 @@ call_resume_wind (call_stub_t *stub) break; } + case GF_FOP_FREMOVEXATTR: + { + stub->args.fremovexattr.fn (stub->frame, + stub->frame->this, + stub->args.fremovexattr.fd, + stub->args.fremovexattr.name); + break; + } + case GF_FOP_OPENDIR: { stub->args.opendir.fn (stub->frame, @@ -2939,6 +2990,22 @@ call_resume_unwind (call_stub_t *stub) break; } + case GF_FOP_FREMOVEXATTR: + { + if (!stub->args.fremovexattr_cbk.fn) + STACK_UNWIND (stub->frame, + stub->args.fremovexattr_cbk.op_ret, + stub->args.fremovexattr_cbk.op_errno); + else + stub->args.fremovexattr_cbk.fn (stub->frame, + stub->frame->cookie, + stub->frame->this, + stub->args.fremovexattr_cbk.op_ret, + stub->args.fremovexattr_cbk.op_errno); + + break; + } + case GF_FOP_OPENDIR: { if (!stub->args.opendir_cbk.fn) @@ -3454,6 +3521,13 @@ call_stub_destroy_wind (call_stub_t *stub) break; } + case GF_FOP_FREMOVEXATTR: + { + fd_unref (stub->args.fremovexattr.fd); + GF_FREE ((char *)stub->args.fremovexattr.name); + break; + } + case GF_FOP_OPENDIR: { loc_wipe (&stub->args.opendir.loc); @@ -3718,6 +3792,8 @@ call_stub_destroy_unwind (call_stub_t *stub) case GF_FOP_REMOVEXATTR: break; + case GF_FOP_FREMOVEXATTR: + break; case GF_FOP_OPENDIR: { diff --git a/libglusterfs/src/call-stub.h b/libglusterfs/src/call-stub.h index 4b03dbfe209..5e6c0a1d385 100644 --- a/libglusterfs/src/call-stub.h +++ b/libglusterfs/src/call-stub.h @@ -412,6 +412,18 @@ typedef struct { int32_t op_ret, op_errno; } removexattr_cbk; + + /* fremovexattr */ + struct { + fop_fremovexattr_t fn; + fd_t *fd; + const char *name; + } fremovexattr; + struct { + fop_fremovexattr_cbk_t fn; + int32_t op_ret, op_errno; + } fremovexattr_cbk; + /* lk */ struct { fop_lk_t fn; @@ -964,6 +976,20 @@ fop_removexattr_cbk_stub (call_frame_t *frame, fop_removexattr_cbk_t fn, int32_t op_ret, int32_t op_errno); + + +call_stub_t * +fop_fremovexattr_stub (call_frame_t *frame, + fop_fremovexattr_t fn, + fd_t *fd, + const char *name); + +call_stub_t * +fop_fremovexattr_cbk_stub (call_frame_t *frame, + fop_fremovexattr_cbk_t fn, + int32_t op_ret, + int32_t op_errno); + call_stub_t * fop_lk_stub (call_frame_t *frame, fop_lk_t fn, diff --git a/libglusterfs/src/defaults.c b/libglusterfs/src/defaults.c index 828f266b38e..df208c8805a 100644 --- a/libglusterfs/src/defaults.c +++ b/libglusterfs/src/defaults.c @@ -327,6 +327,15 @@ default_removexattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, return 0; } + +int32_t +default_fremovexattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno) +{ + STACK_UNWIND_STRICT (fremovexattr, frame, op_ret, op_errno); + return 0; +} + int32_t default_lk_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret, int32_t op_errno, struct gf_flock *lock) @@ -674,6 +683,15 @@ default_removexattr_resume (call_frame_t *frame, xlator_t *this, loc_t *loc, return 0; } +int32_t +default_fremovexattr_resume (call_frame_t *frame, xlator_t *this, fd_t *fd, + const char *name) +{ + STACK_WIND (frame, default_fremovexattr_cbk, FIRST_CHILD(this), + FIRST_CHILD(this)->fops->fremovexattr, fd, name); + return 0; +} + int32_t default_lk_resume (call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t cmd, struct gf_flock *lock) @@ -1042,6 +1060,15 @@ default_removexattr (call_frame_t *frame, xlator_t *this, loc_t *loc, return 0; } +int32_t +default_fremovexattr (call_frame_t *frame, xlator_t *this, fd_t *fd, + const char *name) +{ + STACK_WIND (frame, default_fremovexattr_cbk, FIRST_CHILD(this), + FIRST_CHILD(this)->fops->fremovexattr, fd, name); + return 0; +} + int32_t default_lk (call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t cmd, struct gf_flock *lock) diff --git a/libglusterfs/src/defaults.h b/libglusterfs/src/defaults.h index fe04cbf9205..deba1557d5f 100644 --- a/libglusterfs/src/defaults.h +++ b/libglusterfs/src/defaults.h @@ -176,6 +176,11 @@ int32_t default_removexattr (call_frame_t *frame, loc_t *loc, const char *name); +int32_t default_fremovexattr (call_frame_t *frame, + xlator_t *this, + fd_t *fd, + const char *name); + int32_t default_lk (call_frame_t *frame, xlator_t *this, fd_t *fd, @@ -390,6 +395,11 @@ int32_t default_removexattr_resume (call_frame_t *frame, loc_t *loc, const char *name); +int32_t default_fremovexattr_resume (call_frame_t *frame, + xlator_t *this, + fd_t *fd, + const char *name); + int32_t default_lk_resume (call_frame_t *frame, xlator_t *this, fd_t *fd, @@ -623,6 +633,10 @@ int32_t default_removexattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret, int32_t op_errno); +int32_t +default_fremovexattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno); + int32_t default_lk_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret, int32_t op_errno, struct gf_flock *lock); diff --git a/libglusterfs/src/glusterfs.h b/libglusterfs/src/glusterfs.h index 2f68ab74106..0642973cbad 100644 --- a/libglusterfs/src/glusterfs.h +++ b/libglusterfs/src/glusterfs.h @@ -166,6 +166,7 @@ typedef enum { GF_FOP_RELEASE, GF_FOP_RELEASEDIR, GF_FOP_GETSPEC, + GF_FOP_FREMOVEXATTR, GF_FOP_MAXVALUE, } glusterfs_fop_t; diff --git a/libglusterfs/src/syncop.c b/libglusterfs/src/syncop.c index 2771bdea5b6..cb3b67ce79f 100644 --- a/libglusterfs/src/syncop.c +++ b/libglusterfs/src/syncop.c @@ -474,6 +474,34 @@ syncop_removexattr (xlator_t *subvol, loc_t *loc, const char *name) return args.op_ret; } +int +syncop_fremovexattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int op_ret, int op_errno) +{ + struct syncargs *args = NULL; + + args = cookie; + + args->op_ret = op_ret; + args->op_errno = op_errno; + + __wake (args); + + return 0; +} + +int +syncop_fremovexattr (xlator_t *subvol, fd_t *fd, const char *name) +{ + struct syncargs args = {0, }; + + SYNCOP (subvol, (&args), syncop_fremovexattr_cbk, + subvol->fops->fremovexattr, fd, name); + + errno = args.op_errno; + return args.op_ret; +} + int syncop_setxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int op_ret, int op_errno) diff --git a/libglusterfs/src/syncop.h b/libglusterfs/src/syncop.h index b4cdafd535c..57567426dab 100644 --- a/libglusterfs/src/syncop.h +++ b/libglusterfs/src/syncop.h @@ -186,6 +186,7 @@ int syncop_listxattr (xlator_t *subvol, loc_t *loc, dict_t **dict); int syncop_getxattr (xlator_t *xl, loc_t *loc, dict_t **dict, const char *key); int syncop_fgetxattr (xlator_t *xl, fd_t *fd, dict_t **dict, const char *key); int syncop_removexattr (xlator_t *subvol, loc_t *loc, const char *name); +int syncop_fremovexattr (xlator_t *subvol, fd_t *fd, const char *name); int syncop_create (xlator_t *subvol, loc_t *loc, int32_t flags, mode_t mode, fd_t *fd, dict_t *dict); diff --git a/libglusterfs/src/syscall.c b/libglusterfs/src/syscall.c index 5819218f55f..8e2d56b8d63 100644 --- a/libglusterfs/src/syscall.c +++ b/libglusterfs/src/syscall.c @@ -360,6 +360,32 @@ sys_fgetxattr (int filedes, const char *name, void *value, size_t size) } +int +sys_fremovexattr (int filedes, const char *name) +{ + +#if defined(GF_LINUX_HOST_OS) || defined(__NetBSD__) + return fremovexattr (filedes, name); +#endif + + errno = ENOSYS; + return -1; +#if 0 /* TODO: to port to other OSes, fill in each of below */ +#ifdef GF_BSD_HOST_OS + return extattr_remove_fd (filedes, EXTATTR_NAMESPACE_USER, name); +#endif + +#ifdef GF_SOLARIS_HOST_OS + return solaris_fremovexattr (filedes, name); +#endif + +#ifdef GF_DARWIN_HOST_OS + return fremovexattr (filedes, name, 0); +#endif +#endif +} + + int sys_fsetxattr (int filedes, const char *name, const void *value, size_t size, int flags) diff --git a/libglusterfs/src/syscall.h b/libglusterfs/src/syscall.h index b8a1c289600..f5325b4cd39 100644 --- a/libglusterfs/src/syscall.h +++ b/libglusterfs/src/syscall.h @@ -139,6 +139,9 @@ sys_flistxattr (int filedes, char *list, size_t size); int sys_lremovexattr (const char *path, const char *name); +int +sys_fremovexattr (int filedes, const char *name); + int sys_access (const char *pathname, int mode); diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c index 160ac2d6322..428357633af 100644 --- a/libglusterfs/src/xlator.c +++ b/libglusterfs/src/xlator.c @@ -69,6 +69,7 @@ fill_defaults (xlator_t *xl) SET_DEFAULT_FOP (fsetxattr); SET_DEFAULT_FOP (fgetxattr); SET_DEFAULT_FOP (removexattr); + SET_DEFAULT_FOP (fremovexattr); SET_DEFAULT_FOP (opendir); SET_DEFAULT_FOP (readdir); SET_DEFAULT_FOP (readdirp); diff --git a/libglusterfs/src/xlator.h b/libglusterfs/src/xlator.h index fab3b4468d8..bc3d7a6dcf6 100644 --- a/libglusterfs/src/xlator.h +++ b/libglusterfs/src/xlator.h @@ -343,6 +343,12 @@ typedef int32_t (*fop_removexattr_cbk_t) (call_frame_t *frame, int32_t op_ret, int32_t op_errno); +typedef int32_t (*fop_fremovexattr_cbk_t) (call_frame_t *frame, + void *cookie, + xlator_t *this, + int32_t op_ret, + int32_t op_errno); + typedef int32_t (*fop_lk_cbk_t) (call_frame_t *frame, void *cookie, xlator_t *this, @@ -564,6 +570,11 @@ typedef int32_t (*fop_removexattr_t) (call_frame_t *frame, loc_t *loc, const char *name); +typedef int32_t (*fop_fremovexattr_t) (call_frame_t *frame, + xlator_t *this, + fd_t *fd, + const char *name); + typedef int32_t (*fop_lk_t) (call_frame_t *frame, xlator_t *this, fd_t *fd, @@ -665,6 +676,7 @@ struct xlator_fops { fop_fsetxattr_t fsetxattr; fop_fgetxattr_t fgetxattr; fop_removexattr_t removexattr; + fop_fremovexattr_t fremovexattr; fop_lk_t lk; fop_inodelk_t inodelk; fop_finodelk_t finodelk; @@ -708,6 +720,7 @@ struct xlator_fops { fop_fsetxattr_cbk_t fsetxattr_cbk; fop_fgetxattr_cbk_t fgetxattr_cbk; fop_removexattr_cbk_t removexattr_cbk; + fop_fremovexattr_cbk_t fremovexattr_cbk; fop_lk_cbk_t lk_cbk; fop_inodelk_cbk_t inodelk_cbk; fop_finodelk_cbk_t finodelk_cbk; -- cgit