lkml.org 
[lkml]   [2006]   [Jun]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
SubjectRe: [RFC][PATCH 03/20] Add vfsmount writer count
From
Date
On Sun, 2006-06-18 at 19:33 +0100, Al Viro wrote:
> On Fri, Jun 16, 2006 at 04:12:15PM -0700, Dave Hansen wrote:
> > +/*
> > + * Must be called under write lock on mnt->mnt_sb->s_umount,
> > + * this prevents concurrent decrements which could make the
> > + * value -1, and test in mnt_want_write() wrongly succeed
> > + */
> > +static inline int mnt_make_readonly(struct vfsmount *mnt)
> > +{
> > + if (!atomic_dec_and_test(&mnt->mnt_writers)) {
> > + atomic_inc(&mnt->mnt_writers);
> > + return -EBUSY;
> > + }
> > + return 0;
> > +}
>
> Check in faccessat() could get screwed by that, if you just lose the
> race with final writer going away. Then mnt_make_readonly() will
> fail (as it should) and access(2) give -EROFS.

Very true. How about this to fix it?

--- lxc/fs//open.c~C8.1-fix-faccesat 2006-06-19 09:59:41.000000000 -0700
+++ lxc-dave/fs//open.c 2006-06-19 10:01:25.000000000 -0700
@@ -546,8 +546,12 @@ asmlinkage long sys_faccessat(int dfd, c
special_file(nd.dentry->d_inode->i_mode))
goto out_path_release;

- if(__mnt_is_readonly(nd.mnt) || IS_RDONLY(nd.dentry->d_inode))
- res = -EROFS;
+ res = mnt_want_write(nd.mnt);
+ if (!res) {
+ mnt_drop_write(nd.mnt);
+ if(IS_RDONLY(nd.dentry->d_inode))
+ res = -EROFS;
+ }

out_path_release:
path_release(&nd);

-- Dave

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2006-06-19 19:05    [W:0.035 / U:0.616 seconds]
©2003-2018 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site