Skip to content

Commit b219b90

Browse files
author
hj110
committed
add statfs, update README
1 parent 4c94d38 commit b219b90

8 files changed

+278
-27
lines changed

Diff for: README.md

+1-2
Original file line numberDiff line numberDiff line change
@@ -85,5 +85,4 @@ For primary server, several updating operation needs to be completed on secondar
8585
#### Known bugs
8686
1. We have handled the cases where primary server or secondary one cannot be reached. But if the client goes down, fd won't be released, thus system resource is leaked.
8787
2. `symlink` and `link` operations are not yet thread-safe.
88-
3. `fd .` should show the file system attribute, but my program cannot.
89-
4. server failover test doesn't pass; currently it can only handle the case when server program is killed, and machine is still alive; it doesn't go well when secondary server is rebooted.
88+
3. server failover test doesn't pass; currently it can only handle the case when server program is killed, and machine is still alive; it doesn't go well when secondary server is rebooted.

Diff for: fuse_rpc.h

+31
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,27 @@ struct write_ret {
318318
};
319319
typedef struct write_ret write_ret;
320320

321+
struct statfs_arg {
322+
char *path;
323+
};
324+
typedef struct statfs_arg statfs_arg;
325+
326+
struct statfs_ret {
327+
u_long f_bsize;
328+
u_long f_frsize;
329+
u_long f_blocks;
330+
u_long f_bfree;
331+
u_long f_bavail;
332+
u_long f_files;
333+
u_long f_ffree;
334+
u_long f_favail;
335+
u_long f_fsid;
336+
u_long f_flag;
337+
u_long f_namemax;
338+
int ret;
339+
};
340+
typedef struct statfs_ret statfs_ret;
341+
321342
#define COMPUTE 456123789
322343
#define COMPUTE_VERS 6
323344

@@ -388,6 +409,9 @@ extern bool_t bb_read_6_svc(read_arg *, read_ret *, struct svc_req *);
388409
#define BB_WRITE 21
389410
extern enum clnt_stat bb_write_6(write_arg *, write_ret *, CLIENT *);
390411
extern bool_t bb_write_6_svc(write_arg *, write_ret *, struct svc_req *);
412+
#define BB_STATFS 22
413+
extern enum clnt_stat bb_statfs_6(statfs_arg *, statfs_ret *, CLIENT *);
414+
extern bool_t bb_statfs_6_svc(statfs_arg *, statfs_ret *, struct svc_req *);
391415
extern int compute_6_freeresult (SVCXPRT *, xdrproc_t, caddr_t);
392416

393417
#else /* K&R C */
@@ -457,6 +481,9 @@ extern bool_t bb_read_6_svc();
457481
#define BB_WRITE 21
458482
extern enum clnt_stat bb_write_6();
459483
extern bool_t bb_write_6_svc();
484+
#define BB_STATFS 22
485+
extern enum clnt_stat bb_statfs_6();
486+
extern bool_t bb_statfs_6_svc();
460487
extern int compute_6_freeresult ();
461488
#endif /* K&R C */
462489

@@ -508,6 +535,8 @@ extern bool_t xdr_read_arg (XDR *, read_arg*);
508535
extern bool_t xdr_read_ret (XDR *, read_ret*);
509536
extern bool_t xdr_write_arg (XDR *, write_arg*);
510537
extern bool_t xdr_write_ret (XDR *, write_ret*);
538+
extern bool_t xdr_statfs_arg (XDR *, statfs_arg*);
539+
extern bool_t xdr_statfs_ret (XDR *, statfs_ret*);
511540

512541
#else /* K&R C */
513542
extern bool_t xdr_identity ();
@@ -555,6 +584,8 @@ extern bool_t xdr_read_arg ();
555584
extern bool_t xdr_read_ret ();
556585
extern bool_t xdr_write_arg ();
557586
extern bool_t xdr_write_ret ();
587+
extern bool_t xdr_statfs_arg ();
588+
extern bool_t xdr_statfs_ret ();
558589

559590
#endif /* K&R C */
560591

Diff for: fuse_rpc.x

+33-13
Original file line numberDiff line numberDiff line change
@@ -53,20 +53,20 @@ struct getattr_arg {
5353
};
5454

