On Sat, 18 Jan 2014, Xishi Qiu wrote: > In the process IO direction, dio_refill_pages will call get_user_pages_fast > to map the page from user space. If ret is less than 0 and IO is write, the > function will create a zero page to fill data. This may work for some file > system, but in some device operate we prefer whole write or fail, not half > data half zero, e.g. fs metadata, like inode, identy. So you're attemping to define a behavior for all users of direct IO for a problem that is filesystem or backing device dependent? Perhaps if you elaborated on the problem that you're seeing then we could address it. > This happens often when kill a process which is doing direct IO. Consider > the following cases, the process A is doing IO process, may enter __get_user_pages > function, if other processes send process A SIG_KILL, A will enter the > following branches > /* > * If we have a pending SIGKILL, don't keep faulting > * pages and potentially allocating memory. > */ > if (unlikely(fatal_signal_pending(current))) > return i ? i : -ERESTARTSYS; > Return current pages. direct IO will write the pages, the subsequent pages > which can’t get will use zero page instead. > > Signed-off-by: Xishi Qiu <qiuxishi@xxxxxxxxxx> > Signed-off-by: Bin Yang <robin.yb@xxxxxxxxxx> > --- > fs/direct-io.c | 3 +++ > 1 files changed, 3 insertions(+), 0 deletions(-) > > diff --git a/fs/direct-io.c b/fs/direct-io.c > index 0e04142..b74d565 100644 > --- a/fs/direct-io.c > +++ b/fs/direct-io.c > @@ -174,6 +174,9 @@ static inline int dio_refill_pages(struct dio *dio, struct dio_submit *sdio) > &dio->pages[0]); /* Put results here */ > > if (ret < 0 && sdio->blocks_available && (dio->rw & WRITE)) { > + /* If task is killed, do not write anymore */ > + if (ret == -ERESTARTSYS) > + goto out; > struct page *page = ZERO_PAGE(0); > /* > * A memory fault, but the filesystem has some outstanding We don't mix declarations and text, please try to compile your patches before proposing them.