diff options
author | Amar Tumballi <amar@gluster.com> | 2012-02-15 17:20:40 +0530 |
---|---|---|
committer | Anand Avati <avati@redhat.com> | 2012-02-16 22:48:57 -0800 |
commit | 47e748fe60c46d543c87f3228eb59d6580db8cf1 (patch) | |
tree | f5b244d4e1e0f5fd595e3235985b7bc921c8f330 /xlators/storage/posix/src/posix.c | |
parent | 4cc4e47f6cad1127ad425cc0ab10bc42ab1411c8 (diff) |
posix: handle some internal behavior in posix_mknod()
assume a case of link() systemcall, which is handled in distribute by
creating a 'linkfile' in hashed subvolume, if the 'oldloc' is present
in different subvolume. we have same 'gfid' for the linkfile as that
of file for consistency. Now, a file with multiple hardlinks, we may
end up with 'hardlinked' linkfiles. dht create linkfile using 'mknod()'
fop, and as now posix_mknod() is not equipped to handle this situation.
this patch fixes the situation by looking at the 'internal' key set in
the dictionary to differentiate the call which originates from inside
with regular system calls.
Change-Id: Ibff7c31f8e0c8bdae035c705c93a295f080ff985
BUG: 763844
Signed-off-by: Amar Tumballi <amar@gluster.com>
Reviewed-on: http://review.gluster.com/2755
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Anand Avati <avati@redhat.com>
Diffstat (limited to 'xlators/storage/posix/src/posix.c')
-rw-r--r-- | xlators/storage/posix/src/posix.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c index 24dd536e4b4..9e003a76a39 100644 --- a/xlators/storage/posix/src/posix.c +++ b/xlators/storage/posix/src/posix.c @@ -722,6 +722,7 @@ posix_mknod (call_frame_t *frame, xlator_t *this, gid_t gid = 0; struct iatt preparent = {0,}; struct iatt postparent = {0,}; + void * uuid_req = NULL; DECLARE_OLD_FS_ID_VAR; @@ -751,6 +752,24 @@ posix_mknod (call_frame_t *frame, xlator_t *this, gid = preparent.ia_gid; } + /* Check if the 'gfid' already exists, because this mknod may be an + internal call from distribute for creating 'linkfile', and that + linkfile may be for a hardlinked file */ + if (dict_get (params, GLUSTERFS_INTERNAL_FOP_KEY)) { + op_ret = dict_get_ptr (params, "gfid-req", &uuid_req); + if (op_ret) { + gf_log (this->name, GF_LOG_DEBUG, + "failed to get the gfid from dict for %s", + loc->path); + goto real_op; + } + op_ret = posix_create_link_if_gfid_exists (this, uuid_req, + real_path); + if (!op_ret) + goto post_op; + } + +real_op: #ifdef __NetBSD__ if (S_ISFIFO(mode)) op_ret = mkfifo (real_path, mode); @@ -797,6 +816,7 @@ posix_mknod (call_frame_t *frame, xlator_t *this, } #endif +post_op: op_ret = posix_acl_xattr_set (this, real_path, params); if (op_ret) { gf_log (this->name, GF_LOG_ERROR, |