summaryrefslogtreecommitdiff
path: root/fsck/fsck.c
diff options
context:
space:
mode:
Diffstat (limited to 'fsck/fsck.c')
-rw-r--r--fsck/fsck.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/fsck/fsck.c b/fsck/fsck.c
index e11bbe9b..66c027c7 100644
--- a/fsck/fsck.c
+++ b/fsck/fsck.c
@@ -847,6 +847,22 @@ static int fs_match(struct fs_info *fs, struct fs_type_compile *cmp)
return (cmp->negate ? !ret : ret);
}
+/*
+ * Check if a device exists
+ */
+static int device_exists(const char *device)
+{
+ struct stat st;
+
+ if (stat(device, &st) == -1)
+ return 0;
+
+ if (!S_ISBLK(st.st_mode))
+ return 0;
+
+ return 1;
+}
+
/* Check if we should ignore this filesystem. */
static int ignore(struct fs_info *fs)
{
@@ -869,6 +885,15 @@ static int ignore(struct fs_info *fs)
return 1;
}
+ /*
+ * ignore devices that don't exist and have the "nofail" mount option
+ */
+ if (!device_exists(fs->device) && opt_in_list("nofail", fs->opts)) {
+ if (verbose)
+ printf(_("%s: skipping nonexistent device\n"), fs->device);
+ return 1;
+ }
+
interpret_type(fs);
/*