From 9cc24de746ce0e616fa09120b89aaa9a626f33cb Mon Sep 17 00:00:00 2001 From: Niels de Vos Date: Tue, 18 Sep 2012 14:39:51 +0200 Subject: mount/fuse: readdir() should return 32-bit inodes when 'enable-ino32' is used The glusterfs mount option 'enable-ino32' does not change the behaviour of readdir(). fuse_readdir_cbk() uses entry->d_ino directly, and this was missed in commit c13823bd16b26bc471d3efb15f63b76fbfdf0309. By adding the function gf_fuse_fill_dirent(), the fuse_dirent structure is filled in a similar way as the fuse_attr structure. This helper uses the same function to squash the 64-bit inode in a 32-bit attribute. Change-Id: Ia20e7144613124a58691e7935cb793b6256aef79 BUG: 850352 URL: http://lists.nongnu.org/archive/html/gluster-devel/2012-09/msg00051.html Tested-by: Steve Bakke Signed-off-by: Niels de Vos Reviewed-on: http://review.gluster.org/3955 Tested-by: Gluster Build System Reviewed-by: Brian Foster Reviewed-by: Anand Avati --- xlators/mount/fuse/src/fuse-bridge.c | 8 +++----- xlators/mount/fuse/src/fuse-bridge.h | 2 ++ xlators/mount/fuse/src/fuse-helpers.c | 14 ++++++++++++++ 3 files changed, 19 insertions(+), 5 deletions(-) (limited to 'xlators') diff --git a/xlators/mount/fuse/src/fuse-bridge.c b/xlators/mount/fuse/src/fuse-bridge.c index 6dfc334be..9bf07bf18 100644 --- a/xlators/mount/fuse/src/fuse-bridge.c +++ b/xlators/mount/fuse/src/fuse-bridge.c @@ -2425,9 +2425,11 @@ fuse_readdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, char *buf = NULL; gf_dirent_t *entry = NULL; struct fuse_dirent *fde = NULL; + fuse_private_t *priv = NULL; state = frame->root->state; finh = state->finh; + priv = state->this->private; if (op_ret < 0) { gf_log ("glusterfs-fuse", GF_LOG_WARNING, @@ -2459,11 +2461,7 @@ fuse_readdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, size = 0; list_for_each_entry (entry, &entries->list, list) { fde = (struct fuse_dirent *)(buf + size); - fde->ino = entry->d_ino; - fde->off = entry->d_off; - fde->type = entry->d_type; - fde->namelen = strlen (entry->d_name); - strncpy (fde->name, entry->d_name, fde->namelen); + gf_fuse_fill_dirent (entry, fde, priv->enable_ino32); size += FUSE_DIRENT_SIZE (fde); } diff --git a/xlators/mount/fuse/src/fuse-bridge.h b/xlators/mount/fuse/src/fuse-bridge.h index 22097f57a..c700554f9 100644 --- a/xlators/mount/fuse/src/fuse-bridge.h +++ b/xlators/mount/fuse/src/fuse-bridge.h @@ -416,6 +416,8 @@ fuse_state_t *get_fuse_state (xlator_t *this, fuse_in_header_t *finh); void free_fuse_state (fuse_state_t *state); void gf_fuse_stat2attr (struct iatt *st, struct fuse_attr *fa, gf_boolean_t enable_ino32); +void gf_fuse_fill_dirent (gf_dirent_t *entry, struct fuse_dirent *fde, + gf_boolean_t enable_ino32); uint64_t inode_to_fuse_nodeid (inode_t *inode); xlator_t *fuse_active_subvol (xlator_t *fuse); inode_t *fuse_ino_to_inode (uint64_t ino, xlator_t *fuse); diff --git a/xlators/mount/fuse/src/fuse-helpers.c b/xlators/mount/fuse/src/fuse-helpers.c index 461f74865..577be2fef 100644 --- a/xlators/mount/fuse/src/fuse-helpers.c +++ b/xlators/mount/fuse/src/fuse-helpers.c @@ -465,6 +465,20 @@ gf_fuse_stat2attr (struct iatt *st, struct fuse_attr *fa, gf_boolean_t enable_in #endif } +void +gf_fuse_fill_dirent (gf_dirent_t *entry, struct fuse_dirent *fde, gf_boolean_t enable_ino32) +{ + if (enable_ino32) + fde->ino = GF_FUSE_SQUASH_INO(entry->d_ino); + else + fde->ino = entry->d_ino; + + fde->off = entry->d_off; + fde->type = entry->d_type; + fde->namelen = strlen (entry->d_name); + strncpy (fde->name, entry->d_name, fde->namelen); +} + static int fuse_do_flip_xattr_ns (char *okey, const char *nns, char **nkey) { -- cgit