branch management: disallow setting leftmost branch to readonly
authorErez_Zadok <ezk@cs.sunysb.edu>
Mon, 30 Apr 2007 20:42:30 +0000 (16:42 -0400)
committerErez Zadok <ezk@cs.sunysb.edu>
Sat, 16 Aug 2014 02:25:59 +0000 (22:25 -0400)
Unionfs requires the leftmost branch to be writeable for copyup to work
properly and simply.  If, through branch-management commands (add, delete,
or mode change), the leftmost branch will becomes readonly, then return an
error (and tell the user to use "remount,ro" if they want a readonly union).

fs/unionfs/super.c

index 10520c0fbf39c6c6b8d0d316f1a307e6f92ded22..3a8d74c539555ce66df36704e3c048bf47e2b106 100644 (file)
@@ -626,12 +626,20 @@ static int unionfs_remount_fs(struct super_block *sb, int *flags,
 out_no_change:
 
        /******************************************************************
-        * WE'RE ALMOST DONE: see if we need to allocate a small-sized new
-        * vector, copy the vectors to their correct place, release the
-        * refcnt of the older ones, and return.
-        * Also handle invalidating any pages that will have to be re-read.
+        * WE'RE ALMOST DONE: check if leftmost branch might be read-only,
+        * see if we need to allocate a small-sized new vector, copy the
+        * vectors to their correct place, release the refcnt of the older
+        * ones, and return.  Also handle invalidating any pages that will
+        * have to be re-read.
         *******************************************************************/
 
+       if (!(tmp_data[0].branchperms & MAY_WRITE)) {
+               printk("unionfs: leftmost branch cannot be read-only "
+                      "(use \"remount,ro\" to create a read-only union)\n");
+               err = -EINVAL;
+               goto out_release;
+       }
+
        /*
         * Allocate space for actual pointers, if needed.  By the time we
         * finish this block of code, new_branches and new_lower_paths will