diff options
Diffstat (limited to 'libglusterfs/src')
| -rw-r--r-- | libglusterfs/src/call-stub.c | 184 | ||||
| -rw-r--r-- | libglusterfs/src/call-stub.h | 50 | ||||
| -rw-r--r-- | libglusterfs/src/common-utils.c | 12 | ||||
| -rw-r--r-- | libglusterfs/src/defaults.c | 73 | ||||
| -rw-r--r-- | libglusterfs/src/defaults.h | 11 | ||||
| -rw-r--r-- | libglusterfs/src/glusterfs.h | 20 | ||||
| -rw-r--r-- | libglusterfs/src/protocol.h | 23 | ||||
| -rw-r--r-- | libglusterfs/src/xlator.c | 2 | ||||
| -rw-r--r-- | libglusterfs/src/xlator.h | 28 | 
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;  | 
