@@ -210,7 +210,7 @@ void gfs2_set_inode_flags(struct inode *inode)
210210
211211/**
212212 * do_gfs2_set_flags - set flags on an inode
213- * @filp: file pointer
213+ * @inode: The inode
214214 * @reqflags: The flags to set
215215 * @mask: Indicates which flags are valid
216216 * @fsflags: The FS_* inode flags passed in
@@ -427,31 +427,34 @@ static vm_fault_t gfs2_page_mkwrite(struct vm_fault *vmf)
427427 struct gfs2_alloc_parms ap = { .aflags = 0 , };
428428 u64 offset = page_offset (page );
429429 unsigned int data_blocks , ind_blocks , rblocks ;
430+ vm_fault_t ret = VM_FAULT_LOCKED ;
430431 struct gfs2_holder gh ;
431432 unsigned int length ;
432433 loff_t size ;
433- int ret ;
434+ int err ;
434435
435436 sb_start_pagefault (inode -> i_sb );
436437
437438 gfs2_holder_init (ip -> i_gl , LM_ST_EXCLUSIVE , 0 , & gh );
438- ret = gfs2_glock_nq (& gh );
439- if (ret )
439+ err = gfs2_glock_nq (& gh );
440+ if (err ) {
441+ ret = block_page_mkwrite_return (err );
440442 goto out_uninit ;
443+ }
441444
442445 /* Check page index against inode size */
443446 size = i_size_read (inode );
444447 if (offset >= size ) {
445- ret = - EINVAL ;
448+ ret = VM_FAULT_SIGBUS ;
446449 goto out_unlock ;
447450 }
448451
449452 /* Update file times before taking page lock */
450453 file_update_time (vmf -> vma -> vm_file );
451454
452455 /* page is wholly or partially inside EOF */
453- if (offset > size - PAGE_SIZE )
454- length = offset_in_page ( size ) ;
456+ if (size - offset < PAGE_SIZE )
457+ length = size - offset ;
455458 else
456459 length = PAGE_SIZE ;
457460
@@ -469,24 +472,30 @@ static vm_fault_t gfs2_page_mkwrite(struct vm_fault *vmf)
469472 !gfs2_write_alloc_required (ip , offset , length )) {
470473 lock_page (page );
471474 if (!PageUptodate (page ) || page -> mapping != inode -> i_mapping ) {
472- ret = - EAGAIN ;
475+ ret = VM_FAULT_NOPAGE ;
473476 unlock_page (page );
474477 }
475478 goto out_unlock ;
476479 }
477480
478- ret = gfs2_rindex_update (sdp );
479- if (ret )
481+ err = gfs2_rindex_update (sdp );
482+ if (err ) {
483+ ret = block_page_mkwrite_return (err );
480484 goto out_unlock ;
485+ }
481486
482487 gfs2_write_calc_reserv (ip , length , & data_blocks , & ind_blocks );
483488 ap .target = data_blocks + ind_blocks ;
484- ret = gfs2_quota_lock_check (ip , & ap );
485- if (ret )
489+ err = gfs2_quota_lock_check (ip , & ap );
490+ if (err ) {
491+ ret = block_page_mkwrite_return (err );
486492 goto out_unlock ;
487- ret = gfs2_inplace_reserve (ip , & ap );
488- if (ret )
493+ }
494+ err = gfs2_inplace_reserve (ip , & ap );
495+ if (err ) {
496+ ret = block_page_mkwrite_return (err );
489497 goto out_quota_unlock ;
498+ }
490499
491500 rblocks = RES_DINODE + ind_blocks ;
492501 if (gfs2_is_jdata (ip ))
@@ -495,28 +504,38 @@ static vm_fault_t gfs2_page_mkwrite(struct vm_fault *vmf)
495504 rblocks += RES_STATFS + RES_QUOTA ;
496505 rblocks += gfs2_rg_blocks (ip , data_blocks + ind_blocks );
497506 }
498- ret = gfs2_trans_begin (sdp , rblocks , 0 );
499- if (ret )
507+ err = gfs2_trans_begin (sdp , rblocks , 0 );
508+ if (err ) {
509+ ret = block_page_mkwrite_return (err );
500510 goto out_trans_fail ;
511+ }
512+
513+ /* Unstuff, if required, and allocate backing blocks for page */
514+ if (gfs2_is_stuffed (ip )) {
515+ err = gfs2_unstuff_dinode (ip );
516+ if (err ) {
517+ ret = block_page_mkwrite_return (err );
518+ goto out_trans_end ;
519+ }
520+ }
501521
502522 lock_page (page );
503- ret = - EAGAIN ;
504523 /* If truncated, we must retry the operation, we may have raced
505524 * with the glock demotion code.
506525 */
507- if (!PageUptodate (page ) || page -> mapping != inode -> i_mapping )
508- goto out_trans_end ;
526+ if (!PageUptodate (page ) || page -> mapping != inode -> i_mapping ) {
527+ ret = VM_FAULT_NOPAGE ;
528+ goto out_page_locked ;
529+ }
509530
510- /* Unstuff, if required, and allocate backing blocks for page */
511- ret = 0 ;
512- if (gfs2_is_stuffed (ip ))
513- ret = gfs2_unstuff_dinode (ip , page );
514- if (ret == 0 )
515- ret = gfs2_allocate_page_backing (page , length );
531+ err = gfs2_allocate_page_backing (page , length );
532+ if (err )
533+ ret = block_page_mkwrite_return (err );
516534
517- out_trans_end :
518- if (ret )
535+ out_page_locked :
536+ if (ret != VM_FAULT_LOCKED )
519537 unlock_page (page );
538+ out_trans_end :
520539 gfs2_trans_end (sdp );
521540out_trans_fail :
522541 gfs2_inplace_release (ip );
@@ -526,12 +545,12 @@ static vm_fault_t gfs2_page_mkwrite(struct vm_fault *vmf)
526545 gfs2_glock_dq (& gh );
527546out_uninit :
528547 gfs2_holder_uninit (& gh );
529- if (ret == 0 ) {
548+ if (ret == VM_FAULT_LOCKED ) {
530549 set_page_dirty (page );
531550 wait_for_stable_page (page );
532551 }
533552 sb_end_pagefault (inode -> i_sb );
534- return block_page_mkwrite_return ( ret ) ;
553+ return ret ;
535554}
536555
537556static vm_fault_t gfs2_fault (struct vm_fault * vmf )
@@ -962,7 +981,7 @@ static int fallocate_chunk(struct inode *inode, loff_t offset, loff_t len,
962981 gfs2_trans_add_meta (ip -> i_gl , dibh );
963982
964983 if (gfs2_is_stuffed (ip )) {
965- error = gfs2_unstuff_dinode (ip , NULL );
984+ error = gfs2_unstuff_dinode (ip );
966985 if (unlikely (error ))
967986 goto out ;
968987 }
0 commit comments