aboutsummaryrefslogtreecommitdiffstats
path: root/fs/udf/inode.c
diff options
context:
space:
mode:
authorJiri Kosina <jkosina@suse.cz>2013-01-29 04:48:30 -0500
committerJiri Kosina <jkosina@suse.cz>2013-01-29 04:48:30 -0500
commit617677295b53a40d0e54aac4cbbc216ffbc755dd (patch)
tree51b9e87213243ed5efff252c8e8d8fec4eebc588 /fs/udf/inode.c
parent5c8d1b68e01a144813e38795fe6dbe7ebb506131 (diff)
parent6abb7c25775b7fb2225ad0508236d63ca710e65f (diff)
Merge branch 'master' into for-next
Conflicts: drivers/devfreq/exynos4_bus.c Sync with Linus' tree to be able to apply patches that are against newer code (mvneta).
Diffstat (limited to 'fs/udf/inode.c')
-rw-r--r--fs/udf/inode.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/fs/udf/inode.c b/fs/udf/inode.c
index df88b957ccf0..cbae1ed0b7c1 100644
--- a/fs/udf/inode.c
+++ b/fs/udf/inode.c
@@ -587,7 +587,6 @@ out:
587static sector_t inode_getblk(struct inode *inode, sector_t block, 587static sector_t inode_getblk(struct inode *inode, sector_t block,
588 int *err, int *new) 588 int *err, int *new)
589{ 589{
590 static sector_t last_block;
591 struct kernel_long_ad laarr[EXTENT_MERGE_SIZE]; 590 struct kernel_long_ad laarr[EXTENT_MERGE_SIZE];
592 struct extent_position prev_epos, cur_epos, next_epos; 591 struct extent_position prev_epos, cur_epos, next_epos;
593 int count = 0, startnum = 0, endnum = 0; 592 int count = 0, startnum = 0, endnum = 0;
@@ -601,6 +600,7 @@ static sector_t inode_getblk(struct inode *inode, sector_t block,
601 struct udf_inode_info *iinfo = UDF_I(inode); 600 struct udf_inode_info *iinfo = UDF_I(inode);
602 int goal = 0, pgoal = iinfo->i_location.logicalBlockNum; 601 int goal = 0, pgoal = iinfo->i_location.logicalBlockNum;
603 int lastblock = 0; 602 int lastblock = 0;
603 bool isBeyondEOF;
604 604
605 *err = 0; 605 *err = 0;
606 *new = 0; 606 *new = 0;
@@ -676,11 +676,10 @@ static sector_t inode_getblk(struct inode *inode, sector_t block,
676 return newblock; 676 return newblock;
677 } 677 }
678 678
679 last_block = block;
680 /* Are we beyond EOF? */ 679 /* Are we beyond EOF? */
681 if (etype == -1) { 680 if (etype == -1) {
682 int ret; 681 int ret;
683 682 isBeyondEOF = 1;
684 if (count) { 683 if (count) {
685 if (c) 684 if (c)
686 laarr[0] = laarr[1]; 685 laarr[0] = laarr[1];
@@ -718,11 +717,11 @@ static sector_t inode_getblk(struct inode *inode, sector_t block,
718 memset(&laarr[c].extLocation, 0x00, 717 memset(&laarr[c].extLocation, 0x00,
719 sizeof(struct kernel_lb_addr)); 718 sizeof(struct kernel_lb_addr));
720 count++; 719 count++;
721 endnum++;
722 } 720 }
723 endnum = c + 1; 721 endnum = c + 1;
724 lastblock = 1; 722 lastblock = 1;
725 } else { 723 } else {
724 isBeyondEOF = 0;
726 endnum = startnum = ((count > 2) ? 2 : count); 725 endnum = startnum = ((count > 2) ? 2 : count);
727 726
728 /* if the current extent is in position 0, 727 /* if the current extent is in position 0,
@@ -765,10 +764,13 @@ static sector_t inode_getblk(struct inode *inode, sector_t block,
765 goal, err); 764 goal, err);
766 if (!newblocknum) { 765 if (!newblocknum) {
767 brelse(prev_epos.bh); 766 brelse(prev_epos.bh);
767 brelse(cur_epos.bh);
768 brelse(next_epos.bh);
768 *err = -ENOSPC; 769 *err = -ENOSPC;
769 return 0; 770 return 0;
770 } 771 }
771 iinfo->i_lenExtents += inode->i_sb->s_blocksize; 772 if (isBeyondEOF)
773 iinfo->i_lenExtents += inode->i_sb->s_blocksize;
772 } 774 }
773 775
774 /* if the extent the requsted block is located in contains multiple 776 /* if the extent the requsted block is located in contains multiple
@@ -795,6 +797,8 @@ static sector_t inode_getblk(struct inode *inode, sector_t block,
795 udf_update_extents(inode, laarr, startnum, endnum, &prev_epos); 797 udf_update_extents(inode, laarr, startnum, endnum, &prev_epos);
796 798
797 brelse(prev_epos.bh); 799 brelse(prev_epos.bh);
800 brelse(cur_epos.bh);
801 brelse(next_epos.bh);
798 802
799 newblock = udf_get_pblock(inode->i_sb, newblocknum, 803 newblock = udf_get_pblock(inode->i_sb, newblocknum,
800 iinfo->i_location.partitionReferenceNum, 0); 804 iinfo->i_location.partitionReferenceNum, 0);