5555
struct getattr_ret {
56-
int st_dev; /* ID of device containing file */
57-
int st_ino; /* inode number */
58-
int st_mode; /* protection */
59-
int st_nlink; /* number osf hard links */
60-
int st_uid; /* user ID of owner */
61-
int st_gid; /* group ID of owner */
62-
int st_rdev; /* device ID (if special file) */
63-
unsigned long st_size; /* total size, in bytes */
56+
int st_dev; /* ID of device containing file */
57+
int st_ino; /* inode number */
58+
int st_mode; /* protection */
59+
int st_nlink; /* number osf hard links */
60+
int st_uid; /* user ID of owner */
61+
int st_gid; /* group ID of owner */
62+
int st_rdev; /* device ID (if special file) */
63+
unsigned long st_size; /* total size, in bytes */
6464
unsigned long st_blksize; /* blocksize for file system I/O */
65-
unsigned long st_blocks; /* number of 512B blocks allocated */
66-
long st_acc_time; /* time of last access */
67-
long st_mod_time; /* time of last modification */
68-
long st_chg_time; /* time of last status change */
69-
int ret; /* status of RPC */
65+
unsigned long st_blocks; /* number of 512B blocks allocated */
66+
long st_acc_time; /* time of last access */
67+
long st_mod_time; /* time of last modification */
68+
long st_chg_time; /* time of last status change */
69+
int ret; /* status of RPC */
7070
};
7171

7272
struct access_arg {
@@ -289,6 +289,25 @@ struct write_ret {
289289
int ret; /* status of RPC */
290290
};
291291

292+
struct statfs_arg {
293+
string path<>;
294+
};
295+
296+
struct statfs_ret {
297+
unsigned long f_bsize; /* Filesystem block size */
298+
unsigned long f_frsize; /* Fragment size */
299+
unsigned long f_blocks; /* Size of fs in f_frsize units */
300+
unsigned long f_bfree; /* Number of free blocks */
301+
unsigned long f_bavail; /* Number of free blocks for unprivileged users */
302+
unsigned long f_files; /* Number of inodes */
303+
unsigned long f_ffree; /* Number of free inodes */
304+
unsigned long f_favail; /* Number of free inodes for unprivileged users */
305+
unsigned long f_fsid; /* Filesystem ID */
306+
unsigned long f_flag; /* Mount flags */
307+
unsigned long f_namemax; /* Maximum filename length */
308+
int ret; /* status of syscall and RPC */
309+
};
310+
292311
program COMPUTE{
293312
version COMPUTE_VERS {
294313
init_ret INIT_ROOTDIR(init_arg) = 0;
@@ -313,5 +332,6 @@ program COMPUTE{
313332
release_ret BB_RELEASE(release_arg) = 19;
314333
read_ret BB_READ(read_arg) = 20;
315334
write_ret BB_WRITE(write_arg) = 21;
335+
statfs_ret BB_STATFS(statfs_arg) = 22;
316336
} = 6;
317337
} = 456123789;

Diff for: fuse_rpc_clnt.c

+9
Original file line numberDiff line numberDiff line change
@@ -206,3 +206,12 @@ bb_write_6(write_arg *argp, write_ret *clnt_res, CLIENT *clnt)
206206
(xdrproc_t) xdr_write_ret, (caddr_t) clnt_res,
207207
TIMEOUT));
208208
}
209+
210+
enum clnt_stat
211+
bb_statfs_6(statfs_arg *argp, statfs_ret *clnt_res, CLIENT *clnt)
212+
{
213+
return (clnt_call(clnt, BB_STATFS,
214+
(xdrproc_t) xdr_statfs_arg, (caddr_t) argp,
215+
(xdrproc_t) xdr_statfs_ret, (caddr_t) clnt_res,
216+
TIMEOUT));
217+
}

Diff for: fuse_rpc_server.c

+31
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#include <string.h>
3838
#include <sys/file.h>
3939
#include <sys/stat.h>
40+
#include <sys/statvfs.h>
4041
#include <sys/types.h>
4142
#include <time.h>
4243
#include <unistd.h>
@@ -954,6 +955,36 @@ bb_write_6_svc(write_arg *argp, write_ret *result, struct svc_req *rqstp)
954955
return TRUE;
955956
}
956957

