summaryrefslogtreecommitdiffstats
path: root/rpc/glfs-operations.c
diff options
context:
space:
mode:
authorPrasanna Kumar Kalever <prasanna.kalever@redhat.com>2018-02-07 21:40:13 +0530
committerPrasanna Kumar Kalever <prasanna.kalever@redhat.com>2018-02-08 13:11:40 +0530
commit450f7e89116ed104f092dd1a709c0f057150a4f7 (patch)
tree6c5ec8f0e8efa600e496fe66dd30227fb878309b /rpc/glfs-operations.c
parentd7ebb697457fc4b8562bb1475a6832f1badb15f8 (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.c57
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);