diff options
| author | Avra Sengupta <asengupt@redhat.com> | 2013-06-26 16:50:53 +0530 | 
|---|---|---|
| committer | Anand Avati <avati@redhat.com> | 2013-07-11 11:52:31 -0700 | 
| commit | 55ccdb71466ca8459f29454e9eee38fa7aa63e95 (patch) | |
| tree | 3faf2dde2b906a7941ad5d20586671d4ffa7e5c6 | |
| parent | 869b0f2c272d8e0f3afb7ad5f15ebc0f7c900a76 (diff) | |
mount/fuse: expose 'glusterfs.gfid*' virtual xattr key
currently two keys are exposed:
'glusterfs.gfid' : output is 16byte binary gfid
'glusterfs.gfid.string' : output is 36 byte canonical format of gfid
e.g.
[root@supernova glusterfs]# getfattr -n glusterfs.gfid -e hex f0
glusterfs.gfid=0x68305acb73e541719804fcf36a4857e8
[root@supernova glusterfs]# getfattr -n glusterfs.gfid.string f0
glusterfs.gfid.string="68305acb-73e5-4171-9804-fcf36a4857e8"
early consumers for this key would be geo-replication
(as it has being designed to do namespace operations on
gfid from the mount point, thereby needing the GFID for
entry operations on the slave).
Change-Id: I10b23dbd11628566ad6924334253f5d85d01a519
BUG: 847839
Original Author: Venky Shankar <vshankar@redhat.com>
Signed-off-by: Avra Sengupta <asengupt@redhat.com>
Reviewed-on: http://review.gluster.org/5129
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Anand Avati <avati@redhat.com>
| -rw-r--r-- | libglusterfs/src/glusterfs.h | 5 | ||||
| -rw-r--r-- | xlators/mount/fuse/src/fuse-bridge.c | 43 | 
2 files changed, 47 insertions, 1 deletions
diff --git a/libglusterfs/src/glusterfs.h b/libglusterfs/src/glusterfs.h index c2fbf5ac4..a50cc7fb7 100644 --- a/libglusterfs/src/glusterfs.h +++ b/libglusterfs/src/glusterfs.h @@ -95,7 +95,10 @@                                         strlen (GF_XATTR_LOCKINFO_KEY)) == 0)  #define GF_XATTR_LINKINFO_KEY   "trusted.distribute.linkinfo" -#define GFID_XATTR_KEY "trusted.gfid" +#define GFID_XATTR_KEY          "trusted.gfid" +#define VIRTUAL_GFID_XATTR_KEY_STR  "glusterfs.gfid.string" +#define VIRTUAL_GFID_XATTR_KEY      "glusterfs.gfid" +#define UUID_CANONICAL_FORM_LEN 36  #define GLUSTERFS_INTERNAL_FOP_KEY  "glusterfs-internal-fop" diff --git a/xlators/mount/fuse/src/fuse-bridge.c b/xlators/mount/fuse/src/fuse-bridge.c index 1b97d4302..5b6fed9fe 100644 --- a/xlators/mount/fuse/src/fuse-bridge.c +++ b/xlators/mount/fuse/src/fuse-bridge.c @@ -11,6 +11,7 @@  #include <sys/wait.h>  #include "fuse-bridge.h"  #include "mount-gluster-compat.h" +#include "glusterfs.h"  #ifdef __NetBSD__  #undef open /* in perfuse.h, pulled from mount-gluster-compat.h */ @@ -3161,6 +3162,8 @@ out:  void  fuse_getxattr_resume (fuse_state_t *state)  { +        char *value  = NULL; +          if (!state->loc.inode) {                  gf_log ("glusterfs-fuse", GF_LOG_WARNING,                          "%"PRIu64": GETXATTR %s/%"PRIu64" (%s) " @@ -3178,6 +3181,46 @@ fuse_getxattr_resume (fuse_state_t *state)          state->fd = fd_lookup (state->loc.inode, state->finh->pid);  #endif /* GF_TEST_FFOP */ +        if (state->name && +            (strcmp (state->name, VIRTUAL_GFID_XATTR_KEY) == 0)) { +                /* send glusterfs gfid in binary form */ + +                value = GF_CALLOC (16 + 1, sizeof(char), +                                   gf_common_mt_char); +                if (!value) { +                        send_fuse_err (state->this, state->finh, ENOMEM); +                        goto internal_out; +                } +                memcpy (value, state->loc.inode->gfid, 16); + +                send_fuse_xattr (THIS, state->finh, value, 16, state->size); +                GF_FREE (value); +        internal_out: +                free_fuse_state (state); +                return; +        } + +        if (state->name && +            (strcmp (state->name, VIRTUAL_GFID_XATTR_KEY_STR) == 0)) { +                /* transform binary gfid to canonical form */ + +                value = GF_CALLOC (UUID_CANONICAL_FORM_LEN + 1, sizeof(char), +                                   gf_common_mt_char); +                if (!value) { +                        send_fuse_err (state->this, state->finh, ENOMEM); +                        goto internal_out1; +                } +                uuid_utoa_r (state->loc.inode->gfid, value); + +                send_fuse_xattr (THIS, state->finh, value, +                                 UUID_CANONICAL_FORM_LEN, state->size); +                GF_FREE (value); +        internal_out1: +                free_fuse_state (state); +                return; +        } + +          if (state->fd) {                  gf_log ("glusterfs-fuse", GF_LOG_TRACE,                          "%"PRIu64": GETXATTR %p/%"PRIu64" (%s)", state->finh->unique,  | 
