diff options
Diffstat (limited to 'xlators')
-rw-r--r-- | xlators/mount/fuse/src/fuse-bridge.c | 34 | ||||
-rw-r--r-- | xlators/mount/fuse/src/fuse-bridge.h | 3 | ||||
-rw-r--r-- | xlators/mount/fuse/src/fuse-resolve.c | 25 |
3 files changed, 54 insertions, 8 deletions
diff --git a/xlators/mount/fuse/src/fuse-bridge.c b/xlators/mount/fuse/src/fuse-bridge.c index 069135d57b3..cd2df760771 100644 --- a/xlators/mount/fuse/src/fuse-bridge.c +++ b/xlators/mount/fuse/src/fuse-bridge.c @@ -240,8 +240,6 @@ fuse_lookup_resume (fuse_state_t *state) if (!state->loc.inode) state->loc.inode = inode_new (state->loc.parent->table); - state->dict = dict_new (); - FUSE_FOP (state, fuse_lookup_cbk, GF_FOP_LOOKUP, lookup, &state->loc, state->dict); } @@ -255,6 +253,8 @@ fuse_lookup (xlator_t *this, fuse_in_header_t *finh, void *msg) GET_STATE (this, finh, state); + uuid_generate (state->gfid); + ret = fuse_loc_fill (&state->loc, state, 0, finh->nodeid, name); if (ret < 0) { @@ -459,6 +459,8 @@ fuse_getattr (xlator_t *this, fuse_in_header_t *finh, void *msg) GET_STATE (this, finh, state); if (finh->nodeid == 1) { + state->gfid[15] = 1; + ret = fuse_loc_fill (&state->loc, state, finh->nodeid, 0, NULL); if (ret < 0) { gf_log ("glusterfs-fuse", GF_LOG_WARNING, @@ -469,7 +471,7 @@ fuse_getattr (xlator_t *this, fuse_in_header_t *finh, void *msg) return; } - state->dict = dict_new (); + fuse_gfid_set (state); FUSE_FOP (state, fuse_root_lookup_cbk, GF_FOP_LOOKUP, lookup, &state->loc, state->dict); @@ -501,6 +503,10 @@ fuse_getattr (xlator_t *this, fuse_in_header_t *finh, void *msg) free_fuse_state (state); return; } + + if (state->fd) + fd_unref (state->fd); + state->fd = NULL; } @@ -1019,7 +1025,7 @@ fuse_mknod_resume (fuse_state_t *state) state->loc.path); FUSE_FOP (state, fuse_newentry_cbk, GF_FOP_MKNOD, - mknod, &state->loc, state->mode, state->rdev, NULL); + mknod, &state->loc, state->mode, state->rdev, state->dict); } @@ -1040,6 +1046,9 @@ fuse_mknod (xlator_t *this, fuse_in_header_t *finh, void *msg) #endif GET_STATE (this, finh, state); + + uuid_generate (state->gfid); + ret = fuse_loc_fill (&state->loc, state, 0, finh->nodeid, name); if (ret < 0) { gf_log ("glusterfs-fuse", GF_LOG_WARNING, @@ -1079,7 +1088,7 @@ fuse_mkdir_resume (fuse_state_t *state) state->loc.path); FUSE_FOP (state, fuse_newentry_cbk, GF_FOP_MKDIR, - mkdir, &state->loc, state->mode, NULL); + mkdir, &state->loc, state->mode, state->dict); } static void @@ -1092,6 +1101,9 @@ fuse_mkdir (xlator_t *this, fuse_in_header_t *finh, void *msg) int32_t ret = -1; GET_STATE (this, finh, state); + + uuid_generate (state->gfid); + ret = fuse_loc_fill (&state->loc, state, 0, finh->nodeid, name); if (ret < 0) { gf_log ("glusterfs-fuse", GF_LOG_WARNING, @@ -1213,7 +1225,7 @@ fuse_symlink_resume (fuse_state_t *state) state->loc.path, state->name); FUSE_FOP (state, fuse_newentry_cbk, GF_FOP_SYMLINK, - symlink, state->name, &state->loc, NULL); + symlink, state->name, &state->loc, state->dict); } static void @@ -1226,6 +1238,9 @@ fuse_symlink (xlator_t *this, fuse_in_header_t *finh, void *msg) int32_t ret = -1; GET_STATE (this, finh, state); + + uuid_generate (state->gfid); + ret = fuse_loc_fill (&state->loc, state, 0, finh->nodeid, name); if (ret < 0) { gf_log ("glusterfs-fuse", GF_LOG_WARNING, @@ -1520,7 +1535,7 @@ fuse_create_resume (fuse_state_t *state) FUSE_FOP (state, fuse_create_cbk, GF_FOP_CREATE, create, &state->loc, state->flags, state->mode, - fd, NULL); + fd, state->dict); } @@ -1546,6 +1561,8 @@ fuse_create (xlator_t *this, fuse_in_header_t *finh, void *msg) GET_STATE (this, finh, state); + uuid_generate (state->gfid); + ret = fuse_loc_fill (&state->loc, state, 0, finh->nodeid, name); if (ret < 0) { gf_log ("glusterfs-fuse", GF_LOG_WARNING, @@ -2915,6 +2932,7 @@ fuse_first_lookup (xlator_t *this) dict_t *dict = NULL; struct fuse_first_lookup stub; uuid_t gfid; + int ret; priv = this->private; @@ -2938,7 +2956,7 @@ fuse_first_lookup (xlator_t *this) memset (gfid, 0, 16); gfid[15] = 1; - + ret = dict_set_static_bin (dict, "gfid-req", gfid, 16); STACK_WIND (frame, fuse_first_lookup_cbk, xl, xl->fops->lookup, &loc, dict); diff --git a/xlators/mount/fuse/src/fuse-bridge.h b/xlators/mount/fuse/src/fuse-bridge.h index 547cc895268..53a2cc59814 100644 --- a/xlators/mount/fuse/src/fuse-bridge.h +++ b/xlators/mount/fuse/src/fuse-bridge.h @@ -267,6 +267,8 @@ typedef struct { struct iatt attr; struct flock lk_lock; struct iovec vector; + + uuid_t gfid; } fuse_state_t; typedef void (*fuse_resume_fn_t) (fuse_state_t *state); @@ -285,4 +287,5 @@ inode_t *fuse_ino_to_inode (uint64_t ino, xlator_t *fuse); int fuse_resolve_and_resume (fuse_state_t *state, fuse_resume_fn_t fn); int is_gf_log_command (xlator_t *this, const char *name, char *value); int send_fuse_err (xlator_t *this, fuse_in_header_t *finh, int error); +int fuse_gfid_set (fuse_state_t *state); #endif /* _GF_FUSE_BRIDGE_H_ */ diff --git a/xlators/mount/fuse/src/fuse-resolve.c b/xlators/mount/fuse/src/fuse-resolve.c index 77a55cd701f..3bdc0b9293e 100644 --- a/xlators/mount/fuse/src/fuse-resolve.c +++ b/xlators/mount/fuse/src/fuse-resolve.c @@ -689,11 +689,36 @@ gf_resolve_all (fuse_state_t *state) int +fuse_gfid_set (fuse_state_t *state) +{ + int ret = 0; + + if (uuid_is_null (state->gfid)) + goto out; + + if (!state->dict) + state->dict = dict_new (); + + if (!state->dict) { + ret = -1; + goto out; + } + + ret = dict_set_static_bin (state->dict, "gfid-req", + state->gfid, sizeof (state->gfid)); +out: + return ret; +} + + +int fuse_resolve_and_resume (fuse_state_t *state, fuse_resume_fn_t fn) { xlator_t *inode_xl = NULL; xlator_t *active_xl = NULL; + fuse_gfid_set (state); + state->resume_fn = fn; active_xl = fuse_active_subvol (state->this); |