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 ...
This commit is contained in:
@@ -31,13 +31,6 @@
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* TODO: Neil Brown made the following observation: We currently
|
||||
* initially reserve NFSD_BUFSIZE space on the transmit queue and
|
||||
* never release any of that until the request is complete.
|
||||
* It would be good to calculate a new maximum response size while
|
||||
* decoding the COMPOUND, and call svc_reserve with this number
|
||||
* at the end of nfs4svc_decode_compoundargs.
|
||||
*/
|
||||
|
||||
#include <linux/slab.h>
|
||||
@@ -1520,6 +1513,22 @@ static __be32 nfsd4_decode_reclaim_complete(struct nfsd4_compoundargs *argp, str
|
||||
DECODE_TAIL;
|
||||
}
|
||||
|
||||
static __be32
|
||||
nfsd4_decode_seek(struct nfsd4_compoundargs *argp, struct nfsd4_seek *seek)
|
||||
{
|
||||
DECODE_HEAD;
|
||||
|
||||
status = nfsd4_decode_stateid(argp, &seek->seek_stateid);
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
READ_BUF(8 + 4);
|
||||
p = xdr_decode_hyper(p, &seek->seek_offset);
|
||||
seek->seek_whence = be32_to_cpup(p);
|
||||
|
||||
DECODE_TAIL;
|
||||
}
|
||||
|
||||
static __be32
|
||||
nfsd4_decode_noop(struct nfsd4_compoundargs *argp, void *p)
|
||||
{
|
||||
@@ -1593,6 +1602,20 @@ static nfsd4_dec nfsd4_dec_ops[] = {
|
||||
[OP_WANT_DELEGATION] = (nfsd4_dec)nfsd4_decode_notsupp,
|
||||
[OP_DESTROY_CLIENTID] = (nfsd4_dec)nfsd4_decode_destroy_clientid,
|
||||
[OP_RECLAIM_COMPLETE] = (nfsd4_dec)nfsd4_decode_reclaim_complete,
|
||||
|
||||
/* new operations for NFSv4.2 */
|
||||
[OP_ALLOCATE] = (nfsd4_dec)nfsd4_decode_notsupp,
|
||||
[OP_COPY] = (nfsd4_dec)nfsd4_decode_notsupp,
|
||||
[OP_COPY_NOTIFY] = (nfsd4_dec)nfsd4_decode_notsupp,
|
||||
[OP_DEALLOCATE] = (nfsd4_dec)nfsd4_decode_notsupp,
|
||||
[OP_IO_ADVISE] = (nfsd4_dec)nfsd4_decode_notsupp,
|
||||
[OP_LAYOUTERROR] = (nfsd4_dec)nfsd4_decode_notsupp,
|
||||
[OP_LAYOUTSTATS] = (nfsd4_dec)nfsd4_decode_notsupp,
|
||||
[OP_OFFLOAD_CANCEL] = (nfsd4_dec)nfsd4_decode_notsupp,
|
||||
[OP_OFFLOAD_STATUS] = (nfsd4_dec)nfsd4_decode_notsupp,
|
||||
[OP_READ_PLUS] = (nfsd4_dec)nfsd4_decode_notsupp,
|
||||
[OP_SEEK] = (nfsd4_dec)nfsd4_decode_seek,
|
||||
[OP_WRITE_SAME] = (nfsd4_dec)nfsd4_decode_notsupp,
|
||||
};
|
||||
|
||||
static inline bool
|
||||
@@ -1670,6 +1693,14 @@ nfsd4_decode_compound(struct nfsd4_compoundargs *argp)
|
||||
readbytes += nfsd4_max_reply(argp->rqstp, op);
|
||||
} else
|
||||
max_reply += nfsd4_max_reply(argp->rqstp, op);
|
||||
/*
|
||||
* OP_LOCK may return a conflicting lock. (Special case
|
||||
* because it will just skip encoding this if it runs
|
||||
* out of xdr buffer space, and it is the only operation
|
||||
* that behaves this way.)
|
||||
*/
|
||||
if (op->opnum == OP_LOCK)
|
||||
max_reply += NFS4_OPAQUE_LIMIT;
|
||||
|
||||
if (op->status) {
|
||||
argp->opcnt = i+1;
|
||||
@@ -3763,6 +3794,22 @@ nfsd4_encode_test_stateid(struct nfsd4_compoundres *resp, __be32 nfserr,
|
||||
return nfserr;
|
||||
}
|
||||
|
||||
static __be32
|
||||
nfsd4_encode_seek(struct nfsd4_compoundres *resp, __be32 nfserr,
|
||||
struct nfsd4_seek *seek)
|
||||
{
|
||||
__be32 *p;
|
||||
|
||||
if (nfserr)
|
||||
return nfserr;
|
||||
|
||||
p = xdr_reserve_space(&resp->xdr, 4 + 8);
|
||||
*p++ = cpu_to_be32(seek->seek_eof);
|
||||
p = xdr_encode_hyper(p, seek->seek_pos);
|
||||
|
||||
return nfserr;
|
||||
}
|
||||
|
||||
static __be32
|
||||
nfsd4_encode_noop(struct nfsd4_compoundres *resp, __be32 nfserr, void *p)
|
||||
{
|
||||
@@ -3835,6 +3882,20 @@ static nfsd4_enc nfsd4_enc_ops[] = {
|
||||
[OP_WANT_DELEGATION] = (nfsd4_enc)nfsd4_encode_noop,
|
||||
[OP_DESTROY_CLIENTID] = (nfsd4_enc)nfsd4_encode_noop,
|
||||
[OP_RECLAIM_COMPLETE] = (nfsd4_enc)nfsd4_encode_noop,
|
||||
|
||||
/* NFSv4.2 operations */
|
||||
[OP_ALLOCATE] = (nfsd4_enc)nfsd4_encode_noop,
|
||||
[OP_COPY] = (nfsd4_enc)nfsd4_encode_noop,
|
||||
[OP_COPY_NOTIFY] = (nfsd4_enc)nfsd4_encode_noop,
|
||||
[OP_DEALLOCATE] = (nfsd4_enc)nfsd4_encode_noop,
|
||||
[OP_IO_ADVISE] = (nfsd4_enc)nfsd4_encode_noop,
|
||||
[OP_LAYOUTERROR] = (nfsd4_enc)nfsd4_encode_noop,
|
||||
[OP_LAYOUTSTATS] = (nfsd4_enc)nfsd4_encode_noop,
|
||||
[OP_OFFLOAD_CANCEL] = (nfsd4_enc)nfsd4_encode_noop,
|
||||
[OP_OFFLOAD_STATUS] = (nfsd4_enc)nfsd4_encode_noop,
|
||||
[OP_READ_PLUS] = (nfsd4_enc)nfsd4_encode_noop,
|
||||
[OP_SEEK] = (nfsd4_enc)nfsd4_encode_seek,
|
||||
[OP_WRITE_SAME] = (nfsd4_enc)nfsd4_encode_noop,
|
||||
};
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user