958+
bool_t
959+
bb_statfs_6_svc(statfs_arg *argp, statfs_ret *result, struct svc_req *rqstp) {
960+
char *path = argp->path;
961+
char fpath[MAX_PATH_LEN];
962+
translate_abspath(fpath, path);
963+
fprintf(stderr, "Stat file system with path %s\n", fpath);
964+
965+
struct statvfs statv;
966+
result->ret = statvfs(fpath, &statv);
967+
if (result->ret < 0) {
968+
fprintf(stderr, "statvfs %s error\n", fpath);
969+
result->ret = -errno;
970+
return TRUE;
971+
}
972+
973+
result->f_bavail = statv.f_bavail;
974+
result->f_bfree = statv.f_bfree;
975+
result->f_blocks = statv.f_blocks;
976+
result->f_bsize = statv.f_bsize;
977+
result->f_favail = statv.f_favail;
978+
result->f_ffree = statv.f_ffree;
979+
result->f_files = statv.f_files;
980+
result->f_flag = statv.f_flag;
981+
result->f_frsize = statv.f_frsize;
982+
result->f_fsid = statv.f_fsid;
983+
result->f_namemax = statv.f_namemax;
984+
return TRUE;
985+
}
986+
987+
957988
int
958989
compute_6_freeresult (SVCXPRT *transp, xdrproc_t xdr_result, caddr_t result)
959990
{

Diff for: fuse_rpc_svc.c

+8
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ compute_6(struct svc_req *rqstp, register SVCXPRT *transp)
4242
release_arg bb_release_6_arg;
4343
read_arg bb_read_6_arg;
4444
write_arg bb_write_6_arg;
45+
statfs_arg bb_statfs_6_arg;
4546
} argument;
4647
union {
4748
init_ret init_rootdir_6_res;
@@ -66,6 +67,7 @@ compute_6(struct svc_req *rqstp, register SVCXPRT *transp)
6667
release_ret bb_release_6_res;
6768
read_ret bb_read_6_res;
6869
write_ret bb_write_6_res;
70+
statfs_ret bb_statfs_6_res;
6971
} result;
7072
bool_t retval;
7173
xdrproc_t _xdr_argument, _xdr_result;
@@ -204,6 +206,12 @@ compute_6(struct svc_req *rqstp, register SVCXPRT *transp)
204206
local = (bool_t (*) (char *, void *, struct svc_req *))bb_write_6_svc;
205207
break;
206208

209+
case BB_STATFS:
210+
_xdr_argument = (xdrproc_t) xdr_statfs_arg;
211+
_xdr_result = (xdrproc_t) xdr_statfs_ret;
212+
local = (bool_t (*) (char *, void *, struct svc_req *))bb_statfs_6_svc;
213+
break;
214+
207215
default:
208216
svcerr_noproc (transp);
209217
return;

Diff for: fuse_rpc_xdr.c

+129
Original file line numberDiff line numberDiff line change
@@ -711,3 +711,132 @@ xdr_write_ret (XDR *xdrs, write_ret *objp)
711711
return FALSE;
712712
return TRUE;
713713
}
714+
715+
bool_t
716+
xdr_statfs_arg (XDR *xdrs, statfs_arg *objp)
717+
{
718+
register int32_t *buf;
719+
720+
if (!xdr_string (xdrs, &objp->path, ~0))
721+
return FALSE;
722+
return TRUE;
723+
}
724+
725+
bool_t
726+
xdr_statfs_ret (XDR *xdrs, statfs_ret *objp)
727+
{
728+
register int32_t *buf;
729+
730+
731+
if (xdrs->x_op == XDR_ENCODE) {
732+
buf = XDR_INLINE (xdrs, 12 * BYTES_PER_XDR_UNIT);
733+
if (buf == NULL) {
734+
if (!xdr_u_long (xdrs, &objp->f_bsize))
735+
return FALSE;
736+
if (!xdr_u_long (xdrs, &objp->f_frsize))
737+
return FALSE;
738+
if (!xdr_u_long (xdrs, &objp->f_blocks))
739+
return FALSE;
740+
if (!xdr_u_long (xdrs, &objp->f_bfree))
741+
return FALSE;
742+
if (!xdr_u_long (xdrs, &objp->f_bavail))
743+
return FALSE;
744+
if (!xdr_u_long (xdrs, &objp->f_files))
745+
return FALSE;
746+
if (!xdr_u_long (xdrs, &objp->f_ffree))
747+
return FALSE;
748+
if (!xdr_u_long (xdrs, &objp->f_favail))
749+
return FALSE;
750+
if (!xdr_u_long (xdrs, &objp->f_fsid))
751+
return FALSE;
752+
if (!xdr_u_long (xdrs, &objp->f_flag))
753+
return FALSE;
754+
if (!xdr_u_long (xdrs, &objp->f_namemax))
755+
return FALSE;
756+
if (!xdr_int (xdrs, &objp->ret))
757+
return FALSE;
758+
} else {
759+
IXDR_PUT_U_LONG(buf, objp->f_bsize);
760+
IXDR_PUT_U_LONG(buf, objp->f_frsize);
761+
IXDR_PUT_U_LONG(buf, objp->f_blocks);
762+
IXDR_PUT_U_LONG(buf, objp->f_bfree);
763+
IXDR_PUT_U_LONG(buf, objp->f_bavail);
764+
IXDR_PUT_U_LONG(buf, objp->f_files);
765+
IXDR_PUT_U_LONG(buf, objp->f_ffree);
766+
IXDR_PUT_U_LONG(buf, objp->f_favail);
767+
IXDR_PUT_U_LONG(buf, objp->f_fsid);
768+
IXDR_PUT_U_LONG(buf, objp->f_flag);
769+
IXDR_PUT_U_LONG(buf, objp->f_namemax);
770+
IXDR_PUT_LONG(buf, objp->ret);
771+
}
772+
return TRUE;
773+
} else if (xdrs->x_op == XDR_DECODE) {
774+
buf = XDR_INLINE (xdrs, 12 * BYTES_PER_XDR_UNIT);
775+
if (buf == NULL) {
776+
if (!xdr_u_long (xdrs, &objp->f_bsize))
777+
return FALSE;
778+
if (!xdr_u_long (xdrs, &objp->f_frsize))
779+
return FALSE;
780+
if (!xdr_u_long (xdrs, &objp->f_blocks))
781+
return FALSE;
782+
if (!xdr_u_long (xdrs, &objp->f_bfree))
783+
return FALSE;
784+
if (!xdr_u_long (xdrs, &objp->f_bavail))
785+
return FALSE;
786+
if (!xdr_u_long (xdrs, &objp->f_files))
787+
return FALSE;
788+
if (!xdr_u_long (xdrs, &objp->f_ffree))
789+
return FALSE;
790+
if (!xdr_u_long (xdrs, &objp->f_favail))
791+
return FALSE;
792+
if (!xdr_u_long (xdrs, &objp->f_fsid))
793+
return FALSE;
794+
if (!xdr_u_long (xdrs, &objp->f_flag))
795+
return FALSE;
796+
if (!xdr_u_long (xdrs, &objp->f_namemax))
797+
return FALSE;
798+
if (!xdr_int (xdrs, &objp->ret))
799+
return FALSE;
800+
} else {
801+
objp->f_bsize = IXDR_GET_U_LONG(buf);
802+
objp->f_frsize = IXDR_GET_U_LONG(buf);
803+
objp->f_blocks = IXDR_GET_U_LONG(buf);
804+
objp->f_bfree = IXDR_GET_U_LONG(buf);
805+
objp->f_bavail = IXDR_GET_U_LONG(buf);
806+
objp->f_files = IXDR_GET_U_LONG(buf);
807+
objp->f_ffree = IXDR_GET_U_LONG(buf);
808+
objp->f_favail = IXDR_GET_U_LONG(buf);
809+
objp->f_fsid = IXDR_GET_U_LONG(buf);
810+
objp->f_flag = IXDR_GET_U_LONG(buf);
811+
objp->f_namemax = IXDR_GET_U_LONG(buf);
812+
objp->ret = IXDR_GET_LONG(buf);
813+
}
814+
return TRUE;
815+
}
816+
817+
if (!xdr_u_long (xdrs, &objp->f_bsize))
818+
return FALSE;
819+
if (!xdr_u_long (xdrs, &objp->f_frsize))
820+
return FALSE;
821+
if (!xdr_u_long (xdrs, &objp->f_blocks))
822+
return FALSE;
823+
if (!xdr_u_long (xdrs, &objp->f_bfree))
824+
return FALSE;
825+
if (!xdr_u_long (xdrs, &objp->f_bavail))
826+
return FALSE;
827+
if (!xdr_u_long (xdrs, &objp->f_files))
828+
return FALSE;
829+
if (!xdr_u_long (xdrs, &objp->f_ffree))
830+
return FALSE;
831+
if (!xdr_u_long (xdrs, &objp->f_favail))
832+
return FALSE;
833+
if (!xdr_u_long (xdrs, &objp->f_fsid))
834+
return FALSE;
835+
if (!xdr_u_long (xdrs, &objp->f_flag))
836+
return FALSE;
837+
if (!xdr_u_long (xdrs, &objp->f_namemax))
838+
return FALSE;
839+
if (!xdr_int (xdrs, &objp->ret))
840+
return FALSE;
841+
return TRUE;
842+
}

0 commit comments

Comments
 (0)