[v2] hfsplus: Add module parameter to enable force writes

Message ID 79C58B25-8ECF-432B-AE90-2194921DB797@live.com
State New
Headers
Series [v2] hfsplus: Add module parameter to enable force writes |

Commit Message

Aditya Garg Dec. 3, 2022, 7:11 a.m. UTC
  From: Aditya Garg <gargaditya08@live.com>

This patch enables users to permanently enable writes of HFS+ locked
and/or journaled volumes using a module parameter.

Why module parameter?
Reason being, its not convenient to manually mount the volume with force
everytime. There are use cases which are fine with force enabling writes
on journaled volumes. I've seen many on various online forums and I am one
of them as well.

Isn't it risky?
Yes obviously it is, as the driver itself warns users for the same. But
any user using the parameter obviously shall be well aware of the risks
involved. To be honest, I've been writing on a 100Gb journaled volume for
a few days, including both large and small files, and haven't faced any
corruption yet.

Signed-off-by: Aditya Garg <gargaditya08@live.com>
---
v2 :- Add Documentation and split long lines across multiple lines.
 Documentation/filesystems/hfsplus.rst | 15 +++++++-
 fs/hfsplus/super.c                    | 49 +++++++++++++++++++++------
 2 files changed, 53 insertions(+), 11 deletions(-)
  

Comments

kernel test robot Dec. 4, 2022, 1:05 a.m. UTC | #1
Hi Aditya,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on akpm-mm/mm-everything]
[also build test WARNING on linus/master v6.1-rc7 next-20221202]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Aditya-Garg/hfsplus-Add-module-parameter-to-enable-force-writes/20221203-151143
base:   https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
patch link:    https://lore.kernel.org/r/79C58B25-8ECF-432B-AE90-2194921DB797%40live.com
patch subject: [PATCH v2] hfsplus: Add module parameter to enable force writes
reproduce:
        # https://github.com/intel-lab-lkp/linux/commit/dfb483e3c16e562d768f9bddc63252f1cccb0275
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Aditya-Garg/hfsplus-Add-module-parameter-to-enable-force-writes/20221203-151143
        git checkout dfb483e3c16e562d768f9bddc63252f1cccb0275
        make menuconfig
        # enable CONFIG_COMPILE_TEST, CONFIG_WARN_MISSING_DOCUMENTS, CONFIG_WARN_ABI_ERRORS
        make htmldocs

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

>> Documentation/filesystems/hfsplus.rst:65: WARNING: Unexpected indentation.

vim +65 Documentation/filesystems/hfsplus.rst

    60	
    61	  force_journaled_rw=n, force_locked_rw=n
    62		Used to force enable writes on volumes marked as journaled/locked.
    63		Its risky to use them as they may cause data corruption.
    64		Accepted values:
  > 65			0 (default): Disables writes
    66			1: Enables writes
    67	
    68
  
