diff options
Diffstat (limited to 'fs/udf/namei.c')
-rw-r--r-- | fs/udf/namei.c | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/fs/udf/namei.c b/fs/udf/namei.c index 76cfaf79d982..6a29fa34c478 100644 --- a/fs/udf/namei.c +++ b/fs/udf/namei.c | |||
@@ -171,7 +171,7 @@ static struct fileIdentDesc *udf_find_entry(struct inode *dir, | |||
171 | if (inode_bmap(dir, f_pos >> dir->i_sb->s_blocksize_bits, &epos, | 171 | if (inode_bmap(dir, f_pos >> dir->i_sb->s_blocksize_bits, &epos, |
172 | &eloc, &elen, &offset) != (EXT_RECORDED_ALLOCATED >> 30)) | 172 | &eloc, &elen, &offset) != (EXT_RECORDED_ALLOCATED >> 30)) |
173 | goto out_err; | 173 | goto out_err; |
174 | block = udf_get_lb_pblock(dir->i_sb, eloc, offset); | 174 | block = udf_get_lb_pblock(dir->i_sb, &eloc, offset); |
175 | if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { | 175 | if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { |
176 | if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) | 176 | if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) |
177 | epos.offset -= sizeof(struct short_ad); | 177 | epos.offset -= sizeof(struct short_ad); |
@@ -283,11 +283,14 @@ static struct dentry *udf_lookup(struct inode *dir, struct dentry *dentry, | |||
283 | #endif /* UDF_RECOVERY */ | 283 | #endif /* UDF_RECOVERY */ |
284 | 284 | ||
285 | if (udf_find_entry(dir, &dentry->d_name, &fibh, &cfi)) { | 285 | if (udf_find_entry(dir, &dentry->d_name, &fibh, &cfi)) { |
286 | struct kernel_lb_addr loc; | ||
287 | |||
286 | if (fibh.sbh != fibh.ebh) | 288 | if (fibh.sbh != fibh.ebh) |
287 | brelse(fibh.ebh); | 289 | brelse(fibh.ebh); |
288 | brelse(fibh.sbh); | 290 | brelse(fibh.sbh); |
289 | 291 | ||
290 | inode = udf_iget(dir->i_sb, lelb_to_cpu(cfi.icb.extLocation)); | 292 | loc = lelb_to_cpu(cfi.icb.extLocation); |
293 | inode = udf_iget(dir->i_sb, &loc); | ||
291 | if (!inode) { | 294 | if (!inode) { |
292 | unlock_kernel(); | 295 | unlock_kernel(); |
293 | return ERR_PTR(-EACCES); | 296 | return ERR_PTR(-EACCES); |
@@ -351,11 +354,11 @@ static struct fileIdentDesc *udf_add_entry(struct inode *dir, | |||
351 | if (inode_bmap(dir, f_pos >> dir->i_sb->s_blocksize_bits, &epos, | 354 | if (inode_bmap(dir, f_pos >> dir->i_sb->s_blocksize_bits, &epos, |
352 | &eloc, &elen, &offset) != (EXT_RECORDED_ALLOCATED >> 30)) { | 355 | &eloc, &elen, &offset) != (EXT_RECORDED_ALLOCATED >> 30)) { |
353 | block = udf_get_lb_pblock(dir->i_sb, | 356 | block = udf_get_lb_pblock(dir->i_sb, |
354 | dinfo->i_location, 0); | 357 | &dinfo->i_location, 0); |
355 | fibh->soffset = fibh->eoffset = sb->s_blocksize; | 358 | fibh->soffset = fibh->eoffset = sb->s_blocksize; |
356 | goto add; | 359 | goto add; |
357 | } | 360 | } |
358 | block = udf_get_lb_pblock(dir->i_sb, eloc, offset); | 361 | block = udf_get_lb_pblock(dir->i_sb, &eloc, offset); |
359 | if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { | 362 | if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { |
360 | if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) | 363 | if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) |
361 | epos.offset -= sizeof(struct short_ad); | 364 | epos.offset -= sizeof(struct short_ad); |
@@ -412,7 +415,7 @@ add: | |||
412 | epos.offset -= sizeof(struct short_ad); | 415 | epos.offset -= sizeof(struct short_ad); |
413 | else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) | 416 | else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) |
414 | epos.offset -= sizeof(struct long_ad); | 417 | epos.offset -= sizeof(struct long_ad); |
415 | udf_write_aext(dir, &epos, eloc, elen, 1); | 418 | udf_write_aext(dir, &epos, &eloc, elen, 1); |
416 | } | 419 | } |
417 | f_pos += nfidlen; | 420 | f_pos += nfidlen; |
418 | 421 | ||
@@ -724,7 +727,7 @@ static int empty_dir(struct inode *dir) | |||
724 | else if (inode_bmap(dir, f_pos >> dir->i_sb->s_blocksize_bits, | 727 | else if (inode_bmap(dir, f_pos >> dir->i_sb->s_blocksize_bits, |
725 | &epos, &eloc, &elen, &offset) == | 728 | &epos, &eloc, &elen, &offset) == |
726 | (EXT_RECORDED_ALLOCATED >> 30)) { | 729 | (EXT_RECORDED_ALLOCATED >> 30)) { |
727 | block = udf_get_lb_pblock(dir->i_sb, eloc, offset); | 730 | block = udf_get_lb_pblock(dir->i_sb, &eloc, offset); |
728 | if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { | 731 | if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { |
729 | if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) | 732 | if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) |
730 | epos.offset -= sizeof(struct short_ad); | 733 | epos.offset -= sizeof(struct short_ad); |
@@ -788,7 +791,7 @@ static int udf_rmdir(struct inode *dir, struct dentry *dentry) | |||
788 | 791 | ||
789 | retval = -EIO; | 792 | retval = -EIO; |
790 | tloc = lelb_to_cpu(cfi.icb.extLocation); | 793 | tloc = lelb_to_cpu(cfi.icb.extLocation); |
791 | if (udf_get_lb_pblock(dir->i_sb, tloc, 0) != inode->i_ino) | 794 | if (udf_get_lb_pblock(dir->i_sb, &tloc, 0) != inode->i_ino) |
792 | goto end_rmdir; | 795 | goto end_rmdir; |
793 | retval = -ENOTEMPTY; | 796 | retval = -ENOTEMPTY; |
794 | if (!empty_dir(inode)) | 797 | if (!empty_dir(inode)) |
@@ -834,7 +837,7 @@ static int udf_unlink(struct inode *dir, struct dentry *dentry) | |||
834 | 837 | ||
835 | retval = -EIO; | 838 | retval = -EIO; |
836 | tloc = lelb_to_cpu(cfi.icb.extLocation); | 839 | tloc = lelb_to_cpu(cfi.icb.extLocation); |
837 | if (udf_get_lb_pblock(dir->i_sb, tloc, 0) != inode->i_ino) | 840 | if (udf_get_lb_pblock(dir->i_sb, &tloc, 0) != inode->i_ino) |
838 | goto end_unlink; | 841 | goto end_unlink; |
839 | 842 | ||
840 | if (!inode->i_nlink) { | 843 | if (!inode->i_nlink) { |
@@ -913,7 +916,7 @@ static int udf_symlink(struct inode *dir, struct dentry *dentry, | |||
913 | iinfo->i_location.partitionReferenceNum; | 916 | iinfo->i_location.partitionReferenceNum; |
914 | bsize = inode->i_sb->s_blocksize; | 917 | bsize = inode->i_sb->s_blocksize; |
915 | iinfo->i_lenExtents = bsize; | 918 | iinfo->i_lenExtents = bsize; |
916 | udf_add_aext(inode, &epos, eloc, bsize, 0); | 919 | udf_add_aext(inode, &epos, &eloc, bsize, 0); |
917 | brelse(epos.bh); | 920 | brelse(epos.bh); |
918 | 921 | ||
919 | block = udf_get_pblock(inode->i_sb, block, | 922 | block = udf_get_pblock(inode->i_sb, block, |
@@ -1119,7 +1122,7 @@ static int udf_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
1119 | brelse(ofibh.sbh); | 1122 | brelse(ofibh.sbh); |
1120 | } | 1123 | } |
1121 | tloc = lelb_to_cpu(ocfi.icb.extLocation); | 1124 | tloc = lelb_to_cpu(ocfi.icb.extLocation); |
1122 | if (!ofi || udf_get_lb_pblock(old_dir->i_sb, tloc, 0) | 1125 | if (!ofi || udf_get_lb_pblock(old_dir->i_sb, &tloc, 0) |
1123 | != old_inode->i_ino) | 1126 | != old_inode->i_ino) |
1124 | goto end_rename; | 1127 | goto end_rename; |
1125 | 1128 | ||
@@ -1158,7 +1161,7 @@ static int udf_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
1158 | if (!dir_fi) | 1161 | if (!dir_fi) |
1159 | goto end_rename; | 1162 | goto end_rename; |
1160 | tloc = lelb_to_cpu(dir_fi->icb.extLocation); | 1163 | tloc = lelb_to_cpu(dir_fi->icb.extLocation); |
1161 | if (udf_get_lb_pblock(old_inode->i_sb, tloc, 0) != | 1164 | if (udf_get_lb_pblock(old_inode->i_sb, &tloc, 0) != |
1162 | old_dir->i_ino) | 1165 | old_dir->i_ino) |
1163 | goto end_rename; | 1166 | goto end_rename; |
1164 | 1167 | ||
@@ -1242,6 +1245,7 @@ end_rename: | |||
1242 | 1245 | ||
1243 | static struct dentry *udf_get_parent(struct dentry *child) | 1246 | static struct dentry *udf_get_parent(struct dentry *child) |
1244 | { | 1247 | { |
1248 | struct kernel_lb_addr tloc; | ||
1245 | struct inode *inode = NULL; | 1249 | struct inode *inode = NULL; |
1246 | struct qstr dotdot = {.name = "..", .len = 2}; | 1250 | struct qstr dotdot = {.name = "..", .len = 2}; |
1247 | struct fileIdentDesc cfi; | 1251 | struct fileIdentDesc cfi; |
@@ -1255,8 +1259,8 @@ static struct dentry *udf_get_parent(struct dentry *child) | |||
1255 | brelse(fibh.ebh); | 1259 | brelse(fibh.ebh); |
1256 | brelse(fibh.sbh); | 1260 | brelse(fibh.sbh); |
1257 | 1261 | ||
1258 | inode = udf_iget(child->d_inode->i_sb, | 1262 | tloc = lelb_to_cpu(cfi.icb.extLocation); |
1259 | lelb_to_cpu(cfi.icb.extLocation)); | 1263 | inode = udf_iget(child->d_inode->i_sb, &tloc); |
1260 | if (!inode) | 1264 | if (!inode) |
1261 | goto out_unlock; | 1265 | goto out_unlock; |
1262 | unlock_kernel(); | 1266 | unlock_kernel(); |
@@ -1279,7 +1283,7 @@ static struct dentry *udf_nfs_get_inode(struct super_block *sb, u32 block, | |||
1279 | 1283 | ||
1280 | loc.logicalBlockNum = block; | 1284 | loc.logicalBlockNum = block; |
1281 | loc.partitionReferenceNum = partref; | 1285 | loc.partitionReferenceNum = partref; |
1282 | inode = udf_iget(sb, loc); | 1286 | inode = udf_iget(sb, &loc); |
1283 | 1287 | ||
1284 | if (inode == NULL) | 1288 | if (inode == NULL) |
1285 | return ERR_PTR(-ENOMEM); | 1289 | return ERR_PTR(-ENOMEM); |