diff options
| -rw-r--r-- | xlators/features/trash/src/trash.c | 7 | ||||
| -rw-r--r-- | xlators/storage/posix/src/posix-helpers.c | 6 | ||||
| -rw-r--r-- | xlators/storage/posix/src/posix.c | 8 | ||||
| -rw-r--r-- | xlators/storage/posix/src/posix.h | 29 | 
4 files changed, 50 insertions, 0 deletions
diff --git a/xlators/features/trash/src/trash.c b/xlators/features/trash/src/trash.c index ab01832bb8b..4a41a14f427 100644 --- a/xlators/features/trash/src/trash.c +++ b/xlators/features/trash/src/trash.c @@ -1579,6 +1579,8 @@ trash_truncate_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          local = frame->local;          GF_VALIDATE_OR_GOTO ("trash", local, out); +        TRASH_UNSET_PID (frame, local); +          /* Checks whether path is present in trash directory or not */          if ((op_ret == -1) && (op_errno == ENOENT)) { @@ -1753,6 +1755,9 @@ trash_truncate_mkdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                          strcat (real_path, local->origpath);                          /* Call create again once directory structure                             is created. */ + +                        TRASH_SET_PID (frame, local); +                          STACK_WIND (frame, trash_truncate_create_cbk,                                      FIRST_CHILD(this),                                      FIRST_CHILD(this)->fops->create, @@ -1957,6 +1962,8 @@ trash_truncate_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          flags = O_CREAT|O_EXCL|O_WRONLY; +        TRASH_SET_PID (frame, local); +          STACK_WIND (frame, trash_truncate_create_cbk,                      FIRST_CHILD(this),                      FIRST_CHILD(this)->fops->create, diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c index 9b945c271bc..3dfae4df684 100644 --- a/xlators/storage/posix/src/posix-helpers.c +++ b/xlators/storage/posix/src/posix-helpers.c @@ -870,6 +870,12 @@ posix_gfid_set (xlator_t *this, const char *path, loc_t *loc, dict_t *xattr_req)                          loc->path);                  goto out;          } +        if (gf_uuid_is_null (uuid_req)) { +                gf_msg (this->name, GF_LOG_ERROR, EINVAL, P_MSG_NULL_GFID, +                        "gfid is null for %s", loc ? loc->path : ""); +                ret = -1; +                goto out; +        }          ret = sys_lsetxattr (path, GFID_XATTR_KEY, uuid_req, 16, XATTR_CREATE);          if (ret == -1) { diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c index 5f3f3388046..51d49d772de 100644 --- a/xlators/storage/posix/src/posix.c +++ b/xlators/storage/posix/src/posix.c @@ -1282,6 +1282,8 @@ posix_mknod (call_frame_t *frame, xlator_t *this,          priv = this->private;          VALIDATE_OR_GOTO (priv, out); +        GFID_NULL_CHECK_AND_GOTO (frame, this, loc, xdata, op_ret, op_errno, +                                  out);          MAKE_ENTRY_HANDLE (real_path, par_path, this, loc, NULL); @@ -1493,6 +1495,8 @@ posix_mkdir (call_frame_t *frame, xlator_t *this,          priv = this->private;          VALIDATE_OR_GOTO (priv, out); +        GFID_NULL_CHECK_AND_GOTO (frame, this, loc, xdata, op_ret, op_errno, +                                  out);          MAKE_ENTRY_HANDLE (real_path, par_path, this, loc, NULL);          if (!real_path || !par_path) { @@ -2276,6 +2280,8 @@ posix_symlink (call_frame_t *frame, xlator_t *this,          priv = this->private;          VALIDATE_OR_GOTO (priv, out); +        GFID_NULL_CHECK_AND_GOTO (frame, this, loc, xdata, op_ret, op_errno, +                                  out);          MAKE_ENTRY_HANDLE (real_path, par_path, this, loc, &stbuf); @@ -2886,6 +2892,8 @@ posix_create (call_frame_t *frame, xlator_t *this,          priv = this->private;          VALIDATE_OR_GOTO (priv, out); +        GFID_NULL_CHECK_AND_GOTO (frame, this, loc, xdata, op_ret, op_errno, +                                  out);          MAKE_ENTRY_HANDLE (real_path, par_path, this, loc, &stbuf); diff --git a/xlators/storage/posix/src/posix.h b/xlators/storage/posix/src/posix.h index febd4326aa1..40ce4cdb5ac 100644 --- a/xlators/storage/posix/src/posix.h +++ b/xlators/storage/posix/src/posix.h @@ -76,6 +76,35 @@ struct posix_fd {          struct list_head list; /* to add to the janitor list */  }; +#define GFID_NULL_CHECK_AND_GOTO(frame, this, loc, xattr_req, op_ret,         \ +                                 op_errno, out)                               \ +        do {                                                                  \ +                void *_uuid_req = NULL;                                       \ +                int _ret = 0;                                                 \ +                /* TODO: Remove pid check once trash implements client side   \ +                 * logic to assign gfid for entry creations inside .trashcan  \ +                 */                                                           \ +                if (frame->root->pid == GF_SERVER_PID_TRASH)                  \ +                        break;                                                \ +                _ret = dict_get_ptr (xattr_req, "gfid-req", &_uuid_req);      \ +                if (_ret) {                                                   \ +                        gf_msg (this->name, GF_LOG_ERROR, EINVAL,             \ +                               P_MSG_NULL_GFID, "failed to get the gfid from" \ +                               " dict for %s", loc->path);                    \ +                        op_ret = -1;                                          \ +                        op_errno = EINVAL;                                    \ +                        goto out;                                             \ +                }                                                             \ +                if (gf_uuid_is_null (_uuid_req)) {                            \ +                        gf_msg (this->name, GF_LOG_ERROR, EINVAL,             \ +                                P_MSG_NULL_GFID, "gfid is null for %s",       \ +                                loc->path);                                   \ +                        op_ret = -1;                                          \ +                        op_errno = EINVAL;                                    \ +                        goto out;                                             \ +                }                                                             \ +        } while (0) +  struct posix_private {  	char   *base_path;  | 
