scoutfs: add data_wait_err for reporting errors

Add support for reporting errors to data waiters via a new
SCOUTFS_IOC_DATA_WAIT_ERR ioctl.  This allows waiters to return an error
to readers when staging fails.

Signed-off-by: Benjamin LaHaise <bcrl@kvack.org>
[zab: renamed to data_wait_err, took ino arg]
Signed-off-by: Zach Brown <zab@versity.com>
This commit is contained in:
Benjamin LaHaise
2020-05-29 13:50:13 -07:00
committed by Zach Brown
parent d16b18562d
commit f5863142be
5 changed files with 145 additions and 0 deletions
+32
View File
@@ -1923,6 +1923,8 @@ int scoutfs_data_wait(struct inode *inode, struct scoutfs_data_wait *dw)
spin_lock(&rt->lock);
rb_erase(&dw->node, &rt->root);
RB_CLEAR_NODE(&dw->node);
if (!ret && dw->err)
ret = dw->err;
spin_unlock(&rt->lock);
return ret;
@@ -1936,6 +1938,36 @@ void scoutfs_data_wait_changed(struct inode *inode)
wake_up(&wq->waitq);
}
long scoutfs_data_wait_err(struct inode *inode, u64 sblock, u64 eblock,
u64 op, long err)
{
struct super_block *sb = inode->i_sb;
const u64 ino = scoutfs_ino(inode);
DECLARE_DATA_WAIT_ROOT(sb, rt);
struct scoutfs_data_wait *dw;
long nr = 0;
if (!err)
return 0;
spin_lock(&rt->lock);
for (dw = next_data_wait(&rt->root, ino, sblock);
dw; dw = dw_next(dw)) {
if (dw->ino != ino || dw->iblock > eblock)
break;
if ((dw->op & op) && !dw->err) {
dw->err = err;
nr++;
}
}
spin_unlock(&rt->lock);
if (nr)
scoutfs_data_wait_changed(inode);
return nr;
}
int scoutfs_data_waiting(struct super_block *sb, u64 ino, u64 iblock,
struct scoutfs_ioctl_data_waiting_entry *dwe,
unsigned int nr)