diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-10-08 12:51:44 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-10-08 12:51:44 -0400 |
commit | 6dea0737bc5e160efc77f4c39d393b94fd2746dc (patch) | |
tree | 5f4021fa66f86a9cf0700bdefb8fcdfb370161df /fs/nfsd/nfs4xdr.c | |
parent | 25641c0c8d72f3d235c022fd2c19181912c2ae8b (diff) | |
parent | 34549ab09e62db9703811c6ed4715f2ffa1fd7fb (diff) |
Merge branch 'for-3.18' of git://linux-nfs.org/~bfields/linux
Pull nfsd updates from Bruce Fields:
"Highlights:
- support the NFSv4.2 SEEK operation (allowing clients to support
SEEK_HOLE/SEEK_DATA), thanks to Anna.
- end the grace period early in a number of cases, mitigating a
long-standing annoyance, thanks to Jeff
- improve SMP scalability, thanks to Trond"
* 'for-3.18' of git://linux-nfs.org/~bfields/linux: (55 commits)
nfsd: eliminate "to_delegation" define
NFSD: Implement SEEK
NFSD: Add generic v4.2 infrastructure
svcrdma: advertise the correct max payload
nfsd: introduce nfsd4_callback_ops
nfsd: split nfsd4_callback initialization and use
nfsd: introduce a generic nfsd4_cb
nfsd: remove nfsd4_callback.cb_op
nfsd: do not clear rpc_resp in nfsd4_cb_done_sequence
nfsd: fix nfsd4_cb_recall_done error handling
nfsd4: clarify how grace period ends
nfsd4: stop grace_time update at end of grace period
nfsd: skip subsequent UMH "create" operations after the first one for v4.0 clients
nfsd: set and test NFSD4_CLIENT_STABLE bit to reduce nfsdcltrack upcalls
nfsd: serialize nfsdcltrack upcalls for a particular client
nfsd: pass extra info in env vars to upcalls to allow for early grace period end
nfsd: add a v4_end_grace file to /proc/fs/nfsd
lockd: add a /proc/fs/lockd/nlm_end_grace file
nfsd: reject reclaim request when client has already sent RECLAIM_COMPLETE
nfsd: remove redundant boot_time parm from grace_done client tracking op
...
Diffstat (limited to 'fs/nfsd/nfs4xdr.c')
-rw-r--r-- | fs/nfsd/nfs4xdr.c | 75 |
1 files changed, 68 insertions, 7 deletions
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index b01f6e100ee8..eeea7a90eb87 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c | |||
@@ -31,13 +31,6 @@ | |||
31 | * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | 31 | * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
32 | * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | 32 | * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
33 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 33 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
34 | * | ||
35 | * TODO: Neil Brown made the following observation: We currently | ||
36 | * initially reserve NFSD_BUFSIZE space on the transmit queue and | ||
37 | * never release any of that until the request is complete. | ||
38 | * It would be good to calculate a new maximum response size while | ||
39 | * decoding the COMPOUND, and call svc_reserve with this number | ||
40 | * at the end of nfs4svc_decode_compoundargs. | ||
41 | */ | 34 | */ |
42 | 35 | ||
43 | #include <linux/slab.h> | 36 | #include <linux/slab.h> |
@@ -1521,6 +1514,22 @@ static __be32 nfsd4_decode_reclaim_complete(struct nfsd4_compoundargs *argp, str | |||
1521 | } | 1514 | } |
1522 | 1515 | ||
1523 | static __be32 | 1516 | static __be32 |
1517 | nfsd4_decode_seek(struct nfsd4_compoundargs *argp, struct nfsd4_seek *seek) | ||
1518 | { | ||
1519 | DECODE_HEAD; | ||
1520 | |||
1521 | status = nfsd4_decode_stateid(argp, &seek->seek_stateid); | ||
1522 | if (status) | ||
1523 | return status; | ||
1524 | |||
1525 | READ_BUF(8 + 4); | ||
1526 | p = xdr_decode_hyper(p, &seek->seek_offset); | ||
1527 | seek->seek_whence = be32_to_cpup(p); | ||
1528 | |||
1529 | DECODE_TAIL; | ||
1530 | } | ||
1531 | |||
1532 | static __be32 | ||
1524 | nfsd4_decode_noop(struct nfsd4_compoundargs *argp, void *p) | 1533 | nfsd4_decode_noop(struct nfsd4_compoundargs *argp, void *p) |
1525 | { | 1534 | { |
1526 | return nfs_ok; | 1535 | return nfs_ok; |
@@ -1593,6 +1602,20 @@ static nfsd4_dec nfsd4_dec_ops[] = { | |||
1593 | [OP_WANT_DELEGATION] = (nfsd4_dec)nfsd4_decode_notsupp, | 1602 | [OP_WANT_DELEGATION] = (nfsd4_dec)nfsd4_decode_notsupp, |
1594 | [OP_DESTROY_CLIENTID] = (nfsd4_dec)nfsd4_decode_destroy_clientid, | 1603 | [OP_DESTROY_CLIENTID] = (nfsd4_dec)nfsd4_decode_destroy_clientid, |
1595 | [OP_RECLAIM_COMPLETE] = (nfsd4_dec)nfsd4_decode_reclaim_complete, | 1604 | [OP_RECLAIM_COMPLETE] = (nfsd4_dec)nfsd4_decode_reclaim_complete, |
1605 | |||
1606 | /* new operations for NFSv4.2 */ | ||
1607 | [OP_ALLOCATE] = (nfsd4_dec)nfsd4_decode_notsupp, | ||
1608 | [OP_COPY] = (nfsd4_dec)nfsd4_decode_notsupp, | ||
1609 | [OP_COPY_NOTIFY] = (nfsd4_dec)nfsd4_decode_notsupp, | ||
1610 | [OP_DEALLOCATE] = (nfsd4_dec)nfsd4_decode_notsupp, | ||
1611 | [OP_IO_ADVISE] = (nfsd4_dec)nfsd4_decode_notsupp, | ||
1612 | [OP_LAYOUTERROR] = (nfsd4_dec)nfsd4_decode_notsupp, | ||
1613 | [OP_LAYOUTSTATS] = (nfsd4_dec)nfsd4_decode_notsupp, | ||
1614 | [OP_OFFLOAD_CANCEL] = (nfsd4_dec)nfsd4_decode_notsupp, | ||
1615 | [OP_OFFLOAD_STATUS] = (nfsd4_dec)nfsd4_decode_notsupp, | ||
1616 | [OP_READ_PLUS] = (nfsd4_dec)nfsd4_decode_notsupp, | ||
1617 | [OP_SEEK] = (nfsd4_dec)nfsd4_decode_seek, | ||
1618 | [OP_WRITE_SAME] = (nfsd4_dec)nfsd4_decode_notsupp, | ||
1596 | }; | 1619 | }; |
1597 | 1620 | ||
1598 | static inline bool | 1621 | static inline bool |
@@ -1670,6 +1693,14 @@ nfsd4_decode_compound(struct nfsd4_compoundargs *argp) | |||
1670 | readbytes += nfsd4_max_reply(argp->rqstp, op); | 1693 | readbytes += nfsd4_max_reply(argp->rqstp, op); |
1671 | } else | 1694 | } else |
1672 | max_reply += nfsd4_max_reply(argp->rqstp, op); | 1695 | max_reply += nfsd4_max_reply(argp->rqstp, op); |
1696 | /* | ||
1697 | * OP_LOCK may return a conflicting lock. (Special case | ||
1698 | * because it will just skip encoding this if it runs | ||
1699 | * out of xdr buffer space, and it is the only operation | ||
1700 | * that behaves this way.) | ||
1701 | */ | ||
1702 | if (op->opnum == OP_LOCK) | ||
1703 | max_reply += NFS4_OPAQUE_LIMIT; | ||
1673 | 1704 | ||
1674 | if (op->status) { | 1705 | if (op->status) { |
1675 | argp->opcnt = i+1; | 1706 | argp->opcnt = i+1; |
@@ -3764,6 +3795,22 @@ nfsd4_encode_test_stateid(struct nfsd4_compoundres *resp, __be32 nfserr, | |||
3764 | } | 3795 | } |
3765 | 3796 | ||
3766 | static __be32 | 3797 | static __be32 |
3798 | nfsd4_encode_seek(struct nfsd4_compoundres *resp, __be32 nfserr, | ||
3799 | struct nfsd4_seek *seek) | ||
3800 | { | ||
3801 | __be32 *p; | ||
3802 | |||
3803 | if (nfserr) | ||
3804 | return nfserr; | ||
3805 | |||
3806 | p = xdr_reserve_space(&resp->xdr, 4 + 8); | ||
3807 | *p++ = cpu_to_be32(seek->seek_eof); | ||
3808 | p = xdr_encode_hyper(p, seek->seek_pos); | ||
3809 | |||
3810 | return nfserr; | ||
3811 | } | ||
3812 | |||
3813 | static __be32 | ||
3767 | nfsd4_encode_noop(struct nfsd4_compoundres *resp, __be32 nfserr, void *p) | 3814 | nfsd4_encode_noop(struct nfsd4_compoundres *resp, __be32 nfserr, void *p) |
3768 | { | 3815 | { |
3769 | return nfserr; | 3816 | return nfserr; |
@@ -3835,6 +3882,20 @@ static nfsd4_enc nfsd4_enc_ops[] = { | |||
3835 | [OP_WANT_DELEGATION] = (nfsd4_enc)nfsd4_encode_noop, | 3882 | [OP_WANT_DELEGATION] = (nfsd4_enc)nfsd4_encode_noop, |
3836 | [OP_DESTROY_CLIENTID] = (nfsd4_enc)nfsd4_encode_noop, | 3883 | [OP_DESTROY_CLIENTID] = (nfsd4_enc)nfsd4_encode_noop, |
3837 | [OP_RECLAIM_COMPLETE] = (nfsd4_enc)nfsd4_encode_noop, | 3884 | [OP_RECLAIM_COMPLETE] = (nfsd4_enc)nfsd4_encode_noop, |
3885 | |||
3886 | /* NFSv4.2 operations */ | ||
3887 | [OP_ALLOCATE] = (nfsd4_enc)nfsd4_encode_noop, | ||
3888 | [OP_COPY] = (nfsd4_enc)nfsd4_encode_noop, | ||
3889 | [OP_COPY_NOTIFY] = (nfsd4_enc)nfsd4_encode_noop, | ||
3890 | [OP_DEALLOCATE] = (nfsd4_enc)nfsd4_encode_noop, | ||
3891 | [OP_IO_ADVISE] = (nfsd4_enc)nfsd4_encode_noop, | ||
3892 | [OP_LAYOUTERROR] = (nfsd4_enc)nfsd4_encode_noop, | ||
3893 | [OP_LAYOUTSTATS] = (nfsd4_enc)nfsd4_encode_noop, | ||
3894 | [OP_OFFLOAD_CANCEL] = (nfsd4_enc)nfsd4_encode_noop, | ||
3895 | [OP_OFFLOAD_STATUS] = (nfsd4_enc)nfsd4_encode_noop, | ||
3896 | [OP_READ_PLUS] = (nfsd4_enc)nfsd4_encode_noop, | ||
3897 | [OP_SEEK] = (nfsd4_enc)nfsd4_encode_seek, | ||
3898 | [OP_WRITE_SAME] = (nfsd4_enc)nfsd4_encode_noop, | ||
3838 | }; | 3899 | }; |
3839 | 3900 | ||
3840 | /* | 3901 | /* |