~ubuntu-branches/ubuntu/edgy/xfsprogs/edgy

« back to all changes in this revision

Viewing changes to libdisk/dm.c

  • Committer: Bazaar Package Importer
  • Author(s): Nathan Scott
  • Date: 2004-07-28 21:11:38 UTC
  • Revision ID: james.westby@ubuntu.com-20040728211138-0v4pdnunnp7na5lm
Tags: 2.6.20-1
* New upstream release.
* Fix xfs_io segfault on non-XFS files.  (closes: #260470)
* Fix packaging botch, deleted files included.  (closes: #260491)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (c) 2004 Silicon Graphics, Inc.  All Rights Reserved.
 
3
 *
 
4
 * This program is free software; you can redistribute it and/or modify it
 
5
 * under the terms of version 2 of the GNU General Public License as
 
6
 * published by the Free Software Foundation.
 
7
 *
 
8
 * This program is distributed in the hope that it would be useful, but
 
9
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
11
 *
 
12
 * Further, this software is distributed without any warranty that it is
 
13
 * free of the rightful claim of any third person regarding infringement
 
14
 * or the like.  Any license provided herein, whether implied or
 
15
 * otherwise, applies only to this software file.  Patent licenses, if
 
16
 * any, provided herein do not apply to combinations of this program with
 
17
 * other software, or any other product whatsoever.
 
18
 *
 
19
 * You should have received a copy of the GNU General Public License along
 
20
 * with this program; if not, write the Free Software Foundation, Inc., 59
 
21
 * Temple Place - Suite 330, Boston MA 02111-1307, USA.
 
22
 *
 
23
 * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
 
24
 * Mountain View, CA  94043, or:
 
25
 *
 
26
 * http://www.sgi.com
 
27
 *
 
28
 * For further information regarding this notice, see:
 
29
 *
 
30
 * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
 
31
 */
 
32
 
 
33
#include "drivers.h"
 
34
 
 
35
int
 
36
mnt_is_dm_subvol(
 
37
        dev_t           dev)
 
38
{
 
39
        return get_driver_block_major("device-mapper", major(dev));
 
40
}
 
41
 
 
42
int
 
43
dm_get_subvol_stripe(
 
44
        char            *dfile,
 
45
        sv_type_t       type,
 
46
        int             *sunit,
 
47
        int             *swidth,
 
48
        struct stat64   *sb)
 
49
{
 
50
        int             count, stripes = 0, stripesize = 0;
 
51
        int             dmpipe[2];
 
52
        char            *dpath, *largv[4], tmppath[PATH_MAX];
 
53
        FILE            *stream;
 
54
        long long       offset, size;
 
55
        static char     *command = "table";     /* dmsetup table /dev/xxx */
 
56
 
 
57
        if (!mnt_is_dm_subvol(sb->st_rdev))
 
58
                return 0;
 
59
 
 
60
        /* Quest for dmsetup */
 
61
        if (!access("/usr/local/sbin/dmsetup", R_OK|X_OK))
 
62
                largv[0] = "/usr/local/sbin/dmsetup";
 
63
        else if (!access("/usr/sbin/dmsetup", R_OK|X_OK))
 
64
                largv[0] = "/usr/sbin/dmsetup";
 
65
        else if (!access("/sbin/dmsetup", R_OK|X_OK))
 
66
                largv[0] = "/sbin/dmsetup";
 
67
        else {
 
68
                fprintf(stderr,
 
69
        _("Warning - device mapper device, but no dmsetup(8) found\n"));
 
70
                return 0;
 
71
        }
 
72
 
 
73
        if (!(dpath = realpath(dfile, tmppath))) {
 
74
                fprintf(stderr,
 
75
        _("Warning - device mapper device, but cannot resolve path %s: %s\n"),
 
76
                        dfile, strerror(errno));
 
77
                return 0;
 
78
        }
 
79
 
 
80
        largv[1] = command;
 
81
        largv[2] = dpath;
 
82
        largv[3] = NULL;
 
83
 
 
84
        /* Open pipe */
 
85
        if (pipe(dmpipe) < 0) {
 
86
                fprintf(stderr, _("Could not open pipe\n"));
 
87
                exit(1);
 
88
        }
 
89
 
 
90
        /* Spawn dmsetup */
 
91
        switch (fork()) {
 
92
        case 0:
 
93
                /* Plumbing */
 
94
                close(dmpipe[0]);
 
95
 
 
96
                if (dmpipe[1] != STDOUT_FILENO)
 
97
                        dup2(dmpipe[1], STDOUT_FILENO);
 
98
 
 
99
                execv(largv[0], largv);
 
100
 
 
101
                fprintf(stderr, _("Failed to execute %s\n"), largv[0]);
 
102
                exit(1);
 
103
 
 
104
        case -1:
 
105
                fprintf(stderr, _("Failed forking dmsetup process\n"));
 
106
                exit(1);
 
107
 
 
108
        default:
 
109
                break;
 
110
        }
 
111
 
 
112
        close(dmpipe[1]);
 
113
        stream = fdopen(dmpipe[0], "r");
 
114
        count = fscanf(stream, "%lld %lld striped %d %d ",
 
115
                        &offset, &size, &stripes, &stripesize);
 
116
        fclose(stream);
 
117
        if (count != 4)
 
118
                return 0;
 
119
 
 
120
        /* Update sizes */
 
121
        *sunit = stripesize;
 
122
        *swidth = (stripes * stripesize);
 
123
        return 1;
 
124
}