@@ -4200,7 +4200,7 @@ int ext4_calculate_overhead(struct super_block *sb)
4200
4200
else if (ext4_has_feature_journal (sb ) && !sbi -> s_journal && j_inum ) {
4201
4201
/* j_inum for internal journal is non-zero */
4202
4202
j_inode = ext4_get_journal_inode (sb , j_inum );
4203
- if (j_inode ) {
4203
+ if (! IS_ERR ( j_inode ) ) {
4204
4204
j_blocks = j_inode -> i_size >> sb -> s_blocksize_bits ;
4205
4205
overhead += EXT4_NUM_B2C (sbi , j_blocks );
4206
4206
iput (j_inode );
@@ -5740,18 +5740,18 @@ static struct inode *ext4_get_journal_inode(struct super_block *sb,
5740
5740
journal_inode = ext4_iget (sb , journal_inum , EXT4_IGET_SPECIAL );
5741
5741
if (IS_ERR (journal_inode )) {
5742
5742
ext4_msg (sb , KERN_ERR , "no journal found" );
5743
- return NULL ;
5743
+ return ERR_CAST ( journal_inode ) ;
5744
5744
}
5745
5745
if (!journal_inode -> i_nlink ) {
5746
5746
make_bad_inode (journal_inode );
5747
5747
iput (journal_inode );
5748
5748
ext4_msg (sb , KERN_ERR , "journal inode is deleted" );
5749
- return NULL ;
5749
+ return ERR_PTR ( - EFSCORRUPTED ) ;
5750
5750
}
5751
5751
if (!S_ISREG (journal_inode -> i_mode ) || IS_ENCRYPTED (journal_inode )) {
5752
5752
ext4_msg (sb , KERN_ERR , "invalid journal inode" );
5753
5753
iput (journal_inode );
5754
- return NULL ;
5754
+ return ERR_PTR ( - EFSCORRUPTED ) ;
5755
5755
}
5756
5756
5757
5757
ext4_debug ("Journal inode found at %p: %lld bytes\n" ,
@@ -5781,21 +5781,21 @@ static int ext4_journal_bmap(journal_t *journal, sector_t *block)
5781
5781
return 0 ;
5782
5782
}
5783
5783
5784
- static journal_t * ext4_get_journal (struct super_block * sb ,
5785
- unsigned int journal_inum )
5784
+ static journal_t * ext4_open_inode_journal (struct super_block * sb ,
5785
+ unsigned int journal_inum )
5786
5786
{
5787
5787
struct inode * journal_inode ;
5788
5788
journal_t * journal ;
5789
5789
5790
5790
journal_inode = ext4_get_journal_inode (sb , journal_inum );
5791
- if (! journal_inode )
5792
- return NULL ;
5791
+ if (IS_ERR ( journal_inode ) )
5792
+ return ERR_CAST ( journal_inode ) ;
5793
5793
5794
5794
journal = jbd2_journal_init_inode (journal_inode );
5795
5795
if (IS_ERR (journal )) {
5796
5796
ext4_msg (sb , KERN_ERR , "Could not load journal inode" );
5797
5797
iput (journal_inode );
5798
- return NULL ;
5798
+ return ERR_CAST ( journal ) ;
5799
5799
}
5800
5800
journal -> j_private = sb ;
5801
5801
journal -> j_bmap = ext4_journal_bmap ;
@@ -5813,21 +5813,23 @@ static struct block_device *ext4_get_journal_blkdev(struct super_block *sb,
5813
5813
ext4_fsblk_t sb_block ;
5814
5814
unsigned long offset ;
5815
5815
struct ext4_super_block * es ;
5816
+ int errno ;
5816
5817
5817
5818
bdev = blkdev_get_by_dev (j_dev , BLK_OPEN_READ | BLK_OPEN_WRITE , sb ,
5818
5819
& ext4_holder_ops );
5819
5820
if (IS_ERR (bdev )) {
5820
5821
ext4_msg (sb , KERN_ERR ,
5821
5822
"failed to open journal device unknown-block(%u,%u) %ld" ,
5822
5823
MAJOR (j_dev ), MINOR (j_dev ), PTR_ERR (bdev ));
5823
- return NULL ;
5824
+ return ERR_CAST ( bdev ) ;
5824
5825
}
5825
5826
5826
5827
blocksize = sb -> s_blocksize ;
5827
5828
hblock = bdev_logical_block_size (bdev );
5828
5829
if (blocksize < hblock ) {
5829
5830
ext4_msg (sb , KERN_ERR ,
5830
5831
"blocksize too small for journal device" );
5832
+ errno = - EINVAL ;
5831
5833
goto out_bdev ;
5832
5834
}
5833
5835
@@ -5838,6 +5840,7 @@ static struct block_device *ext4_get_journal_blkdev(struct super_block *sb,
5838
5840
if (!bh ) {
5839
5841
ext4_msg (sb , KERN_ERR , "couldn't read superblock of "
5840
5842
"external journal" );
5843
+ errno = - EINVAL ;
5841
5844
goto out_bdev ;
5842
5845
}
5843
5846
@@ -5846,18 +5849,21 @@ static struct block_device *ext4_get_journal_blkdev(struct super_block *sb,
5846
5849
!(le32_to_cpu (es -> s_feature_incompat ) &
5847
5850
EXT4_FEATURE_INCOMPAT_JOURNAL_DEV )) {
5848
5851
ext4_msg (sb , KERN_ERR , "external journal has bad superblock" );
5852
+ errno = - EFSCORRUPTED ;
5849
5853
goto out_bh ;
5850
5854
}
5851
5855
5852
5856
if ((le32_to_cpu (es -> s_feature_ro_compat ) &
5853
5857
EXT4_FEATURE_RO_COMPAT_METADATA_CSUM ) &&
5854
5858
es -> s_checksum != ext4_superblock_csum (sb , es )) {
5855
5859
ext4_msg (sb , KERN_ERR , "external journal has corrupt superblock" );
5860
+ errno = - EFSCORRUPTED ;
5856
5861
goto out_bh ;
5857
5862
}
5858
5863
5859
5864
if (memcmp (EXT4_SB (sb )-> s_es -> s_journal_uuid , es -> s_uuid , 16 )) {
5860
5865
ext4_msg (sb , KERN_ERR , "journal UUID does not match" );
5866
+ errno = - EFSCORRUPTED ;
5861
5867
goto out_bh ;
5862
5868
}
5863
5869
@@ -5870,31 +5876,34 @@ static struct block_device *ext4_get_journal_blkdev(struct super_block *sb,
5870
5876
brelse (bh );
5871
5877
out_bdev :
5872
5878
blkdev_put (bdev , sb );
5873
- return NULL ;
5879
+ return ERR_PTR ( errno ) ;
5874
5880
}
5875
5881
5876
- static journal_t * ext4_get_dev_journal (struct super_block * sb ,
5877
- dev_t j_dev )
5882
+ static journal_t * ext4_open_dev_journal (struct super_block * sb ,
5883
+ dev_t j_dev )
5878
5884
{
5879
5885
journal_t * journal ;
5880
5886
ext4_fsblk_t j_start ;
5881
5887
ext4_fsblk_t j_len ;
5882
5888
struct block_device * journal_bdev ;
5889
+ int errno = 0 ;
5883
5890
5884
5891
journal_bdev = ext4_get_journal_blkdev (sb , j_dev , & j_start , & j_len );
5885
- if (! journal_bdev )
5886
- return NULL ;
5892
+ if (IS_ERR ( journal_bdev ) )
5893
+ return ERR_CAST ( journal_bdev ) ;
5887
5894
5888
5895
journal = jbd2_journal_init_dev (journal_bdev , sb -> s_bdev , j_start ,
5889
5896
j_len , sb -> s_blocksize );
5890
5897
if (IS_ERR (journal )) {
5891
5898
ext4_msg (sb , KERN_ERR , "failed to create device journal" );
5899
+ errno = PTR_ERR (journal );
5892
5900
goto out_bdev ;
5893
5901
}
5894
5902
if (be32_to_cpu (journal -> j_superblock -> s_nr_users ) != 1 ) {
5895
5903
ext4_msg (sb , KERN_ERR , "External journal has more than one "
5896
5904
"user (unsupported) - %d" ,
5897
5905
be32_to_cpu (journal -> j_superblock -> s_nr_users ));
5906
+ errno = - EINVAL ;
5898
5907
goto out_journal ;
5899
5908
}
5900
5909
journal -> j_private = sb ;
@@ -5906,7 +5915,7 @@ static journal_t *ext4_get_dev_journal(struct super_block *sb,
5906
5915
jbd2_journal_destroy (journal );
5907
5916
out_bdev :
5908
5917
blkdev_put (journal_bdev , sb );
5909
- return NULL ;
5918
+ return ERR_PTR ( errno ) ;
5910
5919
}
5911
5920
5912
5921
static int ext4_load_journal (struct super_block * sb ,
@@ -5938,13 +5947,13 @@ static int ext4_load_journal(struct super_block *sb,
5938
5947
}
5939
5948
5940
5949
if (journal_inum ) {
5941
- journal = ext4_get_journal (sb , journal_inum );
5942
- if (! journal )
5943
- return - EINVAL ;
5950
+ journal = ext4_open_inode_journal (sb , journal_inum );
5951
+ if (IS_ERR ( journal ) )
5952
+ return PTR_ERR ( journal ) ;
5944
5953
} else {
5945
- journal = ext4_get_dev_journal (sb , journal_dev );
5946
- if (! journal )
5947
- return - EINVAL ;
5954
+ journal = ext4_open_dev_journal (sb , journal_dev );
5955
+ if (IS_ERR ( journal ) )
5956
+ return PTR_ERR ( journal ) ;
5948
5957
}
5949
5958
5950
5959
journal_dev_ro = bdev_read_only (journal -> j_dev );
0 commit comments