forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/fs/xfs/scrub/parent.c
....@@ -9,21 +9,13 @@
99 #include "xfs_format.h"
1010 #include "xfs_trans_resv.h"
1111 #include "xfs_mount.h"
12
-#include "xfs_defer.h"
13
-#include "xfs_btree.h"
14
-#include "xfs_bit.h"
1512 #include "xfs_log_format.h"
16
-#include "xfs_trans.h"
17
-#include "xfs_sb.h"
1813 #include "xfs_inode.h"
1914 #include "xfs_icache.h"
2015 #include "xfs_dir2.h"
2116 #include "xfs_dir2_priv.h"
22
-#include "xfs_ialloc.h"
23
-#include "scrub/xfs_scrub.h"
2417 #include "scrub/scrub.h"
2518 #include "scrub/common.h"
26
-#include "scrub/trace.h"
2719
2820 /* Set us up to scrub parents. */
2921 int
....@@ -40,8 +32,10 @@
4032
4133 struct xchk_parent_ctx {
4234 struct dir_context dc;
35
+ struct xfs_scrub *sc;
4336 xfs_ino_t ino;
4437 xfs_nlink_t nlink;
38
+ bool cancelled;
4539 };
4640
4741 /* Look for a single entry in a directory pointing to an inode. */
....@@ -55,11 +49,21 @@
5549 unsigned type)
5650 {
5751 struct xchk_parent_ctx *spc;
52
+ int error = 0;
5853
5954 spc = container_of(dc, struct xchk_parent_ctx, dc);
6055 if (spc->ino == ino)
6156 spc->nlink++;
62
- return 0;
57
+
58
+ /*
59
+ * If we're facing a fatal signal, bail out. Store the cancellation
60
+ * status separately because the VFS readdir code squashes error codes
61
+ * into short directory reads.
62
+ */
63
+ if (xchk_should_terminate(spc->sc, &error))
64
+ spc->cancelled = true;
65
+
66
+ return error;
6367 }
6468
6569 /* Count the number of dentries in the parent dir that point to this inode. */
....@@ -70,10 +74,9 @@
7074 xfs_nlink_t *nlink)
7175 {
7276 struct xchk_parent_ctx spc = {
73
- .dc.actor = xchk_parent_actor,
74
- .dc.pos = 0,
75
- .ino = sc->ip->i_ino,
76
- .nlink = 0,
77
+ .dc.actor = xchk_parent_actor,
78
+ .ino = sc->ip->i_ino,
79
+ .sc = sc,
7780 };
7881 size_t bufsize;
7982 loff_t oldpos;
....@@ -87,8 +90,8 @@
8790 * if there is one.
8891 */
8992 lock_mode = xfs_ilock_data_map_shared(parent);
90
- if (parent->i_d.di_nextents > 0)
91
- error = xfs_dir3_data_readahead(parent, 0, -1);
93
+ if (parent->i_df.if_nextents > 0)
94
+ error = xfs_dir3_data_readahead(parent, 0, 0);
9295 xfs_iunlock(parent, lock_mode);
9396 if (error)
9497 return error;
....@@ -105,6 +108,10 @@
105108 error = xfs_readdir(sc->tp, parent, &spc.dc, bufsize);
106109 if (error)
107110 goto out;
111
+ if (spc.cancelled) {
112
+ error = -EAGAIN;
113
+ goto out;
114
+ }
108115 if (oldpos == spc.dc.pos)
109116 break;
110117 oldpos = spc.dc.pos;
....@@ -320,7 +327,7 @@
320327 * If we failed to lock the parent inode even after a retry, just mark
321328 * this scrub incomplete and return.
322329 */
323
- if (sc->try_harder && error == -EDEADLOCK) {
330
+ if ((sc->flags & XCHK_TRY_HARDER) && error == -EDEADLOCK) {
324331 error = 0;
325332 xchk_set_incomplete(sc);
326333 }