diff options
| author | Amar Tumballi <amar@gluster.com> | 2012-01-18 18:06:44 +0530 | 
|---|---|---|
| committer | Anand Avati <avati@gluster.com> | 2012-01-25 02:03:44 -0800 | 
| commit | cf8486cbef329ef66868f658fa35f470f97db462 (patch) | |
| tree | 18cf37bd7cf65ac820d435fb1ee43dc205a2917b /xlators/protocol/client/src/client-helpers.c | |
| parent | b02afc6d008f9959db28244eb2b9dd3b9ef92393 (diff) | |
core: get xattrs also as part of readdirp
readdirp_req() call sends a dict_t * as an argument, which
contains all the xattr keys for which the entries got in
readdirp_rsp() are having xattr value filled dictionary.
Change-Id: I8b7e1290740ea3e884e67d19156ce849227167c0
Signed-off-by: Amar Tumballi <amar@gluster.com>
BUG: 765785
Reviewed-on: http://review.gluster.com/771
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Anand Avati <avati@gluster.com>
Diffstat (limited to 'xlators/protocol/client/src/client-helpers.c')
| -rw-r--r-- | xlators/protocol/client/src/client-helpers.c | 30 | 
1 files changed, 29 insertions, 1 deletions
diff --git a/xlators/protocol/client/src/client-helpers.c b/xlators/protocol/client/src/client-helpers.c index 2a12573e2bb..5759f30624e 100644 --- a/xlators/protocol/client/src/client-helpers.c +++ b/xlators/protocol/client/src/client-helpers.c @@ -154,15 +154,21 @@ out:  }  int -unserialize_rsp_direntp (struct gfs3_readdirp_rsp *rsp, gf_dirent_t *entries) +unserialize_rsp_direntp (xlator_t *this, fd_t *fd, +                         struct gfs3_readdirp_rsp *rsp, gf_dirent_t *entries)  {          struct gfs3_dirplist *trav      = NULL; +        char                 *buf       = NULL;  	gf_dirent_t          *entry     = NULL; +        inode_table_t        *itable    = NULL;          int                   entry_len = 0;          int                   ret       = -1;          trav = rsp->reply; +        if (fd) +                itable = fd->inode->table; +          while (trav) {                  entry_len = gf_dirent_size (trav->name);                  entry = GF_CALLOC (1, entry_len, gf_common_mt_gf_dirent_t); @@ -178,6 +184,28 @@ unserialize_rsp_direntp (struct gfs3_readdirp_rsp *rsp, gf_dirent_t *entries)                  strcpy (entry->d_name, trav->name); +                if (trav->dict.dict_val) { +                        /* Dictionary is sent along with response */ +                        buf = memdup (trav->dict.dict_val, trav->dict.dict_len); +                        if (!buf) +                                goto out; + +                        ret = dict_unserialize (buf, trav->dict.dict_len, +                                                &entry->dict); +                        if (ret < 0) { +                                gf_log (THIS->name, GF_LOG_WARNING, +                                        "failed to unserialize xattr dict"); +                                errno = EINVAL; +                                goto out; +                        } +                        entry->dict->extra_free = buf; +                        buf = NULL; +                } + +                entry->inode = inode_find (itable, entry->d_stat.ia_gfid); +                if (!entry->inode) +                        entry->inode = inode_new (itable); +  		list_add_tail (&entry->list, &entries->list);                  trav = trav->nextentry;  | 
