aboutsummaryrefslogtreecommitdiffstats
path: root/fs/udf/ialloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/udf/ialloc.c')
-rw-r--r--fs/udf/ialloc.c28
1 files changed, 15 insertions, 13 deletions
diff --git a/fs/udf/ialloc.c b/fs/udf/ialloc.c
index 6eaf5edf1ea1..e77db621ec89 100644
--- a/fs/udf/ialloc.c
+++ b/fs/udf/ialloc.c
@@ -45,7 +45,7 @@ void udf_free_inode(struct inode *inode)
45 udf_free_blocks(sb, NULL, &UDF_I(inode)->i_location, 0, 1); 45 udf_free_blocks(sb, NULL, &UDF_I(inode)->i_location, 0, 1);
46} 46}
47 47
48struct inode *udf_new_inode(struct inode *dir, umode_t mode, int *err) 48struct inode *udf_new_inode(struct inode *dir, umode_t mode)
49{ 49{
50 struct super_block *sb = dir->i_sb; 50 struct super_block *sb = dir->i_sb;
51 struct udf_sb_info *sbi = UDF_SB(sb); 51 struct udf_sb_info *sbi = UDF_SB(sb);
@@ -55,14 +55,12 @@ struct inode *udf_new_inode(struct inode *dir, umode_t mode, int *err)
55 struct udf_inode_info *iinfo; 55 struct udf_inode_info *iinfo;
56 struct udf_inode_info *dinfo = UDF_I(dir); 56 struct udf_inode_info *dinfo = UDF_I(dir);
57 struct logicalVolIntegrityDescImpUse *lvidiu; 57 struct logicalVolIntegrityDescImpUse *lvidiu;
58 int err;
58 59
59 inode = new_inode(sb); 60 inode = new_inode(sb);
60 61
61 if (!inode) { 62 if (!inode)
62 *err = -ENOMEM; 63 return ERR_PTR(-ENOMEM);
63 return NULL;
64 }
65 *err = -ENOSPC;
66 64
67 iinfo = UDF_I(inode); 65 iinfo = UDF_I(inode);
68 if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_EXTENDED_FE)) { 66 if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_EXTENDED_FE)) {
@@ -80,21 +78,22 @@ struct inode *udf_new_inode(struct inode *dir, umode_t mode, int *err)
80 } 78 }
81 if (!iinfo->i_ext.i_data) { 79 if (!iinfo->i_ext.i_data) {
82 iput(inode); 80 iput(inode);
83 *err = -ENOMEM; 81 return ERR_PTR(-ENOMEM);
84 return NULL;
85 } 82 }
86 83
84 err = -ENOSPC;
87 block = udf_new_block(dir->i_sb, NULL, 85 block = udf_new_block(dir->i_sb, NULL,
88 dinfo->i_location.partitionReferenceNum, 86 dinfo->i_location.partitionReferenceNum,
89 start, err); 87 start, &err);
90 if (*err) { 88 if (err) {
91 iput(inode); 89 iput(inode);
92 return NULL; 90 return ERR_PTR(err);
93 } 91 }
94 92
95 lvidiu = udf_sb_lvidiu(sb); 93 lvidiu = udf_sb_lvidiu(sb);
96 if (lvidiu) { 94 if (lvidiu) {
97 iinfo->i_unique = lvid_get_unique_id(sb); 95 iinfo->i_unique = lvid_get_unique_id(sb);
96 inode->i_generation = iinfo->i_unique;
98 mutex_lock(&sbi->s_alloc_mutex); 97 mutex_lock(&sbi->s_alloc_mutex);
99 if (S_ISDIR(mode)) 98 if (S_ISDIR(mode))
100 le32_add_cpu(&lvidiu->numDirs, 1); 99 le32_add_cpu(&lvidiu->numDirs, 1);
@@ -123,9 +122,12 @@ struct inode *udf_new_inode(struct inode *dir, umode_t mode, int *err)
123 iinfo->i_alloc_type = ICBTAG_FLAG_AD_LONG; 122 iinfo->i_alloc_type = ICBTAG_FLAG_AD_LONG;
124 inode->i_mtime = inode->i_atime = inode->i_ctime = 123 inode->i_mtime = inode->i_atime = inode->i_ctime =
125 iinfo->i_crtime = current_fs_time(inode->i_sb); 124 iinfo->i_crtime = current_fs_time(inode->i_sb);
126 insert_inode_hash(inode); 125 if (unlikely(insert_inode_locked(inode) < 0)) {
126 make_bad_inode(inode);
127 iput(inode);
128 return ERR_PTR(-EIO);
129 }
127 mark_inode_dirty(inode); 130 mark_inode_dirty(inode);
128 131
129 *err = 0;
130 return inode; 132 return inode;
131} 133}