Commit b41572e929221b0d87f529106cdf12185ee84bca

Authored by Dave Hansen
Committed by Linus Torvalds
1 parent ce8d2cdf3d

r/o bind mounts: rearrange may_open() to be r/o friendly

may_open() calls vfs_permission() before it does checks for IS_RDONLY(inode).
It checks _again_ inside of vfs_permission().

The check inside of vfs_permission() is going away eventually.  With the
mnt_want/drop_write() functions, all of the r/o checks (except for this one)
are consistently done before calling permission().  Because of this, I'd like
to use permission() to hold a debugging check to make sure that the
mnt_want/drop_write() calls are actually being made.

So, to do this:
1. remove the IS_RDONLY() check from permission()
2. enforce that you must mnt_want_write() before
   even calling permission()
3. actually add the debugging check to permission()

We need to rearrange may_open() to do r/o checks before calling permission().
Here's the patch.

Signed-off-by: Dave Hansen <haveblue@us.ibm.com>
Cc: Christoph Hellwig <hch@lst.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Showing 1 changed file with 4 additions and 4 deletions Side-by-side Diff

... ... @@ -1604,10 +1604,6 @@
1604 1604 if (S_ISDIR(inode->i_mode) && (flag & FMODE_WRITE))
1605 1605 return -EISDIR;
1606 1606  
1607   - error = vfs_permission(nd, acc_mode);
1608   - if (error)
1609   - return error;
1610   -
1611 1607 /*
1612 1608 * FIFO's, sockets and device files are special: they don't
1613 1609 * actually live on the filesystem itself, and as such you
... ... @@ -1622,6 +1618,10 @@
1622 1618 flag &= ~O_TRUNC;
1623 1619 } else if (IS_RDONLY(inode) && (flag & FMODE_WRITE))
1624 1620 return -EROFS;
  1621 +
  1622 + error = vfs_permission(nd, acc_mode);
  1623 + if (error)
  1624 + return error;
1625 1625 /*
1626 1626 * An append-only file must be opened in append mode for writing.
1627 1627 */