diff options
| author | Amar Tumballi <amarts@redhat.com> | 2017-10-23 21:17:52 +0200 | 
|---|---|---|
| committer | Jeff Darcy <jeff@pl.atyp.us> | 2017-10-24 12:21:27 +0000 | 
| commit | 2ade36cd98ea0f5bd2a8f619a19c20438318afaf (patch) | |
| tree | 785134ef604de400e711c904bdb2d3337bfc7ec5 /xlators/protocol/server | |
| parent | a39f5d62f737d7a3241f2adaff064b8d92f0d3ea (diff) | |
protocol/server: fix the comparision logic in case of subdir mount
without the fix, the stat entry on a file would return inode==1 for
many files, in case of subdir mount
This happened with the confusion of return value of 'gf_uuid_compare()',
it is more like strcmp, instead of a gf_boolean return value, and hence
resulted in the bug.
Change-Id: I31b8cbd95eaa3af5ff916a969458e8e4020c86bb
BUG: 1505527
Signed-off-by: Amar Tumballi <amarts@redhat.com>
Diffstat (limited to 'xlators/protocol/server')
| -rw-r--r-- | xlators/protocol/server/src/server-common.c | 60 | 
1 files changed, 30 insertions, 30 deletions
diff --git a/xlators/protocol/server/src/server-common.c b/xlators/protocol/server/src/server-common.c index b972918f37f..ce3308937ca 100644 --- a/xlators/protocol/server/src/server-common.c +++ b/xlators/protocol/server/src/server-common.c @@ -12,22 +12,22 @@  void  server_post_stat (server_state_t *state, gfs3_stat_rsp *rsp, struct iatt *stbuf)  { -        if (state->client->subdir_mount) { -                if (gf_uuid_compare (stbuf->ia_gfid, -                                     state->client->subdir_gfid)) { -                        /* This is very important as when we send iatt of -                           root-inode, fuse/client expect the gfid to be 1, -                           along with inode number. As for subdirectory mount, -                           we use inode table which is shared by everyone, but -                           make sure we send fops only from subdir and below, -                           we have to alter inode gfid and send it to client */ -                        uuid_t gfid = {0,}; - -                        gfid[15] = 1; -                        stbuf->ia_ino = 1; -                        gf_uuid_copy (stbuf->ia_gfid, gfid); -                } +        if (state->client->subdir_mount && +            !gf_uuid_compare (stbuf->ia_gfid, +                              state->client->subdir_gfid)) { +                /* This is very important as when we send iatt of +                   root-inode, fuse/client expect the gfid to be 1, +                   along with inode number. As for subdirectory mount, +                   we use inode table which is shared by everyone, but +                   make sure we send fops only from subdir and below, +                   we have to alter inode gfid and send it to client */ +                uuid_t gfid = {0,}; + +                gfid[15] = 1; +                stbuf->ia_ino = 1; +                gf_uuid_copy (stbuf->ia_gfid, gfid);          } +          gf_stat_from_iatt (&rsp->stat, stbuf);  } @@ -185,22 +185,22 @@ void  server_post_fstat (server_state_t *state, gfs3_fstat_rsp *rsp,                     struct iatt *stbuf)  { -        if (state->client->subdir_mount) { -                if (gf_uuid_compare (stbuf->ia_gfid, -                                     state->client->subdir_gfid)) { -                        /* This is very important as when we send iatt of -                           root-inode, fuse/client expect the gfid to be 1, -                           along with inode number. As for subdirectory mount, -                           we use inode table which is shared by everyone, but -                           make sure we send fops only from subdir and below, -                           we have to alter inode gfid and send it to client */ -                        uuid_t gfid = {0,}; - -                        gfid[15] = 1; -                        stbuf->ia_ino = 1; -                        gf_uuid_copy (stbuf->ia_gfid, gfid); -                } +        if (state->client->subdir_mount && +            !gf_uuid_compare (stbuf->ia_gfid, +                              state->client->subdir_gfid)) { +                /* This is very important as when we send iatt of +                   root-inode, fuse/client expect the gfid to be 1, +                   along with inode number. As for subdirectory mount, +                   we use inode table which is shared by everyone, but +                   make sure we send fops only from subdir and below, +                   we have to alter inode gfid and send it to client */ +                uuid_t gfid = {0,}; + +                gfid[15] = 1; +                stbuf->ia_ino = 1; +                gf_uuid_copy (stbuf->ia_gfid, gfid);          } +          gf_stat_from_iatt (&rsp->stat, stbuf);  }  | 
