Commit 8366025e authored by Dave Hansen's avatar Dave Hansen Committed by Al Viro

[PATCH] r/o bind mounts: stub functions

This patch adds two function mnt_want_write() and mnt_drop_write().  These are
used like a lock pair around and fs operations that might cause a write to the

Before these can become useful, we must first cover each place in the VFS
where writes are performed with a want/drop pair.  When that is complete, we
can actually introduce code that will safely check the counts before allowing
r/w<->r/o transitions to occur.
Acked-by: default avatarSerge Hallyn <>
Acked-by: default avatarAl Viro <>
Signed-off-by: default avatarChristoph Hellwig <>
Signed-off-by: default avatarAndrew Morton <>
Signed-off-by: default avatarDave Hansen <>
Signed-off-by: default avatarAl Viro <>
parent a70e65df
......@@ -80,6 +80,60 @@ struct vfsmount *alloc_vfsmnt(const char *name)
return mnt;
* Most r/o checks on a fs are for operations that take
* discrete amounts of time, like a write() or unlink().
* We must keep track of when those operations start
* (for permission checks) and when they end, so that
* we can determine when writes are able to occur to
* a filesystem.
* mnt_want_write - get write access to a mount
* @mnt: the mount on which to take a write
* This tells the low-level filesystem that a write is
* about to be performed to it, and makes sure that
* writes are allowed before returning success. When
* the write operation is finished, mnt_drop_write()
* must be called. This is effectively a refcount.
int mnt_want_write(struct vfsmount *mnt)
if (__mnt_is_readonly(mnt))
return -EROFS;
return 0;
* mnt_drop_write - give up write access to a mount
* @mnt: the mount on which to give up write access
* Tells the low-level filesystem that we are done
* performing writes to it. Must be matched with
* mnt_want_write() call above.
void mnt_drop_write(struct vfsmount *mnt)
* __mnt_is_readonly: check whether a mount is read-only
* @mnt: the mount to check for its write status
* This shouldn't be used directly ouside of the VFS.
* It does not guarantee that the filesystem will stay
* r/w, just that it is right *now*. This can not and
* should not be used in place of IS_RDONLY(inode).
int __mnt_is_readonly(struct vfsmount *mnt)
return (mnt->mnt_sb->s_flags & MS_RDONLY);
int simple_set_mnt(struct vfsmount *mnt, struct super_block *sb)
mnt->mnt_sb = sb;
......@@ -71,9 +71,12 @@ static inline struct vfsmount *mntget(struct vfsmount *mnt)
return mnt;
extern int mnt_want_write(struct vfsmount *mnt);
extern void mnt_drop_write(struct vfsmount *mnt);
extern void mntput_no_expire(struct vfsmount *mnt);
extern void mnt_pin(struct vfsmount *mnt);
extern void mnt_unpin(struct vfsmount *mnt);
extern int __mnt_is_readonly(struct vfsmount *mnt);
static inline void mntput(struct vfsmount *mnt)
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment