diff options
Diffstat (limited to 'fs/udf')
| -rw-r--r-- | fs/udf/file.c | 1 | ||||
| -rw-r--r-- | fs/udf/ialloc.c | 44 |
2 files changed, 20 insertions, 25 deletions
diff --git a/fs/udf/file.c b/fs/udf/file.c index 0ed6e146a0d9..eb91f3b70320 100644 --- a/fs/udf/file.c +++ b/fs/udf/file.c | |||
| @@ -211,6 +211,7 @@ const struct file_operations udf_file_operations = { | |||
| 211 | .release = udf_release_file, | 211 | .release = udf_release_file, |
| 212 | .fsync = udf_fsync_file, | 212 | .fsync = udf_fsync_file, |
| 213 | .splice_read = generic_file_splice_read, | 213 | .splice_read = generic_file_splice_read, |
| 214 | .llseek = generic_file_llseek, | ||
| 214 | }; | 215 | }; |
| 215 | 216 | ||
| 216 | const struct inode_operations udf_file_inode_operations = { | 217 | const struct inode_operations udf_file_inode_operations = { |
diff --git a/fs/udf/ialloc.c b/fs/udf/ialloc.c index eb9cfa23dc3d..a4f2b3ce45b0 100644 --- a/fs/udf/ialloc.c +++ b/fs/udf/ialloc.c | |||
| @@ -76,11 +76,24 @@ struct inode *udf_new_inode(struct inode *dir, int mode, int *err) | |||
| 76 | *err = -ENOSPC; | 76 | *err = -ENOSPC; |
| 77 | 77 | ||
| 78 | iinfo = UDF_I(inode); | 78 | iinfo = UDF_I(inode); |
| 79 | iinfo->i_unique = 0; | 79 | if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_EXTENDED_FE)) { |
| 80 | iinfo->i_lenExtents = 0; | 80 | iinfo->i_efe = 1; |
| 81 | iinfo->i_next_alloc_block = 0; | 81 | if (UDF_VERS_USE_EXTENDED_FE > sbi->s_udfrev) |
| 82 | iinfo->i_next_alloc_goal = 0; | 82 | sbi->s_udfrev = UDF_VERS_USE_EXTENDED_FE; |
| 83 | iinfo->i_strat4096 = 0; | 83 | iinfo->i_ext.i_data = kzalloc(inode->i_sb->s_blocksize - |
| 84 | sizeof(struct extendedFileEntry), | ||
| 85 | GFP_KERNEL); | ||
| 86 | } else { | ||
| 87 | iinfo->i_efe = 0; | ||
| 88 | iinfo->i_ext.i_data = kzalloc(inode->i_sb->s_blocksize - | ||
| 89 | sizeof(struct fileEntry), | ||
| 90 | GFP_KERNEL); | ||
| 91 | } | ||
| 92 | if (!iinfo->i_ext.i_data) { | ||
| 93 | iput(inode); | ||
| 94 | *err = -ENOMEM; | ||
| 95 | return NULL; | ||
| 96 | } | ||
| 84 | 97 | ||
| 85 | block = udf_new_block(dir->i_sb, NULL, | 98 | block = udf_new_block(dir->i_sb, NULL, |
| 86 | dinfo->i_location.partitionReferenceNum, | 99 | dinfo->i_location.partitionReferenceNum, |
| @@ -111,6 +124,7 @@ struct inode *udf_new_inode(struct inode *dir, int mode, int *err) | |||
| 111 | lvhd->uniqueID = cpu_to_le64(uniqueID); | 124 | lvhd->uniqueID = cpu_to_le64(uniqueID); |
| 112 | mark_buffer_dirty(sbi->s_lvid_bh); | 125 | mark_buffer_dirty(sbi->s_lvid_bh); |
| 113 | } | 126 | } |
| 127 | mutex_unlock(&sbi->s_alloc_mutex); | ||
| 114 | inode->i_mode = mode; | 128 | inode->i_mode = mode; |
| 115 | inode->i_uid = current->fsuid; | 129 | inode->i_uid = current->fsuid; |
| 116 | if (dir->i_mode & S_ISGID) { | 130 | if (dir->i_mode & S_ISGID) { |
| @@ -129,25 +143,6 @@ struct inode *udf_new_inode(struct inode *dir, int mode, int *err) | |||
| 129 | iinfo->i_lenEAttr = 0; | 143 | iinfo->i_lenEAttr = 0; |
| 130 | iinfo->i_lenAlloc = 0; | 144 | iinfo->i_lenAlloc = 0; |
| 131 | iinfo->i_use = 0; | 145 | iinfo->i_use = 0; |
| 132 | if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_EXTENDED_FE)) { | ||
| 133 | iinfo->i_efe = 1; | ||
| 134 | if (UDF_VERS_USE_EXTENDED_FE > sbi->s_udfrev) | ||
| 135 | sbi->s_udfrev = UDF_VERS_USE_EXTENDED_FE; | ||
| 136 | iinfo->i_ext.i_data = kzalloc(inode->i_sb->s_blocksize - | ||
| 137 | sizeof(struct extendedFileEntry), | ||
| 138 | GFP_KERNEL); | ||
| 139 | } else { | ||
| 140 | iinfo->i_efe = 0; | ||
| 141 | iinfo->i_ext.i_data = kzalloc(inode->i_sb->s_blocksize - | ||
| 142 | sizeof(struct fileEntry), | ||
| 143 | GFP_KERNEL); | ||
| 144 | } | ||
| 145 | if (!iinfo->i_ext.i_data) { | ||
| 146 | iput(inode); | ||
| 147 | *err = -ENOMEM; | ||
| 148 | mutex_unlock(&sbi->s_alloc_mutex); | ||
| 149 | return NULL; | ||
| 150 | } | ||
| 151 | if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_AD_IN_ICB)) | 146 | if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_AD_IN_ICB)) |
| 152 | iinfo->i_alloc_type = ICBTAG_FLAG_AD_IN_ICB; | 147 | iinfo->i_alloc_type = ICBTAG_FLAG_AD_IN_ICB; |
| 153 | else if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_SHORT_AD)) | 148 | else if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_SHORT_AD)) |
| @@ -158,7 +153,6 @@ struct inode *udf_new_inode(struct inode *dir, int mode, int *err) | |||
| 158 | iinfo->i_crtime = current_fs_time(inode->i_sb); | 153 | iinfo->i_crtime = current_fs_time(inode->i_sb); |
| 159 | insert_inode_hash(inode); | 154 | insert_inode_hash(inode); |
| 160 | mark_inode_dirty(inode); | 155 | mark_inode_dirty(inode); |
| 161 | mutex_unlock(&sbi->s_alloc_mutex); | ||
| 162 | 156 | ||
| 163 | if (DQUOT_ALLOC_INODE(inode)) { | 157 | if (DQUOT_ALLOC_INODE(inode)) { |
| 164 | DQUOT_DROP(inode); | 158 | DQUOT_DROP(inode); |
