summaryrefslogtreecommitdiffstats
path: root/libglusterfs
diff options
context:
space:
mode:
authorVikas Gorur <vikas@zresearch.com>2009-03-03 16:00:58 +0530
committerAnand V. Avati <avati@amp.gluster.com>2009-03-07 02:08:41 +0530
commit0991858fca6dc93de685e9527fb9ff47d77f616f (patch)
treeadcdf627d40c1fe90a8535c7b0bc27d057901788 /libglusterfs
parentd092dff9a6e23d5fdef64154b6f3d6211f7482a6 (diff)
added fgetxattr and fsetxattr FOPs
Signed-off-by: Anand V. Avati <avati@amp.gluster.com>
Diffstat (limited to 'libglusterfs')
-rw-r--r--libglusterfs/src/call-stub.c184
-rw-r--r--libglusterfs/src/call-stub.h50
-rw-r--r--libglusterfs/src/common-utils.c12
-rw-r--r--libglusterfs/src/defaults.c73
-rw-r--r--libglusterfs/src/defaults.h11
-rw-r--r--libglusterfs/src/glusterfs.h20
-rw-r--r--libglusterfs/src/protocol.h23
-rw-r--r--libglusterfs/src/xlator.c2
-rw-r--r--libglusterfs/src/xlator.h28
9 files changed, 381 insertions, 22 deletions
diff --git a/libglusterfs/src/call-stub.c b/libglusterfs/src/call-stub.c
index c1288d90530..92301a2ddb8 100644
--- a/libglusterfs/src/call-stub.c
+++ b/libglusterfs/src/call-stub.c
@@ -1537,6 +1537,105 @@ out:
return stub;
}
+
+call_stub_t *
+fop_fsetxattr_stub (call_frame_t *frame,
+ fop_fsetxattr_t fn,
+ fd_t *fd,
+ dict_t *dict,
+ int32_t flags)
+{
+ call_stub_t *stub = NULL;
+
+ GF_VALIDATE_OR_GOTO ("call-stub", frame, out);
+ GF_VALIDATE_OR_GOTO ("call-stub", fd, out);
+
+ stub = stub_new (frame, 1, GF_FOP_FSETXATTR);
+ GF_VALIDATE_OR_GOTO ("call-stub", stub, out);
+
+ stub->args.fsetxattr.fn = fn;
+ stub->args.fsetxattr.fd = fd_ref (fd);
+
+ /* TODO */
+ if (dict)
+ stub->args.fsetxattr.dict = dict_ref (dict);
+ stub->args.fsetxattr.flags = flags;
+out:
+ return stub;
+}
+
+
+call_stub_t *
+fop_fsetxattr_cbk_stub (call_frame_t *frame,
+ fop_fsetxattr_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_FSETXATTR);
+ GF_VALIDATE_OR_GOTO ("call-stub", stub, out);
+
+ stub->args.fsetxattr_cbk.fn = fn;
+ stub->args.fsetxattr_cbk.op_ret = op_ret;
+ stub->args.fsetxattr_cbk.op_errno = op_errno;
+out:
+ return stub;
+}
+
+
+call_stub_t *
+fop_fgetxattr_stub (call_frame_t *frame,
+ fop_fgetxattr_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);
+
+ stub = stub_new (frame, 1, GF_FOP_FGETXATTR);
+ GF_VALIDATE_OR_GOTO ("call-stub", stub, out);
+
+ stub->args.fgetxattr.fn = fn;
+ stub->args.fgetxattr.fd = fd_ref (fd);
+
+ if (name)
+ stub->args.fgetxattr.name = strdup (name);
+out:
+ return stub;
+}
+
+
+call_stub_t *
+fop_fgetxattr_cbk_stub (call_frame_t *frame,
+ fop_fgetxattr_cbk_t fn,
+ int32_t op_ret,
+ int32_t op_errno,
+ dict_t *dict)
+{
+ call_stub_t *stub = NULL;
+
+ GF_VALIDATE_OR_GOTO ("call-stub", frame, out);
+
+ stub = stub_new (frame, 0, GF_FOP_GETXATTR);
+ GF_VALIDATE_OR_GOTO ("call-stub", stub, out);
+
+ stub->args.fgetxattr_cbk.fn = fn;
+ stub->args.fgetxattr_cbk.op_ret = op_ret;
+ stub->args.fgetxattr_cbk.op_errno = op_errno;
+
+ /* TODO */
+ if (dict)
+ stub->args.fgetxattr_cbk.dict = dict_ref (dict);
+out:
+ return stub;
+}
+
+
call_stub_t *
fop_removexattr_stub (call_frame_t *frame,
fop_removexattr_t fn,
@@ -2340,6 +2439,25 @@ call_resume_wind (call_stub_t *stub)
break;
}
+ case GF_FOP_FSETXATTR:
+ {
+ stub->args.fsetxattr.fn (stub->frame,
+ stub->frame->this,
+ stub->args.fsetxattr.fd,
+ stub->args.fsetxattr.dict,
+ stub->args.fsetxattr.flags);
+ break;
+ }
+
+ case GF_FOP_FGETXATTR:
+ {
+ stub->args.fgetxattr.fn (stub->frame,
+ stub->frame->this,
+ stub->args.fgetxattr.fd,
+ stub->args.fgetxattr.name);
+ break;
+ }
+
case GF_FOP_REMOVEXATTR:
{
stub->args.removexattr.fn (stub->frame,
@@ -2953,7 +3071,41 @@ call_resume_unwind (call_stub_t *stub)
stub->args.getxattr_cbk.dict);
break;
}
-
+
+ case GF_FOP_FSETXATTR:
+ {
+ if (!stub->args.fsetxattr_cbk.fn)
+ STACK_UNWIND (stub->frame,
+ stub->args.fsetxattr_cbk.op_ret,
+ stub->args.fsetxattr_cbk.op_errno);
+
+ else
+ stub->args.fsetxattr_cbk.fn (stub->frame,
+ stub->frame->cookie,
+ stub->frame->this,
+ stub->args.fsetxattr_cbk.op_ret,
+ stub->args.fsetxattr_cbk.op_errno);
+
+ break;
+ }
+
+ case GF_FOP_FGETXATTR:
+ {
+ if (!stub->args.fgetxattr_cbk.fn)
+ STACK_UNWIND (stub->frame,
+ stub->args.fgetxattr_cbk.op_ret,
+ stub->args.fgetxattr_cbk.op_errno,
+ stub->args.fgetxattr_cbk.dict);
+ else
+ stub->args.fgetxattr_cbk.fn (stub->frame,
+ stub->frame->cookie,
+ stub->frame->this,
+ stub->args.fgetxattr_cbk.op_ret,
+ stub->args.fgetxattr_cbk.op_errno,
+ stub->args.fgetxattr_cbk.dict);
+ break;
+ }
+
case GF_FOP_REMOVEXATTR:
{
if (!stub->args.removexattr_cbk.fn)
@@ -3518,13 +3670,29 @@ call_stub_destroy_wind (call_stub_t *stub)
break;
}
+ case GF_FOP_FSETXATTR:
+ {
+ fd_unref (stub->args.fsetxattr.fd);
+ if (stub->args.fsetxattr.dict)
+ dict_unref (stub->args.fsetxattr.dict);
+ break;
+ }
+
+ case GF_FOP_FGETXATTR:
+ {
+ if (stub->args.fgetxattr.name)
+ FREE (stub->args.fgetxattr.name);
+ fd_unref (stub->args.fgetxattr.fd);
+ break;
+ }
+
case GF_FOP_REMOVEXATTR:
{
loc_wipe (&stub->args.removexattr.loc);
FREE (stub->args.removexattr.name);
break;
}
-
+
case GF_FOP_OPENDIR:
{
loc_wipe (&stub->args.opendir.loc);
@@ -3805,9 +3973,19 @@ call_stub_destroy_unwind (call_stub_t *stub)
}
break;
+ case GF_FOP_FSETXATTR:
+ break;
+
+ case GF_FOP_FGETXATTR:
+ {
+ if (stub->args.fgetxattr_cbk.dict)
+ dict_unref (stub->args.fgetxattr_cbk.dict);
+ }
+ break;
+
case GF_FOP_REMOVEXATTR:
break;
-
+
case GF_FOP_OPENDIR:
{
if (stub->args.opendir_cbk.fd)
diff --git a/libglusterfs/src/call-stub.h b/libglusterfs/src/call-stub.h
index ee2ba98a047..d80ddd1733b 100644
--- a/libglusterfs/src/call-stub.h
+++ b/libglusterfs/src/call-stub.h
@@ -436,6 +436,30 @@ typedef struct {
dict_t *dict;
} getxattr_cbk;
+ /* fsetxattr */
+ struct {
+ fop_fsetxattr_t fn;
+ fd_t *fd;
+ dict_t *dict;
+ int32_t flags;
+ } fsetxattr;
+ struct {
+ fop_fsetxattr_cbk_t fn;
+ int32_t op_ret, op_errno;
+ } fsetxattr_cbk;
+
+ /* fgetxattr */
+ struct {
+ fop_fgetxattr_t fn;
+ fd_t *fd;
+ const char *name;
+ } fgetxattr;
+ struct {
+ fop_fgetxattr_cbk_t fn;
+ int32_t op_ret, op_errno;
+ dict_t *dict;
+ } fgetxattr_cbk;
+
/* removexattr */
struct {
fop_removexattr_t fn;
@@ -1010,6 +1034,32 @@ fop_getxattr_cbk_stub (call_frame_t *frame,
dict_t *value);
call_stub_t *
+fop_fsetxattr_stub (call_frame_t *frame,
+ fop_fsetxattr_t fn,
+ fd_t *fd,
+ dict_t *dict,
+ int32_t flags);
+
+call_stub_t *
+fop_fsetxattr_cbk_stub (call_frame_t *frame,
+ fop_fsetxattr_cbk_t fn,
+ int32_t op_ret,
+ int32_t op_errno);
+
+call_stub_t *
+fop_fgetxattr_stub (call_frame_t *frame,
+ fop_fgetxattr_t fn,
+ fd_t *fd,
+ const char *name);
+
+call_stub_t *
+fop_fgetxattr_cbk_stub (call_frame_t *frame,
+ fop_fgetxattr_cbk_t fn,
+ int32_t op_ret,
+ int32_t op_errno,
+ dict_t *value);
+
+call_stub_t *
fop_removexattr_stub (call_frame_t *frame,
fop_removexattr_t fn,
loc_t *loc,
diff --git a/libglusterfs/src/common-utils.c b/libglusterfs/src/common-utils.c
index e8a7c9ab525..372195daaed 100644
--- a/libglusterfs/src/common-utils.c
+++ b/libglusterfs/src/common-utils.c
@@ -202,30 +202,32 @@ gf_global_variable_init()
gf_fop_list[GF_FOP_SETDENTS] = "SETDENTS"; /* 35 */
gf_fop_list[GF_FOP_READDIR] = "READDIR";
gf_fop_list[GF_FOP_INODELK] = "INODELK";
- gf_fop_list[GF_FOP_FINODELK] = "FINODELK";
+ gf_fop_list[GF_FOP_FINODELK] = "FINODELK";
gf_fop_list[GF_FOP_ENTRYLK] = "ENTRYLK";
gf_fop_list[GF_FOP_FENTRYLK] = "FENTRYLK"; /* 40 */
- gf_fop_list[GF_FOP_CHECKSUM] = "CHECKSUM"; /* 41 */
+ gf_fop_list[GF_FOP_CHECKSUM] = "CHECKSUM"; /* 41 */
gf_fop_list[GF_FOP_XATTROP] = "XATTROP";
gf_fop_list[GF_FOP_LOCK_NOTIFY] = "LOCK_NOTIFY";
gf_fop_list[GF_FOP_LOCK_FNOTIFY]= "LOCK_FNOTIFY";
+ gf_fop_list[GF_FOP_FSETXATTR] = "FSETXATTR";
+ gf_fop_list[GF_FOP_FGETXATTR] = "FGETXATTR";
gf_mop_list[GF_MOP_SETVOLUME] = "SETVOLUME"; /* 0 */
gf_mop_list[GF_MOP_GETVOLUME] = "GETVOLUME"; /* 1 */
gf_mop_list[GF_MOP_STATS] = "STATS";
gf_mop_list[GF_MOP_SETSPEC] = "SETSPEC";
gf_mop_list[GF_MOP_GETSPEC] = "GETSPEC";
-
+
gf_cbk_list[GF_CBK_FORGET] = "FORGET";
gf_cbk_list[GF_CBK_RELEASE] = "RELEASE";
gf_cbk_list[GF_CBK_RELEASEDIR] = "RELEASEDIR";
- /* Are there any more variables to be included? All global
+ /* Are there any more variables to be included? All global
variables initialization should go here */
return;
}
-void
+void
set_global_ctx_ptr (glusterfs_ctx_t *ctx)
{
gf_global_ctx = ctx;
diff --git a/libglusterfs/src/defaults.c b/libglusterfs/src/defaults.c
index 69d03160e81..dc290863395 100644
--- a/libglusterfs/src/defaults.c
+++ b/libglusterfs/src/defaults.c
@@ -974,13 +974,76 @@ default_setxattr (call_frame_t *frame,
return 0;
}
+
+static int32_t
+default_fsetxattr_cbk (call_frame_t *frame,
+ void *cookie,
+ xlator_t *this,
+ int32_t op_ret,
+ int32_t op_errno)
+{
+ STACK_UNWIND (frame,
+ op_ret,
+ op_errno);
+ return 0;
+}
+
+int32_t
+default_fsetxattr (call_frame_t *frame,
+ xlator_t *this,
+ fd_t *fd,
+ dict_t *dict,
+ int32_t flags)
+{
+ STACK_WIND (frame,
+ default_fsetxattr_cbk,
+ FIRST_CHILD(this),
+ FIRST_CHILD(this)->fops->fsetxattr,
+ fd,
+ dict,
+ flags);
+ return 0;
+}
+
+
+static int32_t
+default_fgetxattr_cbk (call_frame_t *frame,
+ void *cookie,
+ xlator_t *this,
+ int32_t op_ret,
+ int32_t op_errno,
+ dict_t *dict)
+{
+ STACK_UNWIND (frame,
+ op_ret,
+ op_errno,
+ dict);
+ return 0;
+}
+
+
+int32_t
+default_fgetxattr (call_frame_t *frame,
+ xlator_t *this,
+ fd_t *fd,
+ const char *name)
+{
+ STACK_WIND (frame,
+ default_fgetxattr_cbk,
+ FIRST_CHILD(this),
+ FIRST_CHILD(this)->fops->fgetxattr,
+ fd,
+ name);
+ return 0;
+}
+
static int32_t
default_getxattr_cbk (call_frame_t *frame,
- void *cookie,
- xlator_t *this,
- int32_t op_ret,
- int32_t op_errno,
- dict_t *dict)
+ void *cookie,
+ xlator_t *this,
+ int32_t op_ret,
+ int32_t op_errno,
+ dict_t *dict)
{
STACK_UNWIND (frame,
op_ret,
diff --git a/libglusterfs/src/defaults.h b/libglusterfs/src/defaults.h
index 22c814b7d97..61522230075 100644
--- a/libglusterfs/src/defaults.h
+++ b/libglusterfs/src/defaults.h
@@ -207,6 +207,17 @@ int32_t default_getxattr (call_frame_t *frame,
loc_t *loc,
const char *name);
+int32_t default_fsetxattr (call_frame_t *frame,
+ xlator_t *this,
+ fd_t *fd,
+ dict_t *dict,
+ int32_t flags);
+
+int32_t default_fgetxattr (call_frame_t *frame,
+ xlator_t *this,
+ fd_t *fd,
+ const char *name);
+
int32_t default_removexattr (call_frame_t *frame,
xlator_t *this,
loc_t *loc,
diff --git a/libglusterfs/src/glusterfs.h b/libglusterfs/src/glusterfs.h
index d00ec48668c..b828a3ecd7a 100644
--- a/libglusterfs/src/glusterfs.h
+++ b/libglusterfs/src/glusterfs.h
@@ -101,32 +101,34 @@ typedef enum {
GF_FOP_FLUSH,
GF_FOP_FSYNC,
GF_FOP_SETXATTR,
- GF_FOP_GETXATTR,
+ GF_FOP_GETXATTR,
GF_FOP_REMOVEXATTR,/* 20 */
GF_FOP_OPENDIR,
GF_FOP_GETDENTS,
- GF_FOP_FSYNCDIR,
+ GF_FOP_FSYNCDIR,
GF_FOP_ACCESS,
GF_FOP_CREATE, /* 25 */
GF_FOP_FTRUNCATE,
GF_FOP_FSTAT,
- GF_FOP_LK,
+ GF_FOP_LK,
GF_FOP_UTIMENS,
GF_FOP_FCHMOD, /* 30 */
GF_FOP_FCHOWN,
GF_FOP_LOOKUP,
GF_FOP_SETDENTS,
- GF_FOP_READDIR,
+ GF_FOP_READDIR,
GF_FOP_INODELK, /* 35 */
- GF_FOP_FINODELK,
- GF_FOP_ENTRYLK,
- GF_FOP_FENTRYLK,
- GF_FOP_CHECKSUM,
+ GF_FOP_FINODELK,
+ GF_FOP_ENTRYLK,
+ GF_FOP_FENTRYLK,
+ GF_FOP_CHECKSUM,
GF_FOP_XATTROP, /* 40 */
GF_FOP_FXATTROP,
GF_FOP_LOCK_NOTIFY,
GF_FOP_LOCK_FNOTIFY,
- GF_FOP_MAXVALUE,
+ GF_FOP_FGETXATTR,
+ GF_FOP_FSETXATTR,
+ GF_FOP_MAXVALUE,
} glusterfs_fop_t;
/* NOTE: add members ONLY at the end (just before _MAXVALUE) */
diff --git a/libglusterfs/src/protocol.h b/libglusterfs/src/protocol.h
index 82e42cfb180..35f172ab7b4 100644
--- a/libglusterfs/src/protocol.h
+++ b/libglusterfs/src/protocol.h
@@ -397,6 +397,17 @@ typedef struct {
} __attribute__((packed)) gf_fop_setxattr_req_t;
typedef struct { } __attribute__((packed)) gf_fop_setxattr_rsp_t;
+
+typedef struct {
+ uint64_t ino;
+ int64_t fd;
+ uint32_t flags;
+ uint32_t dict_len;
+ char dict[0];
+} __attribute__((packed)) gf_fop_fsetxattr_req_t;
+typedef struct { } __attribute__((packed)) gf_fop_fsetxattr_rsp_t;
+
+
typedef struct {
uint64_t ino;
uint32_t flags;
@@ -438,6 +449,18 @@ typedef struct {
typedef struct {
+ uint64_t ino;
+ int64_t fd;
+ uint32_t namelen;
+ char name[0];
+} __attribute__((packed)) gf_fop_fgetxattr_req_t;
+typedef struct {
+ uint32_t dict_len;
+ char dict[0];
+} __attribute__((packed)) gf_fop_fgetxattr_rsp_t;
+
+
+typedef struct {
uint64_t ino;
char path[0];
char name[0];
diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c
index 2706609af86..090fbc72708 100644
--- a/libglusterfs/src/xlator.c
+++ b/libglusterfs/src/xlator.c
@@ -75,6 +75,8 @@ fill_defaults (xlator_t *xl)
SET_DEFAULT_FOP (fsync);
SET_DEFAULT_FOP (setxattr);
SET_DEFAULT_FOP (getxattr);
+ SET_DEFAULT_FOP (fsetxattr);
+ SET_DEFAULT_FOP (fgetxattr);
SET_DEFAULT_FOP (removexattr);
SET_DEFAULT_FOP (opendir);
SET_DEFAULT_FOP (readdir);
diff --git a/libglusterfs/src/xlator.h b/libglusterfs/src/xlator.h
index d353a663f54..a5a20e8b28a 100644
--- a/libglusterfs/src/xlator.h
+++ b/libglusterfs/src/xlator.h
@@ -352,6 +352,19 @@ typedef int32_t (*fop_getxattr_cbk_t) (call_frame_t *frame,
int32_t op_errno,
dict_t *dict);
+typedef int32_t (*fop_fsetxattr_cbk_t) (call_frame_t *frame,
+ void *cookie,
+ xlator_t *this,
+ int32_t op_ret,
+ int32_t op_errno);
+
+typedef int32_t (*fop_fgetxattr_cbk_t) (call_frame_t *frame,
+ void *cookie,
+ xlator_t *this,
+ int32_t op_ret,
+ int32_t op_errno,
+ dict_t *dict);
+
typedef int32_t (*fop_removexattr_cbk_t) (call_frame_t *frame,
void *cookie,
xlator_t *this,
@@ -589,6 +602,17 @@ typedef int32_t (*fop_getxattr_t) (call_frame_t *frame,
loc_t *loc,
const char *name);
+typedef int32_t (*fop_fsetxattr_t) (call_frame_t *frame,
+ xlator_t *this,
+ fd_t *fd,
+ dict_t *dict,
+ int32_t flags);
+
+typedef int32_t (*fop_fgetxattr_t) (call_frame_t *frame,
+ xlator_t *this,
+ fd_t *fd,
+ const char *name);
+
typedef int32_t (*fop_removexattr_t) (call_frame_t *frame,
xlator_t *this,
loc_t *loc,
@@ -687,6 +711,8 @@ struct xlator_fops {
fop_statfs_t statfs;
fop_setxattr_t setxattr;
fop_getxattr_t getxattr;
+ fop_fsetxattr_t fsetxattr;
+ fop_fgetxattr_t fgetxattr;
fop_removexattr_t removexattr;
fop_lk_t lk;
fop_inodelk_t inodelk;
@@ -733,6 +759,8 @@ struct xlator_fops {
fop_statfs_cbk_t statfs_cbk;
fop_setxattr_cbk_t setxattr_cbk;
fop_getxattr_cbk_t getxattr_cbk;
+ fop_fsetxattr_cbk_t fsetxattr_cbk;
+ fop_fgetxattr_cbk_t fgetxattr_cbk;
fop_removexattr_cbk_t removexattr_cbk;
fop_lk_cbk_t lk_cbk;
fop_inodelk_cbk_t inodelk_cbk;