Aditya Garg Dec. 4, 2022, 6:43 a.m. UTC | #2
> On 04-Dec-2022, at 6:35 AM, kernel test robot <lkp@intel.com> wrote:
> 
> Hi Aditya,
> 
> Thank you for the patch! Perhaps something to improve:
> 
> [auto build test WARNING on akpm-mm/mm-everything]
> [also build test WARNING on linus/master v6.1-rc7 next-20221202]
> [If your patch is applied to the wrong git tree, kindly drop us a note.
> And when submitting patch, we suggest to use '--base' as documented in
> https://git-scm.com/docs/git-format-patch#_base_tree_information]
> 
> url:    https://github.com/intel-lab-lkp/linux/commits/Aditya-Garg/hfsplus-Add-module-parameter-to-enable-force-writes/20221203-151143
> base:   https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
> patch link:    https://lore.kernel.org/r/79C58B25-8ECF-432B-AE90-2194921DB797%40live.com
> patch subject: [PATCH v2] hfsplus: Add module parameter to enable force writes
> reproduce:
>        # https://github.com/intel-lab-lkp/linux/commit/dfb483e3c16e562d768f9bddc63252f1cccb0275
>        git remote add linux-review https://github.com/intel-lab-lkp/linux
>        git fetch --no-tags linux-review Aditya-Garg/hfsplus-Add-module-parameter-to-enable-force-writes/20221203-151143
>        git checkout dfb483e3c16e562d768f9bddc63252f1cccb0275
>        make menuconfig
>        # enable CONFIG_COMPILE_TEST, CONFIG_WARN_MISSING_DOCUMENTS, CONFIG_WARN_ABI_ERRORS
>        make htmldocs
> 
> If you fix the issue, kindly add following tag where applicable
> | Reported-by: kernel test robot <lkp@intel.com>
> 
> All warnings (new ones prefixed by >>):
> 
>>> Documentation/filesystems/hfsplus.rst:65: WARNING: Unexpected indentation.
> 

Do I need to fix this or should I consider it as a false positive?
  
Matthew Wilcox Dec. 6, 2022, 3:17 p.m. UTC | #3
On Sun, Dec 04, 2022 at 06:43:43AM +0000, Aditya Garg wrote:
> 
> 
> > On 04-Dec-2022, at 6:35 AM, kernel test robot <lkp@intel.com> wrote:
> > 
> > Hi Aditya,
> > 
> > Thank you for the patch! Perhaps something to improve:
> > 
> > [auto build test WARNING on akpm-mm/mm-everything]
> > [also build test WARNING on linus/master v6.1-rc7 next-20221202]
> > [If your patch is applied to the wrong git tree, kindly drop us a note.
> > And when submitting patch, we suggest to use '--base' as documented in
> > https://git-scm.com/docs/git-format-patch#_base_tree_information]
> > 
> > url:    https://github.com/intel-lab-lkp/linux/commits/Aditya-Garg/hfsplus-Add-module-parameter-to-enable-force-writes/20221203-151143
> > base:   https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
> > patch link:    https://lore.kernel.org/r/79C58B25-8ECF-432B-AE90-2194921DB797%40live.com
> > patch subject: [PATCH v2] hfsplus: Add module parameter to enable force writes
> > reproduce:
> >        # https://github.com/intel-lab-lkp/linux/commit/dfb483e3c16e562d768f9bddc63252f1cccb0275
> >        git remote add linux-review https://github.com/intel-lab-lkp/linux
> >        git fetch --no-tags linux-review Aditya-Garg/hfsplus-Add-module-parameter-to-enable-force-writes/20221203-151143
> >        git checkout dfb483e3c16e562d768f9bddc63252f1cccb0275
> >        make menuconfig
> >        # enable CONFIG_COMPILE_TEST, CONFIG_WARN_MISSING_DOCUMENTS, CONFIG_WARN_ABI_ERRORS
> >        make htmldocs
> > 
> > If you fix the issue, kindly add following tag where applicable
> > | Reported-by: kernel test robot <lkp@intel.com>
> > 
> > All warnings (new ones prefixed by >>):
> > 
> >>> Documentation/filesystems/hfsplus.rst:65: WARNING: Unexpected indentation.
> > 
> 
> Do I need to fix this or should I consider it as a false positive?

Your patch creates the warning, so yes you need to fix it.
  

Patch

diff --git a/Documentation/filesystems/hfsplus.rst b/Documentation/filesystems/hfsplus.rst
index f02f4f5fc..85feca0b0 100644
--- a/Documentation/filesystems/hfsplus.rst
+++ b/Documentation/filesystems/hfsplus.rst
@@ -46,13 +46,26 @@  When mounting an HFSPlus filesystem, the following options are accepted:
 	Do not decompose file name characters.
 
   force
-	Used to force write access to volumes that are marked as journalled
+	Used to force write access to volumes that are marked as journaled
 	or locked.  Use at your own risk.
 
   nls=cccc
 	Encoding to use when presenting file names.
 
 
+Module Parameters
+=================
+
+The HFSPlus module supports the following module parameters:
+
+  force_journaled_rw=n, force_locked_rw=n
+	Used to force enable writes on volumes marked as journaled/locked.
+	Its risky to use them as they may cause data corruption.
+	Accepted values:
+		0 (default): Disables writes
+		1: Enables writes
+
+
 References
 ==========
 
diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c
index 122ed89eb..91812c4c3 100644
--- a/fs/hfsplus/super.c
+++ b/fs/hfsplus/super.c
@@ -24,6 +24,16 @@  static void hfsplus_free_inode(struct inode *inode);
 #include "hfsplus_fs.h"
 #include "xattr.h"
 
+static unsigned int force_journaled_rw;
+module_param(force_journaled_rw, uint, 0644);
+MODULE_PARM_DESC(force_journaled_rw, "Force enable writes on Journaled HFS+ volumes. "
+		"([0] = disabled, 1 = enabled)");
+
+static unsigned int force_locked_rw;
+module_param(force_locked_rw, uint, 0644);
+MODULE_PARM_DESC(force_locked_rw, "Force enable writes on locked HFS+ volumes. "
+		"([0] = disabled, 1 = enabled)");
+
 static int hfsplus_system_read_inode(struct inode *inode)
 {
 	struct hfsplus_vh *vhdr = HFSPLUS_SB(inode->i_sb)->s_vhdr;
@@ -346,14 +356,22 @@  static int hfsplus_remount(struct super_block *sb, int *flags, char *data)
 			/* nothing */
 		} else if (vhdr->attributes &
 				cpu_to_be32(HFSPLUS_VOL_SOFTLOCK)) {
-			pr_warn("filesystem is marked locked, leaving read-only.\n");
-			sb->s_flags |= SB_RDONLY;
-			*flags |= SB_RDONLY;
+			if (force_locked_rw) {
+				pr_warn("filesystem is marked locked, but writes have been force enabled.\n");
+			} else {
+				pr_warn("filesystem is marked locked, leaving read-only.\n");
+				sb->s_flags |= SB_RDONLY;
+				*flags |= SB_RDONLY;
+			}
 		} else if (vhdr->attributes &
 				cpu_to_be32(HFSPLUS_VOL_JOURNALED)) {
-			pr_warn("filesystem is marked journaled, leaving read-only.\n");
-			sb->s_flags |= SB_RDONLY;
-			*flags |= SB_RDONLY;
+			if (force_journaled_rw) {
+				pr_warn("filesystem is marked journaled, but writes have been force enabled.\n");
+			} else {
+				pr_warn("filesystem is marked journaled, leaving read-only.\n");
+				sb->s_flags |= SB_RDONLY;
+				*flags |= SB_RDONLY;
+			}
 		}
 	}
 	return 0;
@@ -459,12 +477,23 @@  static int hfsplus_fill_super(struct super_block *sb, void *data, int silent)
 	} else if (test_and_clear_bit(HFSPLUS_SB_FORCE, &sbi->flags)) {
 		/* nothing */
 	} else if (vhdr->attributes & cpu_to_be32(HFSPLUS_VOL_SOFTLOCK)) {
-		pr_warn("Filesystem is marked locked, mounting read-only.\n");
-		sb->s_flags |= SB_RDONLY;
+		if (force_locked_rw) {
+			pr_warn("Filesystem is marked locked, but writes have been force enabled.\n");
+		} else {
+			pr_warn("Filesystem is marked locked, mounting read-only.\n");
+			sb->s_flags |= SB_RDONLY;
+		}
 	} else if ((vhdr->attributes & cpu_to_be32(HFSPLUS_VOL_JOURNALED)) &&
 			!sb_rdonly(sb)) {
-		pr_warn("write access to a journaled filesystem is not supported, use the force option at your own risk, mounting read-only.\n");
-		sb->s_flags |= SB_RDONLY;
+		if (force_journaled_rw) {
+			pr_warn("write access to a journaled filesystem is "
+				"not supported, but has been force enabled.\n");
+		} else {
+			pr_warn("write access to a journaled filesystem is "
+				"not supported, use the force option at your "
+				"own risk, mounting read-only.\n");
+			sb->s_flags |= SB_RDONLY;
+		}
 	}
 
 	err = -EINVAL;