exofs: Write sbi->s_nextid as part of the Create command
Before when creating a new inode, we'd set the sb->s_dirt flag, and sometime later the system would write out s_nextid as part of the sb_info. Also on inode sync we would force the sb sync as well. Define the s_nextid as a new partition attribute and set it every time we create a new object. At mount we read it from it's new place. We now never set sb->s_dirt anywhere in exofs. write_super is actually never called. The call to exofs_write_super from exofs_put_super is also removed because the VFS always calls ->sync_fs before calling ->put_super twice. To stay backward-and-forward compatible we also write the old s_nextid in the super_block object at unmount, and support zero length attribute on mount. This also fixes a BUG where in layouts when group_width was not a divisor of EXOFS_SUPER_ID (0x10000) the s_nextid was not read from the device it was written to. Because of the sliding window layout trick, and because the read was always done from the 0 device but the write was done via the raid engine that might slide the device view. Now we read and write through the raid engine. Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
This commit is contained in:
@@ -1102,6 +1102,7 @@ int __exofs_wait_obj_created(struct exofs_i_info *oi)
|
||||
}
|
||||
return unlikely(is_bad_inode(&oi->vfs_inode)) ? -EIO : 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Callback function from exofs_new_inode(). The important thing is that we
|
||||
* set the obj_created flag so that other methods know that the object exists on
|
||||
@@ -1160,7 +1161,6 @@ struct inode *exofs_new_inode(struct inode *dir, int mode)
|
||||
sbi = sb->s_fs_info;
|
||||
|
||||
inode->i_mapping->backing_dev_info = sb->s_bdi;
|
||||
sb->s_dirt = 1;
|
||||
inode_init_owner(inode, dir, mode);
|
||||
inode->i_ino = sbi->s_nextid++;
|
||||
inode->i_blkbits = EXOFS_BLKSHIFT;
|
||||
@@ -1171,6 +1171,8 @@ struct inode *exofs_new_inode(struct inode *dir, int mode)
|
||||
spin_unlock(&sbi->s_next_gen_lock);
|
||||
insert_inode_hash(inode);
|
||||
|
||||
exofs_sbi_write_stats(sbi); /* Make sure new sbi->s_nextid is on disk */
|
||||
|
||||
mark_inode_dirty(inode);
|
||||
|
||||
ret = exofs_get_io_state(&sbi->layout, &ios);
|
||||
|
Reference in New Issue
Block a user