diff options
| -rw-r--r-- | fs/afs/security.c | 10 | ||||
| -rw-r--r-- | fs/afs/vlclient.c | 19 | 
2 files changed, 13 insertions, 16 deletions
| diff --git a/fs/afs/security.c b/fs/afs/security.c index 1992b0ffa543..81dfedb7879f 100644 --- a/fs/afs/security.c +++ b/fs/afs/security.c @@ -372,18 +372,14 @@ int afs_permission(struct inode *inode, int mask)  	       mask, access, S_ISDIR(inode->i_mode) ? "dir" : "file");  	if (S_ISDIR(inode->i_mode)) { -		if (mask & MAY_EXEC) { +		if (mask & (MAY_EXEC | MAY_READ | MAY_CHDIR)) {  			if (!(access & AFS_ACE_LOOKUP))  				goto permission_denied; -		} else if (mask & MAY_READ) { -			if (!(access & AFS_ACE_LOOKUP)) -				goto permission_denied; -		} else if (mask & MAY_WRITE) { +		} +		if (mask & MAY_WRITE) {  			if (!(access & (AFS_ACE_DELETE | /* rmdir, unlink, rename from */  					AFS_ACE_INSERT))) /* create, mkdir, symlink, rename to */  				goto permission_denied; -		} else { -			BUG();  		}  	} else {  		if (!(access & AFS_ACE_LOOKUP)) diff --git a/fs/afs/vlclient.c b/fs/afs/vlclient.c index 1ed7e2fd2f35..c3b740813fc7 100644 --- a/fs/afs/vlclient.c +++ b/fs/afs/vlclient.c @@ -23,7 +23,7 @@ static int afs_deliver_vl_get_entry_by_name_u(struct afs_call *call)  	struct afs_uvldbentry__xdr *uvldb;  	struct afs_vldb_entry *entry;  	bool new_only = false; -	u32 tmp, nr_servers; +	u32 tmp, nr_servers, vlflags;  	int i, ret;  	_enter(""); @@ -55,6 +55,7 @@ static int afs_deliver_vl_get_entry_by_name_u(struct afs_call *call)  			new_only = true;  	} +	vlflags = ntohl(uvldb->flags);  	for (i = 0; i < nr_servers; i++) {  		struct afs_uuid__xdr *xdr;  		struct afs_uuid *uuid; @@ -64,12 +65,13 @@ static int afs_deliver_vl_get_entry_by_name_u(struct afs_call *call)  		if (tmp & AFS_VLSF_DONTUSE ||  		    (new_only && !(tmp & AFS_VLSF_NEWREPSITE)))  			continue; -		if (tmp & AFS_VLSF_RWVOL) +		if (tmp & AFS_VLSF_RWVOL) {  			entry->fs_mask[i] |= AFS_VOL_VTM_RW; +			if (vlflags & AFS_VLF_BACKEXISTS) +				entry->fs_mask[i] |= AFS_VOL_VTM_BAK; +		}  		if (tmp & AFS_VLSF_ROVOL)  			entry->fs_mask[i] |= AFS_VOL_VTM_RO; -		if (tmp & AFS_VLSF_BACKVOL) -			entry->fs_mask[i] |= AFS_VOL_VTM_BAK;  		if (!entry->fs_mask[i])  			continue; @@ -89,15 +91,14 @@ static int afs_deliver_vl_get_entry_by_name_u(struct afs_call *call)  	for (i = 0; i < AFS_MAXTYPES; i++)  		entry->vid[i] = ntohl(uvldb->volumeId[i]); -	tmp = ntohl(uvldb->flags); -	if (tmp & AFS_VLF_RWEXISTS) +	if (vlflags & AFS_VLF_RWEXISTS)  		__set_bit(AFS_VLDB_HAS_RW, &entry->flags); -	if (tmp & AFS_VLF_ROEXISTS) +	if (vlflags & AFS_VLF_ROEXISTS)  		__set_bit(AFS_VLDB_HAS_RO, &entry->flags); -	if (tmp & AFS_VLF_BACKEXISTS) +	if (vlflags & AFS_VLF_BACKEXISTS)  		__set_bit(AFS_VLDB_HAS_BAK, &entry->flags); -	if (!(tmp & (AFS_VLF_RWEXISTS | AFS_VLF_ROEXISTS | AFS_VLF_BACKEXISTS))) { +	if (!(vlflags & (AFS_VLF_RWEXISTS | AFS_VLF_ROEXISTS | AFS_VLF_BACKEXISTS))) {  		entry->error = -ENOMEDIUM;  		__set_bit(AFS_VLDB_QUERY_ERROR, &entry->flags);  	} | 
