| .. | .. |
|---|
| 215 | 215 | value, size, xattr_flags); |
|---|
| 216 | 216 | |
|---|
| 217 | 217 | kfree(value); |
|---|
| 218 | | - if (!error) { |
|---|
| 218 | + if (!error) |
|---|
| 219 | 219 | set_cached_acl(inode, type, acl); |
|---|
| 220 | | - } |
|---|
| 221 | 220 | |
|---|
| 222 | 221 | return error; |
|---|
| 223 | 222 | } |
|---|
| .. | .. |
|---|
| 243 | 242 | handle = ext4_journal_start(inode, EXT4_HT_XATTR, credits); |
|---|
| 244 | 243 | if (IS_ERR(handle)) |
|---|
| 245 | 244 | return PTR_ERR(handle); |
|---|
| 245 | + ext4_fc_start_update(inode); |
|---|
| 246 | 246 | |
|---|
| 247 | 247 | if ((type == ACL_TYPE_ACCESS) && acl) { |
|---|
| 248 | 248 | error = posix_acl_update_mode(inode, &mode, &acl); |
|---|
| 249 | 249 | if (error) |
|---|
| 250 | 250 | goto out_stop; |
|---|
| 251 | | - update_mode = 1; |
|---|
| 251 | + if (mode != inode->i_mode) |
|---|
| 252 | + update_mode = 1; |
|---|
| 252 | 253 | } |
|---|
| 253 | 254 | |
|---|
| 254 | 255 | error = __ext4_set_acl(handle, inode, type, acl, 0 /* xattr_flags */); |
|---|
| 255 | 256 | if (!error && update_mode) { |
|---|
| 256 | 257 | inode->i_mode = mode; |
|---|
| 257 | 258 | inode->i_ctime = current_time(inode); |
|---|
| 258 | | - ext4_mark_inode_dirty(handle, inode); |
|---|
| 259 | + error = ext4_mark_inode_dirty(handle, inode); |
|---|
| 259 | 260 | } |
|---|
| 260 | 261 | out_stop: |
|---|
| 261 | 262 | ext4_journal_stop(handle); |
|---|
| 263 | + ext4_fc_stop_update(inode); |
|---|
| 262 | 264 | if (error == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) |
|---|
| 263 | 265 | goto retry; |
|---|
| 264 | 266 | return error; |
|---|
| .. | .. |
|---|
| 284 | 286 | error = __ext4_set_acl(handle, inode, ACL_TYPE_DEFAULT, |
|---|
| 285 | 287 | default_acl, XATTR_CREATE); |
|---|
| 286 | 288 | posix_acl_release(default_acl); |
|---|
| 289 | + } else { |
|---|
| 290 | + inode->i_default_acl = NULL; |
|---|
| 287 | 291 | } |
|---|
| 288 | 292 | if (acl) { |
|---|
| 289 | 293 | if (!error) |
|---|
| 290 | 294 | error = __ext4_set_acl(handle, inode, ACL_TYPE_ACCESS, |
|---|
| 291 | 295 | acl, XATTR_CREATE); |
|---|
| 292 | 296 | posix_acl_release(acl); |
|---|
| 297 | + } else { |
|---|
| 298 | + inode->i_acl = NULL; |
|---|
| 293 | 299 | } |
|---|
| 294 | 300 | return error; |
|---|
| 295 | 301 | } |
|---|