Merge branch 'bugfixes'
* bugfixes: NFSv4.1/pnfs: Retry through MDS when getting bad length of data nfs/blocklayout: Fix bad using of page offset in bl_read_pagelist NFS: Return directly if encode_sessionid fail NFS: Fix bad checking of max taglen in callback request NFS: Fix bad defines of callback response maxsize NFS: Use NFS4_MAX_SESSIONID_LEN directly for decode/encode sessionid NFS: Remove unneeded NFS_DEBUG checking before define NFSDBG_FACILITY NFS: Remove the left function defines in callback.h NFS: Remove the left global variable nfs_callback_tcpport NFS: Get rid of the unneeded addr stored in callback arguments nfsroot: make nfsroot to accept the 1024 bytes long directory name
This commit is contained in:
commit
a85240d254
10 changed files with 44 additions and 52 deletions
|
@ -229,7 +229,7 @@ bl_read_pagelist(struct nfs_pgio_header *header)
|
|||
struct parallel_io *par;
|
||||
loff_t f_offset = header->args.offset;
|
||||
size_t bytes_left = header->args.count;
|
||||
unsigned int pg_offset, pg_len;
|
||||
unsigned int pg_offset = header->args.pgbase, pg_len;
|
||||
struct page **pages = header->args.pages;
|
||||
int pg_index = header->args.pgbase >> PAGE_CACHE_SHIFT;
|
||||
const bool is_dio = (header->dreq != NULL);
|
||||
|
@ -262,7 +262,6 @@ bl_read_pagelist(struct nfs_pgio_header *header)
|
|||
extent_length = be.be_length - (isect - be.be_f_offset);
|
||||
}
|
||||
|
||||
pg_offset = f_offset & ~PAGE_CACHE_MASK;
|
||||
if (is_dio) {
|
||||
if (pg_offset + bytes_left > PAGE_CACHE_SIZE)
|
||||
pg_len = PAGE_CACHE_SIZE - pg_offset;
|
||||
|
@ -273,9 +272,6 @@ bl_read_pagelist(struct nfs_pgio_header *header)
|
|||
pg_len = PAGE_CACHE_SIZE;
|
||||
}
|
||||
|
||||
isect += (pg_offset >> SECTOR_SHIFT);
|
||||
extent_length -= (pg_offset >> SECTOR_SHIFT);
|
||||
|
||||
if (is_hole(&be)) {
|
||||
bio = bl_submit_bio(READ, bio);
|
||||
/* Fill hole w/ zeroes w/o accessing device */
|
||||
|
@ -301,6 +297,7 @@ bl_read_pagelist(struct nfs_pgio_header *header)
|
|||
extent_length -= (pg_len >> SECTOR_SHIFT);
|
||||
f_offset += pg_len;
|
||||
bytes_left -= pg_len;
|
||||
pg_offset = 0;
|
||||
}
|
||||
if ((isect << SECTOR_SHIFT) >= header->inode->i_size) {
|
||||
header->res.eof = 1;
|
||||
|
|
|
@ -61,7 +61,6 @@ struct cb_compound_hdr_res {
|
|||
};
|
||||
|
||||
struct cb_getattrargs {
|
||||
struct sockaddr *addr;
|
||||
struct nfs_fh fh;
|
||||
uint32_t bitmap[2];
|
||||
};
|
||||
|
@ -76,7 +75,6 @@ struct cb_getattrres {
|
|||
};
|
||||
|
||||
struct cb_recallargs {
|
||||
struct sockaddr *addr;
|
||||
struct nfs_fh fh;
|
||||
nfs4_stateid stateid;
|
||||
uint32_t truncate;
|
||||
|
@ -119,9 +117,6 @@ extern __be32 nfs4_callback_sequence(struct cb_sequenceargs *args,
|
|||
struct cb_sequenceres *res,
|
||||
struct cb_process_state *cps);
|
||||
|
||||
extern int nfs41_validate_delegation_stateid(struct nfs_delegation *delegation,
|
||||
const nfs4_stateid *stateid);
|
||||
|
||||
#define RCA4_TYPE_MASK_RDATA_DLG 0
|
||||
#define RCA4_TYPE_MASK_WDATA_DLG 1
|
||||
#define RCA4_TYPE_MASK_DIR_DLG 2
|
||||
|
@ -134,7 +129,6 @@ extern int nfs41_validate_delegation_stateid(struct nfs_delegation *delegation,
|
|||
#define RCA4_TYPE_MASK_ALL 0xf31f
|
||||
|
||||
struct cb_recallanyargs {
|
||||
struct sockaddr *craa_addr;
|
||||
uint32_t craa_objs_to_keep;
|
||||
uint32_t craa_type_mask;
|
||||
};
|
||||
|
@ -144,7 +138,6 @@ extern __be32 nfs4_callback_recallany(struct cb_recallanyargs *args,
|
|||
struct cb_process_state *cps);
|
||||
|
||||
struct cb_recallslotargs {
|
||||
struct sockaddr *crsa_addr;
|
||||
uint32_t crsa_target_highest_slotid;
|
||||
};
|
||||
extern __be32 nfs4_callback_recallslot(struct cb_recallslotargs *args,
|
||||
|
@ -152,7 +145,6 @@ extern __be32 nfs4_callback_recallslot(struct cb_recallslotargs *args,
|
|||
struct cb_process_state *cps);
|
||||
|
||||
struct cb_layoutrecallargs {
|
||||
struct sockaddr *cbl_addr;
|
||||
uint32_t cbl_recall_type;
|
||||
uint32_t cbl_layout_type;
|
||||
uint32_t cbl_layoutchanged;
|
||||
|
@ -196,9 +188,6 @@ extern __be32 nfs4_callback_recall(struct cb_recallargs *args, void *dummy,
|
|||
#if IS_ENABLED(CONFIG_NFS_V4)
|
||||
extern int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt);
|
||||
extern void nfs_callback_down(int minorversion, struct net *net);
|
||||
extern int nfs4_validate_delegation_stateid(struct nfs_delegation *delegation,
|
||||
const nfs4_stateid *stateid);
|
||||
extern int nfs4_set_callback_sessionid(struct nfs_client *clp);
|
||||
#endif /* CONFIG_NFS_V4 */
|
||||
/*
|
||||
* nfs41: Callbacks are expected to not cause substantial latency,
|
||||
|
@ -209,6 +198,5 @@ extern int nfs4_set_callback_sessionid(struct nfs_client *clp);
|
|||
#define NFS41_BC_MAX_CALLBACKS 1
|
||||
|
||||
extern unsigned int nfs_callback_set_tcpport;
|
||||
extern unsigned short nfs_callback_tcpport;
|
||||
|
||||
#endif /* __LINUX_FS_NFS_CALLBACK_H */
|
||||
|
|
|
@ -17,9 +17,7 @@
|
|||
#include "nfs4session.h"
|
||||
#include "nfs4trace.h"
|
||||
|
||||
#ifdef NFS_DEBUG
|
||||
#define NFSDBG_FACILITY NFSDBG_CALLBACK
|
||||
#endif
|
||||
|
||||
__be32 nfs4_callback_getattr(struct cb_getattrargs *args,
|
||||
struct cb_getattrres *res,
|
||||
|
|
|
@ -18,19 +18,21 @@
|
|||
#include "internal.h"
|
||||
#include "nfs4session.h"
|
||||
|
||||
#define CB_OP_TAGLEN_MAXSZ (512)
|
||||
#define CB_OP_HDR_RES_MAXSZ (2 + CB_OP_TAGLEN_MAXSZ)
|
||||
#define CB_OP_GETATTR_BITMAP_MAXSZ (4)
|
||||
#define CB_OP_GETATTR_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ + \
|
||||
CB_OP_GETATTR_BITMAP_MAXSZ + \
|
||||
2 + 2 + 3 + 3)
|
||||
#define CB_OP_RECALL_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ)
|
||||
#define CB_OP_TAGLEN_MAXSZ (512)
|
||||
#define CB_OP_HDR_RES_MAXSZ (2 * 4) // opcode, status
|
||||
#define CB_OP_GETATTR_BITMAP_MAXSZ (4 * 4) // bitmap length, 3 bitmaps
|
||||
#define CB_OP_GETATTR_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ + \
|
||||
CB_OP_GETATTR_BITMAP_MAXSZ + \
|
||||
/* change, size, ctime, mtime */\
|
||||
(2 + 2 + 3 + 3) * 4)
|
||||
#define CB_OP_RECALL_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ)
|
||||
|
||||
#if defined(CONFIG_NFS_V4_1)
|
||||
#define CB_OP_LAYOUTRECALL_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ)
|
||||
#define CB_OP_DEVICENOTIFY_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ)
|
||||
#define CB_OP_SEQUENCE_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ + \
|
||||
4 + 1 + 3)
|
||||
NFS4_MAX_SESSIONID_LEN + \
|
||||
(1 + 3) * 4) // seqid, 3 slotids
|
||||
#define CB_OP_RECALLANY_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ)
|
||||
#define CB_OP_RECALLSLOT_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ)
|
||||
#endif /* CONFIG_NFS_V4_1 */
|
||||
|
@ -157,7 +159,7 @@ static __be32 decode_compound_hdr_arg(struct xdr_stream *xdr, struct cb_compound
|
|||
if (unlikely(status != 0))
|
||||
return status;
|
||||
/* We do not like overly long tags! */
|
||||
if (hdr->taglen > CB_OP_TAGLEN_MAXSZ - 12) {
|
||||
if (hdr->taglen > CB_OP_TAGLEN_MAXSZ) {
|
||||
printk("NFS: NFSv4 CALLBACK %s: client sent tag of length %u\n",
|
||||
__func__, hdr->taglen);
|
||||
return htonl(NFS4ERR_RESOURCE);
|
||||
|
@ -198,7 +200,6 @@ static __be32 decode_getattr_args(struct svc_rqst *rqstp, struct xdr_stream *xdr
|
|||
status = decode_fh(xdr, &args->fh);
|
||||
if (unlikely(status != 0))
|
||||
goto out;
|
||||
args->addr = svc_addr(rqstp);
|
||||
status = decode_bitmap(xdr, args->bitmap);
|
||||
out:
|
||||
dprintk("%s: exit with status = %d\n", __func__, ntohl(status));
|
||||
|
@ -210,7 +211,6 @@ static __be32 decode_recall_args(struct svc_rqst *rqstp, struct xdr_stream *xdr,
|
|||
__be32 *p;
|
||||
__be32 status;
|
||||
|
||||
args->addr = svc_addr(rqstp);
|
||||
status = decode_stateid(xdr, &args->stateid);
|
||||
if (unlikely(status != 0))
|
||||
goto out;
|
||||
|
@ -236,7 +236,6 @@ static __be32 decode_layoutrecall_args(struct svc_rqst *rqstp,
|
|||
__be32 status = 0;
|
||||
uint32_t iomode;
|
||||
|
||||
args->cbl_addr = svc_addr(rqstp);
|
||||
p = read_buf(xdr, 4 * sizeof(uint32_t));
|
||||
if (unlikely(p == NULL)) {
|
||||
status = htonl(NFS4ERR_BADXDR);
|
||||
|
@ -383,13 +382,12 @@ static __be32 decode_sessionid(struct xdr_stream *xdr,
|
|||
struct nfs4_sessionid *sid)
|
||||
{
|
||||
__be32 *p;
|
||||
int len = NFS4_MAX_SESSIONID_LEN;
|
||||
|
||||
p = read_buf(xdr, len);
|
||||
p = read_buf(xdr, NFS4_MAX_SESSIONID_LEN);
|
||||
if (unlikely(p == NULL))
|
||||
return htonl(NFS4ERR_RESOURCE);
|
||||
|
||||
memcpy(sid->data, p, len);
|
||||
memcpy(sid->data, p, NFS4_MAX_SESSIONID_LEN);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -500,7 +498,6 @@ static __be32 decode_recallany_args(struct svc_rqst *rqstp,
|
|||
uint32_t bitmap[2];
|
||||
__be32 *p, status;
|
||||
|
||||
args->craa_addr = svc_addr(rqstp);
|
||||
p = read_buf(xdr, 4);
|
||||
if (unlikely(p == NULL))
|
||||
return htonl(NFS4ERR_BADXDR);
|
||||
|
@ -519,7 +516,6 @@ static __be32 decode_recallslot_args(struct svc_rqst *rqstp,
|
|||
{
|
||||
__be32 *p;
|
||||
|
||||
args->crsa_addr = svc_addr(rqstp);
|
||||
p = read_buf(xdr, 4);
|
||||
if (unlikely(p == NULL))
|
||||
return htonl(NFS4ERR_BADXDR);
|
||||
|
@ -684,13 +680,12 @@ static __be32 encode_sessionid(struct xdr_stream *xdr,
|
|||
const struct nfs4_sessionid *sid)
|
||||
{
|
||||
__be32 *p;
|
||||
int len = NFS4_MAX_SESSIONID_LEN;
|
||||
|
||||
p = xdr_reserve_space(xdr, len);
|
||||
p = xdr_reserve_space(xdr, NFS4_MAX_SESSIONID_LEN);
|
||||
if (unlikely(p == NULL))
|
||||
return htonl(NFS4ERR_RESOURCE);
|
||||
|
||||
memcpy(p, sid, len);
|
||||
memcpy(p, sid, NFS4_MAX_SESSIONID_LEN);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -704,7 +699,9 @@ static __be32 encode_cb_sequence_res(struct svc_rqst *rqstp,
|
|||
if (unlikely(status != 0))
|
||||
goto out;
|
||||
|
||||
encode_sessionid(xdr, &res->csr_sessionid);
|
||||
status = encode_sessionid(xdr, &res->csr_sessionid);
|
||||
if (status)
|
||||
goto out;
|
||||
|
||||
p = xdr_reserve_space(xdr, 4 * sizeof(uint32_t));
|
||||
if (unlikely(p == NULL))
|
||||
|
|
|
@ -16,9 +16,7 @@
|
|||
#include <linux/nfs_fs.h>
|
||||
#include "internal.h"
|
||||
|
||||
#ifdef NFS_DEBUG
|
||||
# define NFSDBG_FACILITY NFSDBG_MOUNT
|
||||
#endif
|
||||
#define NFSDBG_FACILITY NFSDBG_MOUNT
|
||||
|
||||
/*
|
||||
* Defined by RFC 1094, section A.3; and RFC 1813, section 5.1.4
|
||||
|
|
|
@ -90,7 +90,7 @@
|
|||
#define NFS_DEF_OPTIONS "vers=2,udp,rsize=4096,wsize=4096"
|
||||
|
||||
/* Parameters passed from the kernel command line */
|
||||
static char nfs_root_parms[256] __initdata = "";
|
||||
static char nfs_root_parms[NFS_MAXPATHLEN + 1] __initdata = "";
|
||||
|
||||
/* Text-based mount options passed to super.c */
|
||||
static char nfs_root_options[256] __initdata = NFS_DEF_OPTIONS;
|
||||
|
|
|
@ -1912,12 +1912,13 @@ static void pnfs_ld_handle_write_error(struct nfs_pgio_header *hdr)
|
|||
*/
|
||||
void pnfs_ld_write_done(struct nfs_pgio_header *hdr)
|
||||
{
|
||||
trace_nfs4_pnfs_write(hdr, hdr->pnfs_error);
|
||||
if (!hdr->pnfs_error) {
|
||||
if (likely(!hdr->pnfs_error)) {
|
||||
pnfs_set_layoutcommit(hdr->inode, hdr->lseg,
|
||||
hdr->mds_offset + hdr->res.count);
|
||||
hdr->mds_ops->rpc_call_done(&hdr->task, hdr);
|
||||
} else
|
||||
}
|
||||
trace_nfs4_pnfs_write(hdr, hdr->pnfs_error);
|
||||
if (unlikely(hdr->pnfs_error))
|
||||
pnfs_ld_handle_write_error(hdr);
|
||||
hdr->mds_ops->rpc_release(hdr);
|
||||
}
|
||||
|
@ -2028,11 +2029,12 @@ static void pnfs_ld_handle_read_error(struct nfs_pgio_header *hdr)
|
|||
*/
|
||||
void pnfs_ld_read_done(struct nfs_pgio_header *hdr)
|
||||
{
|
||||
trace_nfs4_pnfs_read(hdr, hdr->pnfs_error);
|
||||
if (likely(!hdr->pnfs_error)) {
|
||||
__nfs4_read_done_cb(hdr);
|
||||
hdr->mds_ops->rpc_call_done(&hdr->task, hdr);
|
||||
} else
|
||||
}
|
||||
trace_nfs4_pnfs_read(hdr, hdr->pnfs_error);
|
||||
if (unlikely(hdr->pnfs_error))
|
||||
pnfs_ld_handle_read_error(hdr);
|
||||
hdr->mds_ops->rpc_release(hdr);
|
||||
}
|
||||
|
|
|
@ -246,6 +246,13 @@ static void nfs_readpage_retry(struct rpc_task *task,
|
|||
nfs_set_pgio_error(hdr, -EIO, argp->offset);
|
||||
return;
|
||||
}
|
||||
|
||||
/* For non rpc-based layout drivers, retry-through-MDS */
|
||||
if (!task->tk_ops) {
|
||||
hdr->pnfs_error = -EAGAIN;
|
||||
return;
|
||||
}
|
||||
|
||||
/* Yes, so retry the read at the end of the hdr */
|
||||
hdr->mds_offset += resp->count;
|
||||
argp->offset += resp->count;
|
||||
|
@ -268,7 +275,7 @@ static void nfs_readpage_result(struct rpc_task *task,
|
|||
hdr->good_bytes = bound - hdr->io_start;
|
||||
}
|
||||
spin_unlock(&hdr->lock);
|
||||
} else if (hdr->res.count != hdr->args.count)
|
||||
} else if (hdr->res.count < hdr->args.count)
|
||||
nfs_readpage_retry(task, hdr);
|
||||
}
|
||||
|
||||
|
|
|
@ -2816,7 +2816,6 @@ out_invalid_transport_udp:
|
|||
* NFS client for backwards compatibility
|
||||
*/
|
||||
unsigned int nfs_callback_set_tcpport;
|
||||
unsigned short nfs_callback_tcpport;
|
||||
/* Default cache timeout is 10 minutes */
|
||||
unsigned int nfs_idmap_cache_timeout = 600;
|
||||
/* Turn off NFSv4 uid/gid mapping when using AUTH_SYS */
|
||||
|
@ -2827,7 +2826,6 @@ char nfs4_client_id_uniquifier[NFS4_CLIENT_ID_UNIQ_LEN] = "";
|
|||
bool recover_lost_locks = false;
|
||||
|
||||
EXPORT_SYMBOL_GPL(nfs_callback_set_tcpport);
|
||||
EXPORT_SYMBOL_GPL(nfs_callback_tcpport);
|
||||
EXPORT_SYMBOL_GPL(nfs_idmap_cache_timeout);
|
||||
EXPORT_SYMBOL_GPL(nfs4_disable_idmapping);
|
||||
EXPORT_SYMBOL_GPL(max_session_slots);
|
||||
|
|
|
@ -1505,6 +1505,13 @@ static void nfs_writeback_result(struct rpc_task *task,
|
|||
task->tk_status = -EIO;
|
||||
return;
|
||||
}
|
||||
|
||||
/* For non rpc-based layout drivers, retry-through-MDS */
|
||||
if (!task->tk_ops) {
|
||||
hdr->pnfs_error = -EAGAIN;
|
||||
return;
|
||||
}
|
||||
|
||||
/* Was this an NFSv2 write or an NFSv3 stable write? */
|
||||
if (resp->verf->committed != NFS_UNSTABLE) {
|
||||
/* Resend from where the server left off */
|
||||
|
|
Loading…
Reference in a new issue