4 * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
7 #include <linux/sched.h>
8 #include <linux/nfsd/nfsd.h>
11 int nfsexp_flags(struct svc_rqst
*rqstp
, struct svc_export
*exp
)
13 struct exp_flavor_info
*f
;
14 struct exp_flavor_info
*end
= exp
->ex_flavors
+ exp
->ex_nflavors
;
16 for (f
= exp
->ex_flavors
; f
< end
; f
++) {
17 if (f
->pseudoflavor
== rqstp
->rq_flavor
)
24 int nfsd_setuser(struct svc_rqst
*rqstp
, struct svc_export
*exp
)
26 struct group_info
*rqgi
;
27 struct group_info
*gi
;
30 int flags
= nfsexp_flags(rqstp
, exp
);
33 validate_process_creds();
35 /* discard any old override before preparing the new set */
36 revert_creds(get_cred(current
->real_cred
));
37 new = prepare_creds();
41 new->fsuid
= rqstp
->rq_cred
.cr_uid
;
42 new->fsgid
= rqstp
->rq_cred
.cr_gid
;
44 rqgi
= rqstp
->rq_cred
.cr_group_info
;
46 if (flags
& NFSEXP_ALLSQUASH
) {
47 new->fsuid
= exp
->ex_anon_uid
;
48 new->fsgid
= exp
->ex_anon_gid
;
52 } else if (flags
& NFSEXP_ROOTSQUASH
) {
54 new->fsuid
= exp
->ex_anon_uid
;
56 new->fsgid
= exp
->ex_anon_gid
;
58 gi
= groups_alloc(rqgi
->ngroups
);
62 for (i
= 0; i
< rqgi
->ngroups
; i
++) {
63 if (!GROUP_AT(rqgi
, i
))
64 GROUP_AT(gi
, i
) = exp
->ex_anon_gid
;
66 GROUP_AT(gi
, i
) = GROUP_AT(rqgi
, i
);
69 gi
= get_group_info(rqgi
);
72 if (new->fsuid
== (uid_t
) -1)
73 new->fsuid
= exp
->ex_anon_uid
;
74 if (new->fsgid
== (gid_t
) -1)
75 new->fsgid
= exp
->ex_anon_gid
;
77 ret
= set_groups(new, gi
);
83 new->cap_effective
= cap_drop_nfsd_set(new->cap_effective
);
85 new->cap_effective
= cap_raise_nfsd_set(new->cap_effective
,
87 validate_process_creds();
88 put_cred(override_creds(new));
90 validate_process_creds();