diff options
Diffstat (limited to 'fs/udf')
| -rw-r--r-- | fs/udf/file.c | 8 | ||||
| -rw-r--r-- | fs/udf/ialloc.c | 2 | ||||
| -rw-r--r-- | fs/udf/inode.c | 63 | ||||
| -rw-r--r-- | fs/udf/namei.c | 6 | ||||
| -rw-r--r-- | fs/udf/super.c | 25 | ||||
| -rw-r--r-- | fs/udf/symlink.c | 14 | ||||
| -rw-r--r-- | fs/udf/udf_sb.h | 8 | ||||
| -rw-r--r-- | fs/udf/udfdecl.h | 2 |
8 files changed, 73 insertions, 55 deletions
diff --git a/fs/udf/file.c b/fs/udf/file.c index d8ffa7cc661d..d567b8448dfc 100644 --- a/fs/udf/file.c +++ b/fs/udf/file.c | |||
| @@ -125,7 +125,6 @@ static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
| 125 | err = udf_expand_file_adinicb(inode); | 125 | err = udf_expand_file_adinicb(inode); |
| 126 | if (err) { | 126 | if (err) { |
| 127 | udf_debug("udf_expand_adinicb: err=%d\n", err); | 127 | udf_debug("udf_expand_adinicb: err=%d\n", err); |
| 128 | up_write(&iinfo->i_data_sem); | ||
| 129 | return err; | 128 | return err; |
| 130 | } | 129 | } |
| 131 | } else { | 130 | } else { |
| @@ -133,9 +132,10 @@ static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
| 133 | iinfo->i_lenAlloc = pos + count; | 132 | iinfo->i_lenAlloc = pos + count; |
| 134 | else | 133 | else |
| 135 | iinfo->i_lenAlloc = inode->i_size; | 134 | iinfo->i_lenAlloc = inode->i_size; |
| 135 | up_write(&iinfo->i_data_sem); | ||
| 136 | } | 136 | } |
| 137 | } | 137 | } else |
| 138 | up_write(&iinfo->i_data_sem); | 138 | up_write(&iinfo->i_data_sem); |
| 139 | 139 | ||
| 140 | retval = generic_file_aio_write(iocb, iov, nr_segs, ppos); | 140 | retval = generic_file_aio_write(iocb, iov, nr_segs, ppos); |
| 141 | if (retval > 0) | 141 | if (retval > 0) |
| @@ -201,12 +201,10 @@ out: | |||
| 201 | static int udf_release_file(struct inode *inode, struct file *filp) | 201 | static int udf_release_file(struct inode *inode, struct file *filp) |
| 202 | { | 202 | { |
| 203 | if (filp->f_mode & FMODE_WRITE) { | 203 | if (filp->f_mode & FMODE_WRITE) { |
| 204 | mutex_lock(&inode->i_mutex); | ||
| 205 | down_write(&UDF_I(inode)->i_data_sem); | 204 | down_write(&UDF_I(inode)->i_data_sem); |
| 206 | udf_discard_prealloc(inode); | 205 | udf_discard_prealloc(inode); |
| 207 | udf_truncate_tail_extent(inode); | 206 | udf_truncate_tail_extent(inode); |
| 208 | up_write(&UDF_I(inode)->i_data_sem); | 207 | up_write(&UDF_I(inode)->i_data_sem); |
| 209 | mutex_unlock(&inode->i_mutex); | ||
| 210 | } | 208 | } |
| 211 | return 0; | 209 | return 0; |
| 212 | } | 210 | } |
diff --git a/fs/udf/ialloc.c b/fs/udf/ialloc.c index 6fb7e0adcda0..05ab48195be9 100644 --- a/fs/udf/ialloc.c +++ b/fs/udf/ialloc.c | |||
| @@ -46,7 +46,7 @@ void udf_free_inode(struct inode *inode) | |||
| 46 | udf_free_blocks(sb, NULL, &UDF_I(inode)->i_location, 0, 1); | 46 | udf_free_blocks(sb, NULL, &UDF_I(inode)->i_location, 0, 1); |
| 47 | } | 47 | } |
| 48 | 48 | ||
| 49 | struct inode *udf_new_inode(struct inode *dir, int mode, int *err) | 49 | struct inode *udf_new_inode(struct inode *dir, umode_t mode, int *err) |
| 50 | { | 50 | { |
| 51 | struct super_block *sb = dir->i_sb; | 51 | struct super_block *sb = dir->i_sb; |
| 52 | struct udf_sb_info *sbi = UDF_SB(sb); | 52 | struct udf_sb_info *sbi = UDF_SB(sb); |
diff --git a/fs/udf/inode.c b/fs/udf/inode.c index 4fd1d809738c..7699df7b3198 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c | |||
| @@ -48,13 +48,12 @@ MODULE_LICENSE("GPL"); | |||
| 48 | 48 | ||
| 49 | #define EXTENT_MERGE_SIZE 5 | 49 | #define EXTENT_MERGE_SIZE 5 |
| 50 | 50 | ||
| 51 | static mode_t udf_convert_permissions(struct fileEntry *); | 51 | static umode_t udf_convert_permissions(struct fileEntry *); |
| 52 | static int udf_update_inode(struct inode *, int); | 52 | static int udf_update_inode(struct inode *, int); |
| 53 | static void udf_fill_inode(struct inode *, struct buffer_head *); | 53 | static void udf_fill_inode(struct inode *, struct buffer_head *); |
| 54 | static int udf_sync_inode(struct inode *inode); | 54 | static int udf_sync_inode(struct inode *inode); |
| 55 | static int udf_alloc_i_data(struct inode *inode, size_t size); | 55 | static int udf_alloc_i_data(struct inode *inode, size_t size); |
| 56 | static struct buffer_head *inode_getblk(struct inode *, sector_t, int *, | 56 | static sector_t inode_getblk(struct inode *, sector_t, int *, int *); |
| 57 | sector_t *, int *); | ||
| 58 | static int8_t udf_insert_aext(struct inode *, struct extent_position, | 57 | static int8_t udf_insert_aext(struct inode *, struct extent_position, |
| 59 | struct kernel_lb_addr, uint32_t); | 58 | struct kernel_lb_addr, uint32_t); |
| 60 | static void udf_split_extents(struct inode *, int *, int, int, | 59 | static void udf_split_extents(struct inode *, int *, int, int, |
| @@ -151,6 +150,12 @@ const struct address_space_operations udf_aops = { | |||
| 151 | .bmap = udf_bmap, | 150 | .bmap = udf_bmap, |
| 152 | }; | 151 | }; |
| 153 | 152 | ||
| 153 | /* | ||
| 154 | * Expand file stored in ICB to a normal one-block-file | ||
| 155 | * | ||
| 156 | * This function requires i_data_sem for writing and releases it. | ||
| 157 | * This function requires i_mutex held | ||
| 158 | */ | ||
| 154 | int udf_expand_file_adinicb(struct inode *inode) | 159 | int udf_expand_file_adinicb(struct inode *inode) |
| 155 | { | 160 | { |
| 156 | struct page *page; | 161 | struct page *page; |
| @@ -169,9 +174,15 @@ int udf_expand_file_adinicb(struct inode *inode) | |||
| 169 | iinfo->i_alloc_type = ICBTAG_FLAG_AD_LONG; | 174 | iinfo->i_alloc_type = ICBTAG_FLAG_AD_LONG; |
| 170 | /* from now on we have normal address_space methods */ | 175 | /* from now on we have normal address_space methods */ |
| 171 | inode->i_data.a_ops = &udf_aops; | 176 | inode->i_data.a_ops = &udf_aops; |
| 177 | up_write(&iinfo->i_data_sem); | ||
| 172 | mark_inode_dirty(inode); | 178 | mark_inode_dirty(inode); |
| 173 | return 0; | 179 | return 0; |
| 174 | } | 180 | } |
| 181 | /* | ||
| 182 | * Release i_data_sem so that we can lock a page - page lock ranks | ||
| 183 | * above i_data_sem. i_mutex still protects us against file changes. | ||
| 184 | */ | ||
| 185 | up_write(&iinfo->i_data_sem); | ||
| 175 | 186 | ||
| 176 | page = find_or_create_page(inode->i_mapping, 0, GFP_NOFS); | 187 | page = find_or_create_page(inode->i_mapping, 0, GFP_NOFS); |
| 177 | if (!page) | 188 | if (!page) |
| @@ -187,6 +198,7 @@ int udf_expand_file_adinicb(struct inode *inode) | |||
| 187 | SetPageUptodate(page); | 198 | SetPageUptodate(page); |
| 188 | kunmap(page); | 199 | kunmap(page); |
| 189 | } | 200 | } |
| 201 | down_write(&iinfo->i_data_sem); | ||
| 190 | memset(iinfo->i_ext.i_data + iinfo->i_lenEAttr, 0x00, | 202 | memset(iinfo->i_ext.i_data + iinfo->i_lenEAttr, 0x00, |
| 191 | iinfo->i_lenAlloc); | 203 | iinfo->i_lenAlloc); |
| 192 | iinfo->i_lenAlloc = 0; | 204 | iinfo->i_lenAlloc = 0; |
| @@ -196,17 +208,20 @@ int udf_expand_file_adinicb(struct inode *inode) | |||
| 196 | iinfo->i_alloc_type = ICBTAG_FLAG_AD_LONG; | 208 | iinfo->i_alloc_type = ICBTAG_FLAG_AD_LONG; |
| 197 | /* from now on we have normal address_space methods */ | 209 | /* from now on we have normal address_space methods */ |
| 198 | inode->i_data.a_ops = &udf_aops; | 210 | inode->i_data.a_ops = &udf_aops; |
| 211 | up_write(&iinfo->i_data_sem); | ||
| 199 | err = inode->i_data.a_ops->writepage(page, &udf_wbc); | 212 | err = inode->i_data.a_ops->writepage(page, &udf_wbc); |
| 200 | if (err) { | 213 | if (err) { |
| 201 | /* Restore everything back so that we don't lose data... */ | 214 | /* Restore everything back so that we don't lose data... */ |
| 202 | lock_page(page); | 215 | lock_page(page); |
| 203 | kaddr = kmap(page); | 216 | kaddr = kmap(page); |
| 217 | down_write(&iinfo->i_data_sem); | ||
| 204 | memcpy(iinfo->i_ext.i_data + iinfo->i_lenEAttr, kaddr, | 218 | memcpy(iinfo->i_ext.i_data + iinfo->i_lenEAttr, kaddr, |
| 205 | inode->i_size); | 219 | inode->i_size); |
| 206 | kunmap(page); | 220 | kunmap(page); |
| 207 | unlock_page(page); | 221 | unlock_page(page); |
| 208 | iinfo->i_alloc_type = ICBTAG_FLAG_AD_IN_ICB; | 222 | iinfo->i_alloc_type = ICBTAG_FLAG_AD_IN_ICB; |
| 209 | inode->i_data.a_ops = &udf_adinicb_aops; | 223 | inode->i_data.a_ops = &udf_adinicb_aops; |
| 224 | up_write(&iinfo->i_data_sem); | ||
| 210 | } | 225 | } |
| 211 | page_cache_release(page); | 226 | page_cache_release(page); |
| 212 | mark_inode_dirty(inode); | 227 | mark_inode_dirty(inode); |
| @@ -310,7 +325,6 @@ static int udf_get_block(struct inode *inode, sector_t block, | |||
| 310 | struct buffer_head *bh_result, int create) | 325 | struct buffer_head *bh_result, int create) |
| 311 | { | 326 | { |
| 312 | int err, new; | 327 | int err, new; |
| 313 | struct buffer_head *bh; | ||
| 314 | sector_t phys = 0; | 328 | sector_t phys = 0; |
| 315 | struct udf_inode_info *iinfo; | 329 | struct udf_inode_info *iinfo; |
| 316 | 330 | ||
| @@ -323,7 +337,6 @@ static int udf_get_block(struct inode *inode, sector_t block, | |||
| 323 | 337 | ||
| 324 | err = -EIO; | 338 | err = -EIO; |
| 325 | new = 0; | 339 | new = 0; |
| 326 | bh = NULL; | ||
| 327 | iinfo = UDF_I(inode); | 340 | iinfo = UDF_I(inode); |
| 328 | 341 | ||
| 329 | down_write(&iinfo->i_data_sem); | 342 | down_write(&iinfo->i_data_sem); |
| @@ -332,13 +345,10 @@ static int udf_get_block(struct inode *inode, sector_t block, | |||
| 332 | iinfo->i_next_alloc_goal++; | 345 | iinfo->i_next_alloc_goal++; |
| 333 | } | 346 | } |
| 334 | 347 | ||
| 335 | err = 0; | ||
| 336 | 348 | ||
| 337 | bh = inode_getblk(inode, block, &err, &phys, &new); | 349 | phys = inode_getblk(inode, block, &err, &new); |
| 338 | BUG_ON(bh); | 350 | if (!phys) |
| 339 | if (err) | ||
| 340 | goto abort; | 351 | goto abort; |
| 341 | BUG_ON(!phys); | ||
| 342 | 352 | ||
| 343 | if (new) | 353 | if (new) |
| 344 | set_buffer_new(bh_result); | 354 | set_buffer_new(bh_result); |
| @@ -547,11 +557,10 @@ out: | |||
| 547 | return err; | 557 | return err; |
| 548 | } | 558 | } |
| 549 | 559 | ||
| 550 | static struct buffer_head *inode_getblk(struct inode *inode, sector_t block, | 560 | static sector_t inode_getblk(struct inode *inode, sector_t block, |
| 551 | int *err, sector_t *phys, int *new) | 561 | int *err, int *new) |
| 552 | { | 562 | { |
| 553 | static sector_t last_block; | 563 | static sector_t last_block; |
| 554 | struct buffer_head *result = NULL; | ||
| 555 | struct kernel_long_ad laarr[EXTENT_MERGE_SIZE]; | 564 | struct kernel_long_ad laarr[EXTENT_MERGE_SIZE]; |
| 556 | struct extent_position prev_epos, cur_epos, next_epos; | 565 | struct extent_position prev_epos, cur_epos, next_epos; |
| 557 | int count = 0, startnum = 0, endnum = 0; | 566 | int count = 0, startnum = 0, endnum = 0; |
| @@ -566,6 +575,8 @@ static struct buffer_head *inode_getblk(struct inode *inode, sector_t block, | |||
| 566 | int goal = 0, pgoal = iinfo->i_location.logicalBlockNum; | 575 | int goal = 0, pgoal = iinfo->i_location.logicalBlockNum; |
| 567 | int lastblock = 0; | 576 | int lastblock = 0; |
| 568 | 577 | ||
| 578 | *err = 0; | ||
| 579 | *new = 0; | ||
| 569 | prev_epos.offset = udf_file_entry_alloc_offset(inode); | 580 | prev_epos.offset = udf_file_entry_alloc_offset(inode); |
| 570 | prev_epos.block = iinfo->i_location; | 581 | prev_epos.block = iinfo->i_location; |
| 571 | prev_epos.bh = NULL; | 582 | prev_epos.bh = NULL; |
| @@ -635,8 +646,7 @@ static struct buffer_head *inode_getblk(struct inode *inode, sector_t block, | |||
| 635 | brelse(cur_epos.bh); | 646 | brelse(cur_epos.bh); |
| 636 | brelse(next_epos.bh); | 647 | brelse(next_epos.bh); |
| 637 | newblock = udf_get_lb_pblock(inode->i_sb, &eloc, offset); | 648 | newblock = udf_get_lb_pblock(inode->i_sb, &eloc, offset); |
| 638 | *phys = newblock; | 649 | return newblock; |
| 639 | return NULL; | ||
| 640 | } | 650 | } |
| 641 | 651 | ||
| 642 | last_block = block; | 652 | last_block = block; |
| @@ -664,7 +674,7 @@ static struct buffer_head *inode_getblk(struct inode *inode, sector_t block, | |||
| 664 | brelse(cur_epos.bh); | 674 | brelse(cur_epos.bh); |
| 665 | brelse(next_epos.bh); | 675 | brelse(next_epos.bh); |
| 666 | *err = ret; | 676 | *err = ret; |
| 667 | return NULL; | 677 | return 0; |
| 668 | } | 678 | } |
| 669 | c = 0; | 679 | c = 0; |
| 670 | offset = 0; | 680 | offset = 0; |
| @@ -729,7 +739,7 @@ static struct buffer_head *inode_getblk(struct inode *inode, sector_t block, | |||
| 729 | if (!newblocknum) { | 739 | if (!newblocknum) { |
| 730 | brelse(prev_epos.bh); | 740 | brelse(prev_epos.bh); |
| 731 | *err = -ENOSPC; | 741 | *err = -ENOSPC; |
| 732 | return NULL; | 742 | return 0; |
| 733 | } | 743 | } |
| 734 | iinfo->i_lenExtents += inode->i_sb->s_blocksize; | 744 | iinfo->i_lenExtents += inode->i_sb->s_blocksize; |
| 735 | } | 745 | } |
| @@ -761,10 +771,10 @@ static struct buffer_head *inode_getblk(struct inode *inode, sector_t block, | |||
| 761 | 771 | ||
| 762 | newblock = udf_get_pblock(inode->i_sb, newblocknum, | 772 | newblock = udf_get_pblock(inode->i_sb, newblocknum, |
| 763 | iinfo->i_location.partitionReferenceNum, 0); | 773 | iinfo->i_location.partitionReferenceNum, 0); |
| 764 | if (!newblock) | 774 | if (!newblock) { |
| 765 | return NULL; | 775 | *err = -EIO; |
| 766 | *phys = newblock; | 776 | return 0; |
| 767 | *err = 0; | 777 | } |
| 768 | *new = 1; | 778 | *new = 1; |
| 769 | iinfo->i_next_alloc_block = block; | 779 | iinfo->i_next_alloc_block = block; |
| 770 | iinfo->i_next_alloc_goal = newblocknum; | 780 | iinfo->i_next_alloc_goal = newblocknum; |
| @@ -775,7 +785,7 @@ static struct buffer_head *inode_getblk(struct inode *inode, sector_t block, | |||
| 775 | else | 785 | else |
| 776 | mark_inode_dirty(inode); | 786 | mark_inode_dirty(inode); |
| 777 | 787 | ||
| 778 | return result; | 788 | return newblock; |
| 779 | } | 789 | } |
| 780 | 790 | ||
| 781 | static void udf_split_extents(struct inode *inode, int *c, int offset, | 791 | static void udf_split_extents(struct inode *inode, int *c, int offset, |
| @@ -1111,10 +1121,9 @@ int udf_setsize(struct inode *inode, loff_t newsize) | |||
| 1111 | if (bsize < | 1121 | if (bsize < |
| 1112 | (udf_file_entry_alloc_offset(inode) + newsize)) { | 1122 | (udf_file_entry_alloc_offset(inode) + newsize)) { |
| 1113 | err = udf_expand_file_adinicb(inode); | 1123 | err = udf_expand_file_adinicb(inode); |
| 1114 | if (err) { | 1124 | if (err) |
| 1115 | up_write(&iinfo->i_data_sem); | ||
| 1116 | return err; | 1125 | return err; |
| 1117 | } | 1126 | down_write(&iinfo->i_data_sem); |
| 1118 | } else | 1127 | } else |
| 1119 | iinfo->i_lenAlloc = newsize; | 1128 | iinfo->i_lenAlloc = newsize; |
| 1120 | } | 1129 | } |
| @@ -1452,9 +1461,9 @@ static int udf_alloc_i_data(struct inode *inode, size_t size) | |||
| 1452 | return 0; | 1461 | return 0; |
| 1453 | } | 1462 | } |
| 1454 | 1463 | ||
| 1455 | static mode_t udf_convert_permissions(struct fileEntry *fe) | 1464 | static umode_t udf_convert_permissions(struct fileEntry *fe) |
| 1456 | { | 1465 | { |
| 1457 | mode_t mode; | 1466 | umode_t mode; |
| 1458 | uint32_t permissions; | 1467 | uint32_t permissions; |
| 1459 | uint32_t flags; | 1468 | uint32_t flags; |
| 1460 | 1469 | ||
diff --git a/fs/udf/namei.c b/fs/udf/namei.c index 4639e137222f..08bf46edf9c4 100644 --- a/fs/udf/namei.c +++ b/fs/udf/namei.c | |||
| @@ -552,7 +552,7 @@ static int udf_delete_entry(struct inode *inode, struct fileIdentDesc *fi, | |||
| 552 | return udf_write_fi(inode, cfi, fi, fibh, NULL, NULL); | 552 | return udf_write_fi(inode, cfi, fi, fibh, NULL, NULL); |
| 553 | } | 553 | } |
| 554 | 554 | ||
| 555 | static int udf_create(struct inode *dir, struct dentry *dentry, int mode, | 555 | static int udf_create(struct inode *dir, struct dentry *dentry, umode_t mode, |
| 556 | struct nameidata *nd) | 556 | struct nameidata *nd) |
| 557 | { | 557 | { |
| 558 | struct udf_fileident_bh fibh; | 558 | struct udf_fileident_bh fibh; |
| @@ -596,7 +596,7 @@ static int udf_create(struct inode *dir, struct dentry *dentry, int mode, | |||
| 596 | return 0; | 596 | return 0; |
| 597 | } | 597 | } |
| 598 | 598 | ||
| 599 | static int udf_mknod(struct inode *dir, struct dentry *dentry, int mode, | 599 | static int udf_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, |
| 600 | dev_t rdev) | 600 | dev_t rdev) |
| 601 | { | 601 | { |
| 602 | struct inode *inode; | 602 | struct inode *inode; |
| @@ -640,7 +640,7 @@ out: | |||
| 640 | return err; | 640 | return err; |
| 641 | } | 641 | } |
| 642 | 642 | ||
| 643 | static int udf_mkdir(struct inode *dir, struct dentry *dentry, int mode) | 643 | static int udf_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) |
| 644 | { | 644 | { |
| 645 | struct inode *inode; | 645 | struct inode *inode; |
| 646 | struct udf_fileident_bh fibh; | 646 | struct udf_fileident_bh fibh; |
diff --git a/fs/udf/super.c b/fs/udf/super.c index e185253470df..c09a84daaf50 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c | |||
| @@ -89,7 +89,7 @@ static void udf_open_lvid(struct super_block *); | |||
| 89 | static void udf_close_lvid(struct super_block *); | 89 | static void udf_close_lvid(struct super_block *); |
| 90 | static unsigned int udf_count_free(struct super_block *); | 90 | static unsigned int udf_count_free(struct super_block *); |
| 91 | static int udf_statfs(struct dentry *, struct kstatfs *); | 91 | static int udf_statfs(struct dentry *, struct kstatfs *); |
| 92 | static int udf_show_options(struct seq_file *, struct vfsmount *); | 92 | static int udf_show_options(struct seq_file *, struct dentry *); |
| 93 | 93 | ||
| 94 | struct logicalVolIntegrityDescImpUse *udf_sb_lvidiu(struct udf_sb_info *sbi) | 94 | struct logicalVolIntegrityDescImpUse *udf_sb_lvidiu(struct udf_sb_info *sbi) |
| 95 | { | 95 | { |
| @@ -138,7 +138,6 @@ static struct inode *udf_alloc_inode(struct super_block *sb) | |||
| 138 | static void udf_i_callback(struct rcu_head *head) | 138 | static void udf_i_callback(struct rcu_head *head) |
| 139 | { | 139 | { |
| 140 | struct inode *inode = container_of(head, struct inode, i_rcu); | 140 | struct inode *inode = container_of(head, struct inode, i_rcu); |
| 141 | INIT_LIST_HEAD(&inode->i_dentry); | ||
| 142 | kmem_cache_free(udf_inode_cachep, UDF_I(inode)); | 141 | kmem_cache_free(udf_inode_cachep, UDF_I(inode)); |
| 143 | } | 142 | } |
| 144 | 143 | ||
| @@ -196,11 +195,11 @@ struct udf_options { | |||
| 196 | unsigned int fileset; | 195 | unsigned int fileset; |
| 197 | unsigned int rootdir; | 196 | unsigned int rootdir; |
| 198 | unsigned int flags; | 197 | unsigned int flags; |
| 199 | mode_t umask; | 198 | umode_t umask; |
| 200 | gid_t gid; | 199 | gid_t gid; |
| 201 | uid_t uid; | 200 | uid_t uid; |
| 202 | mode_t fmode; | 201 | umode_t fmode; |
| 203 | mode_t dmode; | 202 | umode_t dmode; |
| 204 | struct nls_table *nls_map; | 203 | struct nls_table *nls_map; |
| 205 | }; | 204 | }; |
| 206 | 205 | ||
| @@ -250,9 +249,9 @@ static int udf_sb_alloc_partition_maps(struct super_block *sb, u32 count) | |||
| 250 | return 0; | 249 | return 0; |
| 251 | } | 250 | } |
| 252 | 251 | ||
| 253 | static int udf_show_options(struct seq_file *seq, struct vfsmount *mnt) | 252 | static int udf_show_options(struct seq_file *seq, struct dentry *root) |
| 254 | { | 253 | { |
| 255 | struct super_block *sb = mnt->mnt_sb; | 254 | struct super_block *sb = root->d_sb; |
| 256 | struct udf_sb_info *sbi = UDF_SB(sb); | 255 | struct udf_sb_info *sbi = UDF_SB(sb); |
| 257 | 256 | ||
| 258 | if (!UDF_QUERY_FLAG(sb, UDF_FLAG_STRICT)) | 257 | if (!UDF_QUERY_FLAG(sb, UDF_FLAG_STRICT)) |
| @@ -280,11 +279,11 @@ static int udf_show_options(struct seq_file *seq, struct vfsmount *mnt) | |||
| 280 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_GID_SET)) | 279 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_GID_SET)) |
| 281 | seq_printf(seq, ",gid=%u", sbi->s_gid); | 280 | seq_printf(seq, ",gid=%u", sbi->s_gid); |
| 282 | if (sbi->s_umask != 0) | 281 | if (sbi->s_umask != 0) |
| 283 | seq_printf(seq, ",umask=%o", sbi->s_umask); | 282 | seq_printf(seq, ",umask=%ho", sbi->s_umask); |
| 284 | if (sbi->s_fmode != UDF_INVALID_MODE) | 283 | if (sbi->s_fmode != UDF_INVALID_MODE) |
| 285 | seq_printf(seq, ",mode=%o", sbi->s_fmode); | 284 | seq_printf(seq, ",mode=%ho", sbi->s_fmode); |
| 286 | if (sbi->s_dmode != UDF_INVALID_MODE) | 285 | if (sbi->s_dmode != UDF_INVALID_MODE) |
| 287 | seq_printf(seq, ",dmode=%o", sbi->s_dmode); | 286 | seq_printf(seq, ",dmode=%ho", sbi->s_dmode); |
| 288 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_SESSION_SET)) | 287 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_SESSION_SET)) |
| 289 | seq_printf(seq, ",session=%u", sbi->s_session); | 288 | seq_printf(seq, ",session=%u", sbi->s_session); |
| 290 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_LASTBLOCK_SET)) | 289 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_LASTBLOCK_SET)) |
| @@ -1799,6 +1798,12 @@ static void udf_close_lvid(struct super_block *sb) | |||
| 1799 | le16_to_cpu(lvid->descTag.descCRCLength))); | 1798 | le16_to_cpu(lvid->descTag.descCRCLength))); |
| 1800 | 1799 | ||
| 1801 | lvid->descTag.tagChecksum = udf_tag_checksum(&lvid->descTag); | 1800 | lvid->descTag.tagChecksum = udf_tag_checksum(&lvid->descTag); |
| 1801 | /* | ||
| 1802 | * We set buffer uptodate unconditionally here to avoid spurious | ||
| 1803 | * warnings from mark_buffer_dirty() when previous EIO has marked | ||
| 1804 | * the buffer as !uptodate | ||
| 1805 | */ | ||
| 1806 | set_buffer_uptodate(bh); | ||
| 1802 | mark_buffer_dirty(bh); | 1807 | mark_buffer_dirty(bh); |
| 1803 | sbi->s_lvid_dirty = 0; | 1808 | sbi->s_lvid_dirty = 0; |
| 1804 | mutex_unlock(&sbi->s_alloc_mutex); | 1809 | mutex_unlock(&sbi->s_alloc_mutex); |
diff --git a/fs/udf/symlink.c b/fs/udf/symlink.c index b1d4488b0f14..d7c6dbe4194b 100644 --- a/fs/udf/symlink.c +++ b/fs/udf/symlink.c | |||
| @@ -41,10 +41,16 @@ static void udf_pc_to_char(struct super_block *sb, unsigned char *from, | |||
| 41 | pc = (struct pathComponent *)(from + elen); | 41 | pc = (struct pathComponent *)(from + elen); |
| 42 | switch (pc->componentType) { | 42 | switch (pc->componentType) { |
| 43 | case 1: | 43 | case 1: |
| 44 | if (pc->lengthComponentIdent == 0) { | 44 | /* |
| 45 | p = to; | 45 | * Symlink points to some place which should be agreed |
| 46 | *p++ = '/'; | 46 | * upon between originator and receiver of the media. Ignore. |
| 47 | } | 47 | */ |
| 48 | if (pc->lengthComponentIdent > 0) | ||
| 49 | break; | ||
| 50 | /* Fall through */ | ||
| 51 | case 2: | ||
| 52 | p = to; | ||
| 53 | *p++ = '/'; | ||
| 48 | break; | 54 | break; |
| 49 | case 3: | 55 | case 3: |
| 50 | memcpy(p, "../", 3); | 56 | memcpy(p, "../", 3); |
diff --git a/fs/udf/udf_sb.h b/fs/udf/udf_sb.h index 5142a82e3276..42ad69ac9576 100644 --- a/fs/udf/udf_sb.h +++ b/fs/udf/udf_sb.h | |||
| @@ -50,7 +50,7 @@ | |||
| 50 | #define UDF_SPARABLE_MAP15 0x1522U | 50 | #define UDF_SPARABLE_MAP15 0x1522U |
| 51 | #define UDF_METADATA_MAP25 0x2511U | 51 | #define UDF_METADATA_MAP25 0x2511U |
| 52 | 52 | ||
| 53 | #define UDF_INVALID_MODE ((mode_t)-1) | 53 | #define UDF_INVALID_MODE ((umode_t)-1) |
| 54 | 54 | ||
| 55 | #pragma pack(1) /* XXX(hch): Why? This file just defines in-core structures */ | 55 | #pragma pack(1) /* XXX(hch): Why? This file just defines in-core structures */ |
| 56 | 56 | ||
| @@ -127,11 +127,11 @@ struct udf_sb_info { | |||
| 127 | struct buffer_head *s_lvid_bh; | 127 | struct buffer_head *s_lvid_bh; |
| 128 | 128 | ||
| 129 | /* Default permissions */ | 129 | /* Default permissions */ |
| 130 | mode_t s_umask; | 130 | umode_t s_umask; |
| 131 | gid_t s_gid; | 131 | gid_t s_gid; |
| 132 | uid_t s_uid; | 132 | uid_t s_uid; |
| 133 | mode_t s_fmode; | 133 | umode_t s_fmode; |
| 134 | mode_t s_dmode; | 134 | umode_t s_dmode; |
| 135 | /* Lock protecting consistency of above permission settings */ | 135 | /* Lock protecting consistency of above permission settings */ |
| 136 | rwlock_t s_cred_lock; | 136 | rwlock_t s_cred_lock; |
| 137 | 137 | ||
diff --git a/fs/udf/udfdecl.h b/fs/udf/udfdecl.h index f34e6fc0cdaa..ebe10314e512 100644 --- a/fs/udf/udfdecl.h +++ b/fs/udf/udfdecl.h | |||
| @@ -215,7 +215,7 @@ extern int udf_CS0toUTF8(struct ustr *, const struct ustr *); | |||
| 215 | 215 | ||
| 216 | /* ialloc.c */ | 216 | /* ialloc.c */ |
| 217 | extern void udf_free_inode(struct inode *); | 217 | extern void udf_free_inode(struct inode *); |
| 218 | extern struct inode *udf_new_inode(struct inode *, int, int *); | 218 | extern struct inode *udf_new_inode(struct inode *, umode_t, int *); |
| 219 | 219 | ||
| 220 | /* truncate.c */ | 220 | /* truncate.c */ |
| 221 | extern void udf_truncate_tail_extent(struct inode *); | 221 | extern void udf_truncate_tail_extent(struct inode *); |
