b);
else
err = lafs_setparent(dblk(b));
+ if (err)
+ return err;
/* If there is already a physaddr, or the data is
* stored in the inode, then we aren't really allocating
*/
in_emergency = test_bit(EmergencyClean, &fs->fsstate);
/* Allocate space in the filesystem */
- err = err ?: lafs_prealloc(b, alloc_type);
+ err = lafs_prealloc(b, alloc_type);
+ if (err) {
+ if (alloc_type == NewSpace) {
+ if (in_emergency)
+ return -ENOSPC;
+ return -EAGAIN;
+ }
+ if (alloc_type == ReleaseSpace)
+ return -EAGAIN;
+ LAFS_BUG(1, b);
+ }
/* Allocate space in the file (and quota set) */
- if (err == 0 && b->physaddr == 0 &&
+ if (b->physaddr == 0 &&
!test_bit(B_Index, &b->flags) &&
!test_and_set_bit(B_Prealloc, &b->flags)) {
err = lafs_summary_allocate(fs, b->inode, 1);
if (err)
clear_bit(B_Prealloc, &b->flags);
}
+ if (err) {
+ LAFS_BUG(alloc_type == AccountSpace, b);
+ return err;
+ }
/* Having reserved the block, we need to get a segref,
* which will involve reserving those blocks too.
&& !test_bit(B_SegRef, &b->flags))
err = lafs_seg_ref_block(b, 0);
- if (err == 0)
- return 0;
- if (alloc_type == NewSpace) {
- if (in_emergency)
- return -ENOSPC;
- return -EAGAIN;
- }
- if (alloc_type == ReleaseSpace)
- return -EAGAIN;
- LAFS_BUG(1, b);
+ return err;
}
int