169 lines
5.7 KiB
Diff
169 lines
5.7 KiB
Diff
|
commit ad11e277ebd8d01a1b0a29ee9f697ba90c8577a4
|
||
|
Author: Andrew Price <anprice@redhat.com>
|
||
|
Date: Sat Nov 16 02:19:07 2013 -0600
|
||
|
|
||
|
Switch is_pathname_mounted callers to lgfs2_open_mnt*
|
||
|
|
||
|
Use the new lgfs2_open_mnt* functions in fsck.gfs2, gfs2_grow, and gfs2_jadd.
|
||
|
|
||
|
Signed-off-by: Andrew Price <anprice@redhat.com>
|
||
|
|
||
|
diff --git a/gfs2/fsck/initialize.c b/gfs2/fsck/initialize.c
|
||
|
index 6612fe7..5758607 100644
|
||
|
--- a/gfs2/fsck/initialize.c
|
||
|
+++ b/gfs2/fsck/initialize.c
|
||
|
@@ -1475,8 +1475,7 @@ int initialize(struct gfs2_sbd *sdp, int force_check, int preen,
|
||
|
|
||
|
sdp->device_fd = open(opts.device, open_flag);
|
||
|
if (sdp->device_fd < 0) {
|
||
|
- int is_mounted, ro;
|
||
|
-
|
||
|
+ struct mntent *mnt;
|
||
|
if (open_flag == O_RDONLY || errno != EBUSY) {
|
||
|
log_crit( _("Unable to open device: %s\n"),
|
||
|
opts.device);
|
||
|
@@ -1485,30 +1484,23 @@ int initialize(struct gfs2_sbd *sdp, int force_check, int preen,
|
||
|
/* We can't open it EXCL. It may be already open rw (in which
|
||
|
case we want to deny them access) or it may be mounted as
|
||
|
the root file system at boot time (in which case we need to
|
||
|
- allow it.) We use is_pathname_mounted here even though
|
||
|
- we're specifying a device name, not a path name. The
|
||
|
- function checks for device as well. */
|
||
|
- strncpy(sdp->device_name, opts.device,
|
||
|
- sizeof(sdp->device_name));
|
||
|
- sdp->path_name = sdp->device_name; /* This gets overwritten */
|
||
|
- is_mounted = is_pathname_mounted(sdp->path_name, sdp->device_name, &ro);
|
||
|
- /* If the device is busy, but not because it's mounted, fail.
|
||
|
+ allow it.)
|
||
|
+ If the device is busy, but not because it's mounted, fail.
|
||
|
This protects against cases where the file system is LVM
|
||
|
- and perhaps mounted on a different node. */
|
||
|
- if (!is_mounted)
|
||
|
+ and perhaps mounted on a different node.
|
||
|
+ Try opening without O_EXCL. */
|
||
|
+ sdp->device_fd = lgfs2_open_mnt_dev(opts.device, O_RDWR, &mnt);
|
||
|
+ if (sdp->device_fd < 0)
|
||
|
goto mount_fail;
|
||
|
/* If the device is mounted, but not mounted RO, fail. This
|
||
|
protects them against cases where the file system is
|
||
|
mounted RW, but still allows us to check our own root
|
||
|
file system. */
|
||
|
- if (!ro)
|
||
|
- goto mount_fail;
|
||
|
+ if (!hasmntopt(mnt, MNTOPT_RO))
|
||
|
+ goto close_fail;
|
||
|
/* The device is mounted RO, so it's likely our own root
|
||
|
file system. We can only do so much to protect the users
|
||
|
- from themselves. Try opening without O_EXCL. */
|
||
|
- if ((sdp->device_fd = open(opts.device, O_RDWR)) < 0)
|
||
|
- goto mount_fail;
|
||
|
-
|
||
|
+ from themselves. */
|
||
|
was_mounted_ro = 1;
|
||
|
}
|
||
|
|
||
|
@@ -1591,6 +1583,8 @@ int initialize(struct gfs2_sbd *sdp, int force_check, int preen,
|
||
|
|
||
|
return FSCK_OK;
|
||
|
|
||
|
+close_fail:
|
||
|
+ close(sdp->device_fd);
|
||
|
mount_fail:
|
||
|
log_crit( _("Device %s is busy.\n"), opts.device);
|
||
|
return FSCK_USAGE;
|
||
|
diff --git a/gfs2/mkfs/main_grow.c b/gfs2/mkfs/main_grow.c
|
||
|
index 5db91d9..541b0f2 100644
|
||
|
--- a/gfs2/mkfs/main_grow.c
|
||
|
+++ b/gfs2/mkfs/main_grow.c
|
||
|
@@ -323,7 +323,7 @@ main_grow(int argc, char *argv[])
|
||
|
int rgcount, rindex_fd;
|
||
|
char rindex_name[PATH_MAX];
|
||
|
int error = EXIT_SUCCESS;
|
||
|
- int ro_mnt = 0;
|
||
|
+ int devflags = (test ? O_RDONLY : O_RDWR) | O_CLOEXEC;
|
||
|
|
||
|
memset(sdp, 0, sizeof(struct gfs2_sbd));
|
||
|
sdp->bsize = GFS2_DEFAULT_BSIZE;
|
||
|
@@ -333,30 +333,23 @@ main_grow(int argc, char *argv[])
|
||
|
sdp->md.journals = 1;
|
||
|
decode_arguments(argc, argv, sdp);
|
||
|
|
||
|
- while ((argc - optind) > 0) {
|
||
|
+ for(; (argc - optind) > 0; optind++) {
|
||
|
int sane;
|
||
|
+ struct mntent *mnt;
|
||
|
struct rgrp_tree *last_rgrp;
|
||
|
|
||
|
- strncpy(sdp->device_name, argv[optind], PATH_MAX - 1);
|
||
|
- sdp->path_name = argv[optind++];
|
||
|
-
|
||
|
- if ((!is_pathname_mounted(sdp->path_name, sdp->device_name, &ro_mnt))) {
|
||
|
- perror(sdp->path_name);
|
||
|
- exit(EXIT_FAILURE);
|
||
|
- }
|
||
|
-
|
||
|
- sdp->path_fd = open(sdp->path_name, O_RDONLY | O_CLOEXEC);
|
||
|
- if (sdp->path_fd < 0){
|
||
|
- perror(sdp->path_name);
|
||
|
+ error = lgfs2_open_mnt(argv[optind], O_RDONLY|O_CLOEXEC, &sdp->path_fd,
|
||
|
+ devflags, &sdp->device_fd, &mnt);
|
||
|
+ if (error != 0) {
|
||
|
+ fprintf(stderr, _("Error looking up mount '%s': %s\n"), argv[optind], strerror(errno));
|
||
|
exit(EXIT_FAILURE);
|
||
|
}
|
||
|
-
|
||
|
- sdp->device_fd = open(sdp->device_name,
|
||
|
- (test ? O_RDONLY : O_RDWR) | O_CLOEXEC);
|
||
|
- if (sdp->device_fd < 0){
|
||
|
- perror(sdp->device_name);
|
||
|
- exit(EXIT_FAILURE);
|
||
|
+ if (mnt == NULL) {
|
||
|
+ fprintf(stderr, _("%s: not a mounted gfs2 file system\n"), argv[optind]);
|
||
|
+ continue;
|
||
|
}
|
||
|
+ sdp->path_name = mnt->mnt_dir;
|
||
|
+ strncpy(sdp->device_name, mnt->mnt_fsname, PATH_MAX - 1);
|
||
|
|
||
|
if (lgfs2_get_dev_info(sdp->device_fd, &sdp->dinfo) < 0) {
|
||
|
perror(sdp->device_name);
|
||
|
diff --git a/gfs2/mkfs/main_jadd.c b/gfs2/mkfs/main_jadd.c
|
||
|
index b6cd8e4..815dd52 100644
|
||
|
--- a/gfs2/mkfs/main_jadd.c
|
||
|
+++ b/gfs2/mkfs/main_jadd.c
|
||
|
@@ -490,8 +490,8 @@ add_j(struct gfs2_sbd *sdp)
|
||
|
void main_jadd(int argc, char *argv[])
|
||
|
{
|
||
|
struct gfs2_sbd sbd, *sdp = &sbd;
|
||
|
+ struct mntent *mnt;
|
||
|
unsigned int total;
|
||
|
- int ro_mnt = 0;
|
||
|
|
||
|
memset(sdp, 0, sizeof(struct gfs2_sbd));
|
||
|
sdp->jsize = GFS2_DEFAULT_JSIZE;
|
||
|
@@ -500,17 +500,18 @@ void main_jadd(int argc, char *argv[])
|
||
|
|
||
|
decode_arguments(argc, argv, sdp);
|
||
|
verify_arguments(sdp);
|
||
|
-
|
||
|
- sdp->path_fd = open(sdp->path_name, O_RDONLY | O_CLOEXEC);
|
||
|
- if (sdp->path_fd < 0){
|
||
|
- perror(sdp->path_name);
|
||
|
+
|
||
|
+ sbd.path_fd = lgfs2_open_mnt_dir(sbd.path_name, O_RDONLY|O_CLOEXEC, &mnt);
|
||
|
+ if (sbd.path_fd < 0) {
|
||
|
+ fprintf(stderr, _("Error looking up mount '%s': %s\n"), sbd.path_name, strerror(errno));
|
||
|
exit(EXIT_FAILURE);
|
||
|
}
|
||
|
-
|
||
|
- if (!is_pathname_mounted(sdp->path_name, sdp->device_name, &ro_mnt)) {
|
||
|
- perror(sdp->path_name);
|
||
|
+ if (mnt == NULL) {
|
||
|
+ fprintf(stderr, _("%s: not a mounted gfs2 file system\n"), sbd.path_name);
|
||
|
exit(EXIT_FAILURE);
|
||
|
}
|
||
|
+ sbd.path_name = mnt->mnt_dir;
|
||
|
+ strncpy(sbd.device_name, mnt->mnt_fsname, PATH_MAX - 1);
|
||
|
|
||
|
gather_info(sdp);
|
||
|
|