if (test_and_set_bit(B_Claimed, &b->b.flags)) {
putdref(b, MKREF(cfi_ino));
if (inum)
- return -EINVAL;
+ return -EEXIST;
goto retry;
}
- lafs_iolock_written(&imni->mb->b);
- set_bit(B_PinPending, &imni->mb->b.flags);
- lafs_iounlock_block(&imni->mb->b);
+ if (imni->mb) {
+ lafs_iolock_written(&imni->mb->b);
+ set_bit(B_PinPending, &imni->mb->b.flags);
+ lafs_iounlock_block(&imni->mb->b);
+ }
set_bit(B_PinPending, &b->b.flags);
b->my_inode = NULL;
imni->ib = b;
static int
inode_map_new_pin(struct inode_map_new_info *imni)
{
- int err = lafs_pin_dblock(imni->mb, NewSpace);
+ int err = 0;
+ if (imni->mb)
+ err = lafs_pin_dblock(imni->mb, NewSpace);
err = err ?: lafs_pin_dblock(imni->ib, NewSpace);
return err;
}
static void
inode_map_new_commit(struct inode_map_new_info *imni)
{
- unsigned long *buf = map_dblock(imni->mb);
- int blksize = imni->ib->b.inode->i_sb->s_blocksize;
- int bit = imni->ib->b.fileaddr & (blksize*8 - 1);
- int hole = 0;
- struct inode *ino = NULL;
+ unsigned long *buf;
- clear_bit(bit, buf);
- if (buf[blksize/sizeof(*buf)-1] == 0 &&
- find_first_bit(buf, blksize*8) == blksize*8)
- /* block is empty, punch a hole */
- hole = 1;
+ if (imni->mb) {
+ int blksize = imni->ib->b.inode->i_sb->s_blocksize;
+ int bit = imni->ib->b.fileaddr & (blksize*8 - 1);
+ int hole = 0;
+ struct inode *ino;
+
+ buf = map_dblock(imni->mb);
+ clear_bit(bit, buf);
+ if (buf[blksize/sizeof(*buf)-1] == 0 &&
+ find_first_bit(buf, blksize*8) == blksize*8)
+ /* block is empty, punch a hole */
+ hole = 1;
+
+ unmap_dblock(imni->mb, buf);
+ if (hole)
+ lafs_erase_dblock(imni->mb);
+ else
+ lafs_dirty_dblock(imni->mb);
- unmap_dblock(imni->mb, buf);
- if (hole)
- lafs_erase_dblock(imni->mb);
- else
- lafs_dirty_dblock(imni->mb);
- putdref(imni->ib, MKREF(cfi_ino));
- if (imni->mb)
ino = imni->mb->b.inode;
- putdref(imni->mb, MKREF(cfi_map));
- if (ino)
+ putdref(imni->mb, MKREF(cfi_map));
iput(ino);
+ }
+ putdref(imni->ib, MKREF(cfi_ino));
}
static void
inode_map_new_abort(struct inode_map_new_info *imni)
{
- struct inode *ino = NULL;
if (imni->ib) {
clear_bit(B_Claimed, &imni->ib->b.flags);
clear_bit(B_PinPending, &imni->ib->b.flags);
imni->ib, NULL);
}
putdref(imni->ib, MKREF(cfi_ino));
- if (imni->mb)
- ino = imni->mb->b.inode;
- putdref(imni->mb, MKREF(cfi_map));
- if (ino)
+ if (imni->mb) {
+ struct inode *ino = imni->mb->b.inode;
+ putdref(imni->mb, MKREF(cfi_map));
iput(ino);
+ }
}
struct inode *