]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blobdiff - fs/udf/ialloc.c
udf: fix the udf_iget() vs. udf_new_inode() races
[mirror_ubuntu-zesty-kernel.git] / fs / udf / ialloc.c
index 6eaf5edf1ea1577e88cafc60184963e1b18df5a5..598f33bdcd26ec8f1dabeae7d70f348c4e18e4f0 100644 (file)
@@ -95,6 +95,7 @@ struct inode *udf_new_inode(struct inode *dir, umode_t mode, int *err)
        lvidiu = udf_sb_lvidiu(sb);
        if (lvidiu) {
                iinfo->i_unique = lvid_get_unique_id(sb);
+               inode->i_generation = iinfo->i_unique;
                mutex_lock(&sbi->s_alloc_mutex);
                if (S_ISDIR(mode))
                        le32_add_cpu(&lvidiu->numDirs, 1);
@@ -123,7 +124,12 @@ struct inode *udf_new_inode(struct inode *dir, umode_t mode, int *err)
                iinfo->i_alloc_type = ICBTAG_FLAG_AD_LONG;
        inode->i_mtime = inode->i_atime = inode->i_ctime =
                iinfo->i_crtime = current_fs_time(inode->i_sb);
-       insert_inode_hash(inode);
+       if (unlikely(insert_inode_locked(inode) < 0)) {
+               make_bad_inode(inode);
+               iput(inode);
+               *err = -EIO;
+               return NULL;
+       }
        mark_inode_dirty(inode);
 
        *err = 0;