In several places we want this an open code it.
Just write the real code.
Signed-off-by: NeilBrown <neilb@suse.de>
return ib;
offset = li->metadata_size;
+ err = -EAGAIN;
if (!async)
lafs_iolock_block(&ib->b);
- else if (test_and_set_bit(B_IOLock, &ib->b.flags)) {
- err = -EAGAIN;
- goto err;
- } else
- set_iolock_info(&ib->b);
+ else if (!lafs_iolock_block_async(&ib->b))
+ goto err;
while (ib->depth > 1) {
/* internal index block */
err = lafs_wait_block(&ib2->b);
if (err)
goto err_ib2;
+ err = -EAGAIN;
if (!async)
lafs_iolock_block(&ib->b);
- else if (test_and_set_bit(B_IOLock, &ib->b.flags)) {
- err = -EAGAIN;
+ else if (!lafs_iolock_block_async(&ib->b))
goto err_ib2;
- } else
- set_iolock_info(&ib->b);
}
+ err = -EAGAIN;
if (!async)
lafs_iolock_block(&ib2->b);
- else if (test_and_set_bit(B_IOLock, &ib2->b.flags)) {
- err = -EAGAIN;
+ else if (!lafs_iolock_block_async(&ib2->b))
goto err_ib2;
- } else
- set_iolock_info(&ib2->b);
/* This block might have been split, in which case
* we need to consider adjacent siblings.
spin_unlock(&inode->i_data.private_lock);
if (!async)
lafs_iolock_block(nxt);
- else if (test_and_set_bit(B_IOLock, &nxt->flags)) {
- err = -EAGAIN;
+ else if (!lafs_iolock_block_async(nxt)) {
putref(nxt, REF);
+ err = -EAGAIN;
goto err_ib2;
- } else
- set_iolock_info(nxt);
+ }
lafs_iounlock_block(&ib2->b);
putiref(ib2, REF);
*/
/* lafs_iolock_written(&ib2->b); - without blocking */
- if (test_and_set_bit(B_IOLock, &ib2->b.flags)) {
+ if (!lafs_iolock_block_async(&ib2->b)) {
putiref(ib2, MKREF(inode_handle_orphan2));
goto out2;
}
- set_iolock_info(&ib2->b);
if (test_bit(B_Writeback, &ib2->b.flags)) {
lafs_iounlock_block(&ib2->b);
putiref(ib2, MKREF(inode_handle_orphan2));
}
putiref(ib2, MKREF(inode_handle_orphan2));
if (ib->uninc) {
- if (!test_and_set_bit(B_IOLock, &ib->b.flags)) {
- set_iolock_info(&ib->b);
+ if (lafs_iolock_block_async(&ib->b)) {
if (!test_bit(B_Writeback, &ib->b.flags))
while (ib->uninc)
lafs_incorporate(fs, ib);
#define set_iolock_info(b) (0)
#endif
#define lafs_iolock_block(b) do { _lafs_iolock_block(b); set_iolock_info(b); } while(0)
+#define lafs_iolock_block_async(b) ( _lafs_iolock_block_async(b) ? ( set_iolock_info(b), 1) : 0)
#define lafs_iolock_written(b) do { _lafs_iolock_written(b); set_iolock_info(b); } while(0)
void lafs_io_wake(struct block *b);
void _lafs_iolock_block(struct block *b);
void _lafs_iolock_written(struct block *b);
+static inline int _lafs_iolock_block_async(struct block *b) {
+ return !test_and_set_bit(B_IOLock, &b->flags);
+}
void lafs_iounlock_block(struct block *b);
void lafs_iocheck_block(struct datablock *db, int unlock);
void lafs_iocheck_writeback(struct datablock *db, int unlock);