Re: "mount -o remount,rw" sometimes doesn't work as expected.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, May 22 2017, Karel Zak wrote:

> On Mon, May 22, 2017 at 08:16:36AM +1000, NeilBrown wrote:
>> oooh... it just occurred to me that for a mount, I can make it
>> read/write by:
>> 
>>    mount -o remount,rw none /mount/point
>> 
>> providing I know that no other flags are needed.  I don't need to give
>> the correct device path, do I?
>
> Yes, "none" is an usable placeholder there.
>
>> > After this call, mount reads fstab and merges these options with the
>> > options from the command line (-o).  If no mountpoint is found in
>> > fstab, then a remount with  unspecified source is allowed.
>> 
>> BTW, if fstab contains just
>> 
>>    /bar /foo none bind 0 0
>> 
>> 
>> Then both
>>   mount -o remount,rw /bar
>> and
>>   mount -o remount,rw /foo
>> 
>> will try to remount /foo.  This is also surprising....
>
> Yes, mount(8) goal is to accept "whatever" to keep users happy :-)
>
> This your example is well known disadvantage, the solution is to use
> --source and --target options (it's strongly recommended for scripts):
>
>    mount -o remount,rw --source /bar
>    mount -o remount,rw --target /foo
>
> in this case mount(8) will not try to be smart...
>
> ...
>
>> >> You could possibly argue that the current behaviour is correct
>> >> as /foo is listed as bind mount.  That doesn't stop is being surprising.
>> >> Also
>> >>    mount /bar /foo -o remount,rw
>> >> 
>> >> doesn't pick up the "bind" flag, so the filesystem gets remounted.
>> >> So I think there is definitely something wrong.
>> >
>> > That's question... "remount,bind" is really special and maybe "bind"
>> > from fstab should be really ignored in this case.
>> 
>> I think that is probably the best way forward, at least in the short
>> term.
>> I might try to dig into the code and see how easy this would be.
>
> It's trivial patch, see below. Seems to work as expected (I use
> "findmnt -o TARGET,VFS-OPTIONS,FS-OPTION" to see ro/rw).
>
>     Karel
>

Sorry for the delay.

Yes, this does look easy, makes sense, and does work as expected for me
too.

Reported-and-tested-by: NeilBrown <neilb@xxxxxxxx>

will you be queuing this for the next release?

Thanks,
NeilBrown


>
> diff --git a/libmount/src/context.c b/libmount/src/context.c
> index 38e0363..a574758 100644
> --- a/libmount/src/context.c
> +++ b/libmount/src/context.c
> @@ -2038,7 +2038,7 @@ static int apply_table(struct libmnt_context *cxt, struct libmnt_table *tb,
>   */
>  int mnt_context_apply_fstab(struct libmnt_context *cxt)
>  {
> -	int rc = -1, isremount = 0;
> +	int rc = -1, isremount = 0, iscmdbind = 0;
>  	struct libmnt_table *tab = NULL;
>  	const char *src = NULL, *tgt = NULL;
>  	unsigned long mflags = 0;
> @@ -2063,8 +2063,10 @@ int mnt_context_apply_fstab(struct libmnt_context *cxt)
>  		cxt->optsmode &= ~MNT_OMODE_FORCE;
>  	}
>  
> -	if (mnt_context_get_mflags(cxt, &mflags) == 0 && mflags & MS_REMOUNT)
> -		isremount = 1;
> +	if (mnt_context_get_mflags(cxt, &mflags) == 0) {
> +		isremount = !!(mflags & MS_REMOUNT);
> +		iscmdbind = !!(mflags & MS_BIND);
> +	}
>  
>  	if (cxt->fs) {
>  		src = mnt_fs_get_source(cxt->fs);
> @@ -2131,6 +2133,12 @@ int mnt_context_apply_fstab(struct libmnt_context *cxt)
>  		 * not found are not so important and may be misinterpreted by
>  		 * applications... */
>  		rc = -MNT_ERR_NOFSTAB;
> +
> +
> +	} else if (isremount && !iscmdbind) {
> +
> +		/* remove "bind" from fstab (or no-op if not present) */
> +		mnt_optstr_remove_option(&cxt->fs->optstr, "bind");
>  	}
>  	return rc;
>  }
>
>
>
> -- 
>  Karel Zak  <kzak@xxxxxxxxxx>
>  http://karelzak.blogspot.com

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux