Whamcloud - gitweb
Branch b1_4
[fs/lustre-release.git] / libsysio / src / statvfs.c
1 /*
2  *    This Cplant(TM) source code is the property of Sandia National
3  *    Laboratories.
4  *
5  *    This Cplant(TM) source code is copyrighted by Sandia National
6  *    Laboratories.
7  *
8  *    The redistribution of this Cplant(TM) source code is subject to the
9  *    terms of the GNU Lesser General Public License
10  *    (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
11  *
12  *    Cplant(TM) Copyright 1998-2003 Sandia Corporation. 
13  *    Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
14  *    license for use of this work by or on behalf of the US Government.
15  *    Export of this program may require a license from the United States
16  *    Government.
17  */
18
19 /*
20  * This library is free software; you can redistribute it and/or
21  * modify it under the terms of the GNU Lesser General Public
22  * License as published by the Free Software Foundation; either
23  * version 2.1 of the License, or (at your option) any later version.
24  * 
25  * This library is distributed in the hope that it will be useful,
26  * but WITHOUT ANY WARRANTY; without even the implied warranty of
27  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
28  * Lesser General Public License for more details.
29  * 
30  * You should have received a copy of the GNU Lesser General Public
31  * License along with this library; if not, write to the Free Software
32  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
33  *
34  * Questions or comments about this library should be sent to:
35  *
36  * Lee Ward
37  * Sandia National Laboratories, New Mexico
38  * P.O. Box 5800
39  * Albuquerque, NM 87185-1110
40  *
41  * lee@sandia.gov
42  */
43
44 #ifndef BSD
45
46 #include <unistd.h>
47 #include <errno.h>
48 #include <assert.h>
49 #include <sys/statvfs.h>
50 #include <sys/types.h>
51 #include <sys/queue.h>
52
53 #include "sysio.h"
54 #include "inode.h"
55 #include "file.h"
56 #include "sysio-symbols.h"
57
58 #undef statvfs
59 #undef fstatvfs
60
61 #ifndef INTNL_STATVFS_IS_NATURAL
62 static void
63 convstatvfs(struct statvfs *stvfsbuf, struct intnl_statvfs *istvfsbuf)
64 {
65         stvfsbuf->f_bsize = istvfsbuf->f_bsize;
66         stvfsbuf->f_frsize = istvfsbuf->f_frsize;
67         stvfsbuf->f_blocks = (unsigned long )istvfsbuf->f_blocks;
68         stvfsbuf->f_bfree = (unsigned long )istvfsbuf->f_bfree;
69         stvfsbuf->f_bavail = (unsigned long )istvfsbuf->f_bavail;
70         stvfsbuf->f_files = (unsigned long )istvfsbuf->f_files;
71         stvfsbuf->f_ffree = (unsigned long )istvfsbuf->f_ffree;
72         stvfsbuf->f_favail = (unsigned long )istvfsbuf->f_favail;
73         stvfsbuf->f_fsid = istvfsbuf->f_fsid;
74         stvfsbuf->f_flag = istvfsbuf->f_flag;
75         stvfsbuf->f_namemax = istvfsbuf->f_namemax;
76 }
77 #endif
78
79 int
80 SYSIO_INTERFACE_NAME(statvfs)(const char *path, struct statvfs *buf)
81 {
82         int     err;
83         struct pnode *pno;
84 #ifdef INTNL_STATVFS_IS_NATURAL
85 #define _call_buf buf
86 #else
87         struct intnl_statvfs _call_buffer;
88         struct intnl_statvfs *_call_buf = &_call_buffer;
89 #endif
90         SYSIO_INTERFACE_DISPLAY_BLOCK;
91
92         SYSIO_INTERFACE_ENTER;
93         err = _sysio_namei(_sysio_cwd, path, 0, NULL, &pno);
94         if (err)
95                 goto out;
96
97         err = pno->p_base->pb_ino->i_ops.inop_statvfs(pno, NULL, _call_buf);
98         P_RELE(pno);
99         if (err)
100                 goto err;
101 #ifndef INTNL_STATVFS_IS_NATURAL
102         convstatvfs(buf, _call_buf);
103 #endif
104         goto out;
105 err:
106 out:
107         SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
108 }
109
110 #ifdef REDSTORM
111 #undef __statvfs
112 sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(statvfs),
113                      PREPEND(__, SYSIO_INTERFACE_NAME(statvfs)))
114 #endif
115
116 int
117 SYSIO_INTERFACE_NAME(fstatvfs)(int fd, struct statvfs *buf)
118 {
119         int     err;
120         struct file *filp;
121 #ifdef INTNL_STATVFS_IS_NATURAL
122 #define _call_buf buf
123 #else
124         struct intnl_statvfs _call_buffer;
125         struct intnl_statvfs *_call_buf = &_call_buffer;
126 #endif
127         SYSIO_INTERFACE_DISPLAY_BLOCK;
128
129         SYSIO_INTERFACE_ENTER;
130         err = 0;
131         filp = _sysio_fd_find(fd);
132         if (!filp) {
133                 err = -EBADF;
134                 goto out;
135         }
136
137         err = filp->f_ino->i_ops.inop_statvfs(NULL, filp->f_ino, _call_buf);
138         if (err)
139                 goto err;
140 #ifndef INTNL_STATVFS_IS_NATURAL
141         convstatvfs(buf, _call_buf);
142 #endif
143         goto out;
144 err:
145 out:
146         SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
147 }
148
149 #ifdef REDSTORM
150 #undef __fstatvfs
151 sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(fstatvfs),
152                      PREPEND(__, SYSIO_INTERFACE_NAME(fstatvfs)))
153 #endif
154
155 #endif /* ifndef BSD */