summaryrefslogtreecommitdiffstats
path: root/usr.sbin/mfiutil
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2011-04-05 14:19:05 +0000
committerjhb <jhb@FreeBSD.org>2011-04-05 14:19:05 +0000
commit4fde1ce654bbaabe7c045d8f2cc469c73b079816 (patch)
treed7193902da44118ee92d9e332501be7819e6918d /usr.sbin/mfiutil
parentd61e0853481197f3bed84fdcb57a9a74deb3e549 (diff)
downloadFreeBSD-src-4fde1ce654bbaabe7c045d8f2cc469c73b079816.zip
FreeBSD-src-4fde1ce654bbaabe7c045d8f2cc469c73b079816.tar.gz
Add the ability to manage the state of write caching when the battery
back-up is missing or dead. The current state of this field is reported in 'mfiutil cache <volume>' and can be adjusted via 'mfiutil cache <volume> bad-bbu-write-cache <enable|disable>'. This setting should generally be disabled to avoid data loss. MFC after: 1 week
Diffstat (limited to 'usr.sbin/mfiutil')
-rw-r--r--usr.sbin/mfiutil/mfi_volume.c30
-rw-r--r--usr.sbin/mfiutil/mfiutil.817
2 files changed, 40 insertions, 7 deletions
diff --git a/usr.sbin/mfiutil/mfi_volume.c b/usr.sbin/mfiutil/mfi_volume.c
index 967a314..1e679c4 100644
--- a/usr.sbin/mfiutil/mfi_volume.c
+++ b/usr.sbin/mfiutil/mfi_volume.c
@@ -138,6 +138,10 @@ update_cache_policy(int fd, struct mfi_ld_props *props, uint8_t new_policy,
policy & MR_LD_CACHE_READ_AHEAD ?
(policy & MR_LD_CACHE_READ_ADAPTIVE ?
"adaptive" : "always") : "none");
+ if (changes & MR_LD_CACHE_WRITE_CACHE_BAD_BBU)
+ printf("%s write caching with bad BBU\n",
+ policy & MR_LD_CACHE_WRITE_CACHE_BAD_BBU ? "Enabling" :
+ "Disabling");
props->default_cache_policy = policy;
if (mfi_ld_set_props(fd, props) < 0) {
@@ -182,7 +186,7 @@ volume_cache(int ac, char **av)
if (ac == 2) {
printf("mfi%u volume %s cache settings:\n", mfi_unit,
mfi_volume_name(fd, target_id));
- printf(" I/O caching: ");
+ printf(" I/O caching: ");
switch (props.default_cache_policy &
(MR_LD_CACHE_ALLOW_WRITE_CACHE |
MR_LD_CACHE_ALLOW_READ_CACHE)) {
@@ -200,14 +204,17 @@ volume_cache(int ac, char **av)
printf("writes and reads\n");
break;
}
- printf(" write caching: %s\n",
+ printf(" write caching: %s\n",
props.default_cache_policy & MR_LD_CACHE_WRITE_BACK ?
"write-back" : "write-through");
- printf(" read ahead: %s\n",
+ printf("write cache with bad BBU: %s\n",
+ props.default_cache_policy &
+ MR_LD_CACHE_WRITE_CACHE_BAD_BBU ? "enabled" : "disabled");
+ printf(" read ahead: %s\n",
props.default_cache_policy & MR_LD_CACHE_READ_AHEAD ?
(props.default_cache_policy & MR_LD_CACHE_READ_ADAPTIVE ?
"adaptive" : "always") : "none");
- printf("drive write cache: ");
+ printf(" drive write cache: ");
switch (props.disk_cache_policy) {
case MR_PD_CACHE_UNCHANGED:
printf("default\n");
@@ -273,6 +280,21 @@ volume_cache(int ac, char **av)
error = update_cache_policy(fd, &props, policy,
MR_LD_CACHE_READ_AHEAD |
MR_LD_CACHE_READ_ADAPTIVE);
+ } else if (strcmp(av[2], "bad-bbu-write-cache") == 0) {
+ if (ac < 4) {
+ warnx("cache: bad BBU setting required");
+ return (EINVAL);
+ }
+ if (strcmp(av[3], "enable") == 0)
+ policy = MR_LD_CACHE_WRITE_CACHE_BAD_BBU;
+ else if (strcmp(av[3], "disable") == 0)
+ policy = 0;
+ else {
+ warnx("cache: invalid bad BBU setting");
+ return (EINVAL);
+ }
+ error = update_cache_policy(fd, &props, policy,
+ MR_LD_CACHE_WRITE_CACHE_BAD_BBU);
} else if (strcmp(av[2], "write-cache") == 0) {
if (ac < 4) {
warnx("cache: write-cache setting required");
diff --git a/usr.sbin/mfiutil/mfiutil.8 b/usr.sbin/mfiutil/mfiutil.8
index ad48ab8..abb3c65 100644
--- a/usr.sbin/mfiutil/mfiutil.8
+++ b/usr.sbin/mfiutil/mfiutil.8
@@ -27,7 +27,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd August 16, 2009
+.Dd April 5, 2011
.Dt MFIUTIL 8
.Os
.Sh NAME
@@ -367,7 +367,7 @@ Enable caching only for write I/O operations.
Use write-back policy for cached writes.
.It Cm write-through
Use write-through policy for cached writes.
-.It Cm read-ahead Op Ar value
+.It Cm read-ahead Ar value
Set the read ahead policy for cached reads.
The
.Ar value
@@ -376,7 +376,18 @@ argument can be set to either
.Dq adaptive ,
or
.Dq always .
-.It Cm write-cache Op Ar value
+.It Cm bad-bbu-write-cache Ar value
+Control the behavior of I/O write caching if the battery is dead or
+missing.
+The
+.Ar value
+argument can be set to either
+.Dq disable
+or
+.Dq enable .
+In general this setting should be left disabled to avoid data loss when
+the system loses power.
+.It Cm write-cache Ar value
Control the write caches on the physical drives backing
.Ar volume .
The
OpenPOWER on IntegriCloud