Linux 4.9.322
Greg Kroah-Hartman
maintainerI'm announcing the release of the 4.9.322 kernel.
All users of the 4.9 kernel series must upgrade.
The updated 4.9.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.9.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 arch/arm/xen/p2m.c | 6 - arch/powerpc/include/asm/ppc-opcode.h | 4 arch/powerpc/platforms/powernv/powernv.h | 2 arch/powerpc/platforms/powernv/rng.c | 91 ++++++++++++++++--- arch/powerpc/platforms/powernv/setup.c | 2 drivers/block/xen-blkfront.c | 52 +++++++---- drivers/hwmon/ibmaem.c | 12 +- drivers/md/raid5.c | 1 drivers/net/bonding/bond_3ad.c | 3 drivers/net/bonding/bond_alb.c | 2 drivers/net/caif/caif_virtio.c | 10 +- drivers/net/usb/ax88179_178a.c | 101 ++++++++++++++++----- drivers/net/usb/qmi_wwan.c | 6 + drivers/net/usb/usbnet.c | 23 +++- drivers/net/xen-netfront.c | 55 +++++++++++ drivers/nfc/nfcmrvl/i2c.c | 6 - drivers/nfc/nfcmrvl/spi.c | 6 - drivers/nfc/nxp-nci/i2c.c | 3 drivers/xen/gntdev.c | 144 +++++++++++++++++++++---------- include/linux/skbuff.h | 1 net/core/skbuff.c | 9 + net/ipv6/sit.c | 10 -- net/netfilter/nft_set_hash.c | 2 net/rose/rose_timer.c | 34 ++++--- net/sunrpc/xdr.c | 2 26 files changed, 439 insertions(+), 150 deletions(-)
Carlo Lobrano (1):
net: usb: qmi_wwan: add Telit 0x1060 composition
Chuck Lever (1):
SUNRPC: Fix READ_PLUS crasher
Daniele Palmas (3):
net: usb: qmi_wwan: add Telit 0x1260 and 0x1261 compositions
net: usb: qmi_wwan: add Telit LE910Cx 0x1230 composition
net: usb: qmi_wwan: add Telit 0x1070 compositionDemi Marie Obenour (1):
xen/gntdev: Avoid blocking in unmap_grant_pages()
Duoming Zhou (1):
net: rose: fix UAF bugs caused by timer handler
Eric Dumazet (1):
net: bonding: fix possible NULL deref in rlb code
Greg Kroah-Hartman (1):
Linux 4.9.322
Ilya Lesokhin (1):
net: Rename and export copy_skb_header
Jason A. Donenfeld (1):
powerpc/powernv: wire up rng during setup_arch
Jason Wang (1):
caif_virtio: fix race between virtio_device_ready() and ndo_open()
Jose Alonso (1):
net: usb: ax88179_178a: Fix packet receiving
Jörgen Storvist (1):
qmi_wwan: Added support for Telit LN940 series
Krzysztof Kozlowski (1):
nfc: nfcmrvl: Fix irq_of_parse_and_map() return value
Michael Walle (1):
NFC: nxp-nci: Don't issue a zero length i2c_master_read()
Mikulas Patocka (1):
dm raid: fix KASAN warning in raid5_add_disks
Oleksandr Tyshchenko (1):
xen/arm: Fix race in RB-tree based P2M accounting
Oliver Neukum (2):
usbnet: make sure no NULL pointer is passed through
usbnet: fix memory allocation in helpers
Pablo Neira Ayuso (1):
netfilter: nft_dynset: restore set element counter when failing to update
Roger Pau Monne (4):
xen/blkfront: fix leaking data in shared pages xen/netfront: fix leaking data in shared pages xen/netfront: force data bouncing when backend is untrusted xen/blkfront: force data bouncing when backend is untrusted
Yang Yingliang (1):
hwmon: (ibmaem) don't call platform_device_del() if platform_device_add() fails
Yevhen Orlov (1):
net: bonding: fix use-after-free after 802.3ad slave unbind
katrinzhou (1):
ipv6/sit: fix ipip6_tunnel_get_prl return value
kernel test robot (1):
sit: use min
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,6 +1,6 @@ VERSION = 4 PATCHLEVEL = 9 -SUBLEVEL = 321 +SUBLEVEL = 322 EXTRAVERSION = NAME = Roaring Lionus
arch/arm/xen/p2m.c +4 -2
@@ -61,11 +61,12 @@ static int xen_add_phys_to_mach_entry(struct xen_p2m_entry *new)unsigned long __pfn_to_mfn (unsigned long pfn) { -struct rb_node *n = phys_to_mach.rb_node; +struct rb_node *n;struct xen_p2m_entry *entry;unsigned long irqflags;read_lock_irqsave (&p2m_lock, irqflags); + n = phys_to_mach.rb_node;while (n) { entry = rb_entry(n, struct xen_p2m_entry, rbnode_phys); if (entry->pfn <= pfn &&
@@ -151,10 +152,11 @@ bool __set_phys_to_machine_multi(unsigned long pfn,int rc;unsigned long irqflags;struct xen_p2m_entry *p2m_entry; -struct rb_node *n = phys_to_mach.rb_node; +struct rb_node *n;if (mfn ==INVALID_P2M_ENTRY ) {write_lock_irqsave (&p2m_lock, irqflags); + n = phys_to_mach.rb_node;while (n) { p2m_entry = rb_entry(n, struct xen_p2m_entry, rbnode_phys); if (p2m_entry->pfn <= pfn &&
arch/powerpc/include/asm/ppc-opcode.h +4 -0
@@ -134,6 +134,7 @@#define PPC_INST_COPY 0x7c00060c#define PPC_INST_COPY_FIRST 0x7c20060c#define PPC_INST_CP_ABORT 0x7c00068c +#define PPC_INST_DARN 0x7c0005e6#define PPC_INST_DCBA 0x7c0005ec#define PPC_INST_DCBA_MASK 0xfc0007fe#define PPC_INST_DCBAL 0x7c2005ec
@@ -328,6 +329,9 @@/* Deal with instructions that older assemblers aren't aware of */ #define PPC_CP_ABORT stringify_in_c(.long PPC_INST_CP_ABORT) +#define PPC_DARN (t, l) stringify_in_c(.long PPC_INST_DARN | \ + ___PPC_RT(t) | \ + (((l) & 0x3) << 16))#define PPC_DCBAL (a, b) stringify_in_c(.long PPC_INST_DCBAL | \ __PPC_RA(a) | __PPC_RB(b))#define PPC_DCBZL (a, b) stringify_in_c(.long PPC_INST_DCBZL | \
arch/powerpc/platforms/powernv/powernv.h +2 -0
@@ -27,4 +27,6 @@ extern void opal_event_shutdown(void);bool cpu_core_split_required (void ); +void pnv_rng_init (void ); +#endif /* _POWERNV_H */
arch/powerpc/platforms/powernv/rng.c +77 -14
145 lines not on this page · raw message
arch/powerpc/platforms/powernv/setup.c +2 -0
@@ -168,6 +168,8 @@ static void __init pnv_setup_arch(void) powersave_nap =1 ;/* XXX PMCS */ + +pnv_rng_init (); }static void __init pnv_init (void )
drivers/block/xen-blkfront.c +34 -18
164 lines not on this page · raw message
drivers/hwmon/ibmaem.c +8 -4
@@ -563,7 +563,7 @@ static int aem_init_aem1_inst(struct aem_ipmi_data *probe, u8 module_handle) res =platform_device_add (data->pdev);if (res) - goto ipmi_err; + goto dev_add_err;platform_set_drvdata (data->pdev, data);
@@ -611,7 +611,9 @@ static int aem_init_aem1_inst(struct aem_ipmi_data *probe, u8 module_handle)ipmi_destroy_user (data->ipmi.user); ipmi_err:platform_set_drvdata (data->pdev,NULL ); -platform_device_unregister (data->pdev); +platform_device_del (data->pdev); +dev_add_err: +platform_device_put (data->pdev); dev_err:ida_simple_remove (&aem_ida, data->id); id_err:
@@ -703,7 +705,7 @@ static int aem_init_aem2_inst(struct aem_ipmi_data *probe, res =platform_device_add (data->pdev);if (res) - goto ipmi_err; + goto dev_add_err;platform_set_drvdata (data->pdev, data);
@@ -751,7 +753,9 @@ static int aem_init_aem2_inst(struct aem_ipmi_data *probe,ipmi_destroy_user (data->ipmi.user); ipmi_err:platform_set_drvdata (data->pdev,NULL ); -platform_device_unregister (data->pdev); +platform_device_del (data->pdev); +dev_add_err: +platform_device_put (data->pdev); dev_err:ida_simple_remove (&aem_ida, data->id); id_err:
drivers/md/raid5.c +1 -0
@@ -7322,6 +7322,7 @@ static int raid5_add_disk(struct mddev *mddev, struct md_rdev *rdev)*/ if (rdev->saved_raid_disk >=0 && rdev->saved_raid_disk >= first && + rdev->saved_raid_disk <= last && conf->disks[rdev->saved_raid_disk].rdev ==NULL ) first = rdev->saved_raid_disk;
drivers/net/bonding/bond_3ad.c +2 -1
@@ -2163,7 +2163,8 @@ void bond_3ad_unbind_slave(struct slave *slave) temp_aggregator->num_of_ports--;if (__agg_active_ports (temp_aggregator) ==0 ) { select_new_active_agg = temp_aggregator->is_active; -ad_clear_agg (temp_aggregator); +if (temp_aggregator->num_of_ports ==0 ) +ad_clear_agg (temp_aggregator);if (select_new_active_agg) {netdev_info (bond->dev,"Removing an active aggregator\n" );/* select new active aggregator */
drivers/net/bonding/bond_alb.c +1 -1
@@ -1264,12 +1264,12 @@ int bond_alb_initialize(struct bonding *bond, int rlb_enabled)return res;if (rlb_enabled) { - bond->alb_info.rlb_enabled =1 ; res =rlb_initialize (bond);if (res) {tlb_deinitialize (bond);return res; } + bond->alb_info.rlb_enabled =1 ; }else { bond->alb_info.rlb_enabled =0 ; }
drivers/net/caif/caif_virtio.c +9 -1
@@ -727,13 +727,21 @@ static int cfv_probe(struct virtio_device *vdev)/* Carrier is off until netdevice is opened */ netif_carrier_off (netdev); +/* serialize netdev register + virtio_device_ready() with ndo_open() */ +rtnl_lock (); +/* register Netdev */ - err =register_netdev (netdev); + err =register_netdevice (netdev);if (err) { +rtnl_unlock ();dev_err (&vdev->dev,"Unable to register netdev (%d)\n" , err); goto err; } +virtio_device_ready (vdev); + +rtnl_unlock (); +debugfs_init (cfv);return 0 ;
drivers/net/usb/ax88179_178a.c +76 -25
133 lines not on this page · raw message
drivers/net/usb/qmi_wwan.c +6 -0
@@ -928,10 +928,16 @@ static const struct usb_device_id products[] = { {QMI_QUIRK_SET_DTR(0x1bc7, 0x1031, 3)}, /* Telit LE910C1-EUX */ {QMI_QUIRK_SET_DTR(0x1bc7, 0x1040, 2)}, /* Telit LE922A */ {QMI_QUIRK_SET_DTR(0x1bc7, 0x1050, 2)}, /* Telit FN980 */ + {QMI_QUIRK_SET_DTR(0x1bc7, 0x1060, 2)}, /* Telit LN920 */ + {QMI_QUIRK_SET_DTR(0x1bc7, 0x1070, 2)}, /* Telit FN990 */ {QMI_FIXED_INTF(0x1bc7, 0x1100, 3)}, /* Telit ME910 */ {QMI_FIXED_INTF(0x1bc7, 0x1101, 3)}, /* Telit ME910 dual modem */ {QMI_FIXED_INTF(0x1bc7, 0x1200, 5)}, /* Telit LE920 */ {QMI_QUIRK_SET_DTR(0x1bc7, 0x1201, 2)}, /* Telit LE920, LE920A4 */ + {QMI_QUIRK_SET_DTR(0x1bc7, 0x1230, 2)}, /* Telit LE910Cx */ + {QMI_QUIRK_SET_DTR(0x1bc7, 0x1260, 2)}, /* Telit LE910Cx */ + {QMI_QUIRK_SET_DTR(0x1bc7, 0x1261, 2)}, /* Telit LE910Cx */ + {QMI_QUIRK_SET_DTR(0x1bc7, 0x1900, 1)}, /* Telit LN940 series */ {QMI_FIXED_INTF(0x1c9e, 0x9801, 3)}, /* Telewell TW-3G HSPA+ */ {QMI_FIXED_INTF(0x1c9e, 0x9803, 4)}, /* Telewell TW-3G HSPA+ */ {QMI_FIXED_INTF(0x1c9e, 0x9b01, 3)}, /* XS Stick W100-2 from 4G Systems */
drivers/net/usb/usbnet.c +17 -6
@@ -1951,8 +1951,8 @@ static int __usbnet_read_cmd(struct usbnet *dev, u8 cmd, u8 reqtype," value=0x%04x index=0x%04x size=%d\n" , cmd, reqtype, value, index, size); -if (data) { - buf =kmalloc (size,GFP_KERNEL ); +if (size) { + buf =kmalloc (size,GFP_NOIO );if (!buf) goto out; }
@@ -1960,8 +1960,13 @@ static int __usbnet_read_cmd(struct usbnet *dev, u8 cmd, u8 reqtype, err =usb_control_msg (dev->udev,usb_rcvctrlpipe (dev->udev,0 ), cmd, reqtype, value, index, buf, size,USB_CTRL_GET_TIMEOUT ); -if (err >0 && err <= size) -memcpy (data, buf, err); +if (err >0 && err <= size) { +if (data) +memcpy (data, buf, err); +else +netdev_dbg (dev->net, +"Huh? Data requested but thrown away.\n" ); + }kfree (buf); out:return err;
@@ -1979,10 +1984,16 @@ static int __usbnet_write_cmd(struct usbnet *dev, u8 cmd, u8 reqtype, cmd, reqtype, value, index, size);if (data) { - buf =kmemdup (data, size,GFP_KERNEL ); + buf =kmemdup (data, size,GFP_NOIO );if (!buf) goto out; - } + }else { +if (size) { +WARN_ON_ONCE (1 ); + err = -EINVAL ; + goto out; + } + } err = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0), cmd, reqtype, value, index, buf, size,
drivers/net/xen-netfront.c +52 -3
101 lines not on this page · raw message
drivers/nfc/nfcmrvl/i2c.c +3 -3
@@ -186,9 +186,9 @@ static int nfcmrvl_i2c_parse_dt(struct device_node *node, pdata->irq_polarity =IRQF_TRIGGER_RISING ; ret =irq_of_parse_and_map (node,0 ); -if (ret <0 ) { -pr_err ("Unable to get irq, error: %d\n" , ret); -return ret; +if (!ret) { +pr_err ("Unable to get irq\n" ); +return -EINVAL ; } pdata->irq = ret;
drivers/nfc/nfcmrvl/spi.c +3 -3
@@ -130,9 +130,9 @@ static int nfcmrvl_spi_parse_dt(struct device_node *node, } ret =irq_of_parse_and_map (node,0 ); -if (ret <0 ) { -pr_err ("Unable to get irq, error: %d\n" , ret); -return ret; +if (!ret) { +pr_err ("Unable to get irq\n" ); +return -EINVAL ; } pdata->irq = ret;
drivers/nfc/nxp-nci/i2c.c +3 -0
@@ -180,6 +180,9 @@ static int nxp_nci_i2c_nci_read(struct nxp_nci_i2c_phy *phy,memcpy (skb_put (*skb,NCI_CTRL_HDR_SIZE ), (void *) &header,NCI_CTRL_HDR_SIZE ); +if (!header.plen) +return 0 ; + r =i2c_master_recv (client,skb_put (*skb, header.plen), header.plen);if (r != header.plen) { nfc_err(&client->dev,
drivers/xen/gntdev.c +102 -42
280 lines not on this page · raw message
include/linux/skbuff.h +1 -0
@@ -975,6 +975,7 @@ static inline struct sk_buff *alloc_skb_head(gfp_t priority)struct sk_buff *skb_morph (struct sk_buff *dst,struct sk_buff *src);int skb_copy_ubufs (struct sk_buff *skb,gfp_t gfp_mask);struct sk_buff *skb_clone (struct sk_buff *skb,gfp_t priority); +void skb_copy_header (struct sk_buff *new,const struct sk_buff *old);struct sk_buff *skb_copy (const struct sk_buff *skb,gfp_t priority);struct sk_buff *__pskb_copy_fclone (struct sk_buff *skb,int headroom,gfp_t gfp_mask,bool fclone);
net/core/skbuff.c +5 -4
@@ -1071,7 +1071,7 @@ static void skb_headers_offset_update(struct sk_buff *skb, int off) skb->inner_mac_header += off; } -static void copy_skb_header (struct sk_buff *new,const struct sk_buff *old) +void skb_copy_header (struct sk_buff *new,const struct sk_buff *old) {__copy_skb_header (new, old);
@@ -1079,6 +1079,7 @@ static void copy_skb_header(struct sk_buff *new, const struct sk_buff *old)skb_shinfo (new)->gso_segs =skb_shinfo (old)->gso_segs;skb_shinfo (new)->gso_type =skb_shinfo (old)->gso_type; } +EXPORT_SYMBOL (skb_copy_header);static inline int skb_alloc_rx_flag (const struct sk_buff *skb) {
@@ -1122,7 +1123,7 @@ struct sk_buff *skb_copy(const struct sk_buff *skb, gfp_t gfp_mask)if (skb_copy_bits (skb, -headerlen, n->head, headerlen + skb->len))BUG (); -copy_skb_header (n, skb); +skb_copy_header (n, skb);return n; }EXPORT_SYMBOL (skb_copy);
@@ -1185,7 +1186,7 @@ struct sk_buff *__pskb_copy_fclone(struct sk_buff *skb, int headroom,skb_clone_fraglist (n); } -copy_skb_header (n, skb); +skb_copy_header (n, skb); out:return n; }
@@ -1356,7 +1357,7 @@ struct sk_buff *skb_copy_expand(const struct sk_buff *skb, skb->len + head_copy_len))BUG (); -copy_skb_header (n, skb); +skb_copy_header (n, skb);skb_headers_offset_update (n, newheadroom - oldheadroom);
net/ipv6/sit.c +4 -6
@@ -308,9 +308,7 @@ static int ipip6_tunnel_get_prl(struct ip_tunnel *t, kcalloc(cmax, sizeof(*kp), GFP_KERNEL) : NULL; -rcu_read_lock (); - - ca = t->prl_count < cmax ? t->prl_count : cmax; + ca =min (t->prl_count, cmax);if (!kp) {/* We don't try hard to allocate much memory for
@@ -325,7 +323,7 @@ static int ipip6_tunnel_get_prl(struct ip_tunnel *t, } } - c =0 ; +rcu_read_lock ();for_each_prl_rcu (t->prl) {if (c >= cmax)break ;
@@ -337,7 +335,7 @@ static int ipip6_tunnel_get_prl(struct ip_tunnel *t,if (kprl.addr !=htonl (INADDR_ANY ))break ; } -out: +rcu_read_unlock (); len =sizeof (*kp) * c;
@@ -346,7 +344,7 @@ static int ipip6_tunnel_get_prl(struct ip_tunnel *t, ret = -EFAULT ;kfree (kp); - +out:return ret; }
net/netfilter/nft_set_hash.c +2 -0
@@ -121,6 +121,7 @@ static bool nft_hash_update(struct nft_set *set, const u32 *key,/* Another cpu may race to insert the element with the same key */ if (prev) {nft_set_elem_destroy (set, he, true); +atomic_dec (&set->nelems); he = prev; }
@@ -130,6 +131,7 @@ static bool nft_hash_update(struct nft_set *set, const u32 *key, err2:nft_set_elem_destroy (set, he, true); +atomic_dec (&set->nelems); err1:return false; }
net/rose/rose_timer.c +19 -15
@@ -34,95 +34,95 @@ static void rose_idletimer_expiry(unsigned long);void rose_start_heartbeat (struct sock *sk) { -del_timer (&sk->sk_timer); +sk_stop_timer (sk, &sk->sk_timer); sk->sk_timer.data = (unsigned long )sk; sk->sk_timer.function = &rose_heartbeat_expiry; sk->sk_timer.expires = jiffies +5 *HZ ; -add_timer (&sk->sk_timer); +sk_reset_timer (sk, &sk->sk_timer, sk->sk_timer.expires); }void rose_start_t1timer (struct sock *sk) {struct rose_sock *rose =rose_sk (sk); -del_timer (&rose->timer); +sk_stop_timer (sk, &rose->timer); rose->timer.data = (unsigned long )sk; rose->timer.function = &rose_timer_expiry; rose->timer.expires = jiffies + rose->t1; -add_timer (&rose->timer); +sk_reset_timer (sk, &rose->timer, rose->timer.expires); }void rose_start_t2timer (struct sock *sk) {struct rose_sock *rose =rose_sk (sk); -del_timer (&rose->timer); +sk_stop_timer (sk, &rose->timer); rose->timer.data = (unsigned long )sk; rose->timer.function = &rose_timer_expiry; rose->timer.expires = jiffies + rose->t2; -add_timer (&rose->timer); +sk_reset_timer (sk, &rose->timer, rose->timer.expires); }void rose_start_t3timer (struct sock *sk) {struct rose_sock *rose =rose_sk (sk); -del_timer (&rose->timer); +sk_stop_timer (sk, &rose->timer); rose->timer.data = (unsigned long )sk; rose->timer.function = &rose_timer_expiry; rose->timer.expires = jiffies + rose->t3; -add_timer (&rose->timer); +sk_reset_timer (sk, &rose->timer, rose->timer.expires); }void rose_start_hbtimer (struct sock *sk) {struct rose_sock *rose =rose_sk (sk); -del_timer (&rose->timer); +sk_stop_timer (sk, &rose->timer); rose->timer.data = (unsigned long )sk; rose->timer.function = &rose_timer_expiry; rose->timer.expires = jiffies + rose->hb; -add_timer (&rose->timer); +sk_reset_timer (sk, &rose->timer, rose->timer.expires); }void rose_start_idletimer (struct sock *sk) {struct rose_sock *rose =rose_sk (sk); -del_timer (&rose->idletimer); +sk_stop_timer (sk, &rose->timer);if (rose->idle >0 ) { rose->idletimer.data = (unsigned long )sk; rose->idletimer.function = &rose_idletimer_expiry; rose->idletimer.expires = jiffies + rose->idle; -add_timer (&rose->idletimer); +sk_reset_timer (sk, &rose->idletimer, rose->idletimer.expires); } }void rose_stop_heartbeat (struct sock *sk) { -del_timer (&sk->sk_timer); +sk_stop_timer (sk, &sk->sk_timer); }void rose_stop_timer (struct sock *sk) { -del_timer (&rose_sk (sk)->timer); +sk_stop_timer (sk, &rose_sk (sk)->timer); }void rose_stop_idletimer (struct sock *sk) { -del_timer (&rose_sk (sk)->idletimer); +sk_stop_timer (sk, &rose_sk (sk)->idletimer); }static void rose_heartbeat_expiry (unsigned long param)
@@ -139,6 +139,7 @@ static void rose_heartbeat_expiry(unsigned long param) (sk->sk_state == TCP_LISTEN && sock_flag(sk, SOCK_DEAD))) {bh_unlock_sock (sk);rose_destroy_socket (sk); +sock_put (sk);return ; }break ;
@@ -161,6 +162,7 @@ static void rose_heartbeat_expiry(unsigned long param)rose_start_heartbeat (sk);bh_unlock_sock (sk); +sock_put (sk); }static void rose_timer_expiry (unsigned long param)
@@ -190,6 +192,7 @@ static void rose_timer_expiry(unsigned long param)break ; }bh_unlock_sock (sk); +sock_put (sk); }static void rose_idletimer_expiry (unsigned long param)
@@ -213,4 +216,5 @@ static void rose_idletimer_expiry(unsigned long param)sock_set_flag (sk,SOCK_DEAD ); }bh_unlock_sock (sk); +sock_put (sk); }
net/sunrpc/xdr.c +1 -1
@@ -544,7 +544,7 @@ static __be32 *xdr_get_next_encode_buffer(struct xdr_stream *xdr,*/ xdr->p = (void *)p + frag2bytes; space_left = xdr->buf->buflen - xdr->buf->len; -if (space_left - nbytes >=PAGE_SIZE ) +if (space_left - frag1bytes >=PAGE_SIZE ) xdr->end = (void *)p +PAGE_SIZE ;else xdr->end = (void *)p + space_left - frag1bytes;