diff options
author | Jiri Kosina <jkosina@suse.cz> | 2013-01-29 04:48:30 -0500 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2013-01-29 04:48:30 -0500 |
commit | 617677295b53a40d0e54aac4cbbc216ffbc755dd (patch) | |
tree | 51b9e87213243ed5efff252c8e8d8fec4eebc588 /fs/udf/inode.c | |
parent | 5c8d1b68e01a144813e38795fe6dbe7ebb506131 (diff) | |
parent | 6abb7c25775b7fb2225ad0508236d63ca710e65f (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.c | 14 |
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: | |||
587 | static sector_t inode_getblk(struct inode *inode, sector_t block, | 587 | static 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); |