-------- Original Message --------
Subject: Re: [PATCH RESEND v4 6/8] vfs: Add get_vfsmount_sb() function to get vfsmount from a given sb.
From: Al Viro <v...@zeniv.linux.org.uk>
To: <dste...@suse.cz>, Qu Wenruo <quwen...@cn.fujitsu.com>, <linux-btrfs@vger.kernel.org>, linux-fsdevel <linux-fsde...@vger.kernel.org>
Date: 2015年01月29日 23:23
On Thu, Jan 29, 2015 at 01:37:58PM +0100, David Sterba wrote:
Adding Al Viro into CC

On Thu, Jan 29, 2015 at 10:24:39AM +0800, Qu Wenruo wrote:
+struct vfsmount *get_vfsmount_sb(struct super_block *sb)
+{
+       struct vfsmount *ret_vfs = NULL;
+       struct mount *mnt;
+       int ret = 0;
+
+       lock_mount_hash();
+       if (list_empty(&sb->s_mounts))
+               goto out;
+       mnt = list_entry(sb->s_mounts.next, struct mount, mnt_instance);
from include/linux/fs.h:

struct super_block {
...
        struct list_head        s_mounts;       /* list of mounts; _not_ for fs 
use */
...
};

I hear a storm in the distance coming our direction ... so I'll
preemptively NAK this change.
Could you explain what the devil is that for?
In sysfs interface handler, we don't have struct file or vfsmount to do the mnt_want_write* protection,
so this function is introduced to get a vfsmount and do the protection.
The primitive looks rather
bogus - if nothing else, it includes "make random instance of the filesystem
in someone's namespace appear busy to umount", which doesn't look like a
part of useful interface...
This is the problem I didn't find a good way to avoid.

If using the function, it will always use the first(or last?) vfsmount of the filesystem. For 1 to 1 match case, it's OK, but if one device is mounted on multiple mount points, it will delay the umount of that mount point. But we only need to keep at least one rw mount point exists.
   The only piece of context I'd been able to find
was something vague about sysfs-inflicted operations and wanting to use
mnt_want_write() but having nothing to pass it; BTW, what if the (random)
instance you run into happens to mounted r/o?
For the mounted ro case, that's not a problem, since if one instance is mounted ro,
other instances are also mounted ro, so that's not a problem.


Assuming that your superblock is guaranteed to stay alive and usable for
whatever work you are trying to do, what's wrong with sb_want_write()?
Did you mean change the function name and it's parameter to sb_want_write(sb) and sb_drop_write(sb).
That looks much better.
But I'm a little worried about just using sb_start_write() and s_readonly_remount/s_flags to do the protection,
will it be enough?

Thanks,
Qu
If it's _not_ guaranteed to stay so, and this is what you are trying to
solve, you are doing that at the wrong level - just take sysfs entry
removals earlier in shutdown process and be done with that.  Beginning of
close_ctree() would probably be early enough to be safe, but if that's
not enough, you can take it into the beginning of btrfs_kill_super().

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to