diff options
Diffstat (limited to 'xlators/mgmt/glusterd/src')
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-handshake.c | 7 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-snapshot.c | 204 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-store.c | 33 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-store.h | 1 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 118 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.h | 8 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd.h | 1 | 
7 files changed, 250 insertions, 122 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-handshake.c b/xlators/mgmt/glusterd/src/glusterd-handshake.c index 7d582d443f4..da3a01c99f8 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handshake.c +++ b/xlators/mgmt/glusterd/src/glusterd-handshake.c @@ -349,7 +349,6 @@ glusterd_create_missed_snap (glusterd_missed_snap_info *missed_snapinfo,                               glusterd_snap_op_t *snap_opinfo)  {          char                        *device           = NULL; -        char                         fstype[NAME_MAX] = "";          glusterd_conf_t             *priv             = NULL;          glusterd_snap_t             *snap             = NULL;          glusterd_volinfo_t          *snap_vol         = NULL; @@ -435,12 +434,10 @@ glusterd_create_missed_snap (glusterd_missed_snap_info *missed_snapinfo,          /* Update the backend file-system type of snap brick in           * snap volinfo. */ -        ret = glusterd_update_fstype (snap_opinfo->brick_path, brickinfo, -                                      fstype, sizeof(fstype)); +        ret = glusterd_update_mntopts (snap_opinfo->brick_path, brickinfo);          if (ret) {                  gf_log (this->name, GF_LOG_ERROR, "Failed to update " -                        "file-system type for %s brick", -                        brickinfo->path); +                        "mount options for %s brick", brickinfo->path);                  /* We should not fail snapshot operation if we fail to get                   * the file-system type */          } diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c index 09faa16de40..062007889ab 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c @@ -995,6 +995,17 @@ glusterd_snapshot_restore_prevalidate (dict_t *dict, char **op_errstr,                                          "Failed to set %s", key);                                  goto out;                          } + +                        snprintf (key, sizeof (key), +                                  "snap%d.brick%d.mnt_opts", +                                  volcount, brick_count); +                        ret = dict_set_str (rsp_dict, key, +                                            brickinfo->mnt_opts); +                        if (ret) { +                                gf_log (this->name, GF_LOG_ERROR, +                                        "Failed to set %s", key); +                                goto out; +                        }                  }                  snprintf (key, sizeof (key), "snap%d.brick_count", volcount); @@ -1311,6 +1322,7 @@ glusterd_snap_create_pre_val_use_rsp_dict (dict_t *dst, dict_t *src)          char                  *snap_brick_dir        = NULL;          char                  *snap_device           = NULL;          char                   key[PATH_MAX]         = ""; +        char                  *value                 = "";          char                   snapbrckcnt[PATH_MAX] = "";          char                   snapbrckord[PATH_MAX] = "";          int                    ret                   = -1; @@ -1379,6 +1391,44 @@ glusterd_snap_create_pre_val_use_rsp_dict (dict_t *dst, dict_t *src)                          }                          snprintf (key, sizeof(key) - 1, +                                  "vol%"PRId64".fstype%"PRId64, i+1, j); +                        ret = dict_get_str (src, key, &value); +                        if (ret) { +                                gf_log (this->name, GF_LOG_WARNING, +                                        "Unable to fetch %s", key); +                                continue; +                        } + +                        snprintf (key, sizeof(key) - 1, +                                  "vol%"PRId64".fstype%"PRId64, i+1, +                                  brick_order); +                        ret = dict_set_dynstr_with_alloc (dst, key, value); +                        if (ret) { +                                gf_log (this->name, GF_LOG_ERROR, +                                        "Failed to set %s", key); +                                goto out; +                        } + +                        snprintf (key, sizeof(key) - 1, +                                  "vol%"PRId64".mnt_opts%"PRId64, i+1, j); +                        ret = dict_get_str (src, key, &value); +                        if (ret) { +                                gf_log (this->name, GF_LOG_WARNING, +                                        "Unable to fetch %s", key); +                                continue; +                        } + +                        snprintf (key, sizeof(key) - 1, +                                  "vol%"PRId64".mnt_opts%"PRId64, i+1, +                                  brick_order); +                        ret = dict_set_dynstr_with_alloc (dst, key, value); +                        if (ret) { +                                gf_log (this->name, GF_LOG_ERROR, +                                        "Failed to set %s", key); +                                goto out; +                        } + +                        snprintf (key, sizeof(key) - 1,                                    "vol%"PRId64".brick_snapdevice%"PRId64,                                    i+1, j);                          ret = dict_get_ptr (src, key, @@ -1527,6 +1577,21 @@ glusterd_snap_restore_use_rsp_dict (dict_t *dst, dict_t *src)                                          "Failed to set %s", key);                                  goto out;                          } + +                        snprintf (key, sizeof (key), +                                  "snap%d.brick%d.mnt_opts", i, j); +                        ret = dict_get_str (src, key, &strvalue); +                        if (ret) { +                                gf_log (this->name, GF_LOG_ERROR, +                                        "Failed to get %s", key); +                                goto out; +                        } +                        ret = dict_set_dynstr_with_alloc (dst, key, strvalue); +                        if (ret) { +                                gf_log (this->name, GF_LOG_DEBUG, +                                        "Failed to set %s", key); +                                goto out; +                        }                  }          } @@ -1918,6 +1983,34 @@ glusterd_snapshot_create_prevalidate (dict_t *dict, char **op_errstr,                          }                          device = NULL; +                        ret = glusterd_update_mntopts (brickinfo->path, +                                                       brickinfo); +                        if (ret) { +                                 gf_log (this->name, GF_LOG_ERROR, "Failed to " +                                         "update mount options for %s brick", +                                         brickinfo->path); +                        } + +                        snprintf (key, sizeof(key), "vol%"PRId64".fstype%" +                                  PRId64, i, brick_count); +                        ret = dict_set_dynstr_with_alloc (rsp_dict, key, +                                                          brickinfo->fstype); +                        if (ret) { +                                gf_log (this->name, GF_LOG_ERROR, +                                        "Failed to set %s", key); +                                goto out; +                        } + +                        snprintf (key, sizeof(key), "vol%"PRId64".mnt_opts%" +                                  PRId64, i, brick_count); +                        ret = dict_set_dynstr_with_alloc (rsp_dict, key, +                                                          brickinfo->mnt_opts); +                        if (ret) { +                                gf_log (this->name, GF_LOG_ERROR, +                                        "Failed to set %s", key); +                                goto out; +                        } +                          snprintf (key, sizeof(key), "vol%"PRId64".brickdir%"PRId64, i,                                    brick_count);                          ret = dict_set_dynstr_with_alloc (rsp_dict, key, @@ -3868,9 +3961,7 @@ glusterd_snap_brick_create (glusterd_volinfo_t *snap_volinfo,                          MS_MGC_VAL, "nouuid");             But for now, mounting using runner apis.          */ -        ret = glusterd_mount_lvm_snapshot (brickinfo->device_path, -                                           snap_brick_mount_path, -                                           brickinfo->fstype); +        ret = glusterd_mount_lvm_snapshot (brickinfo, snap_brick_mount_path);          if (ret) {                  gf_log (this->name, GF_LOG_ERROR,                          "Failed to mount lvm snapshot."); @@ -3910,74 +4001,6 @@ out:          return ret;  } -/* This function will update the backend file-system - * type in origin and snap brickinfo. This will be later - * used to perform file-system specific operation during - * LVM snapshot. - * - * @param orig_brickinfo        brickinfo of origin volume - * @param snap_brickinfo        brickinfo of snap volume - * - * @return 0 on success and -1 on failure - */ -int -glusterd_update_fstype (char *orig_brick_path, -                        glusterd_brickinfo_t *snap_brickinfo, -                        char *fstype, size_t fslen) -{ -        int32_t               ret               = -1; -        char                 *mnt_pt            = NULL; -        char                  buff [PATH_MAX]   = ""; -        char                  msg [PATH_MAX]    = ""; -        char                 *cmd               = NULL; -        struct mntent        *entry             = NULL; -        struct mntent         save_entry        = {0,}; -        runner_t              runner            = {0,}; -        xlator_t             *this              = NULL; - -        this = THIS; -        GF_ASSERT (this); -        GF_ASSERT (orig_brick_path); -        GF_ASSERT (snap_brickinfo); -        GF_ASSERT (fstype); - -        /* If the file-system type is not set then set the file-system type -         * in origin brickinfo */ -        if (0 == fstype [0]) { -                ret = glusterd_get_brick_root (orig_brick_path, &mnt_pt); -                if (ret) { -                        gf_log (this->name, GF_LOG_ERROR, "getting the root " -                                "of the brick (%s) failed ", -                                orig_brick_path); -                        goto out; -                } - -                entry = glusterd_get_mnt_entry_info (mnt_pt, buff, -                                                sizeof (buff), &save_entry); -                if (!entry) { -                        gf_log (this->name, GF_LOG_ERROR, "getting the mount " -                                "entry for the brick (%s) failed", -                                orig_brick_path); -                        ret = -1; -                        goto out; -                } - -                /* Update the origin brickinfo with the backend file-system -                 * type */ -                snprintf (fstype, fslen, "%s", -                          entry->mnt_type); -        } - -        /* Update the file-system type for snap brickinfo */ -        snprintf (snap_brickinfo->fstype, sizeof (snap_brickinfo->fstype), -                  "%s", fstype); - -        ret = 0; -out: -        GF_FREE (mnt_pt); -        return ret; -} -  static int32_t  glusterd_add_brick_to_snap_volume (dict_t *dict, dict_t *rsp_dict,                                      glusterd_volinfo_t  *snap_vol, @@ -3985,6 +4008,7 @@ glusterd_add_brick_to_snap_volume (dict_t *dict, dict_t *rsp_dict,                                      int64_t volcount, int32_t brick_count)  {          char                    key[PATH_MAX]                   = ""; +        char                   *value                           = NULL;          char                   *snap_brick_dir                  = NULL;          char                    snap_brick_path[PATH_MAX]       = "";          char                   *snap_device                     = NULL; @@ -4017,22 +4041,28 @@ glusterd_add_brick_to_snap_volume (dict_t *dict, dict_t *rsp_dict,                  goto out;          } -        /* Update fstype for the local bricks only */ -        if (!uuid_compare (original_brickinfo->uuid, MY_UUID)) { -                /* Update the backend file-system type of snap brick in -                 * snap volinfo. */ -                ret = glusterd_update_fstype -                                          (original_brickinfo->path, -                                           snap_brickinfo, -                                           original_brickinfo->fstype, -                                           sizeof(original_brickinfo->fstype)); -                if (ret) { -                        gf_log (this->name, GF_LOG_ERROR, "Failed to update " -                                "file-system type for %s brick", -                                snap_brickinfo->path); -                        /* We should not fail snapshot operation if we fail to -                         * get the file-system type */ -                } +        snprintf (key, sizeof(key) - 1, "vol%"PRId64".fstype%d", volcount, +                  brick_count); +        ret = dict_get_str (dict, key, &value); +        if (!ret) { +                /* Update the fstype in original brickinfo as well */ +                strcpy (original_brickinfo->fstype, value); +                strcpy (snap_brickinfo->fstype, value); +        } else { +                if (is_origin_glusterd (dict) == _gf_true) +                        add_missed_snap = _gf_true; +        } + +        snprintf (key, sizeof(key) - 1, "vol%"PRId64".mnt_opts%d", volcount, +                  brick_count); +        ret = dict_get_str (dict, key, &value); +        if (!ret) { +                /* Update the mnt_opts in original brickinfo as well */ +                strcpy (original_brickinfo->mnt_opts, value); +                strcpy (snap_brickinfo->mnt_opts, value); +        } else { +                if (is_origin_glusterd (dict) == _gf_true) +                        add_missed_snap = _gf_true;          }          snprintf (key, sizeof(key) - 1, "vol%"PRId64".brickdir%d", volcount, diff --git a/xlators/mgmt/glusterd/src/glusterd-store.c b/xlators/mgmt/glusterd/src/glusterd-store.c index 3f241bbe53a..b2ff8c2e00e 100644 --- a/xlators/mgmt/glusterd/src/glusterd-store.c +++ b/xlators/mgmt/glusterd/src/glusterd-store.c @@ -336,6 +336,17 @@ gd_store_brick_snap_details_write (int fd, glusterd_brickinfo_t *brickinfo)                  }          } +        if (strlen (brickinfo->mnt_opts) > 0) { +                snprintf (value, sizeof (value), "%s", brickinfo->mnt_opts); +                ret = gf_store_save_value (fd, +                                GLUSTERD_STORE_KEY_BRICK_MNTOPTS, value); +                if (ret) { +                        gf_log (this->name, GF_LOG_ERROR, "Failed to save " +                                "brick mnt opts of brick %s", brickinfo->path); +                        goto out; +                } +        } +          memset (value, 0, sizeof (value));          snprintf (value, sizeof(value), "%d", brickinfo->snap_status);          ret = gf_store_save_value (fd, GLUSTERD_STORE_KEY_BRICK_SNAP_STATUS, @@ -2318,6 +2329,10 @@ glusterd_store_retrieve_bricks (glusterd_volinfo_t *volinfo)                                               strlen (GLUSTERD_STORE_KEY_BRICK_FSTYPE))) {                                  strncpy (brickinfo->fstype, value,                                           sizeof (brickinfo->fstype)); +                        } else if (!strncmp (key, GLUSTERD_STORE_KEY_BRICK_MNTOPTS, +                                             strlen (GLUSTERD_STORE_KEY_BRICK_MNTOPTS))) { +                                strncpy (brickinfo->mnt_opts, value, +                                         sizeof (brickinfo->mnt_opts));                          } else if (!strncmp (key,                                      GLUSTERD_STORE_KEY_BRICK_VGNAME,                                      strlen (GLUSTERD_STORE_KEY_BRICK_VGNAME))) { @@ -3143,8 +3158,8 @@ out:   * at the brick_mount_path   */  int32_t -glusterd_mount_brick_paths (char *brick_mount_path, char *device_path, -                            const char *fstype) +glusterd_mount_brick_paths (char *brick_mount_path, +                            glusterd_brickinfo_t *brickinfo)  {          int32_t                  ret                 = -1;          runner_t                 runner              = {0, }; @@ -3157,7 +3172,7 @@ glusterd_mount_brick_paths (char *brick_mount_path, char *device_path,          this = THIS;          GF_ASSERT (this);          GF_ASSERT (brick_mount_path); -        GF_ASSERT (device_path); +        GF_ASSERT (brickinfo);          priv = this->private;          GF_ASSERT (priv); @@ -3179,21 +3194,20 @@ glusterd_mount_brick_paths (char *brick_mount_path, char *device_path,           */          /* Activate the snapshot */          runinit (&runner); -        runner_add_args (&runner, "lvchange", "-ay", device_path, +        runner_add_args (&runner, "lvchange", "-ay", brickinfo->device_path,                           NULL);          ret = runner_run (&runner);          if (ret) {                  gf_log (this->name, GF_LOG_ERROR,                          "Failed to activate %s. Error: %s", -                        device_path, strerror(errno)); +                        brickinfo->device_path, strerror(errno));                  goto out;          } else                  gf_log (this->name, GF_LOG_DEBUG, -                        "Activating %s successful", device_path); +                        "Activating %s successful", brickinfo->device_path);          /* Mount the snapshot */ -        ret = glusterd_mount_lvm_snapshot (device_path, brick_mount_path, -                                           fstype); +        ret = glusterd_mount_lvm_snapshot (brickinfo, brick_mount_path);          if (ret) {                  gf_log (this->name, GF_LOG_ERROR,                          "Failed to mount lvm snapshot."); @@ -3266,8 +3280,7 @@ glusterd_recreate_vol_brick_mounts (xlator_t  *this,                  /* Check if brick_mount_path is already mounted.                   * If not, mount the device_path at the brick_mount_path */ -                ret = glusterd_mount_brick_paths (brick_mount_path, -                                brickinfo->device_path, brickinfo->fstype); +                ret = glusterd_mount_brick_paths (brick_mount_path, brickinfo);                  if (ret) {                          gf_log (this->name, GF_LOG_ERROR,                                  "Failed to mount brick_mount_path"); diff --git a/xlators/mgmt/glusterd/src/glusterd-store.h b/xlators/mgmt/glusterd/src/glusterd-store.h index fb7de7b1b10..a17800076e0 100644 --- a/xlators/mgmt/glusterd/src/glusterd-store.h +++ b/xlators/mgmt/glusterd/src/glusterd-store.h @@ -85,6 +85,7 @@ typedef enum glusterd_store_ver_ac_{  #define GLUSTERD_STORE_KEY_BRICK_MOUNT_DIR      "mount_dir"  #define GLUSTERD_STORE_KEY_BRICK_SNAP_STATUS    "snap-status"  #define GLUSTERD_STORE_KEY_BRICK_FSTYPE         "fs-type" +#define GLUSTERD_STORE_KEY_BRICK_MNTOPTS        "mnt-opts"  #define GLUSTERD_STORE_KEY_BRICK_ID             "brick-id"  #define GLUSTERD_STORE_KEY_PEER_UUID            "uuid" diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 712fb9687ca..50a99643616 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -602,6 +602,7 @@ glusterd_brickinfo_dup (glusterd_brickinfo_t *brickinfo,          strcpy (dup_brickinfo->path, brickinfo->path);          strcpy (dup_brickinfo->device_path, brickinfo->device_path);          strcpy (dup_brickinfo->fstype, brickinfo->fstype); +        strcpy (dup_brickinfo->mnt_opts, brickinfo->mnt_opts);          ret = gf_canonicalize_path (dup_brickinfo->path);          if (ret) {                  gf_log (THIS->name, GF_LOG_ERROR, "Failed to canonicalize " @@ -786,6 +787,13 @@ glusterd_snap_volinfo_restore (dict_t *dict, dict_t *rsp_dict,                          strncpy (new_brickinfo->fstype, value,                                   sizeof(new_brickinfo->fstype)); +                snprintf (key, sizeof (key), "snap%d.brick%d.mnt_opts", +                          volcount, brick_count); +                ret = dict_get_str (dict, key, &value); +                if (!ret) +                        strncpy (new_brickinfo->mnt_opts, value, +                                 sizeof(new_brickinfo->mnt_opts)); +                  /* If the brick is not of this peer, or snapshot is missed *                   * for the brick do not replace the xattr for it */                  if ((!uuid_compare (brickinfo->uuid, MY_UUID)) && @@ -2405,6 +2413,15 @@ gd_add_brick_snap_details_to_dict (dict_t *dict, char *prefix,                  goto out;          } +        snprintf (key, sizeof (key), "%s.mnt_opts", prefix); +        ret = dict_set_str (dict, key, brickinfo->mnt_opts); +        if (ret) { +                gf_log (this->name, GF_LOG_ERROR, +                        "Failed to set mnt_opts for %s:%s", +                         brickinfo->hostname, brickinfo->path); +                goto out; +        } +          memset (key, 0, sizeof (key));          snprintf (key, sizeof (key), "%s.mount_dir", prefix);          ret = dict_set_str (dict, key, brickinfo->mount_dir); @@ -3758,6 +3775,7 @@ gd_import_new_brick_snap_details (dict_t *dict, char *prefix,          char             key[512]    = {0,};          char            *snap_device = NULL;          char            *fs_type     = NULL; +        char            *mnt_opts    = NULL;          char            *mount_dir   = NULL;          this = THIS; @@ -3798,6 +3816,14 @@ gd_import_new_brick_snap_details (dict_t *dict, char *prefix,          }          strcpy (brickinfo->fstype, fs_type); +        snprintf (key, sizeof (key), "%s.mnt_opts", prefix); +        ret = dict_get_str (dict, key, &mnt_opts); +        if (ret) { +                gf_log (this->name, GF_LOG_ERROR, "%s missing in payload", key); +                goto out; +        } +        strcpy (brickinfo->mnt_opts, mnt_opts); +          memset (key, 0, sizeof (key));          snprintf (key, sizeof (key), "%s.mount_dir", prefix);          ret = dict_get_str (dict, key, &mount_dir); @@ -12030,34 +12056,44 @@ glusterd_compare_volume_name(struct list_head *list1, struct list_head *list2)  }  int32_t -glusterd_mount_lvm_snapshot (char *device_path, char *brick_mount_path, -                             const char *fstype) +glusterd_mount_lvm_snapshot (glusterd_brickinfo_t *brickinfo, +                             char *brick_mount_path)  { -        char               msg[NAME_MAX] = ""; -        int32_t            ret           = -1; -        runner_t           runner        = {0, }; -        xlator_t          *this          = NULL; +        char               msg[NAME_MAX]  = ""; +        char               mnt_opts[1024] = ""; +        int32_t            ret            = -1; +        runner_t           runner         = {0, }; +        xlator_t          *this           = NULL;          this = THIS;          GF_ASSERT (this);          GF_ASSERT (brick_mount_path); -        GF_ASSERT (device_path); +        GF_ASSERT (brickinfo);          runinit (&runner);          snprintf (msg, sizeof (msg), "mount %s %s", -                  device_path, brick_mount_path); +                  brickinfo->device_path, brick_mount_path); + +        strcpy (mnt_opts, brickinfo->mnt_opts);          /* XFS file-system does not allow to mount file-system with duplicate           * UUID. File-system UUID of snapshot and its origin volume is same.           * Therefore to mount such a snapshot in XFS we need to pass nouuid           * option           */ -        if (!strcmp (fstype, "xfs")) { -                runner_add_args (&runner, "mount", "-o", "nouuid", -                                 device_path, brick_mount_path, NULL); +        if (!strcmp (brickinfo->fstype, "xfs")) { +                if ( strlen (mnt_opts) > 0 ) +                        strcat (mnt_opts, ","); +                strcat (mnt_opts, "nouuid"); +        } + + +        if ( strlen (mnt_opts) > 0 ) { +                runner_add_args (&runner, "mount", "-o", mnt_opts, +                                brickinfo->device_path, brick_mount_path, NULL);          } else { -                runner_add_args (&runner, "mount", device_path, +                runner_add_args (&runner, "mount", brickinfo->device_path,                                   brick_mount_path, NULL);          } @@ -12065,12 +12101,12 @@ glusterd_mount_lvm_snapshot (char *device_path, char *brick_mount_path,          ret = runner_run (&runner);          if (ret) {                  gf_log (this->name, GF_LOG_ERROR, "mounting the snapshot " -                        "logical device %s failed (error: %s)", device_path, -                        strerror (errno)); +                        "logical device %s failed (error: %s)", +                        brickinfo->device_path, strerror (errno));                  goto out;          } else                  gf_log (this->name, GF_LOG_DEBUG, "mounting the snapshot " -                        "logical device %s successful", device_path); +                        "logical device %s successful", brickinfo->device_path);  out:          gf_log (this->name, GF_LOG_TRACE, "Returning with %d", ret); @@ -13532,3 +13568,55 @@ gd_get_snap_conf_values_if_present (dict_t *dict, uint64_t *sys_hard_limit,                          GLUSTERD_STORE_KEY_SNAP_MAX_SOFT_LIMIT);          }  } + +/* This function will update the backend file-system + * type and the mount options in origin and snap brickinfo. + * This will be later used to perform file-system specific operation + * during LVM snapshot. + * + * @param brick_path       brickpath for which fstype to be found + * @param brickinfo        brickinfo of snap/origin volume + * @return 0 on success and -1 on failure + */ +int +glusterd_update_mntopts (char *brick_path, glusterd_brickinfo_t *brickinfo) +{ +        int32_t               ret               = -1; +        char                 *mnt_pt            = NULL; +        char                  buff [PATH_MAX]   = ""; +        char                  msg [PATH_MAX]    = ""; +        char                 *cmd               = NULL; +        struct mntent        *entry             = NULL; +        struct mntent         save_entry        = {0,}; +        runner_t              runner            = {0,}; +        xlator_t             *this              = NULL; + +        this = THIS; +        GF_ASSERT (this); +        GF_ASSERT (brick_path); +        GF_ASSERT (brickinfo); + +        ret = glusterd_get_brick_root (brick_path, &mnt_pt); +        if (ret) { +                gf_log (this->name, GF_LOG_ERROR, "getting the root " +                        "of the brick (%s) failed ", brick_path); +                goto out; +        } + +        entry = glusterd_get_mnt_entry_info (mnt_pt, buff, sizeof (buff), +                                             &save_entry); +        if (!entry) { +                gf_log (this->name, GF_LOG_ERROR, "getting the mount entry for " +                        "the brick (%s) failed", brick_path); +                ret = -1; +                goto out; +        } + +        strcpy (brickinfo->fstype, entry->mnt_type); +        strcpy (brickinfo->mnt_opts, entry->mnt_opts); + +        ret = 0; +out: +        GF_FREE (mnt_pt); +        return ret; +} diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.h b/xlators/mgmt/glusterd/src/glusterd-utils.h index dfff95f01a1..2e06c2a6341 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.h +++ b/xlators/mgmt/glusterd/src/glusterd-utils.h @@ -724,8 +724,8 @@ gd_restore_snap_volume (dict_t *dict, dict_t *rsp_dict,                          int32_t volcount);  int32_t -glusterd_mount_lvm_snapshot (char *device_path, char *brick_mount_path, -                             const char *fstype); +glusterd_mount_lvm_snapshot (glusterd_brickinfo_t *brickinfo, +                             char *brick_mount_path);  int32_t  glusterd_umount (const char *path); @@ -892,9 +892,7 @@ int glusterd_snapshot_get_volnames_uuids (dict_t *dict,             char *volname, gf_getsnap_name_uuid_rsp *snap_info_rsp);  int -glusterd_update_fstype (char *orig_brick_path, -                        glusterd_brickinfo_t *snap_brickinfo, -                        char *fstype, size_t fslen); +glusterd_update_mntopts (char *brick_path, glusterd_brickinfo_t *brickinfo);  int  glusterd_update_fs_label (glusterd_brickinfo_t *brickinfo); diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h index 9f26e7508ad..45656bef8e1 100644 --- a/xlators/mgmt/glusterd/src/glusterd.h +++ b/xlators/mgmt/glusterd/src/glusterd.h @@ -193,6 +193,7 @@ struct glusterd_brickinfo {          char               mount_dir[PATH_MAX];          char               brick_id[1024];/*Client xlator name, AFR changelog name*/          char               fstype [NAME_MAX]; /* Brick file-system type */ +        char               mnt_opts [1024]; /* Brick mount options */          struct list_head   brick_list;          uuid_t             uuid;          int                port;  | 
