| .. | .. |
|---|
| 50 | 50 | * So just sample it once and use the same value everywhere. |
|---|
| 51 | 51 | */ |
|---|
| 52 | 52 | kaddr = kmap_atomic(page); |
|---|
| 53 | | - memcpy(kaddr, iinfo->i_ext.i_data + iinfo->i_lenEAttr, isize); |
|---|
| 53 | + memcpy(kaddr, iinfo->i_data + iinfo->i_lenEAttr, isize); |
|---|
| 54 | 54 | memset(kaddr + isize, 0, PAGE_SIZE - isize); |
|---|
| 55 | 55 | flush_dcache_page(page); |
|---|
| 56 | 56 | SetPageUptodate(page); |
|---|
| .. | .. |
|---|
| 76 | 76 | BUG_ON(!PageLocked(page)); |
|---|
| 77 | 77 | |
|---|
| 78 | 78 | kaddr = kmap_atomic(page); |
|---|
| 79 | | - memcpy(iinfo->i_ext.i_data + iinfo->i_lenEAttr, kaddr, |
|---|
| 80 | | - i_size_read(inode)); |
|---|
| 79 | + memcpy(iinfo->i_data + iinfo->i_lenEAttr, kaddr, i_size_read(inode)); |
|---|
| 81 | 80 | SetPageUptodate(page); |
|---|
| 82 | 81 | kunmap_atomic(kaddr); |
|---|
| 83 | 82 | mark_inode_dirty(inode); |
|---|
| .. | .. |
|---|
| 148 | 147 | goto out; |
|---|
| 149 | 148 | |
|---|
| 150 | 149 | down_write(&iinfo->i_data_sem); |
|---|
| 151 | | - if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) { |
|---|
| 152 | | - loff_t end = iocb->ki_pos + iov_iter_count(from); |
|---|
| 153 | | - |
|---|
| 154 | | - if (inode->i_sb->s_blocksize < |
|---|
| 155 | | - (udf_file_entry_alloc_offset(inode) + end)) { |
|---|
| 156 | | - err = udf_expand_file_adinicb(inode); |
|---|
| 157 | | - if (err) { |
|---|
| 158 | | - inode_unlock(inode); |
|---|
| 159 | | - udf_debug("udf_expand_adinicb: err=%d\n", err); |
|---|
| 160 | | - return err; |
|---|
| 161 | | - } |
|---|
| 162 | | - } else { |
|---|
| 163 | | - iinfo->i_lenAlloc = max(end, inode->i_size); |
|---|
| 164 | | - up_write(&iinfo->i_data_sem); |
|---|
| 150 | + if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB && |
|---|
| 151 | + inode->i_sb->s_blocksize < (udf_file_entry_alloc_offset(inode) + |
|---|
| 152 | + iocb->ki_pos + iov_iter_count(from))) { |
|---|
| 153 | + err = udf_expand_file_adinicb(inode); |
|---|
| 154 | + if (err) { |
|---|
| 155 | + inode_unlock(inode); |
|---|
| 156 | + udf_debug("udf_expand_adinicb: err=%d\n", err); |
|---|
| 157 | + return err; |
|---|
| 165 | 158 | } |
|---|
| 166 | 159 | } else |
|---|
| 167 | 160 | up_write(&iinfo->i_data_sem); |
|---|
| 168 | 161 | |
|---|
| 169 | 162 | retval = __generic_file_write_iter(iocb, from); |
|---|
| 170 | 163 | out: |
|---|
| 164 | + down_write(&iinfo->i_data_sem); |
|---|
| 165 | + if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB && retval > 0) |
|---|
| 166 | + iinfo->i_lenAlloc = inode->i_size; |
|---|
| 167 | + up_write(&iinfo->i_data_sem); |
|---|
| 171 | 168 | inode_unlock(inode); |
|---|
| 172 | 169 | |
|---|
| 173 | 170 | if (retval > 0) { |
|---|
| .. | .. |
|---|
| 215 | 212 | return put_user(UDF_I(inode)->i_lenEAttr, (int __user *)arg); |
|---|
| 216 | 213 | case UDF_GETEABLOCK: |
|---|
| 217 | 214 | return copy_to_user((char __user *)arg, |
|---|
| 218 | | - UDF_I(inode)->i_ext.i_data, |
|---|
| 215 | + UDF_I(inode)->i_data, |
|---|
| 219 | 216 | UDF_I(inode)->i_lenEAttr) ? -EFAULT : 0; |
|---|
| 220 | 217 | default: |
|---|
| 221 | 218 | return -ENOIOCTLCMD; |
|---|
| .. | .. |
|---|
| 280 | 277 | return error; |
|---|
| 281 | 278 | } |
|---|
| 282 | 279 | |
|---|
| 280 | + if (attr->ia_valid & ATTR_MODE) |
|---|
| 281 | + udf_update_extra_perms(inode, attr->ia_mode); |
|---|
| 282 | + |
|---|
| 283 | 283 | setattr_copy(inode, attr); |
|---|
| 284 | 284 | mark_inode_dirty(inode); |
|---|
| 285 | 285 | return 0; |
|---|