Loading fs/xfs/scrub/parent.c +20 −5 Original line number Diff line number Diff line Loading @@ -32,8 +32,10 @@ xchk_setup_parent( struct xchk_parent_ctx { struct dir_context dc; struct xfs_scrub *sc; xfs_ino_t ino; xfs_nlink_t nlink; bool cancelled; }; /* Look for a single entry in a directory pointing to an inode. */ Loading @@ -47,11 +49,21 @@ xchk_parent_actor( unsigned type) { struct xchk_parent_ctx *spc; int error = 0; spc = container_of(dc, struct xchk_parent_ctx, dc); if (spc->ino == ino) spc->nlink++; return 0; /* * If we're facing a fatal signal, bail out. Store the cancellation * status separately because the VFS readdir code squashes error codes * into short directory reads. */ if (xchk_should_terminate(spc->sc, &error)) spc->cancelled = true; return error; } /* Count the number of dentries in the parent dir that point to this inode. */ Loading @@ -63,9 +75,8 @@ xchk_parent_count_parent_dentries( { struct xchk_parent_ctx spc = { .dc.actor = xchk_parent_actor, .dc.pos = 0, .ino = sc->ip->i_ino, .nlink = 0, .sc = sc, }; size_t bufsize; loff_t oldpos; Loading Loading @@ -97,6 +108,10 @@ xchk_parent_count_parent_dentries( error = xfs_readdir(sc->tp, parent, &spc.dc, bufsize); if (error) goto out; if (spc.cancelled) { error = -EAGAIN; goto out; } if (oldpos == spc.dc.pos) break; oldpos = spc.dc.pos; Loading Loading
fs/xfs/scrub/parent.c +20 −5 Original line number Diff line number Diff line Loading @@ -32,8 +32,10 @@ xchk_setup_parent( struct xchk_parent_ctx { struct dir_context dc; struct xfs_scrub *sc; xfs_ino_t ino; xfs_nlink_t nlink; bool cancelled; }; /* Look for a single entry in a directory pointing to an inode. */ Loading @@ -47,11 +49,21 @@ xchk_parent_actor( unsigned type) { struct xchk_parent_ctx *spc; int error = 0; spc = container_of(dc, struct xchk_parent_ctx, dc); if (spc->ino == ino) spc->nlink++; return 0; /* * If we're facing a fatal signal, bail out. Store the cancellation * status separately because the VFS readdir code squashes error codes * into short directory reads. */ if (xchk_should_terminate(spc->sc, &error)) spc->cancelled = true; return error; } /* Count the number of dentries in the parent dir that point to this inode. */ Loading @@ -63,9 +75,8 @@ xchk_parent_count_parent_dentries( { struct xchk_parent_ctx spc = { .dc.actor = xchk_parent_actor, .dc.pos = 0, .ino = sc->ip->i_ino, .nlink = 0, .sc = sc, }; size_t bufsize; loff_t oldpos; Loading Loading @@ -97,6 +108,10 @@ xchk_parent_count_parent_dentries( error = xfs_readdir(sc->tp, parent, &spc.dc, bufsize); if (error) goto out; if (spc.cancelled) { error = -EAGAIN; goto out; } if (oldpos == spc.dc.pos) break; oldpos = spc.dc.pos; Loading