diff options
| author | Mohammed Rafi KC <rkavunga@redhat.com> | 2016-04-26 16:59:30 +0530 | 
|---|---|---|
| committer | Rajesh Joseph <rjoseph@redhat.com> | 2016-05-23 22:48:33 -0700 | 
| commit | 1d52eae8532e027a97dd947b3889b38abe0c113c (patch) | |
| tree | 6a4181b9f9980e80a3edd53938d62262f17c2c4f | |
| parent | b45e2896eacb27b8a76729e9c460df5b5aa818a3 (diff) | |
gfapi: fill iatt in readdirp_cbk if entry->inode is null
If any of dirent have inode as null in readdirp_cbk, which indicates
that the stat information is not valid. So for such entries, we send
explicit lookup to fill the stat information.
Backport of>
>Change-Id: I0604bce34583db0bb04b5aae8933766201c6ddad
>BUG: 1330567
>Signed-off-by: Mohammed Rafi KC <rkavunga@redhat.com>
>Reviewed-on: http://review.gluster.org/14079
>NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
>Smoke: Gluster Build System <jenkins@build.gluster.com>
>CentOS-regression: Gluster Build System <jenkins@build.gluster.com>
>Reviewed-by: Niels de Vos <ndevos@redhat.com>
(cherry picked from commit 9423bdeed169076ebedd9af40b52aaac58c9839e)
Change-Id: I90a218c78d5544a3b49b29079c64a8b76e7939df
BUG: 1331263
Signed-off-by: Mohammed Rafi KC <rkavunga@redhat.com>
Reviewed-on: http://review.gluster.org/14109
Smoke: Gluster Build System <jenkins@build.gluster.com>
CentOS-regression: Gluster Build System <jenkins@build.gluster.com>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
Reviewed-by: Rajesh Joseph <rjoseph@redhat.com>
| -rw-r--r-- | api/src/glfs-fops.c | 11 | ||||
| -rw-r--r-- | libglusterfs/src/gf-dirent.c | 42 | ||||
| -rw-r--r-- | libglusterfs/src/gf-dirent.h | 3 | 
3 files changed, 56 insertions, 0 deletions
diff --git a/api/src/glfs-fops.c b/api/src/glfs-fops.c index 6f67e6c5b9e..ff7f4570b5a 100644 --- a/api/src/glfs-fops.c +++ b/api/src/glfs-fops.c @@ -2601,6 +2601,17 @@ glfd_entry_refresh (struct glfs_fd *glfd, int plus)                          list_for_each_entry (entry, &entries.list, list) {                                  if (entry->inode)                                          inode_set_need_lookup (entry->inode, THIS); +                                else if (!IA_ISDIR (entry->d_stat.ia_type)) { +                                        /* entry->inode for directories will be +                                         * always set to null to force a lookup +                                         * on the dentry. Also we will have +                                         * proper stat if directory present on +                                         * hashed subvolume. +                                         */ +                                        gf_fill_iatt_for_dirent (entry, +                                                                 fd->inode, +                                                                 subvol); +                                }                          }  			gf_link_inodes_from_dirent (THIS, fd->inode, &entries); diff --git a/libglusterfs/src/gf-dirent.c b/libglusterfs/src/gf-dirent.c index 4c077e91871..e3c7bf6e0a9 100644 --- a/libglusterfs/src/gf-dirent.c +++ b/libglusterfs/src/gf-dirent.c @@ -20,6 +20,7 @@  #include <stdint.h>  #include "compat.h"  #include "xlator.h" +#include "syncop.h"  #define ONE 1ULL  #define PRESENT_D_OFF_BITS 63 @@ -262,3 +263,44 @@ gf_link_inodes_from_dirent (xlator_t *this, inode_t *parent,          return 0;  } + +int +gf_fill_iatt_for_dirent (gf_dirent_t *entry, inode_t *parent, xlator_t *subvol) +{ +        loc_t                   loc             = {0, }; +        int                     ret             = -1; +        char                   *path            = NULL; +        struct iatt             iatt            = {0,}; + +        loc.inode = inode_grep (parent->table, parent, entry->d_name); +        if (!loc.inode) { +                loc.inode = inode_new (parent->table); +                gf_uuid_copy (loc.inode->gfid, entry->d_stat.ia_gfid); +        } + +        gf_uuid_copy (loc.pargfid, parent->gfid); +        loc.name = entry->d_name; +        loc.parent = inode_ref (parent); +        ret = inode_path (loc.inode, entry->d_name, &path); +        loc.path = path; +        if (ret < 0) +                goto out; + +        ret = syncop_lookup (subvol, &loc, &iatt, NULL, NULL, NULL); +        if (ret) +                goto out; + +        entry->d_stat = iatt; +        entry->inode = inode_ref (loc.inode); +        /* We don't need to link inode here, because as part of readdirp_cbk +         * we will link all dirents. +         * +         * Since we did a proper lookup, we don't need to set need_lookup +         * flag. +         */ + +        ret = 0; +out: +        loc_wipe (&loc); +        return ret; +} diff --git a/libglusterfs/src/gf-dirent.h b/libglusterfs/src/gf-dirent.h index faeaf411941..faffabf1288 100644 --- a/libglusterfs/src/gf-dirent.h +++ b/libglusterfs/src/gf-dirent.h @@ -66,6 +66,9 @@ void gf_dirent_entry_free (gf_dirent_t *entry);  void gf_dirent_free (gf_dirent_t *entries);  int gf_link_inodes_from_dirent (xlator_t *this, inode_t *parent,                                  gf_dirent_t *entries); +int +gf_fill_iatt_for_dirent (gf_dirent_t *entry, inode_t *parent, +                         xlator_t *subvol);  void  gf_link_inode_from_dirent (xlator_t *this, inode_t *parent, gf_dirent_t *entry);  | 
