From 18789cdeaa05afe8af1c4799e62bfd31a1fcaab9 Mon Sep 17 00:00:00 2001 From: Erik Larsson Date: Thu, 2 Dec 2010 10:15:35 +0100 Subject: [PATCH] Replaced all occurrences of the libntfs mount flag NTFS_MNT_FORCE with the libntfs-3g mount flag MS_RECOVER. Note: The NTFS_MNT_FORCE, in addition to what MS_RECOVER does, also bypasses the check for the 'dirty' bit in libntfs' ntfs_mount. However, this check does not exist in libntfs-3g (libntfs-3g will not check or change the dirty bit, being confident that it can handle volumes marked as 'dirty'), so in essence the same behaviour is achieved with MS_RECOVER. --- ntfsprogs/ntfscat.c | 2 +- ntfsprogs/ntfscluster.c | 2 +- ntfsprogs/ntfscp.c | 2 +- ntfsprogs/ntfsdecrypt.c | 2 +- ntfsprogs/ntfsinfo.c | 2 +- ntfsprogs/ntfslabel.c | 2 +- ntfsprogs/ntfsls.c | 2 +- ntfsprogs/ntfsmove.c | 2 +- ntfsprogs/ntfsundelete.c | 2 +- ntfsprogs/ntfswipe.c | 2 +- ntfsprogs/utils.c | 19 +++++++++++++++++-- 11 files changed, 27 insertions(+), 12 deletions(-) diff --git a/ntfsprogs/ntfscat.c b/ntfsprogs/ntfscat.c index 68be30c3..7d6aebf9 100644 --- a/ntfsprogs/ntfscat.c +++ b/ntfsprogs/ntfscat.c @@ -411,7 +411,7 @@ int main(int argc, char *argv[]) utils_set_locale(); vol = utils_mount_volume(opts.device, MS_RDONLY | - (opts.force ? NTFS_MNT_FORCE : 0)); + (opts.force ? MS_RECOVER : 0)); if (!vol) { ntfs_log_perror("ERROR: couldn't mount volume"); return 1; diff --git a/ntfsprogs/ntfscluster.c b/ntfsprogs/ntfscluster.c index 4ae4680f..5ca12ca2 100644 --- a/ntfsprogs/ntfscluster.c +++ b/ntfsprogs/ntfscluster.c @@ -493,7 +493,7 @@ int main(int argc, char *argv[]) utils_set_locale(); vol = utils_mount_volume(opts.device, MS_RDONLY | - (opts.force ? NTFS_MNT_FORCE : 0)); + (opts.force ? MS_RECOVER : 0)); if (!vol) return 1; diff --git a/ntfsprogs/ntfscp.c b/ntfsprogs/ntfscp.c index b8ed0947..67f533bf 100644 --- a/ntfsprogs/ntfscp.c +++ b/ntfsprogs/ntfscp.c @@ -349,7 +349,7 @@ int main(int argc, char *argv[]) if (opts.noaction) flags = MS_RDONLY; if (opts.force) - flags |= NTFS_MNT_FORCE; + flags |= MS_RECOVER; vol = utils_mount_volume(opts.device, flags); if (!vol) { diff --git a/ntfsprogs/ntfsdecrypt.c b/ntfsprogs/ntfsdecrypt.c index 9cd0d39c..722fa553 100644 --- a/ntfsprogs/ntfsdecrypt.c +++ b/ntfsprogs/ntfsdecrypt.c @@ -1453,7 +1453,7 @@ int main(int argc, char *argv[]) } /* Mount the ntfs volume. */ vol = utils_mount_volume(opts.device, MS_RDONLY | - (opts.force ? NTFS_MNT_FORCE : 0)); + (opts.force ? MS_RECOVER : 0)); if (!vol) { ntfs_log_error("Failed to mount ntfs volume. Aborting.\n"); ntfs_rsa_private_key_release(rsa_key); diff --git a/ntfsprogs/ntfsinfo.c b/ntfsprogs/ntfsinfo.c index 5af51a6e..c67b4cc5 100644 --- a/ntfsprogs/ntfsinfo.c +++ b/ntfsprogs/ntfsinfo.c @@ -2253,7 +2253,7 @@ int main(int argc, char **argv) utils_set_locale(); vol = utils_mount_volume(opts.device, MS_RDONLY | - (opts.force ? NTFS_MNT_FORCE : 0)); + (opts.force ? MS_RECOVER : 0)); if (!vol) { printf("Failed to open '%s'.\n", opts.device); exit(1); diff --git a/ntfsprogs/ntfslabel.c b/ntfsprogs/ntfslabel.c index a337d83b..9615aa05 100644 --- a/ntfsprogs/ntfslabel.c +++ b/ntfsprogs/ntfslabel.c @@ -396,7 +396,7 @@ int main(int argc, char **argv) vol = utils_mount_volume(opts.device, (opts.noaction ? MS_RDONLY : 0) | - (opts.force ? NTFS_MNT_FORCE : 0)); + (opts.force ? MS_RECOVER : 0)); if (!vol) return 1; diff --git a/ntfsprogs/ntfsls.c b/ntfsprogs/ntfsls.c index 1f08b3fa..698ebc65 100644 --- a/ntfsprogs/ntfsls.c +++ b/ntfsprogs/ntfsls.c @@ -652,7 +652,7 @@ int main(int argc, char **argv) utils_set_locale(); vol = utils_mount_volume(opts.device, MS_RDONLY | - (opts.force ? NTFS_MNT_FORCE : 0)); + (opts.force ? MS_RECOVER : 0)); if (!vol) { // FIXME: Print error... (AIA) return 2; diff --git a/ntfsprogs/ntfsmove.c b/ntfsprogs/ntfsmove.c index d357582f..bb0bc9ca 100644 --- a/ntfsprogs/ntfsmove.c +++ b/ntfsprogs/ntfsmove.c @@ -877,7 +877,7 @@ int main(int argc, char *argv[]) if (opts.noaction) flags |= MS_RDONLY; if (opts.force) - flags |= NTFS_MNT_FORCE; + flags |= MS_RECOVER; vol = utils_mount_volume(opts.device, flags); if (!vol) { diff --git a/ntfsprogs/ntfsundelete.c b/ntfsprogs/ntfsundelete.c index 3f81b62c..4b5bb219 100644 --- a/ntfsprogs/ntfsundelete.c +++ b/ntfsprogs/ntfsundelete.c @@ -2156,7 +2156,7 @@ int main(int argc, char *argv[]) utils_set_locale(); vol = utils_mount_volume(opts.device, MS_RDONLY | - (opts.force ? NTFS_MNT_FORCE : 0)); + (opts.force ? MS_RECOVER : 0)); if (!vol) return 1; diff --git a/ntfsprogs/ntfswipe.c b/ntfsprogs/ntfswipe.c index c91dad87..e8980d03 100644 --- a/ntfsprogs/ntfswipe.c +++ b/ntfsprogs/ntfswipe.c @@ -1342,7 +1342,7 @@ int main(int argc, char *argv[]) if (opts.info || opts.noaction) flags = MS_RDONLY; if (opts.force) - flags |= NTFS_MNT_FORCE; + flags |= MS_RECOVER; vol = utils_mount_volume(opts.device, flags); if (!vol) diff --git a/ntfsprogs/utils.c b/ntfsprogs/utils.c index 947bddec..b37b88c1 100644 --- a/ntfsprogs/utils.c +++ b/ntfsprogs/utils.c @@ -216,7 +216,22 @@ ntfs_volume * utils_mount_volume(const char *device, ntfs_mount_flags flags) return NULL; } - if (!utils_valid_device(device, flags & NTFS_MNT_FORCE)) + /* Porting notes: + * + * libntfs-3g does not have the 'force' flag in ntfs_mount_flags. + * The 'force' flag in libntfs bypasses two safety checks when mounting + * read/write: + * 1. Do not mount when the VOLUME_IS_DIRTY flag in + * VOLUME_INFORMATION is set. + * 2. Do not mount when the logfile is unclean. + * + * libntfs-3g only has safety check number 2. The dirty flag is simply + * ignored because we are confident that we can handle a dirty volume. + * So we treat MS_RECOVER like NTFS_MNT_FORCE, knowing that the first + * check is always bypassed. + */ + + if (!utils_valid_device(device, flags & MS_RECOVER)) return NULL; vol = ntfs_mount(device, flags); @@ -242,7 +257,7 @@ ntfs_volume * utils_mount_volume(const char *device, ntfs_mount_flags flags) * before mount, so we can only warn if the VOLUME_IS_DIRTY flag is set * in VOLUME_INFORMATION. */ if (vol->flags & VOLUME_IS_DIRTY) { - if (!(flags & NTFS_MNT_FORCE)) { + if (!(flags & MS_RECOVER)) { ntfs_log_error("%s", dirty_volume_msg); ntfs_umount(vol, FALSE); return NULL;