+10
-7
fs/eventpoll.c
+10
-7
fs/eventpoll.c
···
260
struct ep_send_events_data {
261
int maxevents;
262
struct epoll_event __user *events;
263
};
264
265
/*
···
1617
void *priv)
1618
{
1619
struct ep_send_events_data *esed = priv;
1620
-
int eventcnt;
1621
unsigned int revents;
1622
struct epitem *epi;
1623
struct epoll_event __user *uevent;
···
1630
* Items cannot vanish during the loop because ep_scan_ready_list() is
1631
* holding "mtx" during this call.
1632
*/
1633
-
for (eventcnt = 0, uevent = esed->events;
1634
-
!list_empty(head) && eventcnt < esed->maxevents;) {
1635
epi = list_first_entry(head, struct epitem, rdllink);
1636
1637
/*
···
1665
__put_user(epi->event.data, &uevent->data)) {
1666
list_add(&epi->rdllink, head);
1667
ep_pm_stay_awake(epi);
1668
-
return eventcnt ? eventcnt : -EFAULT;
1669
}
1670
-
eventcnt++;
1671
uevent++;
1672
if (epi->event.events & EPOLLONESHOT)
1673
epi->event.events &= EP_PRIVATE_BITS;
···
1691
}
1692
}
1693
1694
-
return eventcnt;
1695
}
1696
1697
static int ep_send_events(struct eventpoll *ep,
···
1702
esed.maxevents = maxevents;
1703
esed.events = events;
1704
1705
-
return ep_scan_ready_list(ep, ep_send_events_proc, &esed, 0, false);
1706
}
1707
1708
static inline struct timespec64 ep_set_mstimeout(long ms)
···
260
struct ep_send_events_data {
261
int maxevents;
262
struct epoll_event __user *events;
263
+
int res;
264
};
265
266
/*
···
1616
void *priv)
1617
{
1618
struct ep_send_events_data *esed = priv;
1619
unsigned int revents;
1620
struct epitem *epi;
1621
struct epoll_event __user *uevent;
···
1630
* Items cannot vanish during the loop because ep_scan_ready_list() is
1631
* holding "mtx" during this call.
1632
*/
1633
+
for (esed->res = 0, uevent = esed->events;
1634
+
!list_empty(head) && esed->res < esed->maxevents;) {
1635
epi = list_first_entry(head, struct epitem, rdllink);
1636
1637
/*
···
1665
__put_user(epi->event.data, &uevent->data)) {
1666
list_add(&epi->rdllink, head);
1667
ep_pm_stay_awake(epi);
1668
+
if (!esed->res)
1669
+
esed->res = -EFAULT;
1670
+
return 0;
1671
}
1672
+
esed->res++;
1673
uevent++;
1674
if (epi->event.events & EPOLLONESHOT)
1675
epi->event.events &= EP_PRIVATE_BITS;
···
1689
}
1690
}
1691
1692
+
return 0;
1693
}
1694
1695
static int ep_send_events(struct eventpoll *ep,
···
1700
esed.maxevents = maxevents;
1701
esed.events = events;
1702
1703
+
ep_scan_ready_list(ep, ep_send_events_proc, &esed, 0, false);
1704
+
return esed.res;
1705
}
1706
1707
static inline struct timespec64 ep_set_mstimeout(long ms)