From 4b7868ddc23c89df6fbe43b0da488b1f56101637 Mon Sep 17 00:00:00 2001 From: yura Date: Sat, 25 Nov 2006 14:57:54 +0000 Subject: [PATCH] ntfsmount: Umount volume in DESTROY. This is guarantees that all data would be s ynced before umount return for volumes mounted with blkdev option. Thanks to Miklos for information about blkdev. --- ChangeLog | 3 +++ ntfsprogs/ntfsmount.c | 33 +++++++++++++++++---------------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/ChangeLog b/ChangeLog index 755d6724..fedec596 100644 --- a/ChangeLog +++ b/ChangeLog @@ -74,6 +74,9 @@ xx/xx/2006 - x.xx.x - . windows. (Yura) - ntfsmount: Fix free clusters and MFT records calculation. (Yura) - ntfsmount: Fix st_blocks calculation. (Yuval, Yura) + - ntfsmount: Umount volume in DESTROY. This is guarantees that all + data would be synced before umount return for volumes mounted with + blkdev option. (Yura) 21/06/2006 - 1.13.1 - Various fixes. diff --git a/ntfsprogs/ntfsmount.c b/ntfsprogs/ntfsmount.c index 17eccb41..1a0e15fd 100644 --- a/ntfsprogs/ntfsmount.c +++ b/ntfsprogs/ntfsmount.c @@ -1356,6 +1356,18 @@ exit: #endif /* HAVE_SETXATTR */ +static void ntfs_fuse_destroy(void *priv __attribute__((unused))) +{ + if (ctx->vol) { + ntfs_log_info("Unmounting %s (%s)\n", opts.device, + ctx->vol->vol_name); + if (ntfs_umount(ctx->vol, FALSE)) + ntfs_log_perror("Failed to unmount volume"); + } + free(ctx); + free(opts.device); +} + static struct fuse_operations ntfs_fuse_oper = { .getattr = ntfs_fuse_getattr, .readlink = ntfs_fuse_readlink, @@ -1375,6 +1387,7 @@ static struct fuse_operations ntfs_fuse_oper = { .mkdir = ntfs_fuse_mkdir, .rmdir = ntfs_fuse_rmdir, .utime = ntfs_fuse_utime, + .destroy = ntfs_fuse_destroy, #ifdef HAVE_SETXATTR .getxattr = ntfs_fuse_getxattr, .setxattr = ntfs_fuse_setxattr, @@ -1415,17 +1428,6 @@ static int ntfs_fuse_mount(const char *device) return 0; } -static void ntfs_fuse_destroy(void) -{ - if (ctx->vol) { - ntfs_log_info("Unmounting %s (%s)\n", opts.device, - ctx->vol->vol_name); - if (ntfs_umount(ctx->vol, FALSE)) - ntfs_log_perror("Failed to unmount volume"); - } - free(ctx); - free(opts.device); -} static void signal_handler(int arg __attribute__((unused))) { @@ -1776,13 +1778,13 @@ int main(int argc, char *argv[]) parsed_options = parse_mount_options((opts.options) ? opts.options : ""); if (!parsed_options) { - ntfs_fuse_destroy(); + ntfs_fuse_destroy(NULL); return 3; } /* Mount volume. */ if (ntfs_fuse_mount(opts.device)) { - ntfs_fuse_destroy(); + ntfs_fuse_destroy(NULL); free(parsed_options); return 4; } @@ -1796,7 +1798,7 @@ int main(int argc, char *argv[]) free(parsed_options); if (!fch) { ntfs_log_error("fuse_mount failed.\n"); - ntfs_fuse_destroy(); + ntfs_fuse_destroy(NULL); return 5; } fh = (struct fuse *)1; /* Cast anything except NULL to handle errors. */ @@ -1818,7 +1820,7 @@ int main(int argc, char *argv[]) if (!fh) { ntfs_log_error("fuse_new failed.\n"); fuse_unmount(opts.mnt_point, fch); - ntfs_fuse_destroy(); + ntfs_fuse_destroy(NULL); return 6; } if (!ctx->debug && !ctx->no_detach) { @@ -1841,6 +1843,5 @@ int main(int argc, char *argv[]) /* Destroy. */ fuse_unmount(opts.mnt_point, fch); fuse_destroy(fh); - ntfs_fuse_destroy(); return 0; }