mirror of
https://github.com/versity/scoutfs.git
synced 2026-09-30 03:36:29 +00:00
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:
committed by
Zach Brown
parent
d16b18562d
commit
f5863142be
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user