From 8b22f43d9da9cd42652b642b4b4f447825a86c4f Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Tue, 5 Apr 2011 14:19:05 +0000 Subject: [PATCH] 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 ' and can be adjusted via 'mfiutil cache bad-bbu-write-cache '. This setting should generally be disabled to avoid data loss. MFC after: 1 week --- usr.sbin/mfiutil/mfi_volume.c | 30 ++++++++++++++++++++++++++---- usr.sbin/mfiutil/mfiutil.8 | 17 ++++++++++++++--- 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/usr.sbin/mfiutil/mfi_volume.c b/usr.sbin/mfiutil/mfi_volume.c index 967a31434fc1..1e679c484dbe 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 ad48ab855fcb..abb3c657f420 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