diff options
author | Prasanna Kumar Kalever <prasanna.kalever@redhat.com> | 2018-02-07 21:40:13 +0530 |
---|---|---|
committer | Prasanna Kumar Kalever <prasanna.kalever@redhat.com> | 2018-02-08 13:11:40 +0530 |
commit | 450f7e89116ed104f092dd1a709c0f057150a4f7 (patch) | |
tree | 6c5ec8f0e8efa600e496fe66dd30227fb878309b /rpc/glfs-operations.c | |
parent | d7ebb697457fc4b8562bb1475a6832f1badb15f8 (diff) |
create: support [storage <filename>] option
$ gluster-block help
gluster-block (0.3)
usage:
gluster-block <command> <volname[/blockname]> [<args>] [--json*]
commands:
create <volname/blockname> [ha <count>]
[auth <enable|disable>]
[prealloc <full|no>]
[storage <filename>]
<host1[,host2,...]> <size>
create block device [defaults: ha 1, auth disable, prealloc no, size in bytes]
[...]
supported JSON formats:
--json|--json-plain|--json-spaced|--json-pretty
Fixes: #18
Change-Id: I5d9b4abb58596bd2297cffb294c6d31f752d53e9
Signed-off-by: Prasanna Kumar Kalever <prasanna.kalever@redhat.com>
Diffstat (limited to 'rpc/glfs-operations.c')
-rw-r--r-- | rpc/glfs-operations.c | 57 |
1 files changed, 55 insertions, 2 deletions
diff --git a/rpc/glfs-operations.c b/rpc/glfs-operations.c index 838d3c7..341a6e2 100644 --- a/rpc/glfs-operations.c +++ b/rpc/glfs-operations.c @@ -91,6 +91,7 @@ glusterBlockCreateEntry(struct glfs *glfs, blockCreateCli *blk, char *gbid, int *errCode, char **errMsg) { struct glfs_fd *tgfd; + struct stat st; char *tmp; int ret; @@ -112,6 +113,56 @@ glusterBlockCreateEntry(struct glfs *glfs, blockCreateCli *blk, char *gbid, goto out; } + if (strlen(blk->storage)) { + ret = glfs_stat(glfs, blk->storage, &st); + if (ret) { + *errCode = errno; + if (*errCode == ENOENT) { + LOG("mgmt", GB_LOG_ERROR, + "storage file '/block-store/%s' doesn't exist in volume %s", + blk->storage, blk->volume); + GB_ASPRINTF(errMsg, + "storage file '/block-store/%s' doesn't exist in volume %s\n", + blk->storage, blk->volume); + } else { + LOG("mgmt", GB_LOG_ERROR, + "glfs_stat failed on /block-store/%s in volume %s [%s]", + blk->storage, blk->volume, strerror(*errCode)); + GB_ASPRINTF(errMsg, + "glfs_stat failed on /block-store/%s in volume %s [%s]", + blk->storage, blk->volume, strerror(*errCode)); + } + goto out; + } + blk->size = st.st_size; + + if (st.st_nlink == 1) { + ret = glfs_link(glfs, blk->storage, gbid); + if (ret) { + *errCode=errno; + LOG("mgmt", GB_LOG_ERROR, + "glfs_link(%s, %s) on volume %s for block %s failed [%s]", + blk->storage, gbid, blk->volume, blk->block_name, strerror(errno)); + GB_ASPRINTF(errMsg, + "glfs_link(%s, %s) on volume %s for block %s failed [%s]", + blk->storage, gbid, strerror(errno)); + goto out; + } + } else { + *errCode = EBUSY; + LOG("mgmt", GB_LOG_ERROR, + "storage file /block-store/%s is already in use in volume %s [%s]", + blk->storage, blk->volume, strerror(*errCode)); + GB_ASPRINTF(errMsg, + "storage file /block-store/%s is already in use in volume %s [%s]\n" + "hint: delete the hardlink file, make sure file is not in use\n", + blk->storage, blk->volume, strerror(*errCode)); + ret = -1; + goto out; + } + return 0; + } + tgfd = glfs_creat(glfs, gbid, O_WRONLY | O_CREAT | O_EXCL | O_SYNC, S_IRUSR | S_IWUSR); @@ -163,8 +214,10 @@ unlink: out: if (ret) { - GB_ASPRINTF (errMsg, "Not able to create storage for %s/%s [%s]", - blk->volume, blk->block_name, strerror(*errCode)); + if (!errMsg) { + GB_ASPRINTF (errMsg, "Not able to create storage for %s/%s [%s]", + blk->volume, blk->block_name, strerror(*errCode)); + } GB_ASPRINTF(&tmp, "%s/%s", GB_METADIR, blk->block_name); |