Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 257335
b: refs/heads/master
c: 8a5e929
h: refs/heads/master
i:
  257333: 79de658
  257331: 9525946
  257327: 9d36d27
v: v3
  • Loading branch information
Al Viro committed Jul 20, 2011
1 parent d3e1375 commit 99f6bb4
Show file tree
Hide file tree
Showing 8 changed files with 25 additions and 32 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 554a8b9f54cd7ca2b89f5dc227df08be082fae0d
refs/heads/master: 8a5e929dd2e05ab4d3d89f58c5e8fca596af8f3a
2 changes: 1 addition & 1 deletion trunk/drivers/staging/pohmelfs/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -512,7 +512,7 @@ struct dentry *pohmelfs_lookup(struct inode *dir, struct dentry *dentry, struct
int err, lock_type = POHMELFS_READ_LOCK, need_lock = 1;
struct qstr str = dentry->d_name;

if ((nd->intent.open.flags & O_ACCMODE) > 1)
if ((nd->intent.open.flags & O_ACCMODE) != O_RDONLY)
lock_type = POHMELFS_WRITE_LOCK;

if (test_bit(NETFS_INODE_OWNED, &parent->state)) {
Expand Down
2 changes: 1 addition & 1 deletion trunk/fs/9p/vfs_inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -634,7 +634,7 @@ v9fs_vfs_create(struct inode *dir, struct dentry *dentry, int mode,
v9ses = v9fs_inode2v9ses(dir);
perm = unixmode2p9mode(v9ses, mode);
if (nd && nd->flags & LOOKUP_OPEN)
flags = nd->intent.open.flags - 1;
flags = nd->intent.open.flags;
else
flags = O_RDWR;

Expand Down
2 changes: 1 addition & 1 deletion trunk/fs/9p/vfs_inode_dotl.c
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ v9fs_vfs_create_dotl(struct inode *dir, struct dentry *dentry, int omode,

v9ses = v9fs_inode2v9ses(dir);
if (nd && nd->flags & LOOKUP_OPEN)
flags = nd->intent.open.flags - 1;
flags = nd->intent.open.flags;
else {
/*
* create call without LOOKUP_OPEN is due
Expand Down
2 changes: 1 addition & 1 deletion trunk/fs/ceph/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ struct dentry *ceph_lookup_open(struct inode *dir, struct dentry *dentry,
struct inode *parent_inode = get_dentry_parent_inode(file->f_dentry);
struct ceph_mds_request *req;
int err;
int flags = nd->intent.open.flags - 1; /* silly vfs! */
int flags = nd->intent.open.flags;

dout("ceph_lookup_open dentry %p '%.*s' flags %d mode 0%o\n",
dentry, dentry->d_name.len, dentry->d_name.name, flags, mode);
Expand Down
2 changes: 1 addition & 1 deletion trunk/fs/fuse/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -382,7 +382,7 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry, int mode,
struct fuse_entry_out outentry;
struct fuse_file *ff;
struct file *file;
int flags = nd->intent.open.flags - 1;
int flags = nd->intent.open.flags;

if (fc->no_create)
return -ENOSYS;
Expand Down
21 changes: 2 additions & 19 deletions trunk/fs/namei.c
Original file line number Diff line number Diff line change
Expand Up @@ -1965,27 +1965,10 @@ static int handle_truncate(struct file *filp)
return error;
}

/*
* Note that while the flag value (low two bits) for sys_open means:
* 00 - read-only
* 01 - write-only
* 10 - read-write
* 11 - special
* it is changed into
* 00 - no permissions needed
* 01 - read-permission
* 10 - write-permission
* 11 - read-write
* for the internal routines (ie open_namei()/follow_link() etc)
* This is more logical, and also allows the 00 "no perm needed"
* to be used for symlinks (where the permissions are checked
* later).
*
*/
static inline int open_to_namei_flags(int flag)
{
if ((flag+1) & O_ACCMODE)
flag++;
if ((flag & O_ACCMODE) == 3)
flag--;
return flag;
}

Expand Down
24 changes: 17 additions & 7 deletions trunk/fs/nfs/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -1338,16 +1338,26 @@ static int is_atomic_open(struct nameidata *nd)
return 0;
/* Are we trying to write to a read only partition? */
if (__mnt_is_readonly(nd->path.mnt) &&
(nd->intent.open.flags & (O_CREAT|O_TRUNC|FMODE_WRITE)))
(nd->intent.open.flags & (O_CREAT|O_TRUNC|O_ACCMODE)))
return 0;
return 1;
}

static fmode_t flags_to_mode(int flags)
{
fmode_t res = (__force fmode_t)flags & FMODE_EXEC;
if ((flags & O_ACCMODE) != O_WRONLY)
res |= FMODE_READ;
if ((flags & O_ACCMODE) != O_RDONLY)
res |= FMODE_WRITE;
return res;
}

static struct nfs_open_context *create_nfs_open_context(struct dentry *dentry, int open_flags)
{
struct nfs_open_context *ctx;
struct rpc_cred *cred;
fmode_t fmode = open_flags & (FMODE_READ | FMODE_WRITE | FMODE_EXEC);
fmode_t fmode = flags_to_mode(open_flags);

cred = rpc_lookup_cred();
if (IS_ERR(cred))
Expand Down Expand Up @@ -1567,7 +1577,7 @@ static int nfs_open_create(struct inode *dir, struct dentry *dentry, int mode,
struct nfs_open_context *ctx = NULL;
struct iattr attr;
int error;
int open_flags = O_CREAT|O_EXCL|FMODE_READ;
int open_flags = O_CREAT|O_EXCL;

dfprintk(VFS, "NFS: create(%s/%ld), %s\n",
dir->i_sb->s_id, dir->i_ino, dentry->d_name.name);
Expand Down Expand Up @@ -1657,7 +1667,7 @@ static int nfs_create(struct inode *dir, struct dentry *dentry, int mode,
{
struct iattr attr;
int error;
int open_flags = O_CREAT|O_EXCL|FMODE_READ;
int open_flags = O_CREAT|O_EXCL;

dfprintk(VFS, "NFS: create(%s/%ld), %s\n",
dir->i_sb->s_id, dir->i_ino, dentry->d_name.name);
Expand Down Expand Up @@ -2256,11 +2266,11 @@ static int nfs_open_permission_mask(int openflags)
{
int mask = 0;

if (openflags & FMODE_READ)
if ((openflags & O_ACCMODE) != O_WRONLY)
mask |= MAY_READ;
if (openflags & FMODE_WRITE)
if ((openflags & O_ACCMODE) != O_RDONLY)
mask |= MAY_WRITE;
if (openflags & FMODE_EXEC)
if (openflags & __FMODE_EXEC)
mask |= MAY_EXEC;
return mask;
}
Expand Down

0 comments on commit 99f6bb4

Please sign in to comment.