diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-23 11:53:47 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-23 11:53:47 -0400 |
commit | f63d395d47f37a4fe771e6d4b1db9d2cdae5ffc5 (patch) | |
tree | 3448a14ae965802adb963762cadeb9989ce4caa2 /fs/nfs/dir.c | |
parent | 643ac9fc5429e85b8b7f534544b80bcc4f34c367 (diff) | |
parent | 5a7c9eec9fde1da0e3adf0a4ddb64ff2a324a492 (diff) |
Merge tag 'nfs-for-3.4-1' of git://git.linux-nfs.org/projects/trondmy/linux-nfs
Pull NFS client updates for Linux 3.4 from Trond Myklebust:
"New features include:
- Add NFS client support for containers.
This should enable most of the necessary functionality, including
lockd support, and support for rpc.statd, NFSv4 idmapper and
RPCSEC_GSS upcalls into the correct network namespace from which
the mount system call was issued.
- NFSv4 idmapper scalability improvements
Base the idmapper cache on the keyring interface to allow
concurrent access to idmapper entries. Start the process of
migrating users from the single-threaded daemon-based approach to
the multi-threaded request-key based approach.
- NFSv4.1 implementation id.
Allows the NFSv4.1 client and server to mutually identify each
other for logging and debugging purposes.
- Support the 'vers=4.1' mount option for mounting NFSv4.1 instead of
having to use the more counterintuitive 'vers=4,minorversion=1'.
- SUNRPC tracepoints.
Start the process of adding tracepoints in order to improve
debugging of the RPC layer.
- pNFS object layout support for autologin.
Important bugfixes include:
- Fix a bug in rpc_wake_up/rpc_wake_up_status that caused them to
fail to wake up all tasks when applied to priority waitqueues.
- Ensure that we handle read delegations correctly, when we try to
truncate a file.
- A number of fixes for NFSv4 state manager loops (mostly to do with
delegation recovery)."
* tag 'nfs-for-3.4-1' of git://git.linux-nfs.org/projects/trondmy/linux-nfs: (224 commits)
NFS: fix sb->s_id in nfs debug prints
xprtrdma: Remove assumption that each segment is <= PAGE_SIZE
xprtrdma: The transport should not bug-check when a dup reply is received
pnfs-obj: autologin: Add support for protocol autologin
NFS: Remove nfs4_setup_sequence from generic rename code
NFS: Remove nfs4_setup_sequence from generic unlink code
NFS: Remove nfs4_setup_sequence from generic read code
NFS: Remove nfs4_setup_sequence from generic write code
NFS: Fix more NFS debug related build warnings
SUNRPC/LOCKD: Fix build warnings when CONFIG_SUNRPC_DEBUG is undefined
nfs: non void functions must return a value
SUNRPC: Kill compiler warning when RPC_DEBUG is unset
SUNRPC/NFS: Add Kbuild dependencies for NFS_DEBUG/RPC_DEBUG
NFS: Use cond_resched_lock() to reduce latencies in the commit scans
NFSv4: It is not safe to dereference lsp->ls_state in release_lockowner
NFS: ncommit count is being double decremented
SUNRPC: We must not use list_for_each_entry_safe() in rpc_wake_up()
Try using machine credentials for RENEW calls
NFSv4.1: Fix a few issues in filelayout_commit_pagelist
NFSv4.1: Clean ups and bugfixes for the pNFS read/writeback/commit code
...
Diffstat (limited to 'fs/nfs/dir.c')
-rw-r--r-- | fs/nfs/dir.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index 32aa6917265a..4aaf0316d76a 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c | |||
@@ -207,7 +207,7 @@ struct nfs_cache_array_entry { | |||
207 | }; | 207 | }; |
208 | 208 | ||
209 | struct nfs_cache_array { | 209 | struct nfs_cache_array { |
210 | unsigned int size; | 210 | int size; |
211 | int eof_index; | 211 | int eof_index; |
212 | u64 last_cookie; | 212 | u64 last_cookie; |
213 | struct nfs_cache_array_entry array[0]; | 213 | struct nfs_cache_array_entry array[0]; |
@@ -1429,6 +1429,7 @@ static struct dentry *nfs_atomic_lookup(struct inode *dir, struct dentry *dentry | |||
1429 | } | 1429 | } |
1430 | 1430 | ||
1431 | open_flags = nd->intent.open.flags; | 1431 | open_flags = nd->intent.open.flags; |
1432 | attr.ia_valid = 0; | ||
1432 | 1433 | ||
1433 | ctx = create_nfs_open_context(dentry, open_flags); | 1434 | ctx = create_nfs_open_context(dentry, open_flags); |
1434 | res = ERR_CAST(ctx); | 1435 | res = ERR_CAST(ctx); |
@@ -1437,11 +1438,14 @@ static struct dentry *nfs_atomic_lookup(struct inode *dir, struct dentry *dentry | |||
1437 | 1438 | ||
1438 | if (nd->flags & LOOKUP_CREATE) { | 1439 | if (nd->flags & LOOKUP_CREATE) { |
1439 | attr.ia_mode = nd->intent.open.create_mode; | 1440 | attr.ia_mode = nd->intent.open.create_mode; |
1440 | attr.ia_valid = ATTR_MODE; | 1441 | attr.ia_valid |= ATTR_MODE; |
1441 | attr.ia_mode &= ~current_umask(); | 1442 | attr.ia_mode &= ~current_umask(); |
1442 | } else { | 1443 | } else |
1443 | open_flags &= ~(O_EXCL | O_CREAT); | 1444 | open_flags &= ~(O_EXCL | O_CREAT); |
1444 | attr.ia_valid = 0; | 1445 | |
1446 | if (open_flags & O_TRUNC) { | ||
1447 | attr.ia_valid |= ATTR_SIZE; | ||
1448 | attr.ia_size = 0; | ||
1445 | } | 1449 | } |
1446 | 1450 | ||
1447 | /* Open the file on the server */ | 1451 | /* Open the file on the server */ |
@@ -1495,6 +1499,7 @@ static int nfs_open_revalidate(struct dentry *dentry, struct nameidata *nd) | |||
1495 | struct inode *inode; | 1499 | struct inode *inode; |
1496 | struct inode *dir; | 1500 | struct inode *dir; |
1497 | struct nfs_open_context *ctx; | 1501 | struct nfs_open_context *ctx; |
1502 | struct iattr attr; | ||
1498 | int openflags, ret = 0; | 1503 | int openflags, ret = 0; |
1499 | 1504 | ||
1500 | if (nd->flags & LOOKUP_RCU) | 1505 | if (nd->flags & LOOKUP_RCU) |
@@ -1523,19 +1528,27 @@ static int nfs_open_revalidate(struct dentry *dentry, struct nameidata *nd) | |||
1523 | /* We cannot do exclusive creation on a positive dentry */ | 1528 | /* We cannot do exclusive creation on a positive dentry */ |
1524 | if ((openflags & (O_CREAT|O_EXCL)) == (O_CREAT|O_EXCL)) | 1529 | if ((openflags & (O_CREAT|O_EXCL)) == (O_CREAT|O_EXCL)) |
1525 | goto no_open_dput; | 1530 | goto no_open_dput; |
1526 | /* We can't create new files, or truncate existing ones here */ | 1531 | /* We can't create new files here */ |
1527 | openflags &= ~(O_CREAT|O_EXCL|O_TRUNC); | 1532 | openflags &= ~(O_CREAT|O_EXCL); |
1528 | 1533 | ||
1529 | ctx = create_nfs_open_context(dentry, openflags); | 1534 | ctx = create_nfs_open_context(dentry, openflags); |
1530 | ret = PTR_ERR(ctx); | 1535 | ret = PTR_ERR(ctx); |
1531 | if (IS_ERR(ctx)) | 1536 | if (IS_ERR(ctx)) |
1532 | goto out; | 1537 | goto out; |
1538 | |||
1539 | attr.ia_valid = 0; | ||
1540 | if (openflags & O_TRUNC) { | ||
1541 | attr.ia_valid |= ATTR_SIZE; | ||
1542 | attr.ia_size = 0; | ||
1543 | nfs_wb_all(inode); | ||
1544 | } | ||
1545 | |||
1533 | /* | 1546 | /* |
1534 | * Note: we're not holding inode->i_mutex and so may be racing with | 1547 | * Note: we're not holding inode->i_mutex and so may be racing with |
1535 | * operations that change the directory. We therefore save the | 1548 | * operations that change the directory. We therefore save the |
1536 | * change attribute *before* we do the RPC call. | 1549 | * change attribute *before* we do the RPC call. |
1537 | */ | 1550 | */ |
1538 | inode = NFS_PROTO(dir)->open_context(dir, ctx, openflags, NULL); | 1551 | inode = NFS_PROTO(dir)->open_context(dir, ctx, openflags, &attr); |
1539 | if (IS_ERR(inode)) { | 1552 | if (IS_ERR(inode)) { |
1540 | ret = PTR_ERR(inode); | 1553 | ret = PTR_ERR(inode); |
1541 | switch (ret) { | 1554 | switch (ret) { |