summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cli/src/Makefile.am3
-rw-r--r--cli/src/cli-cmd-misc.c3
-rw-r--r--cli/src/cli-cmd-parser.c51
-rw-r--r--cli/src/cli-cmd-volume-bdevice.c270
-rw-r--r--cli/src/cli-cmd-volume.c3
-rw-r--r--cli/src/cli-cmd.c5
-rw-r--r--cli/src/cli-cmd.h3
-rw-r--r--cli/src/cli-rpc-ops.c156
-rw-r--r--cli/src/cli.h13
-rw-r--r--configure.ac41
-rw-r--r--doc/features/bd.txt130
-rw-r--r--doc/gluster.823
-rw-r--r--glusterfsd/src/glusterfsd-mgmt.c72
-rw-r--r--libglusterfs/src/xlator.c23
-rw-r--r--libglusterfs/src/xlator.h1
-rw-r--r--rpc/rpc-lib/src/protocol-common.h10
-rwxr-xr-xtests/basic/bd.t117
-rw-r--r--xlators/mgmt/glusterd/src/Makefile.am3
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-brick-ops.c9
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-handler.c87
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-op-sm.c90
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-replace-brick.c7
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-rpc-ops.c1
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-store.c11
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-store.h2
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-volgen.c53
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-volume-ops.c168
-rw-r--r--xlators/mgmt/glusterd/src/glusterd.h8
-rw-r--r--xlators/storage/Makefile.am3
-rw-r--r--xlators/storage/bd_map/Makefile.am3
-rw-r--r--xlators/storage/bd_map/src/Makefile.am21
-rw-r--r--xlators/storage/bd_map/src/bd_map.c2580
-rw-r--r--xlators/storage/bd_map/src/bd_map.h82
-rw-r--r--xlators/storage/bd_map/src/bd_map_help.c501
-rw-r--r--xlators/storage/bd_map/src/bd_map_help.h69
35 files changed, 20 insertions, 4602 deletions
diff --git a/cli/src/Makefile.am b/cli/src/Makefile.am
index ae52310..d5189da 100644
--- a/cli/src/Makefile.am
+++ b/cli/src/Makefile.am
@@ -3,9 +3,6 @@ sbin_PROGRAMS = gluster
gluster_SOURCES = cli.c registry.c input.c cli-cmd.c cli-rl.c \
cli-cmd-volume.c cli-cmd-peer.c cli-rpc-ops.c cli-cmd-parser.c\
cli-cmd-system.c cli-cmd-misc.c cli-xml-output.c
-if ENABLE_BD_XLATOR
-gluster_SOURCES += cli-cmd-volume-bdevice.c
-endif
gluster_LDADD = $(top_builddir)/libglusterfs/src/libglusterfs.la $(GF_LDADD)\
$(RLLIBS) $(top_builddir)/rpc/xdr/src/libgfxdr.la \
diff --git a/cli/src/cli-cmd-misc.c b/cli/src/cli-cmd-misc.c
index 5f3a77c..4aec8dd 100644
--- a/cli/src/cli-cmd-misc.c
+++ b/cli/src/cli-cmd-misc.c
@@ -47,9 +47,6 @@ cli_cmd_display_help (struct cli_state *state, struct cli_cmd_word *in_word,
{
struct cli_cmd *cmd[] = {volume_cmds, cli_probe_cmds,
cli_misc_cmds,
-#ifdef HAVE_BD_XLATOR
- cli_bd_cmds,
-#endif
NULL};
struct cli_cmd *cmd_ind = NULL;
int i = 0;
diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c
index 5278a3e..cd0370a 100644
--- a/cli/src/cli-cmd-parser.c
+++ b/cli/src/cli-cmd-parser.c
@@ -159,11 +159,7 @@ cli_cmd_volume_create_parse (const char **words, int wordcount, dict_t **options
int32_t index = 0;
char *bricks = NULL;
int32_t brick_count = 0;
- char *opwords[] = { "replica", "stripe", "transport",
-#ifdef HAVE_BD_XLATOR
- "device",
-#endif
- NULL };
+ char *opwords[] = { "replica", "stripe", "transport", NULL };
char *invalid_volnames[] = {"volume", "type", "subvolumes", "option",
"end-volume", "all", "volume_not_in_ring",
@@ -172,9 +168,6 @@ cli_cmd_volume_create_parse (const char **words, int wordcount, dict_t **options
int op_count = 0;
int32_t replica_count = 1;
int32_t stripe_count = 1;
-#ifdef HAVE_BD_XLATOR
- char *dev_type = NULL;
-#endif
gf_boolean_t is_force = _gf_false;
int wc = wordcount;
@@ -311,26 +304,7 @@ cli_cmd_volume_create_parse (const char **words, int wordcount, dict_t **options
goto out;
}
index += 2;
- }
-#ifdef HAVE_BD_XLATOR
- else if ((strcmp (w, "device")) == 0) {
- if (dev_type) {
- cli_err ("'device' option given more"
- " than one time");
- goto out;
- }
- if ((strcasecmp (words[index+1], "vg") == 0)) {
- dev_type = gf_strdup ("vg");
- } else {
- gf_log ("", GF_LOG_ERROR, "incorrect"
- " device type specified");
- ret = -1;
- goto out;
- }
- index += 2;
- }
-#endif
- else {
+ } else {
GF_ASSERT (!"opword mismatch");
ret = -1;
goto out;
@@ -371,19 +345,6 @@ cli_cmd_volume_create_parse (const char **words, int wordcount, dict_t **options
goto out;
}
- /* BD xlator does not support multiple bricks */
-#ifdef HAVE_BD_XLATOR
- if (brick_count > 1 && dev_type) {
- cli_err ("Block Device backend volume does not support multiple"
- " bricks");
- gf_log ("", GF_LOG_ERROR,
- "Block Device backend volume does not support multiple"
- " bricks");
- ret = -1;
- goto out;
- }
-#endif
-
if (brick_count % sub_count) {
if (type == GF_CLUSTER_TYPE_STRIPE)
cli_err ("number of bricks is not a multiple of "
@@ -417,14 +378,6 @@ cli_cmd_volume_create_parse (const char **words, int wordcount, dict_t **options
if (ret)
goto out;
-#ifdef HAVE_BD_XLATOR
- if (dev_type) {
- ret = dict_set_dynstr (dict, "device", dev_type);
- if (ret)
- goto out;
- }
-#endif
-
ret = dict_set_int32 (dict, "count", brick_count);
if (ret)
goto out;
diff --git a/cli/src/cli-cmd-volume-bdevice.c b/cli/src/cli-cmd-volume-bdevice.c
deleted file mode 100644
index 1932575..0000000
--- a/cli/src/cli-cmd-volume-bdevice.c
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- CLI for BD translator
-
- Copyright IBM, Corp. 2012
-
- This file is part of GlusterFS.
-
- Author:
- M. Mohan Kumar <mohan@in.ibm.com>
-
- This file is licensed to you under your choice of the GNU Lesser
- General Public License, version 3 or any later version (LGPLv3 or
- later), or the GNU General Public License, version 2 (GPLv2), in all
- cases as published by the Free Software Foundation.
-*/
-
-#ifndef _CONFIG_H
-#define _CONFIG_H
-#include "config.h"
-#endif
-
-#include "cli.h"
-#include "cli-cmd.h"
-#include <string.h>
-
-extern rpc_clnt_prog_t *cli_rpc_prog;
-
-int
-cli_cmd_bd_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word,
- const char **words, int wordcount);
-
-int32_t
-cli_cmd_bd_parse (dict_t *dict, const char **words)
-{
- char *volname = NULL;
- char *buff = NULL;
- char *buffp = NULL;
- int ret = -1;
- char *save = NULL;
- char *path = NULL;
- char *size = NULL;
- char *eptr = NULL;
- gf_xl_bd_op_t bd_op = GF_BD_OP_INVALID;
- char *dest_lv = NULL;
-
-
- /* volname:/path */
- if (!strchr (words[2], ':') || !strchr (words[2], '/')) {
- cli_out ("invalid parameter %s, needs <volname:/path>",
- words[2]);
- return -1;
- }
- buff = buffp = gf_strdup (words[2]);
- volname = strtok_r (buff, ":", &save);
- path = strtok_r (NULL, ":", &save);
-
- ret = dict_set_dynstr (dict, "volname", gf_strdup (volname));
- if (ret)
- goto out;
-
- ret = dict_set_dynstr (dict, "path", gf_strdup (path));
- if (ret)
- goto out;
-
- if (!strcasecmp (words[1], "create"))
- bd_op = GF_BD_OP_NEW_BD;
- else if (!strcasecmp (words[1], "delete"))
- bd_op = GF_BD_OP_DELETE_BD;
- else if (!strcasecmp (words[1], "clone"))
- bd_op = GF_BD_OP_CLONE_BD;
- else if (!strcasecmp (words[1], "snapshot"))
- bd_op = GF_BD_OP_SNAPSHOT_BD;
- else
- return -1;
-
- ret = dict_set_int32 (dict, "bd-op", bd_op);
- if (ret)
- goto out;
-
- if (bd_op == GF_BD_OP_NEW_BD) {
- /* If no suffix given we will treat it as MB */
- strtoull (words[3], &eptr, 0);
- /* no suffix */
- if (!eptr[0])
- gf_asprintf (&size, "%sMB", words[3]);
- else
- size = gf_strdup (words[3]);
-
- ret = dict_set_dynstr (dict, "size", size);
- if (ret)
- goto out;
- } else if (bd_op == GF_BD_OP_SNAPSHOT_BD ||
- bd_op == GF_BD_OP_CLONE_BD) {
- /*
- * dest_lv should be just dest_lv, we don't support
- * cloning/snapshotting to a different volume or vg
- */
- if (strchr (words[3], ':') || strchr (words[3], '/')) {
- cli_err ("invalid parameter %s, volname/vg not needed",
- words[3]);
- ret = -1;
- goto out;
- }
- dest_lv = gf_strdup (words[3]);
- ret = dict_set_dynstr (dict, "dest_lv", dest_lv);
- if (ret)
- goto out;
-
- /* clone needs size as parameter */
- if (bd_op == GF_BD_OP_SNAPSHOT_BD) {
- ret = dict_set_dynstr (dict, "size",
- gf_strdup (words[4]));
- if (ret)
- goto out;
- }
- }
-
- ret = 0;
-out:
- GF_FREE (buffp);
- return ret;
-}
-
-/*
- * bd create <volname>:/path <size>
- * bd delete <volname>:/path
- * bd clone <volname>:/path <newbd>
- * bd snapshot <volname>:/<path> <newbd> <size>
- */
-int32_t
-cli_cmd_bd_validate (const char **words, int wordcount, dict_t **options)
-{
- dict_t *dict = NULL;
- int ret = -1;
- char *op[] = { "create", "delete", "clone", "snapshot", NULL };
- int index = 0;
-
- for (index = 0; op[index]; index++)
- if (!strcasecmp (words[1], op[index]))
- break;
-
- if (!op[index])
- return -1;
-
- dict = dict_new ();
- if (!dict)
- goto out;
-
- if (!strcasecmp (words[1], "create")) {
- if (wordcount != 4)
- goto out;
- } else if (!strcasecmp (words[1], "delete")) {
- if (wordcount != 3)
- goto out;
- } else if (!strcasecmp (words[1], "clone")) {
- if (wordcount != 4)
- goto out;
- } else if (!strcasecmp (words[1], "snapshot")) {
- if (wordcount != 5)
- goto out;
- } else {
- ret = -1;
- goto out;
- }
-
- ret = cli_cmd_bd_parse (dict, words);
- if (ret < 0)
- goto out;
-
- *options = dict;
- ret = 0;
-out:
- if (ret)
- dict_unref (dict);
- return ret;
-}
-
-int
-cli_cmd_bd_cbk (struct cli_state *state, struct cli_cmd_word *word,
- const char **words, int wordcount)
-{
- int ret = -1;
- rpc_clnt_procedure_t *proc = NULL;
- call_frame_t *frame = NULL;
- int sent = 0;
- int parse_error = 0;
- dict_t *options = NULL;
- cli_local_t *local = NULL;
-
- proc = &cli_rpc_prog->proctable[GLUSTER_CLI_BD_OP];
-
- frame = create_frame (THIS, THIS->ctx->pool);
- if (!frame)
- goto out;
-
- ret = cli_cmd_bd_validate (words, wordcount, &options);
- if (ret) {
- cli_usage_out (word->pattern);
- parse_error = 1;
- goto out;
- }
-
- CLI_LOCAL_INIT (local, words, frame, options);
- if (proc->fn) {
- ret = proc->fn (frame, THIS, options);
- }
-
-out:
- if (options)
- dict_unref (options);
-
- if (ret) {
- cli_cmd_sent_status_get (&sent);
- if ((sent == 0) && (parse_error == 0))
- cli_out ("BD op failed!");
- }
-
- CLI_STACK_DESTROY (frame);
-
- return ret;
-}
-
-struct cli_cmd cli_bd_cmds[] = {
- { "bd help",
- cli_cmd_bd_help_cbk,
- "display help for bd command"},
- { "bd create <volname>:<bd> <size>",
- cli_cmd_bd_cbk,
- "\n\tcreate a block device where size can be "
- "suffixed with KB, MB etc. Default size is in MB"},
- { "bd delete <volname>:<bd>",
- cli_cmd_bd_cbk,
- "Delete a block device"},
- { "bd clone <volname>:<bd> <newbd>",
- cli_cmd_bd_cbk,
- "clone device"},
- { "bd snapshot <volname>:<bd> <newbd> <size>",
- cli_cmd_bd_cbk,
- "\n\tsnapshot device where size can be "
- "suffixed with KB, MB etc. Default size is in MB"},
- { NULL, NULL, NULL }
-};
-
-int
-cli_cmd_bd_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word,
- const char **words, int wordcount)
-{
- struct cli_cmd *cmd = NULL;
-
- for (cmd = cli_bd_cmds; cmd->pattern; cmd++)
- if (_gf_false == cmd->disable)
- cli_out ("%s - %s", cmd->pattern, cmd->desc);
-
- return 0;
-}
-
-int
-cli_cmd_bd_register (struct cli_state *state)
-{
- int ret = 0;
- struct cli_cmd *cmd = NULL;
-
- for (cmd = cli_bd_cmds; cmd->pattern; cmd++) {
- ret = cli_cmd_register (&state->tree, cmd);
- if (ret)
- goto out;
- }
-out:
- return ret;
-}
diff --git a/cli/src/cli-cmd-volume.c b/cli/src/cli-cmd-volume.c
index 4b4bd02..dcb317f 100644
--- a/cli/src/cli-cmd-volume.c
+++ b/cli/src/cli-cmd-volume.c
@@ -1829,9 +1829,6 @@ struct cli_cmd volume_cmds[] = {
"list information of all volumes"},
{ "volume create <NEW-VOLNAME> [stripe <COUNT>] [replica <COUNT>] "
-#ifdef HAVE_BD_XLATOR
- "[device vg] "
-#endif
"[transport <tcp|rdma|tcp,rdma>] <NEW-BRICK> ... [force]",
cli_cmd_volume_create_cbk,
"create a new volume of specified type with mentioned bricks"},
diff --git a/cli/src/cli-cmd.c b/cli/src/cli-cmd.c
index aa76003..1045f34 100644
--- a/cli/src/cli-cmd.c
+++ b/cli/src/cli-cmd.c
@@ -231,11 +231,6 @@ cli_cmds_register (struct cli_state *state)
if (ret)
goto out;
-#ifdef HAVE_BD_XLATOR
- ret = cli_cmd_bd_register (state);
- if (ret)
- goto out;
-#endif
out:
return ret;
}
diff --git a/cli/src/cli-cmd.h b/cli/src/cli-cmd.h
index 0ad37d4..06a1ed3 100644
--- a/cli/src/cli-cmd.h
+++ b/cli/src/cli-cmd.h
@@ -119,7 +119,4 @@ gf_answer_t
cli_cmd_get_confirmation (struct cli_state *state, const char *question);
int cli_cmd_sent_status_get (int *status);
-#ifdef HAVE_BD_XLATOR
-int cli_cmd_bd_register (struct cli_state *state);
-#endif
#endif /* __CLI_CMD_H__ */
diff --git a/cli/src/cli-rpc-ops.c b/cli/src/cli-rpc-ops.c
index 6ecb423..0ff997d 100644
--- a/cli/src/cli-rpc-ops.c
+++ b/cli/src/cli-rpc-ops.c
@@ -58,10 +58,6 @@ char *cli_vol_status_str[] = {"Created",
"Stopped",
};
-char *cli_volume_backend[] = {"",
- "Volume Group",
-};
-
char *cli_vol_task_status_str[] = {"not started",
"in progress",
"stopped",
@@ -500,7 +496,6 @@ gf_cli_get_volume_cbk (struct rpc_req *req, struct iovec *iov,
char key[1024] = {0};
char err_str[2048] = {0};
gf_cli_rsp rsp = {0};
- int32_t backend = 0;
if (-1 == req->rpc_status)
goto out;
@@ -652,9 +647,6 @@ xml_output:
if (ret)
goto out;
- snprintf (key, 256, "volume%d.backend", i);
- ret = dict_get_int32 (dict, key, &backend);
-
vol_type = type;
// Distributed (stripe/replicate/stripe-replica) setups
@@ -666,9 +658,6 @@ xml_output:
cli_out ("Volume ID: %s", volume_id_str);
cli_out ("Status: %s", cli_vol_status_str[status]);
- if (backend)
- goto next;
-
if (type == GF_CLUSTER_TYPE_STRIPE_REPLICATE) {
cli_out ("Number of Bricks: %d x %d x %d = %d",
(brick_count / dist_count),
@@ -689,12 +678,6 @@ xml_output:
((transport == 0)?"tcp":
(transport == 1)?"rdma":
"tcp,rdma"));
-
-next:
- if (backend) {
- cli_out ("Backend Type: Block, %s",
- cli_volume_backend[backend]);
- }
j = 1;
GF_FREE (local->get_vol.volname);
@@ -2932,142 +2915,6 @@ out:
return ret;
}
-#ifdef HAVE_BD_XLATOR
-int
-gf_cli_bd_op_cbk (struct rpc_req *req, struct iovec *iov,
- int count, void *myframe)
-{
- gf_cli_rsp rsp = {0,};
- int ret = -1;
- cli_local_t *local = NULL;
- dict_t *dict = NULL;
- dict_t *input_dict = NULL;
- gf_xl_bd_op_t bd_op = GF_BD_OP_INVALID;
- char *operation = NULL;
- call_frame_t *frame = NULL;
-
- if (-1 == req->rpc_status)
- goto out;
-
- frame = myframe;
-
- ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp);
- if (ret < 0) {
- gf_log (frame->this->name, GF_LOG_ERROR,
- "Failed to decode xdr response");
- goto out;
- }
-
- dict = dict_new ();
- if (!dict) {
- ret = -1;
- goto out;
- }
-
- if (frame)
- local = frame->local;
-
- if (local) {
- input_dict = local->dict;
- ret = dict_get_int32 (input_dict, "bd-op",
- (int32_t *)&bd_op);
- }
-
- switch (bd_op) {
- case GF_BD_OP_NEW_BD:
- operation = gf_strdup ("create");
- break;
- case GF_BD_OP_DELETE_BD:
- operation = gf_strdup ("delete");
- break;
- case GF_BD_OP_CLONE_BD:
- operation = gf_strdup ("clone");
- break;
- case GF_BD_OP_SNAPSHOT_BD:
- operation = gf_strdup ("snapshot");
- break;
- default:
- break;
- }
-
- ret = dict_unserialize (rsp.dict.dict_val, rsp.dict.dict_len, &dict);
- if (ret)
- goto out;
-
- gf_log ("cli", GF_LOG_INFO, "Received resp to %s bd op", operation);
-
- if (global_state->mode & GLUSTER_MODE_XML) {
- ret = cli_xml_output_dict ("BdOp", dict, rsp.op_ret,
- rsp.op_errno, rsp.op_errstr);
- if (ret)
- gf_log ("cli", GF_LOG_ERROR,
- "Error outputting to xml");
- goto out;
- }
-
- if (rsp.op_ret && strcmp (rsp.op_errstr, ""))
- cli_err ("%s", rsp.op_errstr);
- else
- cli_out ("BD %s has been %s", operation,
- (rsp.op_ret) ? "unsuccessful":
- "successful.");
- ret = rsp.op_ret;
-
-out:
- cli_cmd_broadcast_response (ret);
-
- if (dict)
- dict_unref (dict);
-
- if (operation)
- GF_FREE (operation);
-
- if (rsp.dict.dict_val)
- free (rsp.dict.dict_val);
- if (rsp.op_errstr)
- free (rsp.op_errstr);
- return ret;
-}
-
-int32_t
-gf_cli_bd_op (call_frame_t *frame, xlator_t *this,
- void *data)
-{
- gf_cli_req req = { {0,} };
- int ret = 0;
- dict_t *dict = NULL;
-
- if (!frame || !this || !data) {
- ret = -1;
- goto out;
- }
-
- dict = dict_ref ((dict_t *)data);
- if (!dict)
- goto out;
-
- ret = dict_allocate_and_serialize (dict,
- &req.dict.dict_val,
- &req.dict.dict_len);
-
-
- ret = cli_to_glusterd (&req, frame, gf_cli_bd_op_cbk,
- (xdrproc_t)xdr_gf_cli_req, dict,
- GLUSTER_CLI_BD_OP, this, cli_rpc_prog,
- NULL);
-
-out:
- if (dict)
- dict_unref (dict);
-
- if (req.dict.dict_val)
- GF_FREE (req.dict.dict_val);
-
- gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret);
- return ret;
-}
-#endif
-
int32_t
gf_cli_create_volume (call_frame_t *frame, xlator_t *this,
void *data)
@@ -7740,9 +7587,6 @@ struct rpc_clnt_procedure gluster_cli_actors[GLUSTER_CLI_MAXVALUE] = {
[GLUSTER_CLI_CLRLOCKS_VOLUME] = {"CLEARLOCKS_VOLUME", gf_cli_clearlocks_volume},
[GLUSTER_CLI_COPY_FILE] = {"COPY_FILE", gf_cli_copy_file},
[GLUSTER_CLI_SYS_EXEC] = {"SYS_EXEC", gf_cli_sys_exec},
-#ifdef HAVE_BD_XLATOR
- [GLUSTER_CLI_BD_OP] = {"BD_OP", gf_cli_bd_op},
-#endif
};
struct rpc_clnt_program cli_prog = {
diff --git a/cli/src/cli.h b/cli/src/cli.h
index d7b64cf..bc71ee2 100644
--- a/cli/src/cli.h
+++ b/cli/src/cli.h
@@ -37,19 +37,6 @@
#define CLI_TAB_LENGTH 8
#define CLI_BRICK_STATUS_LINE_LEN 78
-#define CLI_LOCAL_INIT(local, words, frame, dictionary) \
- do { \
- local = cli_local_get (); \
- \
- if (local) { \
- local->words = words; \
- if (dictionary) \
- local->dict = dictionary; \
- if (frame) \
- frame->local = local; \
- } \
- } while (0)
-
enum argp_option_keys {
ARGP_DEBUG_KEY = 133,
ARGP_PORT_KEY = 'p',
diff --git a/configure.ac b/configure.ac
index cf301b2..9d676cd 100644
--- a/configure.ac
+++ b/configure.ac
@@ -53,8 +53,6 @@ AC_CONFIG_FILES([Makefile
xlators/storage/Makefile
xlators/storage/posix/Makefile
xlators/storage/posix/src/Makefile
- xlators/storage/bd_map/Makefile
- xlators/storage/bd_map/src/Makefile
xlators/cluster/Makefile
xlators/cluster/afr/Makefile
xlators/cluster/afr/src/Makefile
@@ -303,44 +301,6 @@ if test "x$enable_fuse_client" != "xno"; then
BUILD_FUSE_CLIENT="yes"
fi
-AC_ARG_ENABLE([bd-xlator],
- AC_HELP_STRING([--enable-bd-xlator],
- [Build BD xlator]))
-
-if test "x$enable_bd_xlator" != "xno"; then
- AC_CHECK_LIB([lvm2app],
- [lvm_init,lvm_lv_from_name],
- [HAVE_BD_LIB="yes"],
- [HAVE_BD_LIB="no"])
-
- if test "x$HAVE_BD_LIB" = "xyes"; then
- # lvm_lv_from_name() has been made public with lvm2-2.02.79
- AC_CHECK_DECLS(
- [lvm_lv_from_name],
- [NEED_LVM_LV_FROM_NAME_DECL="no"],
- [NEED_LVM_LV_FROM_NAME_DECL="yes"],
- [[#include <lvm2app.h>]])
- fi
-fi
-
-if test "x$enable_bd_xlator" = "xyes" -a "x$HAVE_BD_LIB" = "xno"; then
- echo "BD xlator requested but required lvm2 development library not found."
- exit 1
-fi
-
-BUILD_BD_XLATOR=no
-if test "x${enable_bd_xlator}" != "xno" -a "x${HAVE_BD_LIB}" = "xyes"; then
- BUILD_BD_XLATOR=yes
- AC_DEFINE(HAVE_BD_XLATOR, 1, [define if lvm2app library found and bd
- xlator enabled])
- if test "x$NEED_LVM_LV_FROM_NAME_DECL" = "xyes"; then
- AC_DEFINE(NEED_LVM_LV_FROM_NAME_DECL, 1, [defined if lvm_lv_from_name()
- was not found in the lvm2app.h header, but can be linked])
- fi
-fi
-
-AM_CONDITIONAL([ENABLE_BD_XLATOR], [test x$BUILD_BD_XLATOR = xyes])
-
AC_SUBST(FUSE_CLIENT_SUBDIR)
# end FUSE section
@@ -861,7 +821,6 @@ echo "georeplication : $BUILD_SYNCDAEMON"
echo "Linux-AIO : $BUILD_LIBAIO"
echo "Enable Debug : $BUILD_DEBUG"
echo "systemtap : $BUILD_SYSTEMTAP"
-echo "Block Device backend : $BUILD_BD_XLATOR"
echo "glupy : $BUILD_GLUPY"
echo "Use syslog : $USE_SYSLOG"
echo "XML output : $BUILD_XML_OUTPUT"
diff --git a/doc/features/bd.txt b/doc/features/bd.txt
deleted file mode 100644
index c1ba006..0000000
--- a/doc/features/bd.txt
+++ /dev/null
@@ -1,130 +0,0 @@
-Sections
-1. Introduction
-2. Advantages
-3. Creating BD backend volume
-4. BD volume file
-5. Using BD backend gluster volume
-6. Limitations
-7. TODO
-
-1. Introduction
-===============
-Block Device translator(BD xlator) represented as storage/bd_map in
-volume file adds a new backend 'block' to GlusterFS. It enables
-GlusterFS to export block devices as regular files to the client.
-Currently BD xlator supports exporting of 'Volume Group(VG)' as
-directory and Logical Volumes(LV) within that VG as regular files to the
-client.
-
-The eventual goal of this work is to support thin provisioning,
-snapshot, copy etc of VM images seamlessly in GlusterFS storage
-environment
-
-The immediate goal of this translator is to use LVs to store
-VM images and expose them as files to QEMU/KVM. Given VG is represented
-as directory and its logical volumes as files.
-
-BD xlator uses lvm2-devel APIs for getting the list of VGs and LVs in
-the system and lvm binaries (such as lvcreate, lvresize etc) to perform
-the required LV operations.
-
-2. Advantages
-=============
-By exporting LVs as regular files, it becomes possible to:
-* Associate each VM to a LV so that there is no file system overhead.
-* Use file system commands like cp to take copy of VM images
-* Create linked clones of VM by doing LV snapshot at server
-side
-* Implement thin provisioning by developing a qcow2 translator
-
-3. Creating BD backend volume
-=============================
-New parameter "device vg" in volume create command is used to create BD
-backend gluster volumes.
-
-For example
- $ gluster volume create my-volume device vg hostname:/my-vg
-
-creates gluster volume 'my-volume' with BD backend which uses the VG
-'my-vg' to store data. VG 'my-vg' should exist before creating this
-gluster volume.
-
-4. BD volume file
-=================
-BD backend volume file specifies which VG to export to the client. The
-section in the volume file that describes BD xlator looks like this.
-
-volume my-volume-bd_map
-type storage/bd_map
-option device vg
-option export volume-group
-end-volume
-
-option device=vg specifies that it should use VG as block backend. option
-export=volume-group specifies that it should export VG "volume-group"
-to the client.
-
-5. Using BD backend gluster volume
-==================================
-Mount
------
- $ mount -t glusterfs hostname:/my-volume /media/bd
- $ cd /media/bd
-
-From the mount point:
---------------------
-* Creating a new file (ie LV) involves two steps
- $ touch lv1
- $ truncate -s <size> lv1
- or
- $ qemu-img create -f <format> gluster:/hostname/my-volume/path-to-image <size>
-
-* Cloning an LV
- $ ln lv1 lv2
-
-* Snapshotting an LV
- $ ln -s lv1 lv1-ss
-
-* Passing it to QEMU as one of the drives
- $ qemu -drive file=<mount>/<file>,if=<if-type>
-
-* GlusterFS is one of the supported QEMU block drivers, the URI format
- is
- gluster[+transport]://[server[:port]]/my-volume/image[?socket=...]
- ie
- $ qemu -drive file=gluster:/hostname/my-volume/path-to-image,if=<if-type>
-
-Using Gluster CLI:
------------------
-* To create a new image of required size
- $ gluster bd create my-volume:/path-to-image <size>
-
-* To delete an existing image
- $ gluster bd delete my-volume:/path-to-image
-
-* To clone (full clone) an image
- $ gluster bd clone my-volume:/path-to-image new-image
-
-* To take a snapshot of an image
- $ gluster bd snapshot my-volume:/path-to-image snapshot-image <size>
-
-All gluster BD commands need size to specified in terms of KB, MB, etc.
-
-6. Limitations
-==============
-* No support to create multiple bricks
-* Image creation should be used with truncate to get proper size or use
- qemu-img create
-* cp command can't be used to copy images, instead use ln command or
- gluster bd clone command
-* ln -s command throws an error even if snapshot is successful
-* When ln command used on BD volumes, target file's inode is different
- from target's
-* Creation/deletion of directories, xattr operations, mknod and readlink
- operations are not supported.
-
-7. TODO
-=======
-Add support for exporting LUNs also as a regular files.
-Add support for xattr and multi brick support
-Include support for device mapper thin targets
diff --git a/doc/gluster.8 b/doc/gluster.8
index b23e2c8..3c78fb8 100644
--- a/doc/gluster.8
+++ b/doc/gluster.8
@@ -8,7 +8,7 @@
.\" cases as published by the Free Software Foundation.
.\"
.\"
-.TH Gluster 8 "Gluster command line utility" "22 November 2012" "Gluster Inc."
+.TH Gluster 8 "Gluster command line utility" "07 March 2011" "Gluster Inc."
.SH NAME
gluster - Gluster Console Manager (command line utility)
.SH SYNOPSIS
@@ -36,11 +36,9 @@ The Gluster Console Manager is a command line utility for elastic volume managem
\fB\ volume info [all|<VOLNAME>] \fR
Display information about all volumes, or the specified volume.
.TP
-\fB\ volume create <NEW-VOLNAME> [device vg] [stripe <COUNT>] [replica <COUNT>] [transport <tcp|rdma|tcp,rdma>] <NEW-BRICK> ... \fR
+\fB\ volume create <NEW-VOLNAME> [stripe <COUNT>] [replica <COUNT>] [transport <tcp|rdma|tcp,rdma>] <NEW-BRICK> ... \fR
Create a new volume of the specified type using the specified bricks and transport type (the default transport type is tcp).
To create a volume with both transports (tcp and rdma), give 'transport tcp,rdma' as an option.
-device vg parameter specifies volume should use block backend instead of regular posix backend. In this case NEW-BRICK should specify an existing Volume Group and there can be only one brick for Block backend volumes. \fR
-Refer Block backend section for more details
.TP
\fB\ volume delete <VOLNAME> \fR
Delete the specified volume.
@@ -59,9 +57,6 @@ Set the volume options.
.TP
\fB\ volume help \fR
Display help for the volume command.
-.SS "Block backend"
-.TP
-By specifying "device vg" in volume create, a volume capable of exporting block devices(ie Volume Groups (VG)) is created. As of now exporting only VG is supported. While creating block backend volume the "VG" (mentioned in NEW-BRICK) must exist (ie created with vgcreate). VG is exported as a directory and all LVs under that VG will be exported as files. Please refer BD commands section for Block backend related commands
.SS "Brick Commands"
.PP
.TP
@@ -110,20 +105,6 @@ Display the status of peers.
.TP
\fB\ peer help \fR
Display help for the peer command.
-.SS "BD commands"
-.TP
-\fB\ bd create <VOLNAME:/path-to-image> <size> \fR
-Creates a new image of given size in the volume. Size can be suffixed with MB, GB etc, if nothing specified MB is taken as default.
-.TP
-\fB\ bd delete <VOLNAME:/path-to-image> \fR
-Deletes a image in the volume
-.TP
-\fB\ bd clone <VOLNAME:/path-to-image> <new-image> \fR
-Clones an existing image (full clone)
-.TP
-\fB\ bd snapshot <VOLNAME:/path-to-image> <new-image> <size> \fR
-Creates a linked clone of an existing image with given size. Size can be suffixed with MB, GB etc, if nothing specified MB is taken as default.
-
.SS "Other Commands"
.TP
\fB\ help \fR
diff --git a/glusterfsd/src/glusterfsd-mgmt.c b/glusterfsd/src/glusterfsd-mgmt.c
index 071066b..f4445ac 100644
--- a/glusterfsd/src/glusterfsd-mgmt.c
+++ b/glusterfsd/src/glusterfsd-mgmt.c
@@ -1124,75 +1124,6 @@ out:
}
int
-glusterfs_handle_bd_op (rpcsvc_request_t *req)
-{
- int32_t ret = -1;
- gd1_mgmt_brick_op_req xlator_req = {0,};
- dict_t *input = NULL;
- xlator_t *xlator = NULL;
- xlator_t *any = NULL;
- dict_t *output = NULL;
- char *xname = NULL;
- glusterfs_ctx_t *ctx = NULL;
- glusterfs_graph_t *active = NULL;
- xlator_t *this = NULL;
- char *error = NULL;
-
- GF_ASSERT (req);
- this = THIS;
- GF_ASSERT (this);
-
- ret = xdr_to_generic (req->msg[0], &xlator_req,
- (xdrproc_t)xdr_gd1_mgmt_brick_op_req);
- if (ret < 0) {
- /* failed to decode msg */
- req->rpc_err = GARBAGE_ARGS;
- goto out;
- }
-
- ctx = glusterfsd_ctx;
- active = ctx->active;
- any = active->first;
- input = dict_new ();
- ret = dict_unserialize (xlator_req.input.input_val,
- xlator_req.input.input_len,
- &input);
- if (ret < 0) {
- gf_log (this->name, GF_LOG_ERROR,
- "failed to "
- "unserialize req-buffer to dictionary");
- goto out;
- } else {
- input->extra_stdfree = xlator_req.input.input_val;
- }
-
- /* FIXME, hardcoded */
- xlator = xlator_search_by_xl_type (any, "storage/bd_map");
- if (!xlator) {
- gf_log (this->name, GF_LOG_ERROR, "xlator %s is not "
- "loaded", xname);
- goto out;
- }
- output = dict_new ();
- XLATOR_NOTIFY (xlator, GF_EVENT_TRANSLATOR_OP, input, output);
-out:
- if (ret < 0) {
- int retval;
- retval = dict_get_str (output, "error", &error);
- }
- glusterfs_xlator_op_response_send (req, ret, error, output);
- if (input)
- dict_unref (input);
- if (output)
- dict_unref (output);
- if (xlator_req.name)
- /* malloced by xdr */
- free (xlator_req.name);
-
- return 0;
-}
-
-int
glusterfs_handle_rpc_msg (rpcsvc_request_t *req)
{
int ret = -1;
@@ -1256,9 +1187,6 @@ rpcsvc_actor_t glusterfs_actors[] = {
[GLUSTERD_BRICK_XLATOR_DEFRAG] = {"TRANSLATOR DEFRAG", GLUSTERD_BRICK_XLATOR_DEFRAG, glusterfs_handle_defrag, NULL, 0, DRC_NA},
[GLUSTERD_NODE_PROFILE] = {"NFS PROFILE", GLUSTERD_NODE_PROFILE, glusterfs_handle_nfs_profile, NULL, 0, DRC_NA},
[GLUSTERD_NODE_STATUS] = {"NFS STATUS", GLUSTERD_NODE_STATUS, glusterfs_handle_node_status, NULL, 0, DRC_NA},
-#ifdef HAVE_BD_XLATOR
- [GLUSTERD_BRICK_BD_OP] = {"BD OP", GLUSTERD_BRICK_BD_OP, glusterfs_handle_bd_op, NULL, 0, DRC_NA}
-#endif
};
struct rpcsvc_program glusterfs_mop_prog = {
diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c
index 483c588..a277c58 100644
--- a/libglusterfs/src/xlator.c
+++ b/libglusterfs/src/xlator.c
@@ -362,29 +362,6 @@ out:
return search;
}
-xlator_t *
-xlator_search_by_xl_type (xlator_t *any, const char *type)
-{
- xlator_t *search = NULL;
-
- GF_VALIDATE_OR_GOTO ("xlator", any, out);
- GF_VALIDATE_OR_GOTO ("xlator", type, out);
-
- search = any;
-
- while (search->prev)
- search = search->prev;
-
- while (search) {
- if (!strcmp (search->type, type))
- break;
- search = search->next;
- }
-
-out:
- return search;
-}
-
static int
__xlator_init(xlator_t *xl)
{
diff --git a/libglusterfs/src/xlator.h b/libglusterfs/src/xlator.h
index 2f938c3..b57e587 100644
--- a/libglusterfs/src/xlator.h
+++ b/libglusterfs/src/xlator.h
@@ -933,7 +933,6 @@ void xlator_foreach_depth_first (xlator_t *this,
void *data);
xlator_t *xlator_search_by_name (xlator_t *any, const char *name);
-xlator_t *xlator_search_by_xl_type (xlator_t *any, const char *type);
void inode_destroy_notify (inode_t *inode, const char *xlname);
diff --git a/rpc/rpc-lib/src/protocol-common.h b/rpc/rpc-lib/src/protocol-common.h
index adec7b6..4bca0f5 100644
--- a/rpc/rpc-lib/src/protocol-common.h
+++ b/rpc/rpc-lib/src/protocol-common.h
@@ -157,7 +157,6 @@ enum gluster_cli_procnum {
GLUSTER_CLI_LIST_VOLUME,
GLUSTER_CLI_CLRLOCKS_VOLUME,
GLUSTER_CLI_UUID_RESET,
- GLUSTER_CLI_BD_OP,
GLUSTER_CLI_UUID_GET,
GLUSTER_CLI_COPY_FILE,
GLUSTER_CLI_SYS_EXEC,
@@ -192,7 +191,6 @@ enum glusterd_brick_procnum {
GLUSTERD_BRICK_XLATOR_DEFRAG,
GLUSTERD_NODE_PROFILE,
GLUSTERD_NODE_STATUS,
- GLUSTERD_BRICK_BD_OP,
GLUSTERD_BRICK_MAXVALUE,
};
@@ -216,14 +214,6 @@ typedef enum {
GF_AFR_OP_STATISTICS_HEAL_COUNT_PER_REPLICA,
} gf_xl_afr_op_t ;
-typedef enum {
- GF_BD_OP_INVALID,
- GF_BD_OP_NEW_BD,
- GF_BD_OP_DELETE_BD,
- GF_BD_OP_CLONE_BD,
- GF_BD_OP_SNAPSHOT_BD,
-} gf_xl_bd_op_t ;
-
#define GLUSTER_HNDSK_PROGRAM 14398633 /* Completely random */
#define GLUSTER_HNDSK_VERSION 2 /* 0.0.2 */
diff --git a/tests/basic/bd.t b/tests/basic/bd.t
deleted file mode 100755
index 3201b74..0000000
--- a/tests/basic/bd.t
+++ /dev/null
@@ -1,117 +0,0 @@
-#!/bin/bash
-
-. $(dirname $0)/../include.rc
-
-cleanup;
-
-
-function execute()
-{
- cmd=$1
- shift
- ${cmd} $@ >/dev/null 2>&1
-}
-
-function bd_cleanup()
-{
- execute vgremove -f ${VG}
- execute pvremove ${ld}
- execute losetup -d ${ld}
- execute rm ${BD_DISK}
- execute $CLI volume delete ${V0}
- cleanup
-}
-
-function check()
-{
- if [ $? -ne 0 ]; then
- echo prerequsite $@ failed
- bd_cleanup
- exit
- fi
-}
-
-VG=__bd_vg
-SIZE=256 #in MB
-
-## Configure environment needed for BD backend volumes
-## Create a file with configured size and
-## set it as a temporary loop device to create
-## physical volume & VG. These are basic things needed
-## for testing BD xlator if anyone of these steps fail,
-## test script exits
-function configure()
-{
- GLDIR=`$CLI system:: getwd`
- BD_DISK=${GLDIR}/bd_disk
-
- execute truncate -s${SIZE}M ${BD_DISK}
- check ${BD_DISK} creation
-
- execute losetup -f
- check losetup
- ld=`losetup -f`
-
- execute losetup ${ld} ${BD_DISK}
- check losetup ${BD_DISK}
- execute pvcreate -f ${ld}
- check pvcreate ${ld}
- execute vgcreate ${VG} ${ld}
- check vgcreate ${VG}
-}
-
-function volinfo_field()
-{
- local vol=$1;
- local field=$2;
-
- $CLI volume info $vol | grep "^$field: " | sed 's/.*: //';
-}
-
-TEST glusterd
-TEST pidof glusterd
-configure
-
-TEST $CLI volume create $V0 device vg ${H0}:/${VG}
-EXPECT "$V0" volinfo_field $V0 'Volume Name';
-EXPECT 'Created' volinfo_field $V0 'Status';
-
-## Start volume and verify
-TEST $CLI volume start $V0;
-EXPECT 'Started' volinfo_field $V0 'Status'
-
-TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0
-
-## Create file (LV)
-TEST touch $M0/$VG/lv1
-TEST stat /dev/$VG/lv1
-
-TEST rm $M0/$VG/lv1;
-TEST ! stat $M0/$VG/lv1;
-
-TEST touch $M0/$VG/lv1
-TEST truncate -s64M $M0/$VG/lv1
-
-TEST ln $M0/$VG/lv1 $M0/$VG/lv2
-TEST stat /dev/$VG/lv2
-
-rm $M0/$VG/lv1
-rm $M0/$VG/lv2
-
-TEST $CLI bd create $V0:/$VG/lv1 4MB
-TEST stat /dev/$VG/lv1
-
-TEST $CLI bd clone $V0:/$VG/lv1 lv2
-TEST stat /dev/$VG/lv2
-TEST $CLI bd delete $V0:/$VG/lv2
-
-TEST $CLI bd snapshot $V0:/$VG/lv1 lv2 1
-TEST stat /dev/$VG/lv2
-rm $M0/$VG/lv2
-rm $M0/$VG/lv1
-
-TEST umount $M0
-TEST $CLI volume stop ${V0}
-TEST $CLI volume delete ${V0}
-
-bd_cleanup
diff --git a/xlators/mgmt/glusterd/src/Makefile.am b/xlators/mgmt/glusterd/src/Makefile.am
index a6f49ae..17767d7 100644
--- a/xlators/mgmt/glusterd/src/Makefile.am
+++ b/xlators/mgmt/glusterd/src/Makefile.am
@@ -2,9 +2,6 @@ xlator_LTLIBRARIES = glusterd.la
xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/mgmt
glusterd_la_CPPFLAGS = $(AM_CPPFLAGS) "-DFILTERDIR=\"$(libdir)/glusterfs/$(PACKAGE_VERSION)/filter\""
glusterd_la_LDFLAGS = -module -avoid-version
-if ENABLE_BD_XLATOR
-glusterd_la_LDFLAGS += -llvm2app
-endif
glusterd_la_SOURCES = glusterd.c glusterd-handler.c glusterd-sm.c \
glusterd-op-sm.c glusterd-utils.c glusterd-rpc-ops.c \
glusterd-store.c glusterd-handshake.c glusterd-pmap.c \
diff --git a/xlators/mgmt/glusterd/src/glusterd-brick-ops.c b/xlators/mgmt/glusterd/src/glusterd-brick-ops.c
index 5b9471f..e24edb2 100644
--- a/xlators/mgmt/glusterd/src/glusterd-brick-ops.c
+++ b/xlators/mgmt/glusterd/src/glusterd-brick-ops.c
@@ -1244,15 +1244,6 @@ glusterd_op_stage_add_brick (dict_t *dict, char **op_errstr)
goto out;
}
- if (volinfo->backend == GD_VOL_BK_BD) {
- snprintf (msg, sizeof (msg), "Add brick is not supported for "
- "Block backend volume %s.", volname);
- gf_log (THIS->name, GF_LOG_ERROR, "%s", msg);
- *op_errstr = gf_strdup (msg);
- ret = -1;
- goto out;
- }
-
ret = glusterd_validate_volume_id (dict, volinfo);
if (ret)
goto out;
diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c
index a80d868..e545fc2 100644
--- a/xlators/mgmt/glusterd/src/glusterd-handler.c
+++ b/xlators/mgmt/glusterd/src/glusterd-handler.c
@@ -50,10 +50,6 @@
#include "globals.h"
#include "glusterd-syncop.h"
-#ifdef HAVE_BD_XLATOR
-#include <lvm2app.h>
-#endif
-
int glusterd_big_locked_notify (struct rpc_clnt *rpc, void *mydata,
rpc_clnt_event_t event,
void *data, rpc_clnt_notify_t notify_fn)
@@ -399,13 +395,6 @@ glusterd_add_volume_detail_to_dict (glusterd_volinfo_t *volinfo,
if (ret)
goto out;
-#ifdef HAVE_BD_XLATOR
- snprintf (key, 256, "volume%d.backend", count);
- ret = dict_set_int32 (volumes, key, volinfo->backend);
- if (ret)
- goto out;
-#endif
-
list_for_each_entry (brickinfo, &volinfo->bricks, brick_list) {
char brick[1024] = {0,};
char brick_uuid[64] = {0,};
@@ -1108,79 +1097,6 @@ glusterd_handle_cli_get_volume (rpcsvc_request_t *req)
__glusterd_handle_cli_get_volume);
}
-#ifdef HAVE_BD_XLATOR
-int
-__glusterd_handle_cli_bd_op (rpcsvc_request_t *req)
-{
- int32_t ret = -1;
- gf_cli_req cli_req = { {0,} };
- dict_t *dict = NULL;
- char *volname = NULL;
- char op_errstr[2048] = {0,};
- glusterd_op_t cli_op = GD_OP_BD_OP;
-
- GF_ASSERT (req);
-
- ret = xdr_to_generic (req->msg[0], &cli_req, (xdrproc_t)xdr_gf_cli_req);
- if (ret < 0) {
- /* failed to decode msg */
- req->rpc_err = GARBAGE_ARGS;
- goto out;
- }
-
- gf_log ("glusterd", GF_LOG_DEBUG, "Received bd op req");
-
- if (cli_req.dict.dict_len) {
- /* Unserialize the dictionary */
- dict = dict_new ();
-
- ret = dict_unserialize (cli_req.dict.dict_val,
- cli_req.dict.dict_len,
- &dict);
- if (ret < 0) {
- gf_log ("glusterd", GF_LOG_ERROR,
- "failed to "
- "unserialize req-buffer to dictionary");
- goto out;
- } else {
- dict->extra_stdfree = cli_req.dict.dict_val;
- }
- }
-
- ret = dict_get_str (dict, "volname", &volname);
- if (ret) {
- gf_log (THIS->name, GF_LOG_ERROR,
- "failed to get volname");
- goto out;
- }
-
- ret = glusterd_op_begin (req, GD_OP_BD_OP, dict, op_errstr,
- sizeof (op_errstr));
-out:
- if (ret && dict)
- dict_unref (dict);
-
- glusterd_friend_sm ();
- glusterd_op_sm ();
-
- if (ret) {
- if (op_errstr[0] == '\0')
- snprintf (op_errstr, sizeof (op_errstr),
- "Operation failed");
- ret = glusterd_op_send_cli_response (cli_op, ret, 0,
- req, NULL, op_errstr);
- }
-
- return ret;
-}
-
-int
-glusterd_handle_cli_bd_op (rpcsvc_request_t *req)
-{
- return glusterd_big_locked_handler (req, __glusterd_handle_cli_bd_op);
-}
-#endif
-
int
__glusterd_handle_cli_uuid_reset (rpcsvc_request_t *req)
{
@@ -3938,9 +3854,6 @@ rpcsvc_actor_t gd_svc_cli_actors[] = {
[GLUSTER_CLI_STATEDUMP_VOLUME] = {"STATEDUMP_VOLUME", GLUSTER_CLI_STATEDUMP_VOLUME, glusterd_handle_cli_statedump_volume, NULL, 0, DRC_NA},
[GLUSTER_CLI_LIST_VOLUME] = {"LIST_VOLUME", GLUSTER_CLI_LIST_VOLUME, glusterd_handle_cli_list_volume, NULL, 0, DRC_NA},
[GLUSTER_CLI_CLRLOCKS_VOLUME] = {"CLEARLOCKS_VOLUME", GLUSTER_CLI_CLRLOCKS_VOLUME, glusterd_handle_cli_clearlocks_volume, NULL, 0, DRC_NA},
-#ifdef HAVE_BD_XLATOR
- [GLUSTER_CLI_BD_OP] = {"BD_OP", GLUSTER_CLI_BD_OP, glusterd_handle_cli_bd_op, NULL, 0, DRC_NA},
-#endif
[GLUSTER_CLI_COPY_FILE] = {"COPY_FILE", GLUSTER_CLI_COPY_FILE, glusterd_handle_copy_file, NULL, 0, DRC_NA},
[GLUSTER_CLI_SYS_EXEC] = {"SYS_EXEC", GLUSTER_CLI_SYS_EXEC, glusterd_handle_sys_exec, NULL, 0, DRC_NA},
};
diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c
index cd14e36..b7b71ad 100644
--- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c
+++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c
@@ -236,19 +236,6 @@ glusterd_brick_op_build_payload (glusterd_op_t op, glusterd_brickinfo_t *brickin
break;
-#ifdef HAVE_BD_XLATOR
- case GD_OP_BD_OP:
- {
- brick_req = GF_CALLOC (1, sizeof (*brick_req),
- gf_gld_mt_mop_brick_req_t);
- if (!brick_req)
- goto out;
-
- brick_req->op = GLUSTERD_BRICK_BD_OP;
- brick_req->name = "";
- }
- break;
-#endif
default:
goto out;
break;
@@ -2761,9 +2748,6 @@ glusterd_op_build_payload (dict_t **req, char **op_errstr, dict_t *op_ctx)
case GD_OP_STATEDUMP_VOLUME:
case GD_OP_CLEARLOCKS_VOLUME:
case GD_OP_DEFRAG_BRICK_VOLUME:
-#ifdef HAVE_BD_XLATOR
- case GD_OP_BD_OP:
-#endif
{
ret = dict_get_str (dict, "volname", &volname);
if (ret) {
@@ -4083,11 +4067,6 @@ glusterd_op_stage_validate (glusterd_op_t op, dict_t *dict, char **op_errstr,
ret = glusterd_op_stage_clearlocks_volume (dict,
op_errstr);
break;
-#ifdef HAVE_BD_XLATOR
- case GD_OP_BD_OP:
- ret = glusterd_op_stage_bd (dict, op_errstr);
- break;
-#endif
case GD_OP_COPY_FILE:
ret = glusterd_op_stage_copy_file (dict, op_errstr);
@@ -4199,11 +4178,6 @@ glusterd_op_commit_perform (glusterd_op_t op, dict_t *dict, char **op_errstr,
ret = glusterd_op_clearlocks_volume (dict, op_errstr,
rsp_dict);
break;
-#ifdef HAVE_BD_XLATOR
- case GD_OP_BD_OP:
- ret = 0;
- break;
-#endif
case GD_OP_COPY_FILE:
ret = glusterd_op_copy_file (dict, op_errstr);
@@ -4688,61 +4662,6 @@ _select_rxlators_for_full_self_heal (xlator_t *this,
return rxlator_count;
}
-#ifdef HAVE_BD_XLATOR
-static int
-glusterd_bricks_select_bd (dict_t *dict, char **op_errstr)
-{
- int ret = -1;
- glusterd_conf_t *priv = NULL;
- xlator_t *this = NULL;
- glusterd_pending_node_t *pending_node = NULL;
- glusterd_volinfo_t *volinfo = NULL;
- char *volname = NULL;
- glusterd_brickinfo_t *brickinfo = NULL;
- int brick_index = -1;
-
- this = THIS;
- GF_ASSERT (this);
- priv = this->private;
- GF_ASSERT (priv);
-
- ret = dict_get_str (dict, "volname", &volname);
- if (ret) {
- gf_log (this->name, GF_LOG_ERROR, "Unable to get volname");
- goto out;
- }
- ret = glusterd_volinfo_find (volname, &volinfo);
- if (ret)
- goto out;
-
- pending_node = GF_CALLOC (1, sizeof (*pending_node),
- gf_gld_mt_pending_node_t);
- if (!pending_node) {
- ret = -1;
- goto out;
- }
-
- list_for_each_entry (brickinfo, &volinfo->bricks, brick_list) {
- brick_index++;
- if (uuid_compare (brickinfo->uuid, MY_UUID) ||
- !glusterd_is_brick_started (brickinfo)) {
- continue;
- }
- pending_node->node = brickinfo;
- pending_node->type = GD_NODE_BRICK;
- pending_node->index = brick_index;
- list_add_tail (&pending_node->list,
- &opinfo.pending_bricks);
- pending_node = NULL;
- }
-
- ret = 0;
-
-out:
- gf_log (THIS->name, GF_LOG_DEBUG, "Returning ret %d", ret);
- return ret;
-}
-#endif
static int
fill_shd_status_for_local_bricks (dict_t *dict, glusterd_volinfo_t *volinfo,
@@ -5296,11 +5215,7 @@ glusterd_op_bricks_select (glusterd_op_t op, dict_t *dict, char **op_errstr,
ret = glusterd_bricks_select_rebalance_volume (dict, op_errstr,
selected);
break;
-#ifdef HAVE_BD_XLATOR
- case GD_OP_BD_OP:
- ret = glusterd_bricks_select_bd (dict, op_errstr);
- break;
-#endif
+
default:
break;
}
@@ -5873,9 +5788,6 @@ glusterd_op_free_ctx (glusterd_op_t op, void *ctx)
case GD_OP_STATEDUMP_VOLUME:
case GD_OP_CLEARLOCKS_VOLUME:
case GD_OP_DEFRAG_BRICK_VOLUME:
-#ifdef HAVE_BD_XLATOR
- case GD_OP_BD_OP:
-#endif
dict_unref (ctx);
break;
default:
diff --git a/xlators/mgmt/glusterd/src/glusterd-replace-brick.c b/xlators/mgmt/glusterd/src/glusterd-replace-brick.c
index 5c879b6..29f6a0e 100644
--- a/xlators/mgmt/glusterd/src/glusterd-replace-brick.c
+++ b/xlators/mgmt/glusterd/src/glusterd-replace-brick.c
@@ -268,13 +268,6 @@ glusterd_op_stage_replace_brick (dict_t *dict, char **op_errstr,
goto out;
}
- if (volinfo->backend == GD_VOL_BK_BD) {
- snprintf (msg, sizeof (msg), "replace brick not supported "
- "for Block backend volume");
- *op_errstr = gf_strdup (msg);
- goto out;
- }
-
if (GLUSTERD_STATUS_STARTED != volinfo->status) {
ret = -1;
snprintf (msg, sizeof (msg), "volume: %s is not started",
diff --git a/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c b/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c
index 2d8d381..38714a5 100644
--- a/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c
+++ b/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c
@@ -142,7 +142,6 @@ glusterd_op_send_cli_response (glusterd_op_t op, int32_t op_ret,
case GD_OP_LIST_VOLUME:
case GD_OP_CLEARLOCKS_VOLUME:
case GD_OP_HEAL_VOLUME:
- case GD_OP_BD_OP:
{
/*nothing specific to be done*/
break;
diff --git a/xlators/mgmt/glusterd/src/glusterd-store.c b/xlators/mgmt/glusterd/src/glusterd-store.c
index 36e7d65..8b658ae 100644
--- a/xlators/mgmt/glusterd/src/glusterd-store.c
+++ b/xlators/mgmt/glusterd/src/glusterd-store.c
@@ -571,14 +571,6 @@ glusterd_volume_exclude_options_write (int fd, glusterd_volinfo_t *volinfo)
goto out;
}
- if (volinfo->backend == GD_VOL_BK_BD) {
- snprintf (buf, sizeof (buf), "%d", volinfo->backend);
- ret = gf_store_save_value (fd, GLUSTERD_STORE_KEY_VOL_BACKEND,
- buf);
- if (ret)
- goto out;
- }
-
snprintf (buf, sizeof (buf), "%d", volinfo->op_version);
ret = gf_store_save_value (fd, GLUSTERD_STORE_KEY_VOL_OP_VERSION, buf);
if (ret)
@@ -1858,9 +1850,6 @@ glusterd_store_retrieve_volume (char *volname)
gf_log ("", GF_LOG_DEBUG, "Parsed as "GEOREP" "
" slave:key=%s,value:%s", key, value);
- } else if (!strncmp (key, GLUSTERD_STORE_KEY_VOL_BACKEND,
- strlen (GLUSTERD_STORE_KEY_VOL_BACKEND))) {
- volinfo->backend = atoi (value);
} else if (!strncmp (key, GLUSTERD_STORE_KEY_VOL_OP_VERSION,
strlen (GLUSTERD_STORE_KEY_VOL_OP_VERSION))) {
volinfo->op_version = atoi (value);
diff --git a/xlators/mgmt/glusterd/src/glusterd-store.h b/xlators/mgmt/glusterd/src/glusterd-store.h
index 9882225..facb964 100644
--- a/xlators/mgmt/glusterd/src/glusterd-store.h
+++ b/xlators/mgmt/glusterd/src/glusterd-store.h
@@ -68,7 +68,7 @@ typedef enum glusterd_store_ver_ac_{
#define GLUSTERD_STORE_KEY_PEER_UUID "uuid"
#define GLUSTERD_STORE_KEY_PEER_HOSTNAME "hostname"
#define GLUSTERD_STORE_KEY_PEER_STATE "state"
-#define GLUSTERD_STORE_KEY_VOL_BACKEND "backend"
+
#define glusterd_for_each_entry(entry, dir) \
do {\
diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.c b/xlators/mgmt/glusterd/src/glusterd-volgen.c
index 3314710..6bf14bc 100644
--- a/xlators/mgmt/glusterd/src/glusterd-volgen.c
+++ b/xlators/mgmt/glusterd/src/glusterd-volgen.c
@@ -1419,8 +1419,6 @@ server_graph_builder (volgen_graph_t *graph, glusterd_volinfo_t *volinfo,
char *password = NULL;
char index_basepath[PATH_MAX] = {0};
char key[1024] = {0};
- char *vgname = NULL;
- char *vg = NULL;
glusterd_brickinfo_t *brickinfo = NULL;
char changelog_basepath[PATH_MAX] = {0,};
@@ -1441,47 +1439,24 @@ server_graph_builder (volgen_graph_t *graph, glusterd_volinfo_t *volinfo,
}
}
- if (volinfo->backend == GD_VOL_BK_BD) {
- xl = volgen_graph_add (graph, "storage/bd_map", volname);
- if (!xl)
- return -1;
-
- ret = xlator_set_option (xl, "device", "vg");
- if (ret)
- return -1;
-
- vg = gf_strdup (path);
- vgname = strrchr (vg, '/');
- if (strchr(vg, '/') != vgname) {
- gf_log ("glusterd", GF_LOG_ERROR,
- "invalid vg specified %s", path);
- GF_FREE (vg);
- goto out;
- }
- vgname++;
- ret = xlator_set_option (xl, "export", vgname);
- GF_FREE (vg);
- if (ret)
- return -1;
- } else {
- xl = volgen_graph_add (graph, "storage/posix", volname);
- if (!xl)
- return -1;
+ xl = volgen_graph_add (graph, "storage/posix", volname);
+ if (!xl)
+ return -1;
- ret = xlator_set_option (xl, "directory", path);
- if (ret)
- return -1;
+ ret = xlator_set_option (xl, "directory", path);
+ if (ret)
+ return -1;
- ret = xlator_set_option (xl, "volume-id",
+ ret = xlator_set_option (xl, "volume-id",
uuid_utoa (volinfo->volume_id));
- if (ret)
- return -1;
+ if (ret)
+ return -1;
+
+ ret = check_and_add_debug_xl (graph, set_dict, volname,
+ "posix");
+ if (ret)
+ return -1;
- ret = check_and_add_debug_xl (graph, set_dict, volname,
- "posix");
- if (ret)
- return -1;
- }
xl = volgen_graph_add (graph, "features/changelog", volname);
if (!xl)
diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c
index d47951f..034004d 100644
--- a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c
+++ b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c
@@ -12,10 +12,6 @@
#include "config.h"
#endif
-#ifdef HAVE_BD_XLATOR
-#include <lvm2app.h>
-#endif
-
#include "common-utils.h"
#include "syscall.h"
#include "cli1-xdr.h"
@@ -603,36 +599,6 @@ glusterd_handle_cli_statedump_volume (rpcsvc_request_t *req)
__glusterd_handle_cli_statedump_volume);
}
-#ifdef HAVE_BD_XLATOR
-int
-glusterd_is_valid_vg (const char *name)
-{
- lvm_t handle = NULL;
- vg_t vg = NULL;
- char *vg_name = NULL;
- int retval = -1;
-
- handle = lvm_init (NULL);
- if (!handle) {
- gf_log ("", GF_LOG_ERROR, "lvm_init failed");
- return -1;
- }
- vg_name = gf_strdup (name);
- vg = lvm_vg_open (handle, basename (vg_name), "r", 0);
- if (!vg) {
- gf_log ("", GF_LOG_ERROR, "no such vg: %s", vg_name);
- goto out;
- }
- retval = 0;
-out:
- if (vg)
- lvm_vg_close (vg);
- lvm_quit (handle);
- GF_FREE (vg_name);
- return retval;
-}
-#endif
-
/* op-sm */
int
glusterd_op_stage_create_volume (dict_t *dict, char **op_errstr)
@@ -653,9 +619,6 @@ glusterd_op_stage_create_volume (dict_t *dict, char **op_errstr)
char msg[2048] = {0};
uuid_t volume_uuid;
char *volume_uuid_str;
-#ifdef HAVE_BD_XLATOR
- char *dev_type = NULL;
-#endif
gf_boolean_t is_force = _gf_false;
this = THIS;
@@ -700,10 +663,6 @@ glusterd_op_stage_create_volume (dict_t *dict, char **op_errstr)
goto out;
}
-#ifdef HAVE_BD_XLATOR
- ret = dict_get_str (dict, "device", &dev_type);
-#endif
-
ret = dict_get_str (dict, "bricks", &bricks);
if (ret) {
gf_log (this->name, GF_LOG_ERROR, "Unable to get bricks for "
@@ -752,18 +711,6 @@ glusterd_op_stage_create_volume (dict_t *dict, char **op_errstr)
goto out;
}
-#ifdef HAVE_BD_XLATOR
- if (dev_type) {
- ret = glusterd_is_valid_vg (brick_info->path);
- if (ret) {
- snprintf (msg, sizeof(msg), "invalid vg %s",
- brick_info->path);
- goto out;
- }
-
- break;
- } else
-#endif
if (!uuid_compare (brick_info->uuid, MY_UUID)) {
ret = glusterd_validate_and_create_brickpath (brick_info,
volume_uuid, op_errstr,
@@ -911,9 +858,6 @@ glusterd_op_stage_start_volume (dict_t *dict, char **op_errstr)
if (uuid_compare (brickinfo->uuid, MY_UUID))
continue;
- if (volinfo->backend == GD_VOL_BK_BD)
- continue;
-
ret = gf_lstat_dir (brickinfo->path, NULL);
if (ret && (flags & GF_CLI_FLAG_OP_FORCE)) {
continue;
@@ -1350,109 +1294,6 @@ out:
return ret;
}
-#ifdef HAVE_BD_XLATOR
-int
-glusterd_op_stage_bd (dict_t *dict, char **op_errstr)
-{
- int ret = -1;
- char *volname = NULL;
- char *path = NULL;
- char *size = NULL;
- glusterd_volinfo_t *volinfo = NULL;
- char msg[2048] = {0,};
- gf_xl_bd_op_t bd_op = GF_BD_OP_INVALID;
- uint64_t bytes = 0;
-
- ret = dict_get_str (dict, "volname", &volname);
- if (ret) {
- snprintf (msg, sizeof(msg), "Failed to get volume name");
- gf_log (THIS->name, GF_LOG_ERROR, "%s", msg);
- *op_errstr = gf_strdup (msg);
- goto out;
- }
-
- ret = dict_get_int32 (dict, "bd-op", (int32_t *)&bd_op);
- if (ret) {
- snprintf (msg, sizeof(msg), "Failed to get bd-op");
- gf_log (THIS->name, GF_LOG_ERROR, "%s", msg);
- *op_errstr = gf_strdup (msg);
- goto out;
- }
-
- ret = dict_get_str (dict, "path", &path);
- if (ret) {
- snprintf (msg, sizeof(msg), "Failed to get path");
- gf_log (THIS->name, GF_LOG_ERROR, "%s", msg);
- *op_errstr = gf_strdup (msg);
- goto out;
- }
-
- if (bd_op == GF_BD_OP_NEW_BD) {
- ret = dict_get_str (dict, "size", &size);
- if (ret) {
- snprintf (msg, sizeof(msg), "Failed to get size");
- gf_log ("", GF_LOG_ERROR, "%s", msg);
- *op_errstr = gf_strdup (msg);
- goto out;
- }
- if (gf_string2bytesize (size, &bytes) < 0) {
- snprintf (msg, sizeof(msg),
- "Invalid size %s, suffix with KB, MB etc",
- size);
- gf_log ("", GF_LOG_ERROR, "%s", msg);
- *op_errstr = gf_strdup (msg);
- ret = -1;
- goto out;
- }
- } else if (bd_op == GF_BD_OP_SNAPSHOT_BD) {
- ret = dict_get_str (dict, "size", &size);
- if (ret) {
- snprintf (msg, sizeof(msg), "Failed to get size");
- gf_log ("", GF_LOG_ERROR, "%s", msg);
- *op_errstr = gf_strdup (msg);
- goto out;
- }
-
- if (gf_string2bytesize (size, &bytes) < 0) {
- ret = -1;
- snprintf (msg, sizeof(msg),
- "Invalid size %s, suffix with KB, MB etc",
- size);
- gf_log ("", GF_LOG_ERROR, "%s", msg);
- *op_errstr = gf_strdup (msg);
- goto out;
- }
- }
-
- ret = glusterd_volinfo_find (volname, &volinfo);
- if (ret) {
- snprintf (msg, sizeof(msg), "Volume %s does not exist",
- volname);
- gf_log ("", GF_LOG_ERROR, "%s", msg);
- *op_errstr = gf_strdup (msg);
- goto out;
- }
-
- ret = glusterd_validate_volume_id (dict, volinfo);
- if (ret)
- goto out;
-
- if (!glusterd_is_volume_started (volinfo)) {
- snprintf (msg, sizeof(msg), "Volume %s is not started",
- volname);
- gf_log ("", GF_LOG_ERROR, "%s", msg);
- *op_errstr = gf_strdup (msg);
- ret = -1;
- goto out;
- }
-
- ret = 0;
-out:
- gf_log ("", GF_LOG_DEBUG, "Returning %d", ret);
- return ret;
-}
-#endif
-
int
glusterd_op_create_volume (dict_t *dict, char **op_errstr)
{
@@ -1474,9 +1315,6 @@ glusterd_op_create_volume (dict_t *dict, char **op_errstr)
char *str = NULL;
char *username = NULL;
char *password = NULL;
-#ifdef HAVE_BD_XLATOR
- char *device = NULL;
-#endif
this = THIS;
GF_ASSERT (this);
@@ -1531,12 +1369,6 @@ glusterd_op_create_volume (dict_t *dict, char **op_errstr)
goto out;
}
-#ifdef HAVE_BD_XLATOR
- ret = dict_get_str (dict, "device", &device);
- if (!ret)
- volinfo->backend = GD_VOL_BK_BD;
-#endif
-
/* replica-count 1 means, no replication, file is in one brick only */
volinfo->replica_count = 1;
/* stripe-count 1 means, no striping, file is present as a whole */
diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h
index ff9ca41..8d8f8d4 100644
--- a/xlators/mgmt/glusterd/src/glusterd.h
+++ b/xlators/mgmt/glusterd/src/glusterd.h
@@ -98,7 +98,6 @@ typedef enum glusterd_op_ {
GD_OP_LIST_VOLUME,
GD_OP_CLEARLOCKS_VOLUME,
GD_OP_DEFRAG_BRICK_VOLUME,
- GD_OP_BD_OP,
GD_OP_COPY_FILE,
GD_OP_SYS_EXEC,
GD_OP_GSYNC_CREATE,
@@ -232,11 +231,6 @@ struct _auth {
typedef struct _auth auth_t;
-typedef enum glusterd_vol_backend_ {
- GD_VOL_BK_DEFAULT = 0, /* POSIX */
- GD_VOL_BK_BD = 1,
-} glusterd_vol_backend_t;
-
struct glusterd_rebalance_ {
gf_defrag_status_t defrag_status;
uint64_t rebalance_files;
@@ -306,7 +300,6 @@ struct glusterd_volinfo_ {
xlator_t *xl;
gf_boolean_t memory_accounting;
- glusterd_vol_backend_t backend;
int op_version;
int client_op_version;
@@ -746,7 +739,6 @@ int glusterd_op_statedump_volume (dict_t *dict, char **op_errstr);
int glusterd_op_stage_clearlocks_volume (dict_t *dict, char **op_errstr);
int glusterd_op_clearlocks_volume (dict_t *dict, char **op_errstr,
dict_t *rsp_dict);
-int glusterd_op_stage_bd (dict_t *dict, char **op_errstr);
/* misc */
void glusterd_do_replace_brick (void *data);
diff --git a/xlators/storage/Makefile.am b/xlators/storage/Makefile.am
index e1316a1..5e3ed0e 100644
--- a/xlators/storage/Makefile.am
+++ b/xlators/storage/Makefile.am
@@ -1,6 +1,3 @@
SUBDIRS = posix
-if ENABLE_BD_XLATOR
-SUBDIRS += bd_map
-endif
CLEANFILES =
diff --git a/xlators/storage/bd_map/Makefile.am b/xlators/storage/bd_map/Makefile.am
deleted file mode 100644
index a985f42..0000000
--- a/xlators/storage/bd_map/Makefile.am
+++ /dev/null
@@ -1,3 +0,0 @@
-SUBDIRS = src
-
-CLEANFILES =
diff --git a/xlators/storage/bd_map/src/Makefile.am b/xlators/storage/bd_map/src/Makefile.am
deleted file mode 100644
index 91412e9..0000000
--- a/xlators/storage/bd_map/src/Makefile.am
+++ /dev/null
@@ -1,21 +0,0 @@
-
-if ENABLE_BD_XLATOR
-xlator_LTLIBRARIES = bd_map.la
-xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/storage
-
-bd_map_la_LDFLAGS = -module -avoid-version
-LIBBD = -llvm2app -lrt
-bd_map_la_SOURCES = bd_map.c bd_map_help.c
-bd_map_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la $(LIBBD)
-
-noinst_HEADERS = bd_map.h bd_map_help.h
-
-AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \
- -I$(top_srcdir)/rpc/xdr/src \
- -I$(top_srcdir)/rpc/rpc-lib/src
-
-AM_CFLAGS = -fno-strict-aliasing -Wall $(GF_CFLAGS)
-
-CLEANFILES =
-
-endif
diff --git a/xlators/storage/bd_map/src/bd_map.c b/xlators/storage/bd_map/src/bd_map.c
deleted file mode 100644
index 9c8f69c..0000000
--- a/xlators/storage/bd_map/src/bd_map.c
+++ /dev/null
@@ -1,2580 +0,0 @@
-/*
- BD translator - Exports Block devices on server side as regular
- files to client
-
- Now only exporting Logical volumes supported.
-
- Copyright IBM, Corp. 2012
-
- This file is part of GlusterFS.
-
- Author:
- M. Mohan Kumar <mohan@in.ibm.com>
-
- This file is licensed to you under your choice of the GNU Lesser
- General Public License, version 3 or any later version (LGPLv3 or
- later), or the GNU General Public License, version 2 (GPLv2), in all
- cases as published by the Free Software Foundation.
-*/
-
-#ifndef _CONFIG_H
-#define _CONFIG_H
-#include "config.h"
-#endif
-
-#include <time.h>
-#include <lvm2app.h>
-#include <openssl/md5.h>
-
-#include "bd_map.h"
-#include "bd_map_help.h"
-#include "defaults.h"
-#include "glusterfs3-xdr.h"
-#include "run.h"
-#include "protocol-common.h"
-
-/* Regular fops */
-
-int
-bd_access (call_frame_t *frame, xlator_t *this,
- loc_t *loc, int32_t mask, dict_t *xdict)
-{
- int32_t op_ret = -1;
- int32_t op_errno = 0;
- char path[PATH_MAX] = {0, };
-
- VALIDATE_OR_GOTO (frame, out);
- VALIDATE_OR_GOTO (this, out);
- VALIDATE_OR_GOTO (loc, out);
-
- sprintf (path, "/dev/mapper/%s", loc->path);
- op_ret = access (path, mask & 07);
- if (op_ret == -1) {
- op_errno = errno;
- gf_log (this->name, GF_LOG_ERROR, "access failed on %s: %s",
- loc->path, strerror (op_errno));
- goto out;
- }
- op_ret = 0;
-out:
- STACK_UNWIND_STRICT (access, frame, op_ret, op_errno, NULL);
-
- return 0;
-}
-
-#define LV_RENAME "/sbin/lvrename"
-
-int bd_rename (call_frame_t *frame, xlator_t *this,
- loc_t *oldloc, loc_t *newloc, dict_t *xdict)
-{
- int32_t op_ret = -1;
- int32_t op_errno = 0;
- char *new_path = NULL;
- char *np = NULL;
- struct iatt stbuf = {0, };
- struct iatt preoldparent = {0, };
- struct iatt postoldparent = {0, };
- struct iatt prenewparent = {0, };
- struct iatt postnewparent = {0, };
- bd_priv_t *priv = NULL;
- bd_entry_t *lventry = NULL;
- bd_entry_t *newp_entry = NULL;
- char *path = NULL;
- struct stat v_stat = {0, };
- runner_t runner = {0, };
-
- VALIDATE_OR_GOTO (frame, out);
- VALIDATE_OR_GOTO (this, out);
- VALIDATE_OR_GOTO (oldloc, out);
- VALIDATE_OR_GOTO (newloc, out);
-
- priv = this->private;
- VALIDATE_OR_GOTO (priv, out);
-
- BD_ENTRY (priv, lventry, oldloc->path);
- if (lventry->refcnt > 1) {
- op_errno = EBUSY;
- goto out;
- }
-
- memcpy (&preoldparent, lventry->parent->attr, sizeof(preoldparent));
-
- new_path = np = gf_strdup (newloc->path);
- if (!new_path)
- goto out;
- new_path = strrchr (np, '/');
- if (!new_path) {
- op_errno = EINVAL;
- goto out;
- }
-
- *new_path = '\0';
- BD_ENTRY (priv, newp_entry, np);
-
- memcpy (&prenewparent, newp_entry->parent->attr, sizeof(preoldparent));
-
- runinit (&runner);
-
- runner_add_args (&runner, LV_RENAME, NULL);
- runner_add_args (&runner, lventry->parent->name, NULL);
- runner_add_args (&runner, oldloc->name, NULL);
- runner_add_args (&runner, newloc->name, NULL);
-
- runner_start (&runner);
- runner_end (&runner);
-
- /* verify */
- gf_asprintf (&path, "/dev/%s", newloc->path);
- if (stat (path, &v_stat) < 0) {
- op_errno = EIO;
- goto out;
- }
- BD_ENTRY_UPDATE_MTIME (lventry);
- BD_ENTRY_UPDATE_MTIME (newp_entry);
- memcpy (&postoldparent, lventry->parent->attr, sizeof(postoldparent));
- memcpy (&postnewparent, newp_entry->parent->attr,
- sizeof(postoldparent));
- BD_WR_LOCK (&priv->lock);
- strncpy (lventry->name, newloc->name, sizeof(lventry->name));
- memcpy (&stbuf, lventry->attr, sizeof(stbuf));
- BD_UNLOCK (&priv->lock);
- op_ret = 0;
-out:
- if (lventry)
- BD_PUT_ENTRY (priv, lventry);
- if (newp_entry)
- BD_PUT_ENTRY (priv, newp_entry);
- if (np)
- GF_FREE (np);
- if (path)
- GF_FREE (path);
-
- STACK_UNWIND_STRICT (rename, frame, op_ret, op_errno, &stbuf,
- &preoldparent, &postoldparent, &prenewparent,
- &postnewparent, NULL);
- return 0;
-}
-
-int32_t
-bd_delete_lv (bd_priv_t *priv, bd_entry_t *p_entry, bd_entry_t *lventry,
- const char *path, int *op_errno)
-{
- vg_t vg = NULL;
- lv_t lv = NULL;
- int op_ret = -1;
-
- *op_errno = 0;
- BD_WR_LOCK (&priv->lock);
- vg = lvm_vg_open (priv->handle, p_entry->name, "w", 0);
- if (!vg) {
- *op_errno = ENOENT;
- BD_UNLOCK (&priv->lock);
- goto out;
- }
-
- lv = lvm_lv_from_name (vg, lventry->name);
- if (!lv) {
- lvm_vg_close (vg);
- *op_errno = ENOENT;
- BD_UNLOCK (&priv->lock);
- goto out;
- }
- op_ret = lvm_vg_remove_lv (lv);
- if (op_ret < 0) {
- *op_errno = errno;
- lvm_vg_close (vg);
- BD_UNLOCK (&priv->lock);
- goto out;
- }
- lvm_vg_close (vg);
-
- op_ret = bd_entry_rm (path);
- if (op_ret < 0) {
- *op_errno = EIO;
- BD_UNLOCK (&priv->lock);
- goto out;
- }
- BD_ENTRY_UPDATE_MTIME (p_entry);
-
- op_ret = 0;
- op_errno = 0;
-
- BD_UNLOCK (&priv->lock);
- op_ret = 0;
-out:
- return op_ret;
-}
-
-int32_t
-bd_unlink (call_frame_t *frame, xlator_t *this,
- loc_t *loc, int xflag, dict_t *xdata)
-{
- int32_t op_ret = -1;
- int32_t op_errno = ENOENT;
- struct iatt preparent = {0, };
- struct iatt postparent = {0, };
- bd_priv_t *priv = NULL;
- bd_entry_t *lventry = NULL;
- bd_entry_t *p_entry = NULL;
- char *vg_name = NULL;
- char *volume = NULL;
-
- VALIDATE_OR_GOTO (frame, out);
- VALIDATE_OR_GOTO (this, out);
- VALIDATE_OR_GOTO (this->private, out);
- VALIDATE_OR_GOTO (loc, out);
-
- priv = this->private;
- VALIDATE_OR_GOTO (priv, out);
-
- volume = vg_name = gf_strdup (loc->path);
- if (!volume)
- goto out;
- volume = strrchr (volume, '/');
- if (!volume) {
- op_errno = EINVAL;
- goto out;
- }
- /* creating under non VG directory not permited */
- if (vg_name == volume) {
- op_errno = EOPNOTSUPP;
- goto out;
- }
- *volume = '\0';
-
- BD_ENTRY (priv, p_entry, vg_name);
- BD_ENTRY (priv, lventry, loc->path);
- if (!p_entry || !lventry)
- goto out;
-
- memcpy (&preparent, p_entry->attr, sizeof(preparent));
- op_ret = bd_delete_lv (priv, p_entry, lventry, loc->path, &op_errno);
- memcpy (&postparent, p_entry->attr, sizeof(postparent));
-out:
- if (p_entry)
- BD_PUT_ENTRY (priv, p_entry);
- if (lventry)
- BD_PUT_ENTRY (priv, lventry);
- if (vg_name)
- GF_FREE (vg_name);
- STACK_UNWIND_STRICT (unlink, frame, op_ret, op_errno,
- &preparent, &postparent, NULL);
-
- return 0;
-}
-
-#define LVM_CREATE "/sbin/lvcreate"
-
-#define IOV_NR 4
-#define IOV_SIZE (4 * 1024)
-
-int bd_clone_lv (bd_priv_t *priv, bd_entry_t *p_entry, dict_t *output,
- const char *vg_name, const char *lv_name,
- const char *dest_lv_name, struct iatt *stbuf)
-{
- int32_t ret = -1;
- vg_t vg = NULL;
- lv_t lv = NULL;
- ssize_t size = 0;
- uint64_t extent = 0;
- int fd1 = -1;
- int fd2 = -1;
- struct iatt iattr = {0, };
- bd_entry_t *lventry = NULL;
- char path[512] = {0, };
- struct iovec *vec = NULL;
- int i = 0;
- ssize_t bytes = 0;
- int nr_iov = 0;
-
- vec = GF_CALLOC (IOV_NR, sizeof(struct iovec), gf_common_mt_iovec);
- if (!vec)
- goto out;
-
- for (i = 0; i < IOV_NR; i++) {
- vec[i].iov_base = GF_MALLOC (IOV_SIZE, gf_common_mt_char);
- if (!vec[i].iov_base)
- goto out;
- vec[i].iov_len = IOV_SIZE;
- }
-
- vg = lvm_vg_open (priv->handle, vg_name, "w", 0);
- if (!vg) {
- gf_log (THIS->name, GF_LOG_ERROR,
- "lvm_vg_open %s failed", vg_name);
- ret = -1;
- goto out;
- }
- lv = lvm_lv_from_name (vg, lv_name);
- if (!lv) {
- gf_log (THIS->name, GF_LOG_ERROR, "lvm_lv_from_name failed");
- ret = -1;
- goto out;
- }
-
- size = lvm_lv_get_size (lv);
- extent = size / lvm_vg_get_extent_size (vg);
-
- if (lvm_vg_create_lv_linear (vg, dest_lv_name, size) == NULL) {
- gf_log (THIS->name, GF_LOG_ERROR, "lv_create:%s",
- lvm_errmsg(priv->handle));
- ret = -1;
- goto out;
- }
- sprintf (path, "/dev/%s/%s", vg_name, lv_name);
- fd1 = open (path, O_RDONLY);
- if (fd1 < 0) {
- gf_log (THIS->name, GF_LOG_ERROR, "opening %s failed", path);
- goto out;
- }
- sprintf (path, "/dev/%s/%s", vg_name, dest_lv_name);
- fd2 = open (path, O_WRONLY);
- if (fd2 < 0) {
- gf_log (THIS->name, GF_LOG_ERROR, "opening %s failed", path);
- goto out;
- }
-
- bd_entry_istat (path, &iattr, IA_IFREG);
- iattr.ia_size = size;
-
- bytes = size;
- while (bytes) {
- size = readv(fd1, vec, IOV_NR);
- if (size < 0) {
- gf_log (THIS->name, GF_LOG_DEBUG,
- "read failed:%s", strerror(errno));
- goto out;
- }
- if (size < IOV_NR * IOV_SIZE) {
- vec[size / IOV_SIZE].iov_len = size % IOV_SIZE;
- nr_iov = (size / IOV_SIZE) + 1;
- } else
- nr_iov = IOV_NR;
- bytes -= size;
- size = writev (fd2, vec, nr_iov);
- if (size < 0) {
- gf_log (THIS->name, GF_LOG_DEBUG,
- "write failed:%s", strerror(errno));
- goto out;
- }
- }
-
- lventry = bd_entry_add (p_entry, dest_lv_name, &iattr, IA_IFREG);
- if (!lventry) {
- ret = EAGAIN;
- goto out;
- }
-
- if (stbuf)
- memcpy (stbuf, &iattr, sizeof(iattr));
-
- ret = 0;
- gf_log (THIS->name, GF_LOG_INFO, "Clone completed");
-out:
- if (vg)
- lvm_vg_close (vg);
- if (fd1 != -1)
- close (fd1);
- if (fd2 != -1)
- close (fd2);
- if (vec)
- iov_free (vec, IOV_NR);
- return ret;
-}
-
-int bd_snapshot_lv (bd_priv_t *priv, bd_entry_t *p_entry, dict_t *output,
- const char *lv_name, const char *dest_lv, char *size,
- struct iatt *stbuf)
-{
- int32_t ret = -1;
- struct iatt iattr = {0, };
- struct stat stat = {0, };
- bd_entry_t *lventry = NULL;
- char *error = NULL;
- int retval = -1;
- runner_t runner = {0, };
- char *path = NULL;
- vg_t vg = NULL;
- lv_t lv = NULL;
-
- runinit (&runner);
-
- runner_add_args (&runner, LVM_CREATE, NULL);
- runner_add_args (&runner, "--snapshot", NULL);
- runner_argprintf (&runner, "/dev/%s/%s", p_entry->name, lv_name);
- runner_add_args (&runner, "--name", NULL);
- runner_argprintf (&runner, "%s", dest_lv);
- runner_argprintf (&runner, "-L%s", size);
-
- runner_start (&runner);
- runner_end (&runner);
-
- gf_asprintf (&path, "/dev/%s/%s", p_entry->name, dest_lv);
- if (!path) {
- ret = -ENOMEM;
- goto out;
- }
- if (lstat (path, &stat) < 0) {
- ret = -EAGAIN;
- if (output)
- gf_asprintf (&error, "try again");
- goto out;
- }
-
- vg = lvm_vg_open (priv->handle, p_entry->name, "r", 0);
- if (!vg) {
- ret = -EIO;
- if (output)
- gf_asprintf (&error, "can't open vg %s", p_entry->name);
- goto out;
- }
- lv = lvm_lv_from_name (vg, lv_name);
- if (!lv) {
- ret = -EIO;
- if (output)
- gf_asprintf (&error, "can't open lv %s", lv_name);
- goto out;
- }
- bd_entry_istat (path, &iattr, IA_IFREG);
- iattr.ia_size = lvm_lv_get_size (lv);
- lventry = bd_entry_add (p_entry, dest_lv, &iattr, IA_IFREG);
- if (!lventry) {
- if (output)
- gf_asprintf (&error, "try again");
- ret = -EAGAIN;
- goto out;
- }
- if (stbuf)
- memcpy (stbuf, &iattr, sizeof(iattr));
- ret = 0;
-out:
- if (vg)
- lvm_vg_close (vg);
- if (error && output)
- retval = dict_set_str (output, "error", error);
- GF_FREE (path);
- return ret;
-}
-
-/*
- * Creates a snapshot of given LV
- */
-int
-bd_symlink (call_frame_t *frame, xlator_t *this,
- const char *linkname, loc_t *loc, mode_t umask, dict_t *xdata)
-{
- int32_t op_ret = -1;
- int32_t op_errno = 0;
- bd_priv_t *priv = NULL;
- struct iatt stbuf = {0, };
- struct iatt preparent = {0, };
- struct iatt postparent = {0, };
- bd_entry_t *lventry = NULL;
- char *name = NULL;
- char *np = NULL;
- char *volume = NULL;
- char *vg_name = NULL;
- char *path = NULL;
-
- VALIDATE_OR_GOTO (frame, out);
- VALIDATE_OR_GOTO (this, out);
- VALIDATE_OR_GOTO (this->private, out);
- VALIDATE_OR_GOTO (loc, out);
-
- priv = this->private;
- VALIDATE_OR_GOTO (priv, out);
-
- if (strchr (loc->path, '/')) {
- vg_name = gf_strdup (loc->path);
- volume = strrchr (vg_name, '/');
- if (!volume) {
- op_errno = EINVAL;
- goto out;
- }
- /* creating under non VG directory not permited */
- if (vg_name == volume) {
- op_errno = EOPNOTSUPP;
- goto out;
- }
- GF_FREE (vg_name);
- vg_name = NULL;
- }
-
- /*
- * symlink creation for BD xlator is different
- * source (LV) has to exist for creation of symbolic link (snapshot)
- */
- if (strchr (linkname, '/')) {
- op_errno = EOPNOTSUPP;
- goto out;
- }
- gf_asprintf (&path, "%s/%s", priv->vg, linkname);
- if (!path) {
- op_errno = -ENOMEM;
- goto out;
- }
- BD_ENTRY (priv, lventry, path);
- if (!lventry) {
- op_errno = ENOENT;
- goto out;
- }
-
- name = np = gf_strdup (loc->path);
- if (!name)
- goto out;
-
- /* Get LV name from loc->path */
- name = strrchr (loc->path, '/');
- if (name != loc->path)
- name++;
-
- memcpy (&preparent, lventry->parent->attr, sizeof(preparent));
- if (bd_snapshot_lv (priv, lventry->parent, NULL, lventry->name,
- name, "1", &stbuf) < 0) {
- op_errno = EAGAIN;
- goto out;
- }
- BD_ENTRY_UPDATE_MTIME (lventry->parent);
- memcpy (&postparent, lventry->parent->attr, sizeof (postparent));
- op_ret = 0;
-out:
- if (lventry)
- BD_PUT_ENTRY (priv, lventry);
- if (np)
- GF_FREE (np);
- if (vg_name)
- GF_FREE (vg_name);
- if (path)
- GF_FREE (path);
-
- STACK_UNWIND_STRICT (symlink, frame, op_ret, op_errno,
- (loc)?loc->inode:NULL, &stbuf, &preparent,
- &postparent, NULL);
- return 0;
-}
-
-/*
- * bd_link: Does full clone of given logical volume
- * A new logical volume with source logical volume's size created
- * and entire content copied
- */
-int
-bd_link (call_frame_t *frame, xlator_t *this,
- loc_t *oldloc, loc_t *newloc, dict_t *xdata)
-{
- int32_t op_ret = -1;
- int32_t op_errno = 0;
- bd_priv_t *priv = NULL;
- struct iatt stbuf = {0, };
- struct iatt preparent = {0, };
- struct iatt postparent = {0, };
- bd_entry_t *lventry = NULL;
-
- VALIDATE_OR_GOTO (frame, out);
- VALIDATE_OR_GOTO (this, out);
- VALIDATE_OR_GOTO (this->private, out);
- VALIDATE_OR_GOTO (oldloc, out);
- VALIDATE_OR_GOTO (newloc, out);
-
- priv = this->private;
- VALIDATE_OR_GOTO (priv, out);
-
- BD_ENTRY (priv, lventry, oldloc->path);
- if (!lventry) {
- op_errno = ENOENT;
- goto out;
- }
- memcpy (&postparent, lventry->parent->attr, sizeof (postparent));
- if (bd_clone_lv (priv, lventry->parent, NULL, lventry->parent->name,
- lventry->name, newloc->name, &stbuf) < 0) {
- op_errno = EAGAIN;
- goto out;
- }
- BD_ENTRY_UPDATE_MTIME (lventry->parent);
- memcpy (&preparent, lventry->parent->attr, sizeof (preparent));
- op_ret = 0;
-out:
- if (lventry)
- BD_PUT_ENTRY (priv, lventry);
-
-
- STACK_UNWIND_STRICT (link, frame, op_ret, op_errno,
- (oldloc)?oldloc->inode:NULL, &stbuf, &preparent,
- &postparent, NULL);
- return 0;
-}
-
-int32_t
-bd_open (call_frame_t *frame, xlator_t *this,
- loc_t *loc, int32_t flags, fd_t *fd, dict_t *xdata)
-{
- int32_t op_ret = -1;
- int32_t op_errno = 0;
- int32_t _fd = -1;
- bd_fd_t *bd_fd = NULL;
- bd_entry_t *lventry = NULL;
- bd_priv_t *priv = NULL;
- char *devpath = NULL;
-
- VALIDATE_OR_GOTO (frame, out);
- VALIDATE_OR_GOTO (this, out);
- VALIDATE_OR_GOTO (this->private, out);
- VALIDATE_OR_GOTO (loc, out);
- VALIDATE_OR_GOTO (fd, out);
-
- priv = this->private;
- VALIDATE_OR_GOTO (priv, out);
-
- BD_ENTRY (priv, lventry, loc->path);
- if (!lventry) {
- op_errno = ENOENT;
- goto out;
- }
-
- gf_asprintf (&devpath, "/dev/%s/%s", lventry->parent->name,
- lventry->name);
- _fd = open (devpath, flags, 0);
- if (_fd == -1) {
- op_errno = errno;
- gf_log (this->name, GF_LOG_ERROR,
- "open on %s: %s", devpath, strerror (op_errno));
- goto out;
- }
-
- bd_fd = GF_CALLOC (1, sizeof(*bd_fd), gf_bd_fd);
- if (!bd_fd) {
- op_errno = errno;
- goto out;
- }
- bd_fd->entry = lventry;
- bd_fd->fd = _fd;
-
- op_ret = fd_ctx_set (fd, this, (uint64_t)(long)bd_fd);
- if (op_ret) {
- gf_log (this->name, GF_LOG_WARNING,
- "failed to set the fd context path=%s fd=%p",
- loc->name, fd);
- goto out;
- }
-
- op_ret = 0;
-out:
- if (op_ret == -1) {
- if (_fd != -1)
- close (_fd);
- /* FIXME: Should we call fd_ctx_set with NULL? */
- if (bd_fd)
- GF_FREE (bd_fd);
- if (lventry)
- BD_PUT_ENTRY (priv, lventry);
- }
- if (devpath)
- GF_FREE (devpath);
-
- STACK_UNWIND_STRICT (open, frame, op_ret, op_errno, fd, NULL);
-
- return 0;
-}
-
-int
-bd_readv (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,
- off_t offset, uint32_t flags, dict_t *xdata)
-{
- uint64_t tmp_bd_fd = 0;
- int32_t op_ret = -1;
- int32_t op_errno = 0;
- int _fd = -1;
- bd_priv_t *priv = NULL;
- struct iobuf *iobuf = NULL;
- struct iobref *iobref = NULL;
- struct iovec vec = {0, };
- bd_fd_t *bd_fd = NULL;
- int ret = -1;
- struct iatt stbuf = {0, };
-
- VALIDATE_OR_GOTO (frame, out);
- VALIDATE_OR_GOTO (this, out);
- VALIDATE_OR_GOTO (fd, out);
- VALIDATE_OR_GOTO (this->private, out);
-
- priv = this->private;
- VALIDATE_OR_GOTO (priv, out);
-
- ret = fd_ctx_get (fd, this, &tmp_bd_fd);
- if (ret < 0) {
- op_errno = -EINVAL;
- gf_log (this->name, GF_LOG_WARNING,
- "bd_fd is NULL from fd=%p", fd);
- goto out;
- }
- bd_fd = (bd_fd_t *)(long)tmp_bd_fd;
- if (!size) {
- op_errno = EINVAL;
- gf_log (this->name, GF_LOG_WARNING, "size=%"GF_PRI_SIZET, size);
- goto out;
- }
- iobuf = iobuf_get2 (this->ctx->iobuf_pool, size);
- if (!iobuf) {
- op_errno = ENOMEM;
- goto out;
- }
- _fd = bd_fd->fd;
- op_ret = pread (_fd, iobuf->ptr, size, offset);
- if (op_ret == -1) {
- op_errno = errno;
- gf_log (this->name, GF_LOG_ERROR,
- "read failed on fd=%p: %s", fd,
- strerror (op_errno));
- goto out;
- }
-
- vec.iov_base = iobuf->ptr;
- vec.iov_len = op_ret;
-
- iobref = iobref_new ();
- iobref_add (iobref, iobuf);
- BD_ENTRY_UPDATE_ATIME (bd_fd->entry);
-
- memcpy (&stbuf, bd_fd->entry->attr, sizeof(stbuf));
-
- /* Hack to notify higher layers of EOF. */
- if (bd_fd->entry->size == 0)
- op_errno = ENOENT;
- else if ((offset + vec.iov_len) >= bd_fd->entry->size)
- op_errno = ENOENT;
- op_ret = vec.iov_len;
-out:
- STACK_UNWIND_STRICT (readv, frame, op_ret, op_errno,
- &vec, 1, &stbuf, iobref, NULL);
-
- if (iobref)
- iobref_unref (iobref);
- if (iobuf)
- iobuf_unref (iobuf);
- return 0;
-}
-
-#define LVM_RESIZE "/sbin/lvresize"
-
-int32_t
-bd_resize (bd_priv_t *priv, bd_entry_t *lventry, off_t *size)
-{
- bd_entry_t *vgentry = NULL;
- uint64_t extent = 0;
- int32_t op_ret = -1;
- vg_t vg = NULL;
- uint32_t nr_ex = 0;
- lv_t lv = NULL;
- uint64_t new_size = 0;
- runner_t runner = {0, };
-
- BD_ENTRY (priv, vgentry, lventry->parent->name);
- if (!vgentry) {
- op_ret = ENOENT;
- goto out;
- }
-
- BD_WR_LOCK (&priv->lock);
- vg = lvm_vg_open (priv->handle, vgentry->name, "w", 0);
- if (!vg) {
- op_ret = lvm_errno (priv->handle);
- BD_UNLOCK (&priv->lock);
- goto out;
- }
-
- extent = lvm_vg_get_extent_size (vg);
- lvm_vg_close (vg);
- BD_UNLOCK (&priv->lock);
-
- nr_ex = *size / extent;
- if (*size % extent)
- nr_ex++;
- *size = extent * nr_ex;
-
- runinit (&runner);
-
- runner_add_args (&runner, LVM_RESIZE, NULL);
- runner_argprintf (&runner, "/dev/%s/%s", lventry->parent->name,
- lventry->name);
- runner_argprintf (&runner, "-l%ld", nr_ex);
- runner_add_args (&runner, "-f", NULL);
-
- runner_start (&runner);
- runner_end (&runner);
-
- BD_WR_LOCK (&priv->lock);
- vg = lvm_vg_open (priv->handle, vgentry->name, "w", 0);
- if (!vg) {
- op_ret = lvm_errno (priv->handle);
- BD_UNLOCK (&priv->lock);
- goto out;
- }
-
- lv = lvm_lv_from_name (vg, lventry->name);
- if (!lv) {
- op_ret = lvm_errno (priv->handle);
- lvm_vg_close (vg);
- BD_UNLOCK (&priv->lock);
- goto out;
- }
- new_size = lvm_lv_get_size (lv);
- lvm_vg_close (vg);
- if (new_size != *size) {
- op_ret = EIO;
- BD_UNLOCK (&priv->lock);
- goto out;
- }
-
- BD_UNLOCK (&priv->lock);
- op_ret = 0;
-
-out:
- if (vgentry)
- BD_PUT_ENTRY (priv, vgentry);
-
- return op_ret;
-}
-
- int32_t
-bd_ftruncate (call_frame_t *frame, xlator_t *this,
- fd_t *fd, off_t offset, dict_t *xdict)
-{
- int32_t op_ret = -1;
- int32_t op_errno = 0;
- struct iatt preop = {0, };
- struct iatt postop = {0, };
- bd_fd_t *bd_fd = NULL;
- int ret = -1;
- uint64_t tmp_bd_fd = 0;
- bd_priv_t *priv = NULL;
-
- VALIDATE_OR_GOTO (frame, out);
- VALIDATE_OR_GOTO (this, out);
- VALIDATE_OR_GOTO (fd, out);
-
- priv = this->private;
- VALIDATE_OR_GOTO (priv, out);
- ret = fd_ctx_get (fd, this, &tmp_bd_fd);
-
- if (ret < 0) {
- gf_log (this->name, GF_LOG_WARNING,
- "bd_fd is NULL, fd=%p", fd);
- op_errno = -ret;
- goto out;
- }
- bd_fd = (bd_fd_t *)(long)tmp_bd_fd;
-
- memcpy (&preop, bd_fd->entry->attr, sizeof(preop));
- if (offset > bd_fd->entry->size) {
- op_errno = bd_resize (priv, bd_fd->entry, &offset);
- if (op_errno)
- goto out;
- if (offset > bd_fd->entry->size) {
- bd_fd->entry->attr->ia_size = offset;
- bd_fd->entry->size = offset;
- }
- }
- /* If the requested size is less then current size
- * we will not update that in bd_fd->entry->attr
- * because it will result in showing size of this file less
- * instead we will return 0 for less size truncation
- */
- BD_ENTRY_UPDATE_MTIME (bd_fd->entry);
- memcpy (&postop, bd_fd->entry->attr, sizeof(postop));
-
- op_ret = 0;
-out:
- STACK_UNWIND_STRICT (ftruncate, frame, op_ret, op_errno, &preop,
- &postop, NULL);
- return 0;
-}
-
-int32_t
-bd_truncate (call_frame_t *frame, xlator_t *this, loc_t *loc,
- off_t offset, dict_t *xdict)
-{
- int32_t op_ret = -1;
- int32_t op_errno = 0;
- struct iatt prebuf = {0, };
- struct iatt postbuf = {0, };
- bd_entry_t *lventry = NULL;
- bd_priv_t *priv = NULL;
- off_t size = 0;
-
- VALIDATE_OR_GOTO (frame, out);
- VALIDATE_OR_GOTO (this, out);
- VALIDATE_OR_GOTO (loc, out);
-
- priv = this->private;
- BD_ENTRY (priv, lventry, loc->path);
- if (!lventry) {
- op_errno = ENOENT;
- gf_log (this->name, GF_LOG_ERROR,
- "pre-operation lstat on %s failed: %s",
- loc->path, strerror (op_errno));
- goto out;
- }
- memcpy (&prebuf, lventry->attr, sizeof(prebuf));
- if (offset > lventry->size) {
- op_errno = bd_resize (priv, lventry, &size);
- if (op_errno)
- goto out;
- if (lventry->size < offset) {
- lventry->attr->ia_size = offset;
- lventry->size = size;
- }
- }
- BD_ENTRY_UPDATE_MTIME (lventry);
- memcpy (&postbuf, lventry->attr, sizeof(postbuf));
- BD_PUT_ENTRY (priv, lventry);
- op_ret = 0;
-out:
- if (lventry)
- BD_PUT_ENTRY (priv, lventry);
- STACK_UNWIND_STRICT (truncate, frame, op_ret, op_errno,
- &prebuf, &postbuf, NULL);
- return 0;
-}
-
-int32_t
-__bd_pwritev (int fd, struct iovec *vector, int count, off_t offset,
- uint64_t bd_size)
-{
- int32_t op_ret = 0;
- int index = 0;
- int retval = 0;
- off_t internal_offset = 0;
- int no_space = 0;
-
- if (!vector)
- return -EFAULT;
-
- internal_offset = offset;
- for (index = 0; index < count; index++) {
- if (internal_offset >= bd_size) {
- op_ret = -ENOSPC;
- goto err;
- }
- if (internal_offset + vector[index].iov_len >= bd_size) {
- vector[index].iov_len = bd_size - internal_offset;
- no_space = 1;
- }
-
- retval = pwrite (fd, vector[index].iov_base,
- vector[index].iov_len, internal_offset);
- if (retval == -1) {
- gf_log (THIS->name, GF_LOG_WARNING,
- "base %p, length %ld, offset %ld, message %s",
- vector[index].iov_base, vector[index].iov_len,
- internal_offset, strerror (errno));
- op_ret = -errno;
- goto err;
- }
- op_ret += retval;
- internal_offset += retval;
- if (no_space)
- break;
- }
-err:
- return op_ret;
-}
-
-int bd_create_lv (bd_priv_t *priv, bd_entry_t *p_entry, const char *vg_name,
- const char *lv_name, char *size, mode_t mode)
-{
- vg_t vg = NULL;
- int ret = -1;
- char *path = NULL;
- struct iatt iattr = {0, };
- bd_entry_t *lventry = NULL;
- uint64_t extent = 0;
-
- BD_WR_LOCK (&priv->lock);
- vg = lvm_vg_open (priv->handle, vg_name, "w", 0);
- if (!vg) {
- ret = -1;
- goto out;
- }
- extent = lvm_vg_get_extent_size (vg);
- if (size)
- gf_string2bytesize (size, &extent);
-
- if (lvm_vg_create_lv_linear (vg, lv_name, extent) == NULL) {
- ret = -EAGAIN;
- lvm_vg_close (vg);
- goto out;
- }
- lvm_vg_close (vg);
-
- gf_asprintf (&path, "/dev/%s/%s", vg_name, lv_name);
- if (!path) {
- ret = -ENOMEM;
- lvm_vg_close (vg);
- goto out;
- }
- bd_entry_istat (path, &iattr, IA_IFREG);
- iattr.ia_size = extent;
- if (!mode)
- mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP;
-
- iattr.ia_type = ia_type_from_st_mode (mode);
- iattr.ia_prot = ia_prot_from_st_mode (mode);
- lventry = bd_entry_add (p_entry, lv_name, &iattr, IA_IFREG);
- if (!lventry) {
- ret = -EAGAIN;
- goto out;
- }
- ret = 0;
-out:
- BD_UNLOCK (&priv->lock);
- if (path)
- GF_FREE (path);
- return ret;
-}
-
-int bd_create (call_frame_t *frame, xlator_t *this,
- loc_t *loc, int32_t flags, mode_t mode,
- mode_t umask, fd_t *fd, dict_t *params)
-{
- int32_t op_ret = -1;
- int32_t op_errno = 0;
- int32_t _fd = -1;
- bd_priv_t *priv = NULL;
- struct iatt stbuf = {0, };
- struct iatt preparent = {0, };
- struct iatt postparent = {0, };
- bd_entry_t *p_entry = NULL;
- bd_entry_t *lventry = NULL;
- bd_fd_t *pfd = NULL;
- char *vg_name = NULL;
- char *volume = NULL;
- char *path = NULL;
-
- VALIDATE_OR_GOTO (frame, out);
- VALIDATE_OR_GOTO (this, out);
- VALIDATE_OR_GOTO (this->private, out);
- VALIDATE_OR_GOTO (loc, out);
- VALIDATE_OR_GOTO (fd, out);
-
- priv = this->private;
- VALIDATE_OR_GOTO (priv, out);
-
- volume = vg_name = gf_strdup (loc->path);
- if (!volume)
- goto out;
- volume = strrchr (volume, '/');
- if (!volume) {
- op_errno = EINVAL;
- goto out;
- }
- /* creating under non VG directory not permited */
- if (vg_name == volume) {
- op_errno = EOPNOTSUPP;
- goto out;
- }
- *volume = '\0';
-
- BD_ENTRY (priv, p_entry, vg_name);
- if (!p_entry) {
- op_errno = ENOENT;
- goto out;
- }
-
- memcpy (&preparent, p_entry->attr, sizeof(preparent));
-
- op_errno = bd_create_lv (priv, p_entry, p_entry->name, loc->name, 0,
- mode);
- if (op_errno)
- goto out;
-
- BD_ENTRY (priv, lventry, loc->path);
- if (!lventry) {
- gf_log (this->name, GF_LOG_WARNING,
- "newly created LV not available %s", loc->path);
- op_errno = EAGAIN;
- goto out;
- }
-
- /* Mask O_CREATE since we created LV */
- flags &= ~(O_CREAT | O_EXCL);
-
- gf_asprintf (&path, "/dev/%s/%s", p_entry->name, loc->name);
- if (!path) {
- op_errno = ENOMEM;
- goto out;
- }
- _fd = open (path, flags, 0);
- if (_fd == -1) {
- op_errno = errno;
- gf_log (this->name, GF_LOG_ERROR,
- "open on %s: %s", path, strerror (op_errno));
- goto out;
- }
-
- memcpy (&stbuf, lventry->attr, sizeof(stbuf));
-
- pfd = GF_CALLOC (1, sizeof(*pfd), gf_bd_fd);
- if (!pfd) {
- op_errno = errno;
- goto out;
- }
- pfd->flag = flags;
- pfd->fd = _fd;
- pfd->entry = lventry;
-
- if (fd_ctx_set (fd, this, (uint64_t)(long)pfd)) {
- gf_log (this->name, GF_LOG_WARNING,
- "failed to set the fd context path=%s fd=%p",
- loc->name, fd);
- goto out;
- }
-
- op_ret = 0;
-
- memcpy (&postparent, p_entry->attr, sizeof(postparent));
-out:
- if (p_entry)
- BD_PUT_ENTRY (priv, p_entry);
- if (path)
- GF_FREE (path);
- if (op_ret < 0 && lventry)
- BD_PUT_ENTRY (priv, lventry);
- if (vg_name)
- GF_FREE (vg_name);
-
- STACK_UNWIND_STRICT (create, frame, op_ret, op_errno, fd,
- (loc)?loc->inode:NULL, &stbuf, &preparent,
- &postparent, NULL);
- return 0;
-}
-
-/*
- * We don't do actual setattr on devices on the host side, we just update
- * the entries in server process & they are not persistent
- */
-int bd_fsetattr (call_frame_t *frame, xlator_t *this, fd_t *fd,
- struct iatt *stbuf, int32_t valid, dict_t *xdata)
-{
- struct iatt statpre = {0, };
- struct iatt statpost = {0, };
- int32_t op_ret = -1;
- int32_t op_errno = 0;
- bd_priv_t *priv = NULL;
- bd_fd_t *pfd = NULL;
- int ret = 0;
- uint64_t tmp_pfd = 0;
- int _fd = -1;
-
- priv = this->private;
-
- ret = fd_ctx_get (fd, this, &tmp_pfd);
- if (ret < 0) {
- gf_log (this->name, GF_LOG_WARNING,
- "pfd is NULL, fd=%p", fd);
- op_errno = -ret;
- goto out;
- }
- pfd = (bd_fd_t *)(long)tmp_pfd;
-
- _fd = pfd->fd;
- memcpy (&statpre, pfd->entry->attr, sizeof(statpre));
- op_ret = 0;
-
- if (valid & GF_SET_ATTR_MODE)
- pfd->entry->attr->ia_prot = stbuf->ia_prot;
- if (valid & (GF_SET_ATTR_UID | GF_SET_ATTR_GID)) {
- if (valid & GF_SET_ATTR_UID)
- pfd->entry->attr->ia_uid = stbuf->ia_uid;
- if (valid & GF_SET_ATTR_GID)
- pfd->entry->attr->ia_gid = stbuf->ia_gid;
- }
- if (valid & (GF_SET_ATTR_ATIME | GF_SET_ATTR_MTIME)) {
- pfd->entry->attr->ia_atime = stbuf->ia_atime;
- pfd->entry->attr->ia_atime_nsec = stbuf->ia_atime_nsec;
- pfd->entry->attr->ia_mtime = stbuf->ia_mtime;
- pfd->entry->attr->ia_mtime_nsec = stbuf->ia_mtime_nsec;
- }
- memcpy (&statpost, pfd->entry->attr, sizeof(statpost));
- op_errno = 0;
-out:
- STACK_UNWIND_STRICT (setattr, frame, 0, 0, &statpre, &statpost, NULL);
- return 0;
-}
-
-int bd_setattr (call_frame_t *frame, xlator_t *this, loc_t *loc,
- struct iatt *stbuf, int32_t valid, dict_t *xdata)
-{
- struct iatt statpre = {0, };
- struct iatt statpost = {0, };
- bd_entry_t *lventry = NULL;
- int32_t op_ret = -1;
- int32_t op_errno = 0;
- bd_priv_t *priv = NULL;
- char path[PATH_MAX] = {0, };
-
- priv = this->private;
-
- /*
- * We don't allow to do setattr on / on host side
- * ie /dev
- */
- if (!strcmp (loc->path, "/")) {
- op_ret = 0;
- goto out;
- }
-
- BD_ENTRY (priv, lventry, loc->path);
- if (!lventry) {
- op_errno = ENOENT;
- goto out;
- }
- sprintf (path, "/dev/%s/%s", lventry->parent->name, lventry->name);
-
- memcpy (&statpre, lventry->attr, sizeof(statpre));
- if (valid & GF_SET_ATTR_MODE)
- lventry->attr->ia_prot = stbuf->ia_prot;
- if (valid & (GF_SET_ATTR_UID | GF_SET_ATTR_GID)) {
- if (valid & GF_SET_ATTR_UID)
- lventry->attr->ia_uid = stbuf->ia_uid;
- if (valid & GF_SET_ATTR_GID)
- lventry->attr->ia_gid = stbuf->ia_gid;
- }
- if (valid & (GF_SET_ATTR_ATIME | GF_SET_ATTR_MTIME)) {
- lventry->attr->ia_atime = stbuf->ia_atime;
- lventry->attr->ia_atime_nsec = stbuf->ia_atime_nsec;
- lventry->attr->ia_mtime = stbuf->ia_mtime;
- lventry->attr->ia_mtime_nsec = stbuf->ia_mtime_nsec;
- }
- memcpy (&statpost, lventry->attr, sizeof(statpost));
- op_errno = 0;
-out:
- if (lventry)
- BD_PUT_ENTRY (priv, lventry);
- STACK_UNWIND_STRICT (setattr, frame, 0, 0, &statpre, &statpost, NULL);
- return 0;
-}
-
-int
-bd_writev (call_frame_t *frame, xlator_t *this, fd_t *fd,
- struct iovec *vector, int32_t count, off_t offset,
- uint32_t flags, struct iobref *iobref, dict_t *xdict)
-{
- int32_t op_ret = -1;
- int32_t op_errno = 0;
- int _fd = -1;
- bd_priv_t *priv = NULL;
- bd_fd_t *bd_fd = NULL;
- int ret = -1;
- struct iatt preop = {0, };
- struct iatt postop = {0, };
- uint64_t tmp_bd_fd = 0;
-
- VALIDATE_OR_GOTO (frame, out);
- VALIDATE_OR_GOTO (this, out);
- VALIDATE_OR_GOTO (fd, out);
- VALIDATE_OR_GOTO (vector, out);
- VALIDATE_OR_GOTO (this->private, out);
-
- priv = this->private;
- VALIDATE_OR_GOTO (priv, out);
-
- ret = fd_ctx_get (fd, this, &tmp_bd_fd);
- if (ret < 0) {
- op_errno = -ret;
- gf_log (this->name, GF_LOG_WARNING,
- "bd_fd is NULL from fd=%p", fd);
- goto out;
- }
- bd_fd = (bd_fd_t *)(long)tmp_bd_fd;
- _fd = bd_fd->fd;
-
- memcpy (&preop, bd_fd->entry->attr, sizeof(preop));
- op_ret = __bd_pwritev (_fd, vector, count, offset, bd_fd->entry->size);
- if (op_ret < 0) {
- op_errno = -op_ret;
- op_ret = -1;
- gf_log (this->name, GF_LOG_ERROR, "write failed: offset %"PRIu64
- ", %s", offset, strerror (op_errno));
- goto out;
- }
- BD_ENTRY_UPDATE_MTIME (bd_fd->entry);
- memcpy (&postop, bd_fd->entry->attr, sizeof(postop));
-
-out:
- STACK_UNWIND_STRICT (writev, frame, op_ret, op_errno, &preop,
- &postop, NULL);
-
- return 0;
-}
-
-int32_t
-bd_lookup (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xattr_req)
-{
- struct iatt buf = {0, };
- int32_t op_ret = -1;
- int32_t entry_ret = 0;
- int32_t op_errno = 0;
- char *pathdup = NULL;
- bd_entry_t *bdentry = NULL;
- struct iatt postparent = {0, };
- bd_priv_t *priv = NULL;
- char *p = NULL;
-
- VALIDATE_OR_GOTO (frame, out);
- VALIDATE_OR_GOTO (this, out);
- VALIDATE_OR_GOTO (loc, out);
- VALIDATE_OR_GOTO (loc->path, out);
-
- priv = this->private;
- VALIDATE_OR_GOTO (priv, out);
-
- BD_ENTRY (priv, bdentry, loc->path);
- if (!bdentry) {
- op_errno = ENOENT;
- entry_ret = -1;
- goto parent;
- }
- memcpy (&buf, bdentry->attr, sizeof(buf));
- BD_PUT_ENTRY (priv, bdentry);
-
-parent:
- if (loc->parent) {
- pathdup = p = gf_strdup (loc->path);
- if (!pathdup) {
- op_errno = ENOMEM;
- entry_ret = -1;
- goto out;
- }
- p = strrchr (pathdup, '/');
- if (p == pathdup)
- *(p+1) = '\0';
- else
- *p = '\0';
- BD_ENTRY (priv, bdentry, pathdup);
- if (!bdentry) {
- op_errno = ENOENT;
- gf_log (this->name, GF_LOG_ERROR,
- "post-operation lookup on parent of %s "
- "failed: %s",
- loc->path, strerror (op_errno));
- goto out;
- }
- memcpy (&postparent, bdentry->attr, sizeof(postparent));
- BD_PUT_ENTRY (priv, bdentry);
- }
-
- op_ret = entry_ret;
-out:
- if (pathdup)
- GF_FREE (pathdup);
-
- STACK_UNWIND_STRICT (lookup, frame, op_ret, op_errno,
- (loc)?loc->inode:NULL, &buf, NULL, &postparent);
-
- return 0;
-}
-
-int32_t
-bd_stat (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)
-{
- struct iatt buf = {0,};
- int32_t op_ret = -1;
- int32_t op_errno = 0;
- bd_entry_t *bdentry = NULL;
- bd_priv_t *priv = NULL;
-
- VALIDATE_OR_GOTO (frame, out);
- VALIDATE_OR_GOTO (this, out);
- VALIDATE_OR_GOTO (loc, out);
-
- priv = this->private;
- VALIDATE_OR_GOTO (priv, out);
-
- BD_ENTRY (priv, bdentry, loc->path);
- if (!bdentry) {
- op_errno = ENOENT;
- gf_log (this->name, GF_LOG_ERROR, "stat on %s failed: %s",
- loc->path, strerror (op_errno));
- goto out;
- }
- memcpy (&buf, bdentry->attr, sizeof(buf));
- BD_PUT_ENTRY (priv, bdentry);
- op_ret = 0;
-
-out:
- STACK_UNWIND_STRICT (stat, frame, op_ret, op_errno, &buf, NULL);
-
- return 0;
-}
-
-int32_t
-bd_fstat (call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata)
-{
- int ret = -1;
- int32_t op_ret = -1;
- int32_t op_errno = 0;
- uint64_t tmp_bd_fd = 0;
- struct iatt buf = {0, };
- bd_fd_t *bd_fd = NULL;
- int _fd = -1;
-
- VALIDATE_OR_GOTO (frame, out);
- VALIDATE_OR_GOTO (this, out);
- VALIDATE_OR_GOTO (fd, out);
-
- ret = fd_ctx_get (fd, this, &tmp_bd_fd);
- if (ret < 0) {
- gf_log (this->name, GF_LOG_WARNING,
- "bd_fd is NULL, fd=%p", fd);
- op_errno = -EINVAL;
- goto out;
- }
- bd_fd = (bd_fd_t *)(long)tmp_bd_fd;
- _fd = bd_fd->fd;
-
- memcpy (&buf, bd_fd->entry->attr, sizeof(buf));
- op_ret = 0;
-
-out:
- STACK_UNWIND_STRICT (stat, frame, op_ret, op_errno, &buf, NULL);
- return 0;
-}
-
-int32_t
-bd_opendir (call_frame_t *frame, xlator_t *this,
- loc_t *loc, fd_t *fd, dict_t *xdata)
-{
- int32_t op_ret = -1;
- int32_t op_errno = EINVAL;
- bd_fd_t *bd_fd = NULL;
- bd_entry_t *bdentry = NULL;
- bd_priv_t *priv = NULL;
-
- VALIDATE_OR_GOTO (frame, out);
- VALIDATE_OR_GOTO (this, out);
- VALIDATE_OR_GOTO (loc, out);
- VALIDATE_OR_GOTO (loc->path, out);
- VALIDATE_OR_GOTO (fd, out);
-
- priv = this->private;
- VALIDATE_OR_GOTO (priv, out);
-
- BD_ENTRY (priv, bdentry, loc->path);
- if (!bdentry) {
- op_errno = ENOENT;
- gf_log (this->name, GF_LOG_ERROR, "opendir failed on %s: %s",
- loc->path, strerror (op_errno));
- goto out;
- }
- bd_fd = GF_CALLOC (1, sizeof(*bd_fd), gf_bd_fd);
- if (!bd_fd) {
- op_errno = errno;
- BD_PUT_ENTRY (priv, bdentry);
- goto out;
- }
-
- bd_fd->p_entry = bdentry;
-
- bdentry = list_entry ((&bdentry->child)->next, typeof(*bdentry), child);
- if (!bdentry) {
- op_errno = EINVAL;
- gf_log (this->name, GF_LOG_ERROR, "bd_entry NULL");
- goto out;
- }
- bdentry = list_entry ((&bdentry->sibling), typeof(*bdentry), sibling);
- if (!bdentry) {
- op_errno = EINVAL;
- gf_log (this->name, GF_LOG_ERROR, "bd_entry NULL");
- goto out;
- }
-
- bd_fd->entry = bdentry;
-
- op_ret = fd_ctx_set (fd, this, (uint64_t) (long)bd_fd);
- if (op_ret) {
- gf_log (this->name, GF_LOG_ERROR,
- "failed to set the fd context path=%s fd=%p",
- loc->path, fd);
- goto out;
- }
-
- op_ret = 0;
-out:
- if (op_ret == -1) {
- BD_PUT_ENTRY (priv, bd_fd->p_entry);
- if (bd_fd)
- GF_FREE (bd_fd);
- }
-
- STACK_UNWIND_STRICT (opendir, frame, op_ret, op_errno, fd, NULL);
- return 0;
-}
-
-int32_t
-bd_releasedir (xlator_t *this, fd_t *fd)
-{
- bd_fd_t *bd_fd = NULL;
- uint64_t tmp_bd_fd = 0;
- int ret = 0;
- bd_priv_t *priv = NULL;
-
- VALIDATE_OR_GOTO (this, out);
- VALIDATE_OR_GOTO (fd, out);
-
- priv = this->private;
- VALIDATE_OR_GOTO (priv, out);
-
- ret = fd_ctx_del (fd, this, &tmp_bd_fd);
- if (ret < 0) {
- gf_log (this->name, GF_LOG_DEBUG, "bd_fd from fd=%p is NULL",
- fd);
- goto out;
- }
- bd_fd = (bd_fd_t *) (long)tmp_bd_fd;
- BD_PUT_ENTRY (priv, bd_fd->p_entry);
-
- bd_fd = (bd_fd_t *) (long)tmp_bd_fd;
- GF_FREE (bd_fd);
-out:
- return 0;
-}
-
-/*
- * bd_statfs: Mimics statfs by returning used/free extents in the VG
- * TODO: IF more than one VG allowed per volume, this functions needs some
- * change
- */
-int32_t
-bd_statfs (call_frame_t *frame, xlator_t *this,
- loc_t *loc, dict_t *xdata)
-{
- int32_t op_ret = -1;
- int32_t ret = -1;
- int32_t op_errno = 0;
- bd_priv_t *priv = NULL;
- struct statvfs buf = {0, };
- vg_t vg = NULL;
- char *vg_name = NULL;
- uint64_t size = 0;
- uint64_t fr_size = 0;
-
- VALIDATE_OR_GOTO (frame, out);
- VALIDATE_OR_GOTO (this, out);
- VALIDATE_OR_GOTO (this->private, out);
- VALIDATE_OR_GOTO (loc, out);
-
- priv = this->private;
- VALIDATE_OR_GOTO (priv, out);
-
- ret = dict_get_str (this->options, "export", &vg_name);
- if (ret) {
- gf_log (this->name, GF_LOG_CRITICAL,
- "FATAL: storage/bd does not specify volume groups");
- op_errno = EINVAL;
- goto out;
- }
-
- BD_RD_LOCK (&priv->lock);
-
- vg = lvm_vg_open (priv->handle, vg_name, "r", 0);
- size += lvm_vg_get_size (vg);
- fr_size += lvm_vg_get_free_size (vg);
- lvm_vg_close (vg);
-
- BD_UNLOCK (&priv->lock);
-
- if (statvfs ("/", &buf) < 0) {
- op_errno = errno;
- goto out;
- }
- op_ret = 0;
- buf.f_blocks = size / buf.f_frsize;
- buf.f_bfree = fr_size / buf.f_frsize;
- buf.f_bavail = fr_size / buf.f_frsize;
-out:
- STACK_UNWIND_STRICT (statfs, frame, op_ret, op_errno, &buf, NULL);
- return 0;
-}
-
-int32_t
-bd_release (xlator_t *this, fd_t *fd)
-{
- bd_fd_t *bd_fd = NULL;
- int ret = -1;
- uint64_t tmp_bd_fd = 0;
- bd_priv_t *priv = NULL;
-
- VALIDATE_OR_GOTO (this, out);
- VALIDATE_OR_GOTO (fd, out);
-
- priv = this->private;
- VALIDATE_OR_GOTO (priv, out);
-
- ret = fd_ctx_get (fd, this, &tmp_bd_fd);
- if (ret < 0) {
- gf_log (this->name, GF_LOG_WARNING, "bd_fd is NULL from fd=%p",
- fd);
- goto out;
- }
- bd_fd = (bd_fd_t *) (long)tmp_bd_fd;
- close (bd_fd->fd);
- BD_PUT_ENTRY (priv, bd_fd->entry);
-
- GF_FREE (bd_fd);
-out:
- return 0;
-}
-
-int32_t
-bd_fsync (call_frame_t *frame, xlator_t *this,
- fd_t *fd, int32_t datasync, dict_t *xdata)
-{
- int _fd = -1;
- int ret = -1;
- int32_t op_ret = -1;
- int32_t op_errno = 0;
- uint64_t tmp_bd_fd = 0;
- bd_fd_t *bd_fd = NULL;
- struct iatt preop = {0, };
- struct iatt postop = {0, };
-
- VALIDATE_OR_GOTO (frame, out);
- VALIDATE_OR_GOTO (this, out);
- VALIDATE_OR_GOTO (fd, out);
-
- ret = fd_ctx_get (fd, this, &tmp_bd_fd);
- if (ret < 0) {
- gf_log (this->name, GF_LOG_WARNING,
- "bd_fd is NULL, fd=%p", fd);
- op_errno = -ret;
- goto out;
- }
- bd_fd = (bd_fd_t *)(long)tmp_bd_fd;
-
- _fd = bd_fd->fd;
- memcpy (&preop, &bd_fd->entry->attr, sizeof(preop));
- if (datasync) {
- ;
-#ifdef HAVE_FDATASYNC
- op_ret = fdatasync (_fd);
- if (op_ret == -1) {
- gf_log (this->name, GF_LOG_ERROR,
- "fdatasync on fd=%p failed: %s",
- fd, strerror (errno));
- }
-#endif
- } else {
- op_ret = fsync (_fd);
- if (op_ret == -1) {
- op_errno = errno;
- gf_log (this->name, GF_LOG_ERROR,
- "fsync on fd=%p failed: %s",
- fd, strerror (op_errno));
- goto out;
- }
- }
-
- memcpy (&postop, bd_fd->entry->attr, sizeof(postop));
- op_ret = 0;
-
-out:
- STACK_UNWIND_STRICT (fsync, frame, op_ret, op_errno, &preop,
- &postop, NULL);
-
- return 0;
-}
-
-int32_t
-bd_flush (call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdict)
-{
- int32_t op_ret = -1;
- int32_t op_errno = 0;
- int ret = -1;
- uint64_t tmp_bd_fd = 0;
-
- VALIDATE_OR_GOTO (frame, out);
- VALIDATE_OR_GOTO (this, out);
- VALIDATE_OR_GOTO (fd, out);
-
- ret = fd_ctx_get (fd, this, &tmp_bd_fd);
- if (ret < 0) {
- op_errno = -EINVAL;
- gf_log (this->name, GF_LOG_WARNING,
- "bd_fd is NULL on fd=%p", fd);
- goto out;
- }
- op_ret = 0;
-out:
- STACK_UNWIND_STRICT (flush, frame, op_ret, op_errno, NULL);
-
- return 0;
-}
-
-int
-__bd_fill_readdir (pthread_rwlock_t *bd_lock, bd_fd_t *bd_fd, off_t off,
- size_t size, gf_dirent_t *entries)
-{
- size_t filled = 0;
- int count = 0;
- struct dirent entry = {0, };
- int32_t this_size = -1;
- gf_dirent_t *this_entry = NULL;
- bd_entry_t *bdentry = NULL;
- bd_entry_t *cur_entry = NULL;
- bd_entry_t *n_entry = NULL;
-
- BD_RD_LOCK (bd_lock);
-
- bdentry = list_entry ((&bd_fd->p_entry->child)->next, typeof(*n_entry),
- child);
-
- if (off) {
- int i = 0;
- list_for_each_entry (n_entry, &bd_fd->entry->sibling, sibling) {
- if (i == off && strcmp (n_entry->name, "")) {
- bd_fd->entry = n_entry;
- break;
- }
- }
- } else
- bd_fd->entry = list_entry ((&bdentry->sibling),
- typeof(*n_entry), sibling);
-
- while (filled <= size) {
- cur_entry = bd_fd->entry;
-
- n_entry = list_entry ((&bd_fd->entry->sibling)->next,
- typeof (*cur_entry), sibling);
- if (&n_entry->sibling == (&bdentry->sibling))
- break;
-
- strcpy (entry.d_name, n_entry->name);
- entry.d_ino = n_entry->attr->ia_ino;
- entry.d_off = off;
- if (n_entry->attr->ia_type == IA_IFDIR)
- entry.d_type = DT_DIR;
- else
- entry.d_type = DT_REG;
-
- this_size = max (sizeof(gf_dirent_t),
- sizeof (gfs3_dirplist))
- + strlen (entry.d_name) + 1;
-
- if (this_size + filled > size)
- break;
-
- bd_fd->entry = n_entry;
-
- this_entry = gf_dirent_for_name (entry.d_name);
- if (!this_entry) {
- gf_log (THIS->name, GF_LOG_ERROR,
- "could not create gf_dirent for entry %s",
- entry.d_name);
- goto out;
- }
- this_entry->d_off = off;
- this_entry->d_ino = entry.d_ino;
- this_entry->d_type = entry.d_type;
- off++;
-
- list_add_tail (&this_entry->list, &entries->list);
-
- filled += this_size;
- count++;
- }
-out:
- BD_UNLOCK (bd_lock);
- return count;
-}
-
-int32_t
-bd_do_readdir (call_frame_t *frame, xlator_t *this,
- fd_t *fd, size_t size, off_t off, int whichop)
-{
- uint64_t tmp_bd_fd = 0;
- bd_fd_t *bd_fd = NULL;
- int ret = -1;
- int count = 0;
- int32_t op_ret = -1;
- int32_t op_errno = 0;
- gf_dirent_t entries;
- gf_dirent_t *tmp_entry = NULL;
- bd_entry_t *bdentry = NULL;
- bd_priv_t *priv = NULL;
- char *devpath = NULL;
-
- VALIDATE_OR_GOTO (frame, out);
- VALIDATE_OR_GOTO (this, out);
- VALIDATE_OR_GOTO (fd, out);
-
- priv = this->private;
- VALIDATE_OR_GOTO (priv, out);
-
- INIT_LIST_HEAD (&entries.list);
-
- ret = fd_ctx_get (fd, this, &tmp_bd_fd);
- if (ret < 0) {
- gf_log (this->name, GF_LOG_WARNING, "bd_fd is NULL, fd=%p", fd);
- op_errno = -EINVAL;
- goto out;
- }
- bd_fd = (bd_fd_t *) (long)tmp_bd_fd;
- LOCK (&fd->lock);
- {
- count = __bd_fill_readdir (&priv->lock, bd_fd, off,
- size, &entries);
- }
- UNLOCK (&fd->lock);
-
- /* pick ENOENT to indicate EOF */
- op_errno = errno;
- op_ret = count;
-
- if (whichop != GF_FOP_READDIRP)
- goto out;
-
- BD_RD_LOCK (&priv->lock);
- list_for_each_entry (tmp_entry, &entries.list, list) {
- char path[PATH_MAX];
- sprintf (path, "%s/%s", bd_fd->p_entry->name,
- tmp_entry->d_name);
- bdentry = bd_entry_get (path);
- if (!bdentry) {
- gf_log (this->name, GF_LOG_WARNING,
- "entry failed %s\n", tmp_entry->d_name);
- continue;
- }
- if (bdentry->attr->ia_ino)
- tmp_entry->d_ino = bdentry->attr->ia_ino;
- memcpy (&tmp_entry->d_stat,
- bdentry->attr, sizeof (tmp_entry->d_stat));
- bd_entry_put (bdentry);
- GF_FREE (devpath);
- }
- BD_UNLOCK (&priv->lock);
-
-out:
- STACK_UNWIND_STRICT (readdir, frame, op_ret, op_errno, &entries, NULL);
-
- gf_dirent_free (&entries);
-
- return 0;
-}
-
-int32_t
-bd_readdir (call_frame_t *frame, xlator_t *this,
- fd_t *fd, size_t size, off_t off, dict_t *dict)
-{
- bd_do_readdir (frame, this, fd, size, off, GF_FOP_READDIR);
- return 0;
-}
-
-
-int32_t
-bd_readdirp (call_frame_t *frame, xlator_t *this,
- fd_t *fd, size_t size, off_t off, dict_t *dict)
-{
- bd_do_readdir (frame, this, fd, size, off, GF_FOP_READDIRP);
- return 0;
-}
-
-int32_t
-bd_priv (xlator_t *this)
-{
- return 0;
-}
-
-int32_t
-bd_inode (xlator_t *this)
-{
- return 0;
-}
-
-/* unsupported interfaces */
-int32_t
-bd_readlink (call_frame_t *frame, xlator_t *this,
- loc_t *loc, size_t size, dict_t *xdata)
-{
- struct iatt stbuf = {0, };
- char *dest = NULL;
-
- dest = alloca (size + 1);
- STACK_UNWIND_STRICT (readlink, frame, -1, ENOSYS, dest, &stbuf, NULL);
- return 0;
-}
-
-int
-bd_mknod (call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,
- dev_t dev, mode_t umask, dict_t *xdata)
-{
- struct iatt stbuf = {0, };
- struct iatt preparent = {0, };
- struct iatt postparent = {0, };
-
- STACK_UNWIND_STRICT (mknod, frame, -1, ENOSYS,
- (loc)?loc->inode:NULL, &stbuf, &preparent,
- &postparent, NULL);
- return 0;
-}
-
-int
-bd_mkdir (call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,
- mode_t umask, dict_t *xdata)
-{
- struct iatt stbuf = {0, };
- struct iatt preparent = {0, };
- struct iatt postparent = {0, };
-
- STACK_UNWIND_STRICT (mkdir, frame, -1, ENOSYS,
- (loc)?loc->inode:NULL, &stbuf, &preparent,
- &postparent, NULL);
- return 0;
-}
-
-int
-bd_rmdir (call_frame_t *frame, xlator_t *this, loc_t *loc, int flags,
- dict_t *xdata)
-{
- struct iatt preparent = {0, };
- struct iatt postparent = {0, };
-
- STACK_UNWIND_STRICT (rmdir, frame, -1, ENOSYS,
- &preparent, &postparent, NULL);
- return 0;
-}
-
-int32_t
-bd_setxattr (call_frame_t *frame, xlator_t *this,
- loc_t *loc, dict_t *dict, int flags, dict_t *xdata)
-{
- STACK_UNWIND_STRICT (setxattr, frame, -1, ENOSYS, NULL);
- return 0;
-}
-
-int32_t
-bd_fsetxattr (call_frame_t *frame, xlator_t *this,
- fd_t *fd, dict_t *dict, int flags, dict_t *xdata)
-{
- STACK_UNWIND_STRICT (setxattr, frame, -1, ENOSYS, NULL);
- return 0;
-}
-
-int32_t
-bd_getxattr (call_frame_t *frame, xlator_t *this,
- loc_t *loc, const char *name, dict_t *xdata)
-{
- STACK_UNWIND_STRICT (getxattr, frame, -1, ENOSYS, NULL, NULL);
- return 0;
-}
-
-int32_t
-bd_fgetxattr (call_frame_t *frame, xlator_t *this,
- fd_t *fd, const char *name, dict_t *xdata)
-{
- STACK_UNWIND_STRICT (fgetxattr, frame, -1, ENOSYS, NULL, NULL);
-
- return 0;
-}
-
-int32_t
-bd_removexattr (call_frame_t *frame, xlator_t *this,
- loc_t *loc, const char *name, dict_t *xdata)
-{
- STACK_UNWIND_STRICT (removexattr, frame, -1, ENOSYS, NULL);
- return 0;
-}
-
-int32_t
-bd_fremovexattr (call_frame_t *frame, xlator_t *this,
- fd_t *fd, const char *name, dict_t *xdata)
-{
- STACK_UNWIND_STRICT (fremovexattr, frame, -1, ENOSYS, NULL);
- return 0;
-}
-
-int32_t
-bd_fsyncdir (call_frame_t *frame, xlator_t *this,
- fd_t *fd, int datasync, dict_t *xdata)
-{
- STACK_UNWIND_STRICT (fsyncdir, frame, -1, ENOSYS, NULL);
- return 0;
-}
-
-static int gf_bd_lk_log;
-int32_t
-bd_lk (call_frame_t *frame, xlator_t *this,
- fd_t *fd, int32_t cmd, struct gf_flock *lock, dict_t *xdata)
-{
- struct gf_flock nullock = {0, };
-
- GF_LOG_OCCASIONALLY (gf_bd_lk_log, this->name, GF_LOG_CRITICAL,
- "\"features/locks\" translator is "
- "not loaded. You need to use it for proper "
- "functioning of your application.");
-
- STACK_UNWIND_STRICT (lk, frame, -1, ENOSYS, &nullock, NULL);
- return 0;
-}
-
-int32_t
-bd_inodelk (call_frame_t *frame, xlator_t *this,
- const char *volume, loc_t *loc, int32_t cmd,
- struct gf_flock *lock, dict_t *xdata)
-{
- GF_LOG_OCCASIONALLY (gf_bd_lk_log, this->name, GF_LOG_CRITICAL,
- "\"features/locks\" translator is "
- "not loaded. You need to use it for proper "
- "functioning of your application.");
-
- STACK_UNWIND_STRICT (inodelk, frame, -1, ENOSYS, NULL);
- return 0;
-}
-
-int32_t
-bd_finodelk (call_frame_t *frame, xlator_t *this,
- const char *volume, fd_t *fd, int32_t cmd,
- struct gf_flock *lock, dict_t *xdata)
-{
- GF_LOG_OCCASIONALLY (gf_bd_lk_log, this->name, GF_LOG_CRITICAL,
- "\"features/locks\" translator is "
- "not loaded. You need to use it for proper "
- "functioning of your application.");
-
- STACK_UNWIND_STRICT (finodelk, frame, -1, ENOSYS, NULL);
- return 0;
-}
-
-
-int32_t
-bd_entrylk (call_frame_t *frame, xlator_t *this,
- const char *volume, loc_t *loc, const char *basename,
- entrylk_cmd cmd, entrylk_type type, dict_t *xdata)
-{
- GF_LOG_OCCASIONALLY (gf_bd_lk_log, this->name, GF_LOG_CRITICAL,
- "\"features/locks\" translator is "
- "not loaded. You need to use it for proper "
- "functioning of your application.");
-
- STACK_UNWIND_STRICT (entrylk, frame, -1, ENOSYS, NULL);
- return 0;
-}
-
-int32_t
-bd_fentrylk (call_frame_t *frame, xlator_t *this,
- const char *volume, fd_t *fd, const char *basename,
- entrylk_cmd cmd, entrylk_type type, dict_t *xdata)
-{
- GF_LOG_OCCASIONALLY (gf_bd_lk_log, this->name, GF_LOG_CRITICAL,
- "\"features/locks\" translator is "
- "not loaded. You need to use it for proper "
- "functioning of your application.");
-
- STACK_UNWIND_STRICT (fentrylk, frame, -1, ENOSYS, NULL);
- return 0;
-}
-
-int32_t
-bd_rchecksum (call_frame_t *frame, xlator_t *this,
- fd_t *fd, off_t offset, int32_t len, dict_t *xdata)
-{
- int32_t weak_checksum = 0;
- unsigned char strong_checksum[MD5_DIGEST_LENGTH];
-
- STACK_UNWIND_STRICT (rchecksum, frame, -1, ENOSYS,
- weak_checksum, strong_checksum, NULL);
- return 0;
-}
-
-int
-bd_xattrop (call_frame_t *frame, xlator_t *this,
- loc_t *loc, gf_xattrop_flags_t optype, dict_t *xattr,
- dict_t *xdata)
-{
- STACK_UNWIND_STRICT (xattrop, frame, -1, ENOSYS, xattr, NULL);
- return 0;
-}
-
-
-int
-bd_fxattrop (call_frame_t *frame, xlator_t *this,
- fd_t *fd, gf_xattrop_flags_t optype, dict_t *xattr,
- dict_t *xdata)
-{
- STACK_UNWIND_STRICT (xattrop, frame, -1, ENOSYS, xattr, NULL);
- return 0;
-}
-
-int bd_xl_op_create (bd_priv_t *priv, dict_t *input, dict_t *output)
-{
- char *vg = NULL;
- char *lv = NULL;
- char *path = NULL;
- bd_entry_t *p_entry = NULL;
- bd_entry_t *lventry = NULL;
- char *size = 0;
- int ret = -1;
- char *error = NULL;
- int retval = -1;
- char *buff = NULL;
- char *buffp = NULL;
- char *save = NULL;
-
- ret = dict_get_str (input, "size", &size);
- if (ret) {
- gf_asprintf (&error, "no size specified");
- goto out;
- }
- ret = dict_get_str (input, "path", &path);
- if (ret) {
- gf_asprintf (&error, "no path specified");
- goto out;
- }
-
- buff = buffp = gf_strdup (path);
-
- vg = strtok_r (buff, "/", &save);
- lv = strtok_r (NULL, "/", &save);
-
- if (!vg || !lv) {
- gf_asprintf (&error, "invalid path %s", path);
- ret = -1;
- goto out;
- }
-
- BD_ENTRY (priv, p_entry, vg);
- if (!p_entry) {
- ret = -ENOENT;
- goto out;
- }
- BD_ENTRY (priv, lventry, path);
- if (lventry) {
- ret = -EEXIST;
- gf_asprintf (&error, "%s already exists", lv);
- BD_PUT_ENTRY (priv, lventry);
- goto out;
- }
-
- ret = bd_create_lv (priv, p_entry, vg, lv, size, 0);
- if (ret < 0) {
- gf_asprintf (&error, "bd_create_lv error %d", -ret);
- goto out;
- }
- ret = 0;
-out:
- if (p_entry)
- BD_PUT_ENTRY (priv, p_entry);
-
- if (buffp)
- GF_FREE (buffp);
-
- if (error)
- retval = dict_set_dynstr (output, "error", error);
- return ret;
-}
-
-int bd_xl_op_delete (bd_priv_t *priv, dict_t *input, dict_t *output)
-{
- char *vg = NULL;
- char *path = NULL;
- bd_entry_t *p_entry = NULL;
- bd_entry_t *lventry = NULL;
- int ret = -1;
- char *error = NULL;
- int retval = -1;
- char *buff = NULL;
- char *buffp = NULL;
- char *save = NULL;
- int op_errno = 0;
-
- ret = dict_get_str (input, "path", &path);
- if (ret) {
- gf_asprintf (&error, "no path specified");
- goto out;
- }
-
- buff = buffp = gf_strdup (path);
-
- vg = strtok_r (buff, "/", &save);
- if (!vg) {
- gf_asprintf (&error, "invalid path %s", path);
- op_errno = EINVAL;
- ret = -1;
- goto out;
- }
-
- BD_ENTRY (priv, p_entry, vg);
- BD_ENTRY (priv, lventry, path);
- if (!p_entry || !lventry) {
- op_errno = -ENOENT;
- gf_asprintf (&error, "%s not found", path);
- ret = -1;
- goto out;
- }
- ret = bd_delete_lv (priv, p_entry, lventry, path, &op_errno);
- if (ret < 0) {
- gf_asprintf (&error, "bd_delete_lv error, error:%d", op_errno);
- goto out;
- }
- ret = 0;
-out:
- if (p_entry)
- BD_PUT_ENTRY (priv, p_entry);
- if (lventry)
- BD_PUT_ENTRY (priv, lventry);
- if (buffp)
- GF_FREE (buffp);
- if (error)
- retval = dict_set_dynstr (output, "error", error);
- return ret;
-}
-
-int bd_xl_op_clone(bd_priv_t *priv, int subop, dict_t *input, dict_t *output)
-{
- bd_entry_t *p_entry = NULL;
- bd_entry_t *lventry = NULL;
- int ret = -1;
- char *error = NULL;
- int retval = -1;
- char *vg = NULL;
- char *lv = NULL;
- char *dest_lv = NULL;
- char *size = NULL;
- char *buff = NULL;
- char *buffp = NULL;
- char *path = NULL;
- char *save = NULL;
- char *npath = NULL;
-
- ret = dict_get_str (input, "path", &path);
- ret = dict_get_str (input, "dest_lv", &dest_lv);
- ret = dict_get_str (input, "size", &size);
-
- if (!path || !dest_lv) {
- gf_asprintf (&error, "invalid arguments");
- ret = -1;
- goto out;
- }
-
- buff = buffp = gf_strdup (path);
-
- vg = strtok_r (buff, "/", &save);
- lv = strtok_r (NULL, "/", &save);
- if (!lv) {
- gf_asprintf (&error, "lv not given %s", path);
- ret = -1;
- goto out;
- }
-
- BD_ENTRY (priv, p_entry, vg);
- if (!p_entry) {
- gf_asprintf (&error, "%s does not exist", vg);
- retval = dict_set_str (output, "error", error);
- goto out;
- }
-
- BD_ENTRY (priv, lventry, path);
- if (!lventry) {
- gf_asprintf (&error, "%s does not exist", path);
- ret = -1;
- goto out;
- }
- BD_PUT_ENTRY (priv, lventry);
- lventry = NULL;
- gf_asprintf (&npath, "/%s/%s", vg, dest_lv);
- BD_ENTRY (priv, lventry, npath);
- if (lventry) {
- gf_asprintf (&error, "%s already exists", dest_lv);
- BD_PUT_ENTRY (priv, lventry);
- ret = -1;
- goto out;
- }
-
- if (subop == GF_BD_OP_SNAPSHOT_BD) {
- if (!size) {
- gf_asprintf (&error, "size not given");
- ret = -1;
- goto out;
- }
- ret = bd_snapshot_lv (priv, p_entry, output, lv, dest_lv,
- size, NULL);
- } else
- ret = bd_clone_lv (priv, p_entry, output, vg, lv, dest_lv,
- NULL);
-
- if (ret)
- goto out;
- ret = 0;
-out:
- if (error)
- retval = dict_set_dynstr (output, "error", error);
- if (p_entry)
- BD_PUT_ENTRY (priv, p_entry);
- if (npath)
- GF_FREE (npath);
- if (buffp)
- GF_FREE (buffp);
- return ret;
-}
-
-int32_t
-bd_notify (xlator_t *this, dict_t *input, dict_t *output)
-{
- int ret = -1;
- int retval = -1;
- int32_t bdop = -1;
- bd_priv_t *priv = NULL;
- char *error = NULL;
-
- priv = this->private;
- VALIDATE_OR_GOTO (priv, out);
-
- ret = dict_get_int32 (input, "bd-op", (int32_t *)&bdop);
- if (ret) {
- gf_asprintf (&error, "no sub-op specified");
- goto out;
- }
-
- switch (bdop)
- {
- case GF_BD_OP_NEW_BD:
- ret = bd_xl_op_create (priv, input, output);
- break;
- case GF_BD_OP_DELETE_BD:
- ret = bd_xl_op_delete (priv, input, output);
- break;
- case GF_BD_OP_CLONE_BD:
- case GF_BD_OP_SNAPSHOT_BD:
- ret = bd_xl_op_clone (priv, bdop, input, output);
- break;
- default:
- gf_asprintf (&error, "invalid bd-op %d specified", bdop);
- retval = dict_set_dynstr (output, "error", error);
- goto out;
- }
-
-out:
- return ret;
-}
-
-/**
- * notify - when parent sends PARENT_UP, send CHILD_UP event from here
- */
-int32_t
-notify (xlator_t *this,
- int32_t event,
- void *data,
- ...)
-{
- va_list ap;
- int ret = 0;
- void *data2 = NULL;
- dict_t *input = NULL;
- dict_t *output = NULL;
-
- va_start (ap, data);
- data2 = va_arg (ap, dict_t *);
- va_end (ap);
-
- switch (event)
- {
- case GF_EVENT_PARENT_UP:
- {
- /* Tell the parent that bd xlator is up */
- default_notify (this, GF_EVENT_CHILD_UP, data);
- }
- break;
- case GF_EVENT_TRANSLATOR_OP:
- input = data;
- output = data2;
- if (!output)
- output = dict_new ();
- ret = bd_notify (this, input, output);
- break;
-
- default:
- break;
- }
- return ret;
-}
-
-int32_t
-mem_acct_init (xlator_t *this)
-{
- int ret = -1;
-
- if (!this)
- return ret;
-
- ret = xlator_mem_acct_init (this, gf_bd_mt_end + 1);
-
- if (ret != 0) {
- gf_log (this->name, GF_LOG_ERROR, "Memory accounting init"
- "failed");
- return ret;
- }
-
- return ret;
-}
-
-
-/**
- * init - Constructs lists of LVs in the given VG
- */
-int
-init (xlator_t *this)
-{
- bd_priv_t *_private = NULL;
- int ret = 0;
- char *vg = NULL;
- char *device = NULL;
-
- LOCK_INIT (&inode_lk);
-
- bd_rootp = bd_entry_add_root ();
- if (!bd_rootp) {
- gf_log (this->name, GF_LOG_CRITICAL,
- "FATAL: adding root entry failed");
- return -1;
- }
-
- if (this->children) {
- gf_log (this->name, GF_LOG_CRITICAL,
- "FATAL: storage/bd cannot have subvolumes");
- ret = -1;
- goto out;
- }
-
- if (!this->parents) {
- gf_log (this->name, GF_LOG_WARNING,
- "Volume is dangling. Please check the volume file.");
- }
-
- ret = dict_get_str (this->options, "device", &device);
- if (ret) {
- gf_log (this->name, GF_LOG_CRITICAL,
- "FATAL: storage/bd does not specify backend");
- return -1;
- }
-
- /* Now we support only LV device */
- if (strcasecmp (device, BACKEND_VG)) {
- gf_log (this->name, GF_LOG_CRITICAL,
- "FATAL: unknown %s backend %s", BD_XLATOR, device);
- return -1;
- }
-
- ret = dict_get_str (this->options, "export", &vg);
- if (ret) {
- gf_log (this->name, GF_LOG_CRITICAL,
- "FATAL: storage/bd does not specify volume groups");
- return -1;
- }
-
- ret = 0;
- _private = GF_CALLOC (1, sizeof(*_private), gf_bd_private);
- if (!_private)
- goto error;
-
- pthread_rwlock_init (&_private->lock, NULL);
- this->private = (void *)_private;
- _private->handle = NULL;
- _private->vg = gf_strdup (vg);
- if (!_private->vg) {
- goto error;
- }
-
- if (bd_build_lv_list (this->private, vg) < 0)
- goto error;
-
-out:
- return 0;
-error:
- BD_WR_LOCK (&_private->lock);
- bd_entry_cleanup ();
- lvm_quit (_private->handle);
- if (_private->vg)
- GF_FREE (_private->vg);
- GF_FREE (_private);
- return -1;
-}
-
-void
-fini (xlator_t *this)
-{
- bd_priv_t *priv = this->private;
- if (!priv)
- return;
- lvm_quit (priv->handle);
- BD_WR_LOCK (&priv->lock);
- bd_entry_cleanup ();
- BD_UNLOCK (&priv->lock);
- GF_FREE (priv->vg);
- this->private = NULL;
- GF_FREE (priv);
- return;
-}
-
-struct xlator_dumpops dumpops = {
- .priv = bd_priv,
- .inode = bd_inode,
-};
-
-struct xlator_fops fops = {
- /* Not supported */
- .readlink = bd_readlink,
- .mknod = bd_mknod,
- .mkdir = bd_mkdir,
- .rmdir = bd_rmdir,
- .setxattr = bd_setxattr,
- .fsetxattr = bd_fsetxattr,
- .getxattr = bd_getxattr,
- .fgetxattr = bd_fgetxattr,
- .removexattr = bd_removexattr,
- .fremovexattr= bd_fremovexattr,
- .fsyncdir = bd_fsyncdir,
- .lk = bd_lk,
- .inodelk = bd_inodelk,
- .finodelk = bd_finodelk,
- .entrylk = bd_entrylk,
- .fentrylk = bd_fentrylk,
- .rchecksum = bd_rchecksum,
- .xattrop = bd_xattrop,
-
- /* Supported */
- .lookup = bd_lookup,
- .opendir = bd_opendir,
- .readdir = bd_readdir,
- .readdirp = bd_readdirp,
- .stat = bd_stat,
- .statfs = bd_statfs,
- .open = bd_open,
- .access = bd_access,
- .flush = bd_flush,
- .readv = bd_readv,
- .fstat = bd_fstat,
- .truncate = bd_truncate,
- .ftruncate = bd_ftruncate,
- .fsync = bd_fsync,
- .writev = bd_writev,
- .fstat = bd_fstat,
- .create = bd_create,
- .setattr = bd_setattr,
- .fsetattr = bd_fsetattr,
- .unlink = bd_unlink,
- .link = bd_link,
- .symlink = bd_symlink,
- .rename = bd_rename,
-};
-
-struct xlator_cbks cbks = {
- .releasedir = bd_releasedir,
- .release = bd_release,
-};
-
-struct volume_options options[] = {
- { .key = {"export"},
- .type = GF_OPTION_TYPE_STR},
- { .key = {"device"},
- .type = GF_OPTION_TYPE_STR},
- { .key = {NULL} }
-};
diff --git a/xlators/storage/bd_map/src/bd_map.h b/xlators/storage/bd_map/src/bd_map.h
deleted file mode 100644
index fa10e97..0000000
--- a/xlators/storage/bd_map/src/bd_map.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- BD translator - Exports Block devices on server side as regular
- files to client
-
- Copyright IBM, Corp. 2012
-
- This file is part of GlusterFS.
-
- Author:
- M. Mohan Kumar <mohan@in.ibm.com>
-
- This file is licensed to you under your choice of the GNU Lesser
- General Public License, version 3 or any later version (LGPLv3 or
- later), or the GNU General Public License, version 2 (GPLv2), in all
- cases as published by the Free Software Foundation.
-*/
-
-#ifndef _BD_MAP_H
-#define _BD_MAP_H
-
-#ifndef _CONFIG_H
-#define _CONFIG_H
-#include "config.h"
-#endif
-
-#include "xlator.h"
-#include "mem-types.h"
-
-#define BD_XLATOR "block device mapper xlator"
-
-#define BACKEND_VG "vg"
-
-/* lvm2-2.02.79 added this in lvm2app.h, but it is available for linking in
- * older versions already */
-#if NEED_LVM_LV_FROM_NAME_DECL
-lv_t lvm_lv_from_name(vg_t vg, const char *name);
-#endif
-
-enum gf_bd_mem_types_ {
- gf_bd_fd = gf_common_mt_end + 1,
- gf_bd_private,
- gf_bd_entry,
- gf_bd_attr,
- gf_bd_mt_end
-};
-
-/*
- * Each BD/LV is represented by this data structure
- * Usually root entry will have only children and there is no sibling for that
- * All other entries may have children and/or sibling entries
- * If an entry is a Volume Group it will have child (. & .. and Logical
- * Volumes) and also other Volume groups will be a sibling for this
- */
-typedef struct bd_entry {
- struct list_head child; /* List to child */
- struct list_head sibling; /* List of siblings */
- struct bd_entry *parent;/* Parent of this node */
- struct bd_entry *link; /* Link to actual entry, if its . or .. */
- char name[NAME_MAX];
- struct iatt *attr;
- int refcnt;
- uint64_t size;
- pthread_rwlock_t lock;
-} bd_entry_t;
-
-/**
- * bd_fd - internal structure common to file and directory fd's
- */
-typedef struct bd_fd {
- bd_entry_t *entry;
- bd_entry_t *p_entry; /* Parent entry */
- int fd;
- int32_t flag;
-} bd_fd_t;
-
-typedef struct bd_priv {
- lvm_t handle;
- pthread_rwlock_t lock;
- char *vg;
-} bd_priv_t;
-
-#endif
diff --git a/xlators/storage/bd_map/src/bd_map_help.c b/xlators/storage/bd_map/src/bd_map_help.c
deleted file mode 100644
index 0613aa3..0000000
--- a/xlators/storage/bd_map/src/bd_map_help.c
+++ /dev/null
@@ -1,501 +0,0 @@
-/*
- BD translator - Exports Block devices on server side as regular
- files to client
-
- Copyright IBM, Corp. 2012
-
- This file is part of GlusterFS.
-
- Author:
- M. Mohan Kumar <mohan@in.ibm.com>
-
- This file is licensed to you under your choice of the GNU Lesser
- General Public License, version 3 or any later version (LGPLv3 or
- later), or the GNU General Public License, version 2 (GPLv2), in all
- cases as published by the Free Software Foundation.
-*/
-
-#ifndef _CONFIG_H
-#define _CONFIG_H
-#include "config.h"
-#endif
-
-#define __XOPEN_SOURCE 500
-
-#include <libgen.h>
-#include <time.h>
-#include <lvm2app.h>
-
-#include "bd_map.h"
-#include "bd_map_help.h"
-#include "defaults.h"
-#include "glusterfs3-xdr.h"
-
-#define CHILD_ENTRY(node) list_entry ((&node->child)->next, typeof(*node), \
- child)
-
-bd_entry_t *bd_rootp;
-gf_lock_t inode_lk;
-static uint64_t bd_entry_ino = 5000; /* Starting inode */
-
-static void bd_entry_get_ino (uint64_t *inode)
-{
- LOCK (&inode_lk);
- {
- *inode = bd_entry_ino++;
- }
- UNLOCK (&inode_lk);
-}
-
-void bd_update_time (bd_entry_t *entry, int type)
-{
- struct timespec ts;
-
- clock_gettime (CLOCK_REALTIME, &ts);
- if (type == 0) {
- entry->attr->ia_mtime = ts.tv_sec;
- entry->attr->ia_mtime_nsec = ts.tv_nsec;
- entry->attr->ia_atime = ts.tv_sec;
- entry->attr->ia_atime_nsec = ts.tv_nsec;
- } else if (type == 1) {
- entry->attr->ia_mtime = ts.tv_sec;
- entry->attr->ia_mtime_nsec = ts.tv_nsec;
- } else {
- entry->attr->ia_atime = ts.tv_sec;
- entry->attr->ia_atime_nsec = ts.tv_nsec;
- }
-}
-
-static bd_entry_t *bd_entry_init (const char *name)
-{
- bd_entry_t *bdentry;
-
- bdentry = GF_MALLOC (sizeof(bd_entry_t), gf_bd_entry);
- if (!bdentry)
- return NULL;
-
- bdentry->attr = GF_MALLOC (sizeof(struct iatt), gf_bd_attr);
- if (!bdentry->attr) {
- GF_FREE (bdentry);
- return NULL;
- }
-
- strcpy (bdentry->name, name);
- INIT_LIST_HEAD (&bdentry->sibling);
- INIT_LIST_HEAD (&bdentry->child);
- bdentry->link = NULL;
- bdentry->refcnt = 0;
- return bdentry;
-}
-
-static bd_entry_t *bd_entry_clone (bd_entry_t *orig, char *name)
-{
- bd_entry_t *bdentry;
-
- bdentry = GF_MALLOC (sizeof(bd_entry_t), gf_bd_entry);
- if (!bdentry)
- return NULL;
-
- bdentry->attr = orig->attr;
-
- strcpy (bdentry->name, name);
- INIT_LIST_HEAD (&bdentry->sibling);
- INIT_LIST_HEAD (&bdentry->child);
- bdentry->link = orig;
- bdentry->refcnt = 0;
- return bdentry;
-}
-
-static void bd_entry_init_iattr (struct iatt *attr, int type)
-{
- struct timespec ts = {0, };
-
- clock_gettime (CLOCK_REALTIME, &ts);
- attr->ia_dev = ia_makedev (0, 0); /* FIXME: */
- attr->ia_type = type;
- attr->ia_prot = ia_prot_from_st_mode (0750);
- attr->ia_nlink = 2;
- attr->ia_uid = 0;
- attr->ia_gid = 0;
- attr->ia_rdev = ia_makedev (0, 0);
-
- attr->ia_size = 4096; /* FIXME */
- attr->ia_blksize = 4096;
- attr->ia_blocks = 0;
-
- attr->ia_atime = ts.tv_sec;
- attr->ia_atime_nsec = ts.tv_nsec;
- attr->ia_mtime = ts.tv_sec;
- attr->ia_mtime_nsec = ts.tv_nsec;
- attr->ia_ctime = ts.tv_sec;
- attr->ia_ctime_nsec = ts.tv_nsec;
-}
-
-/*
- * bd_entry_istat: Initialize iatt strucutre for a given path on success
- */
-void bd_entry_istat (const char *path, struct iatt *attr, int type)
-{
- struct stat stbuf = {0, };
-
- if (stat (path, &stbuf) < 0)
- bd_entry_init_iattr (attr, type);
- else
- iatt_from_stat (attr, &stbuf);
- sprintf ((char *)attr->ia_gfid, "%lx", stbuf.st_ino);
-}
-
-/*
- * Adds the root entry and required entries
- * ie header entry followed by . and .. entries
- */
-bd_entry_t *bd_entry_add_root (void)
-{
- bd_entry_t *bdentry = NULL;
- bd_entry_t *h_entry = NULL;
- bd_entry_t *d_entry = NULL;
- bd_entry_t *dd_entry = NULL;
-
- bdentry = bd_entry_init ("/");
- if (!bdentry)
- return NULL;
-
- bdentry->parent = bdentry;
-
- bd_entry_get_ino (&bdentry->attr->ia_ino);
- sprintf ((char *)bdentry->attr->ia_gfid, "%ld",
- bdentry->attr->ia_ino << 2);
- bd_entry_init_iattr (bdentry->attr, IA_IFDIR);
-
- h_entry = bd_entry_clone (bdentry, "");
- bdentry->child.next = &h_entry->child;
- bdentry->child.prev = &h_entry->child;
-
- d_entry = bd_entry_clone (bdentry, ".");
- dd_entry = bd_entry_clone (bdentry, "..");
-
- list_add_tail (&d_entry->sibling, &h_entry->sibling);
- list_add_tail (&dd_entry->sibling, &h_entry->sibling);
- return bdentry;
-}
-
-bd_entry_t *bd_entry_add (bd_entry_t *parent, const char *name,
- struct iatt *iattr, ia_type_t type)
-{
- bd_entry_t *bdentry = NULL;
- bd_entry_t *h_entry = NULL;
- bd_entry_t *d_entry = NULL;
- bd_entry_t *dd_entry = NULL;
- bd_entry_t *sentry = NULL;
- struct timespec ts = { 0, };
-
- if (!parent)
- parent = bd_rootp;
-
- if (type != IA_IFREG && type != IA_IFDIR)
- return NULL;
-
- bdentry = bd_entry_init (name);
- if (!bdentry)
- return NULL;
-
- bdentry->parent = parent;
-
- iattr->ia_type = type;
-
- bd_entry_get_ino (&iattr->ia_ino);
- if (IA_ISDIR(type)) {
- h_entry = bd_entry_clone (bdentry, "");
- parent->attr->ia_nlink++;
- bdentry->child.next = &h_entry->child;
- bdentry->child.prev = &h_entry->child;
-
- d_entry = bd_entry_clone (bdentry, ".");
- dd_entry = bd_entry_clone (bdentry, "..");
-
- list_add_tail (&d_entry->sibling, &h_entry->sibling);
- list_add_tail (&dd_entry->sibling, &h_entry->sibling);
- }
- memcpy (bdentry->attr, iattr, sizeof(*iattr));
-
- clock_gettime (CLOCK_REALTIME, &ts);
- parent->attr->ia_mtime = ts.tv_sec;
- parent->attr->ia_mtime_nsec = ts.tv_nsec;
- bdentry->size = iattr->ia_size;
-
- sentry = CHILD_ENTRY (parent);
- list_add_tail (&bdentry->sibling, &sentry->sibling);
- return bdentry;
-}
-
-bd_entry_t *bd_entry_get_list (const char *name, bd_entry_t *parent)
-{
- bd_entry_t *centry = NULL;
- bd_entry_t *bdentry = NULL;
-
- if (!parent)
- parent = bd_rootp;
-
- if (parent->child.next == &parent->child)
- return NULL;
-
- centry = CHILD_ENTRY (parent);
- if (!strcmp (centry->name, name))
- return centry;
-
- list_for_each_entry (bdentry, &centry->sibling, sibling) {
- if (!strcmp (bdentry->name, name))
- return bdentry;
- }
- return NULL;
-}
-
-/* FIXME: Do we need hashing here? */
-bd_entry_t *bd_entry_find_by_gfid (const char *path)
-{
- bd_entry_t *h = NULL;
- bd_entry_t *tmp = NULL;
- bd_entry_t *tmp2 = NULL;
- bd_entry_t *node = NULL;
- bd_entry_t *cnode = NULL;
- bd_entry_t *leaf = NULL;
- char *gfid = NULL;
- char *cp = NULL;
- char *bgfid = NULL;
- bd_entry_t *entry = NULL;
-
- gfid = GF_MALLOC (strlen(path) + 1, gf_common_mt_char);
- sscanf (path, "<gfid:%s", gfid);
- if (!gfid)
- return NULL;
-
- cp = strchr(gfid, '>');
- *cp = '\0';
-
- node = CHILD_ENTRY (bd_rootp);
-
- bgfid = GF_MALLOC (GF_UUID_BUF_SIZE, gf_common_mt_char);
- if (!bgfid)
- return NULL;
-
- list_for_each_entry_safe (h, tmp, &node->sibling, sibling) {
- uuid_utoa_r (h->attr->ia_gfid, bgfid);
- if (!h->link && !strcmp (gfid, bgfid)) {
- entry = h;
- goto out;
- }
-
- /* if we have children for this node */
- if (h->child.next != &h->child) {
- cnode = CHILD_ENTRY (h);
- uuid_utoa_r (cnode->attr->ia_gfid, bgfid);
- if (!cnode->link && !strcmp (gfid, bgfid)) {
- entry = cnode;
- goto out;
- }
-
- list_for_each_entry_safe (leaf, tmp2, (&cnode->sibling),
- sibling) {
- uuid_utoa_r (leaf->attr->ia_gfid, bgfid);
- if (!leaf->link && !strcmp (gfid, bgfid)) {
- entry = leaf;
- goto out;
- }
-
- }
- }
- }
-out:
- if (bgfid)
- GF_FREE (bgfid);
-
- return entry;
-}
-
-/* Called with priv->bd_lock held */
-bd_entry_t *bd_entry_get (const char *name)
-{
- bd_entry_t *pentry = NULL;
- char *path = NULL;
- char *comp = NULL;
- char *save = NULL;
-
- if (!strncmp (name, "<gfid:", 5)) {
- pentry = bd_entry_find_by_gfid (name);
- if (pentry)
- pentry->refcnt++;
- return pentry;
- }
-
- if (!strcmp (name, "/")) {
- bd_rootp->refcnt++;
- return bd_rootp;
- }
-
- path = gf_strdup (name);
- comp = strtok_r (path, "/", &save);
- pentry = bd_entry_get_list (comp, NULL);
- if (!pentry)
- goto out;
- while (comp) {
- comp = strtok_r (NULL, "/", &save);
- if (!comp)
- break;
- pentry = bd_entry_get_list (comp, pentry);
- if (!pentry)
- goto out;
- }
-
- pentry->refcnt++;
-out:
- GF_FREE (path);
- return pentry;
-}
-
-int bd_entry_rm (const char *path)
-{
- bd_entry_t *bdentry = NULL;
- int ret = -1;
-
- bdentry = bd_entry_get (path);
- if (!bdentry)
- goto out;
-
- list_del_init (&bdentry->sibling);
- list_del_init (&bdentry->child);
- GF_FREE (bdentry);
-
- ret = 0;
-out:
- return ret;
-}
-
-
-
-/* Called with priv->bd_lock held */
-void bd_entry_put (bd_entry_t *entry)
-{
- entry->refcnt--;
-}
-
-int bd_build_lv_list (bd_priv_t *priv, char *vg_name)
-{
- struct dm_list *lv_dm_list = NULL;
- struct lvm_lv_list *lv_list = NULL;
- struct iatt iattr = {0, };
- char path[PATH_MAX] = {0, };
- vg_t vg = NULL;
- bd_entry_t *vg_map = NULL;
- bd_entry_t *bd = NULL;
- int ret = -1;
- const char *lv_name = NULL;
-
- priv->handle = lvm_init (NULL);
- if (!priv->handle) {
- gf_log (THIS->name, GF_LOG_CRITICAL, "FATAL: bd_init failed");
- return -1;
- }
-
- BD_WR_LOCK (&priv->lock);
-
- vg = lvm_vg_open (priv->handle, vg_name, "r", 0);
- if (!vg) {
- gf_log (THIS->name, GF_LOG_CRITICAL,
- "opening vg %s failed", vg_name);
- goto out;
- }
- /* get list of LVs associated with this VG */
- lv_dm_list = lvm_vg_list_lvs (vg);
- sprintf (path, "/dev/%s", vg_name);
- bd_entry_istat (path, &iattr, IA_IFDIR);
- vg_map = bd_entry_add (bd_rootp, vg_name, &iattr,
- IA_IFDIR);
- if (!vg_map) {
- gf_log (THIS->name, GF_LOG_CRITICAL,
- "bd_add_entry failed");
- goto out;
- }
- ret = 0;
- if (!lv_dm_list) /* no lvs for this VG */
- goto out;
-
- dm_list_iterate_items (lv_list, lv_dm_list) {
- if (!lv_list)
- continue;
- lv_name = lvm_lv_get_name (lv_list->lv);
- /* snapshot%d is reserved name */
- if (!strncmp (lv_name, "snapshot", 8))
- continue;
- /* get symbolic path for this LV */
- sprintf (path, "/dev/%s/%s", vg_name, lv_name);
- bd_entry_istat (path, &iattr, IA_IFREG);
- /* Make the file size equivalant to BD size */
- iattr.ia_size = lvm_lv_get_size (lv_list->lv);
- /* got LV, add it to our tree */
- bd = bd_entry_add (vg_map,
- lvm_lv_get_name (lv_list->lv),
- &iattr, IA_IFREG);
- if (bd == NULL) {
- gf_log (THIS->name, GF_LOG_ERROR,
- "bd_add_entry failed");
- goto out;
- }
- }
-out:
- if (vg)
- lvm_vg_close (vg);
-
- BD_UNLOCK (&priv->lock);
- return ret;
-}
-
-/*
- * Called with bd_lock held to cleanup entire list. If there was a
- * reference to any one of the entry, nothing cleared.
- * Return 0 on success -1 in case if there is a reference to the entry
- */
-int bd_entry_cleanup (void)
-{
- bd_entry_t *node = NULL;
- bd_entry_t *tmp = NULL;
- bd_entry_t *tmp2 = NULL;
- bd_entry_t *cnode = NULL;
- bd_entry_t *h = NULL;
- bd_entry_t *leaf = NULL;
-
- if (!bd_rootp)
- return 0;
-
- node = CHILD_ENTRY (bd_rootp);
- if (node->refcnt) {
- gf_log (THIS->name, GF_LOG_WARNING,
- "entry %s is inuse\n", node->name);
- return -1;
- }
- list_for_each_entry_safe (h, tmp, &node->sibling, sibling) {
- /* if we have children for this node */
- if (h->child.next != &h->child) {
- cnode = CHILD_ENTRY (h);
- list_for_each_entry_safe (leaf, tmp2, (&cnode->sibling),
- sibling) {
- list_del_init (&leaf->sibling);
- list_del_init (&leaf->child);
- if (!leaf->link)
- GF_FREE (leaf->attr);
- GF_FREE (leaf);
- }
- list_del_init (&cnode->sibling);
- list_del_init (&cnode->child);
- if (!cnode->link)
- GF_FREE (cnode->attr);
- GF_FREE (cnode);
- }
- if (!h->link)
- GF_FREE (h->attr);
- GF_FREE (h);
- }
- GF_FREE (h);
- GF_FREE (bd_rootp->attr);
- GF_FREE (bd_rootp);
- return 0;
-}
diff --git a/xlators/storage/bd_map/src/bd_map_help.h b/xlators/storage/bd_map/src/bd_map_help.h
deleted file mode 100644
index 9fafa2d..0000000
--- a/xlators/storage/bd_map/src/bd_map_help.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- BD translator - Exports Block devices on server side as regular
- files to client.
-
- Copyright IBM, Corp. 2012
-
- This file is part of GlusterFS.
-
- Author:
- M. Mohan Kumar <mohan@in.ibm.com>
-
- This file is licensed to you under your choice of the GNU Lesser
- General Public License, version 3 or any later version (LGPLv3 or
- later), or the GNU General Public License, version 2 (GPLv2), in all
- cases as published by the Free Software Foundation.
-*/
-#ifndef _BD_MAP_HELP_H
-#define _BD_MAP_HELP_H
-
-#define BD_RD_LOCK(lock) \
- pthread_rwlock_rdlock (lock);
-
-#define BD_WR_LOCK(lock) \
- pthread_rwlock_wrlock (lock);
-
-#define BD_UNLOCK(lock) \
- pthread_rwlock_unlock (lock);
-
-#define BD_WR_ENTRY(priv, bdentry, path) \
- do { \
- BD_WR_LOCK (&priv->lock); \
- bdentry = bd_entry_get (path); \
- BD_UNLOCK (&priv->lock); \
- } while (0)
-
-#define BD_ENTRY(priv, bdentry, path) \
- do { \
- BD_RD_LOCK (&priv->lock); \
- bdentry = bd_entry_get (path); \
- BD_UNLOCK (&priv->lock); \
- } while (0)
-
-#define BD_PUT_ENTRY(priv, bdentry) \
- do { \
- BD_RD_LOCK (&priv->lock); \
- bd_entry_put (bdentry); \
- BD_UNLOCK (&priv->lock); \
- } while (0)
-
-#define BD_ENTRY_UPDATE_TIME(bdentry) bd_update_time (bdentry, 0)
-#define BD_ENTRY_UPDATE_ATIME(bdentry) bd_update_time (bdentry, 2)
-#define BD_ENTRY_UPDATE_MTIME(bdentry) bd_update_time (bdentry, 1)
-
-extern bd_entry_t *bd_rootp;
-extern gf_lock_t inode_lk;
-
-void bd_entry_istat (const char *path, struct iatt *attr, int type);
-bd_entry_t *bd_entry_add_root (void);
-bd_entry_t *bd_entry_add (bd_entry_t *parent, const char *name,
- struct iatt *iattr, ia_type_t type);
-bd_entry_t *bd_entry_get_list (const char *name, bd_entry_t *parent);
-bd_entry_t *bd_entry_get (const char *name);
-void bd_entry_put (bd_entry_t *entry);
-int bd_build_lv_list (bd_priv_t *priv, char *vg);
-int bd_entry_cleanup (void);
-void bd_update_time (bd_entry_t *entry, int type);
-int bd_entry_rm (const char *path);
-
-#endif