diff options
Diffstat (limited to 'fs/nfs')
| -rw-r--r-- | fs/nfs/dir.c | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index 8fae8b00b8f5..37a6180ee2e8 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c | |||
| @@ -2379,21 +2379,30 @@ EXPORT_SYMBOL_GPL(nfs_access_add_cache); | |||
| 2379 | #define NFS_MAY_WRITE (NFS4_ACCESS_MODIFY | \ | 2379 | #define NFS_MAY_WRITE (NFS4_ACCESS_MODIFY | \ |
| 2380 | NFS4_ACCESS_EXTEND | \ | 2380 | NFS4_ACCESS_EXTEND | \ |
| 2381 | NFS4_ACCESS_DELETE) | 2381 | NFS4_ACCESS_DELETE) |
| 2382 | #define NFS_FILE_MAY_WRITE (NFS4_ACCESS_MODIFY | \ | ||
| 2383 | NFS4_ACCESS_EXTEND) | ||
| 2384 | #define NFS_DIR_MAY_WRITE NFS_MAY_WRITE | ||
| 2382 | #define NFS_MAY_LOOKUP (NFS4_ACCESS_LOOKUP) | 2385 | #define NFS_MAY_LOOKUP (NFS4_ACCESS_LOOKUP) |
| 2383 | #define NFS_MAY_EXECUTE (NFS4_ACCESS_EXECUTE) | 2386 | #define NFS_MAY_EXECUTE (NFS4_ACCESS_EXECUTE) |
| 2384 | static int | 2387 | static int |
| 2385 | nfs_access_calc_mask(u32 access_result) | 2388 | nfs_access_calc_mask(u32 access_result, umode_t umode) |
| 2386 | { | 2389 | { |
| 2387 | int mask = 0; | 2390 | int mask = 0; |
| 2388 | 2391 | ||
| 2389 | if (access_result & NFS_MAY_READ) | 2392 | if (access_result & NFS_MAY_READ) |
| 2390 | mask |= MAY_READ; | 2393 | mask |= MAY_READ; |
| 2391 | if (access_result & NFS_MAY_WRITE) | 2394 | if (S_ISDIR(umode)) { |
| 2392 | mask |= MAY_WRITE; | 2395 | if ((access_result & NFS_DIR_MAY_WRITE) == NFS_DIR_MAY_WRITE) |
| 2393 | if (access_result & NFS_MAY_LOOKUP) | 2396 | mask |= MAY_WRITE; |
| 2394 | mask |= MAY_EXEC; | 2397 | if ((access_result & NFS_MAY_LOOKUP) == NFS_MAY_LOOKUP) |
| 2395 | if (access_result & NFS_MAY_EXECUTE) | 2398 | mask |= MAY_EXEC; |
| 2396 | mask |= MAY_EXEC; | 2399 | } else if (S_ISREG(umode)) { |
| 2400 | if ((access_result & NFS_FILE_MAY_WRITE) == NFS_FILE_MAY_WRITE) | ||
| 2401 | mask |= MAY_WRITE; | ||
| 2402 | if ((access_result & NFS_MAY_EXECUTE) == NFS_MAY_EXECUTE) | ||
| 2403 | mask |= MAY_EXEC; | ||
| 2404 | } else if (access_result & NFS_MAY_WRITE) | ||
| 2405 | mask |= MAY_WRITE; | ||
| 2397 | return mask; | 2406 | return mask; |
| 2398 | } | 2407 | } |
| 2399 | 2408 | ||
| @@ -2438,7 +2447,7 @@ static int nfs_do_access(struct inode *inode, struct rpc_cred *cred, int mask) | |||
| 2438 | } | 2447 | } |
| 2439 | nfs_access_add_cache(inode, &cache); | 2448 | nfs_access_add_cache(inode, &cache); |
| 2440 | out_cached: | 2449 | out_cached: |
| 2441 | cache_mask = nfs_access_calc_mask(cache.mask); | 2450 | cache_mask = nfs_access_calc_mask(cache.mask, inode->i_mode); |
| 2442 | if ((mask & ~cache_mask & (MAY_READ | MAY_WRITE | MAY_EXEC)) != 0) | 2451 | if ((mask & ~cache_mask & (MAY_READ | MAY_WRITE | MAY_EXEC)) != 0) |
| 2443 | status = -EACCES; | 2452 | status = -EACCES; |
| 2444 | out: | 2453 | out: |
