diff options
Diffstat (limited to 'include/linux/backing-dev.h')
| -rw-r--r-- | include/linux/backing-dev.h | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/include/linux/backing-dev.h b/include/linux/backing-dev.h index f6be4b0b6c18..72ca0f3d39f3 100644 --- a/include/linux/backing-dev.h +++ b/include/linux/backing-dev.h | |||
| @@ -347,7 +347,7 @@ static inline struct bdi_writeback *inode_to_wb(const struct inode *inode) | |||
| 347 | /** | 347 | /** |
| 348 | * unlocked_inode_to_wb_begin - begin unlocked inode wb access transaction | 348 | * unlocked_inode_to_wb_begin - begin unlocked inode wb access transaction |
| 349 | * @inode: target inode | 349 | * @inode: target inode |
| 350 | * @lockedp: temp bool output param, to be passed to the end function | 350 | * @cookie: output param, to be passed to the end function |
| 351 | * | 351 | * |
| 352 | * The caller wants to access the wb associated with @inode but isn't | 352 | * The caller wants to access the wb associated with @inode but isn't |
| 353 | * holding inode->i_lock, the i_pages lock or wb->list_lock. This | 353 | * holding inode->i_lock, the i_pages lock or wb->list_lock. This |
| @@ -355,12 +355,12 @@ static inline struct bdi_writeback *inode_to_wb(const struct inode *inode) | |||
| 355 | * association doesn't change until the transaction is finished with | 355 | * association doesn't change until the transaction is finished with |
| 356 | * unlocked_inode_to_wb_end(). | 356 | * unlocked_inode_to_wb_end(). |
| 357 | * | 357 | * |
| 358 | * The caller must call unlocked_inode_to_wb_end() with *@lockdep | 358 | * The caller must call unlocked_inode_to_wb_end() with *@cookie afterwards and |
| 359 | * afterwards and can't sleep during transaction. IRQ may or may not be | 359 | * can't sleep during the transaction. IRQs may or may not be disabled on |
| 360 | * disabled on return. | 360 | * return. |
| 361 | */ | 361 | */ |
| 362 | static inline struct bdi_writeback * | 362 | static inline struct bdi_writeback * |
| 363 | unlocked_inode_to_wb_begin(struct inode *inode, bool *lockedp) | 363 | unlocked_inode_to_wb_begin(struct inode *inode, struct wb_lock_cookie *cookie) |
| 364 | { | 364 | { |
| 365 | rcu_read_lock(); | 365 | rcu_read_lock(); |
| 366 | 366 | ||
| @@ -368,10 +368,10 @@ unlocked_inode_to_wb_begin(struct inode *inode, bool *lockedp) | |||
| 368 | * Paired with store_release in inode_switch_wb_work_fn() and | 368 | * Paired with store_release in inode_switch_wb_work_fn() and |
| 369 | * ensures that we see the new wb if we see cleared I_WB_SWITCH. | 369 | * ensures that we see the new wb if we see cleared I_WB_SWITCH. |
| 370 | */ | 370 | */ |
| 371 | *lockedp = smp_load_acquire(&inode->i_state) & I_WB_SWITCH; | 371 | cookie->locked = smp_load_acquire(&inode->i_state) & I_WB_SWITCH; |
| 372 | 372 | ||
| 373 | if (unlikely(*lockedp)) | 373 | if (unlikely(cookie->locked)) |
| 374 | xa_lock_irq(&inode->i_mapping->i_pages); | 374 | xa_lock_irqsave(&inode->i_mapping->i_pages, cookie->flags); |
| 375 | 375 | ||
| 376 | /* | 376 | /* |
| 377 | * Protected by either !I_WB_SWITCH + rcu_read_lock() or the i_pages | 377 | * Protected by either !I_WB_SWITCH + rcu_read_lock() or the i_pages |
| @@ -383,12 +383,13 @@ unlocked_inode_to_wb_begin(struct inode *inode, bool *lockedp) | |||
| 383 | /** | 383 | /** |
| 384 | * unlocked_inode_to_wb_end - end inode wb access transaction | 384 | * unlocked_inode_to_wb_end - end inode wb access transaction |
| 385 | * @inode: target inode | 385 | * @inode: target inode |
| 386 | * @locked: *@lockedp from unlocked_inode_to_wb_begin() | 386 | * @cookie: @cookie from unlocked_inode_to_wb_begin() |
| 387 | */ | 387 | */ |
| 388 | static inline void unlocked_inode_to_wb_end(struct inode *inode, bool locked) | 388 | static inline void unlocked_inode_to_wb_end(struct inode *inode, |
| 389 | struct wb_lock_cookie *cookie) | ||
| 389 | { | 390 | { |
| 390 | if (unlikely(locked)) | 391 | if (unlikely(cookie->locked)) |
| 391 | xa_unlock_irq(&inode->i_mapping->i_pages); | 392 | xa_unlock_irqrestore(&inode->i_mapping->i_pages, cookie->flags); |
| 392 | 393 | ||
| 393 | rcu_read_unlock(); | 394 | rcu_read_unlock(); |
| 394 | } | 395 | } |
| @@ -435,12 +436,13 @@ static inline struct bdi_writeback *inode_to_wb(struct inode *inode) | |||
| 435 | } | 436 | } |
| 436 | 437 | ||
| 437 | static inline struct bdi_writeback * | 438 | static inline struct bdi_writeback * |
| 438 | unlocked_inode_to_wb_begin(struct inode *inode, bool *lockedp) | 439 | unlocked_inode_to_wb_begin(struct inode *inode, struct wb_lock_cookie *cookie) |
| 439 | { | 440 | { |
| 440 | return inode_to_wb(inode); | 441 | return inode_to_wb(inode); |
| 441 | } | 442 | } |
| 442 | 443 | ||
| 443 | static inline void unlocked_inode_to_wb_end(struct inode *inode, bool locked) | 444 | static inline void unlocked_inode_to_wb_end(struct inode *inode, |
| 445 | struct wb_lock_cookie *cookie) | ||
| 444 | { | 446 | { |
| 445 | } | 447 | } |
| 446 | 448 | ||
