From: kupcevic@sourceware.org <kupcevic@sourceware.org>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] conga/ricci/modules/storage ContentFS.cpp Cont ...
Date: 26 Sep 2006 03:02:59 -0000 [thread overview]
Message-ID: <20060926030259.25044.qmail@sourceware.org> (raw)
CVSROOT: /cvs/cluster
Module name: conga
Changes by: kupcevic at sourceware.org 2006-09-26 03:02:57
Modified files:
ricci/modules/storage: ContentFS.cpp ContentFS.h ExtendedFS.cpp
ExtendedFS.h FSController.cpp Props.cpp
Props.h SwapFS.cpp SwapFS.h defines.h
Log message:
storage module:
- unify mount handling
- add pretty names to filesystem types
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/storage/ContentFS.cpp.diff?cvsroot=cluster&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/storage/ContentFS.h.diff?cvsroot=cluster&r1=1.5&r2=1.6
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/storage/ExtendedFS.cpp.diff?cvsroot=cluster&r1=1.4&r2=1.5
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/storage/ExtendedFS.h.diff?cvsroot=cluster&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/storage/FSController.cpp.diff?cvsroot=cluster&r1=1.5&r2=1.6
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/storage/Props.cpp.diff?cvsroot=cluster&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/storage/Props.h.diff?cvsroot=cluster&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/storage/SwapFS.cpp.diff?cvsroot=cluster&r1=1.4&r2=1.5
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/storage/SwapFS.h.diff?cvsroot=cluster&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/storage/defines.h.diff?cvsroot=cluster&r1=1.5&r2=1.6
--- conga/ricci/modules/storage/ContentFS.cpp 2006/08/10 22:53:09 1.3
+++ conga/ricci/modules/storage/ContentFS.cpp 2006/09/26 03:02:57 1.4
@@ -27,17 +27,23 @@
#include "ContentNone.h"
#include "BDFactory.h"
#include "defines.h"
+#include "utils.h"
using namespace std;
-ContentFS::ContentFS(const String& fs_name, const String& path) :
+#define ILLEGAL_MOUNT_CHARS String(" <>?'\":;|}]{[)(*&^%$#@!~`+=")
+
+
+
+ContentFS::ContentFS(const String& path,
+ const String& name,
+ const String& module) :
Content(CONTENT_FS_TYPE, path),
- _name(fs_name)
-{
-
-}
+ _name(name),
+ _module(module)
+{}
ContentFS::~ContentFS()
{}
@@ -85,7 +91,6 @@
}
-
XMLObject
ContentFS::xml() const
{
@@ -97,13 +102,185 @@
+void
+ContentFS::mount_props_probe(const String& path,
+ const String& fsname,
+ Props& props)
+{
+ FstabLocker l;
+ MountHandler mh;
+
+ // mountpoint
+ pair<unsigned int, unsigned int> maj_min = mh.maj_min(path);
+ list<Mountpoint> mounts = mh.mounts(maj_min);
+ String mountpoint;
+ if (mounts.size())
+ mountpoint = mounts.front().mountpoint;
+ list<String> ill_mnts = mh.used_dirs();
+ ill_mnts.remove(mountpoint);
+ // fstab
+ list<Mountpoint> fstabs = mh.fstabs(maj_min);
+ String fstabpoint;
+ if (fstabs.size())
+ fstabpoint = fstabs.front().mountpoint;
+ ill_mnts.remove(fstabpoint);
+
+
+
+ bool mountable = mount_fs_supported(fsname);
+ props.set(Variable("mountable", mountable));
+ if (mountable)
+ props.set(Variable("mountpoint",
+ mountpoint,
+ 0,
+ 128,
+ ILLEGAL_MOUNT_CHARS,
+ ill_mnts));
+ if (mountable ||
+ !fstabpoint.empty())
+ props.set(Variable("fstabpoint",
+ fstabpoint,
+ 0,
+ 128,
+ ILLEGAL_MOUNT_CHARS,
+ ill_mnts));
+}
+
+void
+ContentFS::mount_props_apply(const String& path,
+ const String& fsname,
+ const Props& old_props,
+ const Props& new_props)
+{
+ FstabLocker l;
+
+ // mountpoint
+ if (old_props.has("mountpoint")) {
+ String mnt_curr = old_props.get("mountpoint").get_string();
+ String mnt_new = new_props.get("mountpoint").get_string();
+ if (mnt_curr != mnt_new) {
+ MountHandler mh;
+ if (mnt_curr.size())
+ if (!mh.umount(path, mnt_curr))
+ throw UMountError(mnt_curr);
+ if (mnt_new.size())
+ if (!mh.mount(path, mnt_new, fsname))
+ throw String("mount failed");
+ }
+ }
+
+ // fstab
+ if (old_props.has("fstabpoint")) {
+ String mnt_curr = old_props.get("fstabpoint").get_string();
+ String mnt_new = new_props.get("fstabpoint").get_string();
+ if (mnt_curr != mnt_new) {
+ MountHandler mh;
+ if (mnt_curr.size()) {
+ list<Mountpoint> l = mh.fstabs(mh.maj_min(path));
+ for (list<Mountpoint>::const_iterator iter = l.begin();
+ iter != l.end();
+ iter++)
+ if (iter->mountpoint == mnt_curr)
+ mh.fstab_remove(iter->devname, mnt_curr);
+ }
+ if (mnt_new.size())
+ mh.fstab_add(path, mnt_new, fsname);
+ }
+ }
+}
+
+bool
+ContentFS::mount_props_mounted(const Props& props)
+{
+ if (props.has("mountpoint"))
+ return props.get("mountpoint").get_string().size();
+ return false;
+}
+
+
+
+
+
+
+
+
ContentFSTemplate::ContentFSTemplate(const String& name) :
ContentTemplate(CONTENT_FS_TYPE),
- name(name)
+ _name(name)
{
- attrs["fs_type"] = name;
+ attrs["fs_type"] = _name;
}
ContentFSTemplate::~ContentFSTemplate()
{}
+
+
+
+void
+ContentFSTemplate::mount_props_template(const String& fsname,
+ Props& props)
+{
+ bool mountable = ContentFS::mount_fs_supported(fsname);
+ props.set(Variable("mountable", mountable));
+
+ if (mountable) {
+ list<String> illegal_mps = MountHandler().used_dirs();
+ props.set(Variable("mountpoint",
+ "",
+ 0,
+ 128,
+ ILLEGAL_MOUNT_CHARS,
+ illegal_mps));
+ props.set(Variable("fstab", false, true));
+ props.set(Variable("mount", false, true));
+ }
+}
+
+void
+ContentFSTemplate::mount_props_create(const String& path,
+ const String& fsname,
+ const Props& props)
+{
+ if (props.has("mountpoint")) {
+ String mountpoint = props.get("mountpoint").get_string();
+ String label;
+ try {
+ label = props.get("label").get_string();
+ } catch ( ... ) {}
+ bool mount = props.get("mount").get_bool();
+ bool fstab = props.get("fstab").get_bool();
+
+ if (mountpoint.size()) {
+ FstabLocker l;
+ if (mount)
+ MountHandler().mount(path,
+ mountpoint,
+ fsname);
+ if (fstab)
+ MountHandler().fstab_add(label.empty() ? path : String("LABEL=") + label,
+ mountpoint,
+ fsname);
+ }
+ }
+}
+
+
+
+
+
+bool
+ContentFS::mount_fs_supported(const String& fsname)
+{
+ list<String> l = MountHandler().fstypes();
+ if (find(l.begin(), l.end(), fsname) != l.end())
+ return true;
+
+ String out, err;
+ int status;
+ vector<String> args;
+ args.push_back(fsname);
+ if (utils::execute("/sbin/modinfo", args, out, err, status))
+ throw String("execute failed");
+ return !status;
+}
--- conga/ricci/modules/storage/ContentFS.h 2006/08/10 22:53:09 1.5
+++ conga/ricci/modules/storage/ContentFS.h 2006/09/26 03:02:57 1.6
@@ -28,6 +28,9 @@
#include "String.h"
+#define ILLEGAL_LABEL_CHARS String(" <>?'\":;|}]{[)(*&^%$#@!~`+=")
+
+
class ContentFS : public Content
{
public:
@@ -39,11 +42,23 @@
virtual void remove();
- protected:
- ContentFS(const String& name, const String& path);
- String _name;
+
+ static bool mount_fs_supported(const String& fsname); // true if mountable
+ // these fcns extract/place info from/into props
+ static bool mount_props_mounted(const Props& props); // true if mounted
+ static void mount_props_probe(const String& path,
+ const String& module,
+ Props& props);
+ static void mount_props_apply(const String& path,
+ const String& module,
+ const Props& old_props,
+ const Props& new_props);
+ protected:
+ ContentFS(const String& path, const String& name, const String& module);
+ String _name;
+ String _module;
};
@@ -53,9 +68,16 @@
public:
virtual ~ContentFSTemplate();
+ static void mount_props_template(const String& module,
+ Props &props);
+ static void mount_props_create(const String& path,
+ const String& module,
+ const Props &props);
+
+
protected:
ContentFSTemplate(const String& name);
- String name;
+ String _name;
};
--- conga/ricci/modules/storage/ExtendedFS.cpp 2006/09/14 17:52:04 1.4
+++ conga/ricci/modules/storage/ExtendedFS.cpp 2006/09/26 03:02:57 1.5
@@ -24,7 +24,6 @@
#include "ExtendedFS.h"
#include "utils.h"
#include "MountHandler.h"
-#include "defines.h"
#include "UMountError.h"
#include "FileMagic.h"
@@ -33,20 +32,21 @@
using namespace std;
-
-
-
+const static String MKE2FS_path("/sbin/mke2fs");
+const String ExtendedFS::PRETTY_NAME("Linux Extended FS");
ExtendedFS::ExtendedFS(const String& path) :
- ContentFS("extended_fs", path),
+ ContentFS(path,
+ PRETTY_NAME,
+ "ext2"),
_journaled(false)
{
String magic(FileMagic::get_description(path));
if (magic.find("ext3") == magic.npos &&
magic.find("ext2") == magic.npos)
- throw String(path + " not extended_fs");
+ throw path + ": not an " + _name;
// dumpe2fs
String out, err;
@@ -95,36 +95,27 @@
String label = words[3];
if (label == "<none>")
label.clear();
- // _props.set(Variable("label", label, 0, 16, illegal_label_chars, list<String>()));
+ // _props.set(Variable("label", label, 0, 16, ILLEGAL_LABEL_CHARS, list<String>()));
_props.set(Variable("label", label));
}
}
}
- // mountpoint
- MountHandler mh;
- pair<unsigned int, unsigned int> maj_min = mh.maj_min(path);
- list<Mountpoint> mounts = mh.mounts(maj_min);
- String mountpoint;
- if (mounts.size())
- mountpoint = mounts.front().mountpoint;
- list<String> ill_mnts = mh.used_dirs();
- ill_mnts.remove(mountpoint);
- // fstab
- list<Mountpoint> fstabs = mh.fstabs(maj_min);
- String fstabpoint;
- if (fstabs.size())
- fstabpoint = fstabs.front().mountpoint;
- ill_mnts.remove(fstabpoint);
+ long long block_count = _props.get("block_count").get_int();
- _props.set(Variable("mountpoint", mountpoint, 0, 128, ";? *!", ill_mnts));
- _props.set(Variable("fstabpoint", fstabpoint, 0, 128, ";? *!", ill_mnts));
+ if (_journaled)
+ _module = "ext3";
+ else
+ _module = "ext2";
// journaling
- long long block_count = _props.get("block_count").get_int();
_props.set(Variable("has_journal",
_journaled,
(!_journaled && block_count > 1024)));
+
+ mount_props_probe(path,
+ _module,
+ _props);
}
ExtendedFS::~ExtendedFS()
@@ -134,7 +125,7 @@
bool
ExtendedFS::expandable(long long& max_size) const
{
- bool mounted = _props.get("mountpoint").get_string().size();
+ bool mounted = mount_props_mounted(_props);
long long bs = _props.get("block_size").get_int();
long long bc = _props.get("block_count").get_int();
@@ -197,7 +188,7 @@
bool index_new = new_props.get("dir_index").get_bool();
if (index_old != index_new) {
vector<String> args;
- String out, err, bin = "/sbin/tune2fs";
+ String out, err, bin("/sbin/tune2fs");
int status;
if (!index_old && index_new) {
args.push_back("-O");
@@ -257,8 +248,8 @@
void
ExtendedFS::enable_journal(const String& path)
{
- MountHandler mh;
FstabLocker lock;
+ MountHandler mh;
list<Mountpoint> mounts = mh.mounts(mh.maj_min(path));
list<Mountpoint> fstabs = mh.fstabs(mh.maj_min(path));
@@ -276,7 +267,7 @@
// add journal
vector<String> args;
- String out, err, bin = "/sbin/tune2fs";
+ String out, err, bin("/sbin/tune2fs");
int status;
args.push_back("-j");
args.push_back(path);
@@ -284,12 +275,14 @@
throw String("execute failed");
if (status)
throw bin + " failed";
+ _module = "ext3";
+
} catch ( ... ) {
for (list<Mountpoint>::const_iterator iter = rollback.begin();
iter != rollback.end();
iter++)
try {
- mh.mount(iter->devname, iter->mountpoint, "ext2");
+ mh.mount(iter->devname, iter->mountpoint, _module);
} catch ( ... ) {}
throw;
}
@@ -299,14 +292,14 @@
iter != fstabs.end();
iter++) {
mh.fstab_remove(iter->devname, iter->mountpoint);
- mh.fstab_add(iter->devname, iter->mountpoint, "ext3");
+ mh.fstab_add(iter->devname, iter->mountpoint, _module);
}
// mount
for (list<Mountpoint>::const_iterator iter = mounts.begin();
iter != mounts.end();
iter++)
- if (!mh.mount(iter->devname, iter->mountpoint, "ext3"))
+ if (!mh.mount(iter->devname, iter->mountpoint, _module))
throw String("mount failed");
}
@@ -316,37 +309,10 @@
unsigned long long new_size,
const Props& new_props)
{
- FstabLocker l;
-
- // mountpoint
- String mnt_curr = _props.get("mountpoint").get_string();
- String mnt_new = new_props.get("mountpoint").get_string();
- if (mnt_curr != mnt_new) {
- MountHandler mh;
- if (mnt_curr.size())
- if (!mh.umount(path, mnt_curr))
- throw UMountError(mnt_curr);
- if (mnt_new.size())
- if (!mh.mount(path, mnt_new, "ext3"))
- throw String("mount failed");
- }
-
- // fstab mountpoint
- mnt_curr = _props.get("fstabpoint").get_string();
- mnt_new = new_props.get("fstabpoint").get_string();
- if (mnt_curr != mnt_new) {
- MountHandler mh;
- if (mnt_curr.size()) {
- list<Mountpoint> l = mh.fstabs(mh.maj_min(path));
- for (list<Mountpoint>::const_iterator iter = l.begin();
- iter != l.end();
- iter++)
- if (iter->mountpoint == mnt_curr)
- mh.fstab_remove(iter->devname, mnt_curr);
- }
- if (mnt_new.size())
- mh.fstab_add(path, mnt_new, "ext3");
- }
+ mount_props_apply(path,
+ _module,
+ _props,
+ new_props);
}
bool
@@ -365,9 +331,6 @@
{
String label = templ->_props.get("label").get_string();
String bs = utils::to_string(templ->_props.get("block_size").get_int());
- String mountpoint = templ->_props.get("mountpoint").get_string();
- bool mount = templ->_props.get("mount").get_bool();
- bool fstab = templ->_props.get("fstab").get_bool();
bool dir_index = templ->_props.get("dir_index").get_bool();
bool has_journal = templ->_props.get("has_journal").get_bool();
@@ -388,43 +351,43 @@
args.push_back("-j");
args.push_back(path);
- String out, err, bin("/sbin/mke2fs");
+ String out, err;
int status;
- if (utils::execute(bin, args, out, err, status))
+ if (utils::execute(MKE2FS_path, args, out, err, status))
throw String("execute failed");
if (status != 0)
- throw bin + " failed";
+ throw MKE2FS_path + " failed";
- String fstype = (has_journal) ? "ext3" : "ext2";
- if (mountpoint.size()) {
- if (mount)
- MountHandler().mount(path,
- mountpoint,
- fstype);
- if (fstab)
- MountHandler().fstab_add(label.empty() ? path : String("LABEL=") + label,
- mountpoint,
- fstype);
- }
+ // mountpoints
+ ContentFSTemplate::mount_props_create(path,
+ (has_journal) ? "ext3" : "ext2",
+ templ->_props);
}
ExtendedFSTemplate::ExtendedFSTemplate() :
- ContentFSTemplate("extended_fs")
+ ContentFSTemplate(ExtendedFS::PRETTY_NAME)
{
- // label
- _props.set(Variable("label", "", 0, 16, illegal_label_chars, list<String>()));
+ if (access(MKE2FS_path.c_str(), X_OK|R_OK))
+ throw String("no mke2fs exists");
+
+ bool ext3_supported = ContentFS::mount_fs_supported("ext3");
+
+ _props.set(Variable("label",
+ "",
+ 0,
+ 16,
+ ILLEGAL_LABEL_CHARS,
+ list<String>()));
- // dir_index
_props.set(Variable("dir_index", true, true));
- // has_journal
- _props.set(Variable("has_journal", true, true));
+ _props.set(Variable("has_journal",
+ ext3_supported,
+ ext3_supported));
- // mountpoint
- list<String> illegal_mps = MountHandler().used_dirs();
- _props.set(Variable("mountpoint", "", 0, 128, ";? *!", illegal_mps));
- _props.set(Variable("fstab", false, true));
- _props.set(Variable("mount", false, true));
+ mount_props_template(ext3_supported ? "ext3" : "ext2",
+ _props);
+
// block_size
list<long long> b_sizes;
--- conga/ricci/modules/storage/ExtendedFS.h 2006/08/10 22:53:09 1.3
+++ conga/ricci/modules/storage/ExtendedFS.h 2006/09/26 03:02:57 1.4
@@ -38,6 +38,7 @@
ExtendedFS(const String& path);
virtual ~ExtendedFS();
+ const static String PRETTY_NAME;
virtual bool expandable(long long& max_size) const;
virtual bool shrinkable(long long& min_size) const;
--- conga/ricci/modules/storage/FSController.cpp 2006/08/10 22:53:09 1.5
+++ conga/ricci/modules/storage/FSController.cpp 2006/09/26 03:02:57 1.6
@@ -39,14 +39,9 @@
try {
return counting_auto_ptr<Content>(new SwapFS(path));
} catch ( ... ) {}
- try {
- // return counting_auto_ptr<ContentFS>(new gfs(path));
- } catch ( ... ) {}
throw String("not FS");
-
}
-
std::list<counting_auto_ptr<ContentTemplate> >
FSController::get_available_fss()
{
@@ -58,9 +53,6 @@
try {
cnts.push_back(counting_auto_ptr<ContentTemplate>(new SwapFSTemplate()));
} catch ( ... ) {}
- try {
- // return counting_auto_ptr<ContentTemplate>(new gfsTemplate(path));
- } catch ( ... ) {}
return cnts;
}
@@ -73,9 +65,9 @@
throw String("content_template not of filesystem type");
String fs_type = cont_templ->attrs["fs_type"];
- if (fs_type == "extended_fs")
+ if (fs_type == ExtendedFS::PRETTY_NAME)
create_extended_fs(bd->path(), cont_templ);
- else if (fs_type == "swap")
+ else if (fs_type == SwapFS::PRETTY_NAME)
create_swap_fs(bd->path(), cont_templ);
else
throw String("unknown fs type \"") + fs_type + "\"";
--- conga/ricci/modules/storage/Props.cpp 2006/09/26 01:04:20 1.3
+++ conga/ricci/modules/storage/Props.cpp 2006/09/26 03:02:57 1.4
@@ -51,6 +51,12 @@
{}
+bool
+Props::has(const String& name) const
+{
+ return _vars.find(name) != _vars.end();
+}
+
const Variable
Props::get(const String& name) const
{
--- conga/ricci/modules/storage/Props.h 2006/09/26 01:04:20 1.3
+++ conga/ricci/modules/storage/Props.h 2006/09/26 03:02:57 1.4
@@ -40,8 +40,9 @@
Props(const XMLObject&);
virtual ~Props();
- const Variable get(const String& name) const;
void set(const Variable& var);
+ bool has(const String& name) const;
+ const Variable get(const String& name) const;
bool is_active(const Variable& var) const;
--- conga/ricci/modules/storage/SwapFS.cpp 2006/09/14 17:52:04 1.4
+++ conga/ricci/modules/storage/SwapFS.cpp 2006/09/26 03:02:57 1.5
@@ -31,8 +31,11 @@
using namespace std;
+const String SwapFS::PRETTY_NAME("Swap");
+
+
SwapFS::SwapFS(const String& path) :
- ContentFS("swap", path)
+ ContentFS(path, PRETTY_NAME, "swap")
{
String magic(FileMagic::get_description(path));
if (magic.find("swap") == magic.npos)
@@ -177,7 +180,12 @@
ContentFSTemplate("swap")
{
// label
- _props.set(Variable("label", "", 0, 16, illegal_label_chars, list<String>()));
+ _props.set(Variable("label",
+ "",
+ 0,
+ 16,
+ ILLEGAL_LABEL_CHARS,
+ list<String>()));
// swapon
_props.set(Variable("swapon", true, true));
--- conga/ricci/modules/storage/SwapFS.h 2006/08/10 22:53:09 1.3
+++ conga/ricci/modules/storage/SwapFS.h 2006/09/26 03:02:57 1.4
@@ -39,6 +39,7 @@
SwapFS(const String& path);
virtual ~SwapFS();
+ const static String PRETTY_NAME;
virtual bool expandable(long long& max_size) const;
virtual bool shrinkable(long long& min_size) const;
--- conga/ricci/modules/storage/defines.h 2006/08/10 22:53:09 1.5
+++ conga/ricci/modules/storage/defines.h 2006/09/26 03:02:57 1.6
@@ -27,9 +27,6 @@
#include "String.h"
-static String illegal_label_chars("| \\ /?.,");
-
-
// XML tags for various objects
reply other threads:[~2006-09-26 3:02 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20060926030259.25044.qmail@sourceware.org \
--to=kupcevic@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.