nfsd4: properly type op_set_currentstateid callbacks

Given the args union in struct nfsd4_op a name, and pass it to the
op_set_currentstateid callbacks instead of using unsafe function
pointer casts.

Signed-off-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
Christoph Hellwig 2017-05-08 20:03:15 +02:00 коммит произвёл Anna Schumaker
Родитель 408b3d46ae
Коммит 6c9600a71d
4 изменённых файлов: 27 добавлений и 19 удалений

Просмотреть файл

@ -8,10 +8,14 @@ extern void clear_current_stateid(struct nfsd4_compound_state *cstate);
/* /*
* functions to set current state id * functions to set current state id
*/ */
extern void nfsd4_set_opendowngradestateid(struct nfsd4_compound_state *cstate, struct nfsd4_open_downgrade *); extern void nfsd4_set_opendowngradestateid(struct nfsd4_compound_state *,
extern void nfsd4_set_openstateid(struct nfsd4_compound_state *, struct nfsd4_open *); union nfsd4_op_u *);
extern void nfsd4_set_lockstateid(struct nfsd4_compound_state *, struct nfsd4_lock *); extern void nfsd4_set_openstateid(struct nfsd4_compound_state *,
extern void nfsd4_set_closestateid(struct nfsd4_compound_state *, struct nfsd4_close *); union nfsd4_op_u *);
extern void nfsd4_set_lockstateid(struct nfsd4_compound_state *,
union nfsd4_op_u *);
extern void nfsd4_set_closestateid(struct nfsd4_compound_state *,
union nfsd4_op_u *);
/* /*
* functions to consume current state id * functions to consume current state id

Просмотреть файл

@ -1525,7 +1525,6 @@ typedef __be32(*nfsd4op_func)(struct svc_rqst *, struct nfsd4_compound_state *,
void *); void *);
typedef u32(*nfsd4op_rsize)(struct svc_rqst *, struct nfsd4_op *op); typedef u32(*nfsd4op_rsize)(struct svc_rqst *, struct nfsd4_op *op);
typedef void(*stateid_setter)(struct nfsd4_compound_state *, void *);
typedef void(*stateid_getter)(struct nfsd4_compound_state *, void *); typedef void(*stateid_getter)(struct nfsd4_compound_state *, void *);
enum nfsd4_op_flags { enum nfsd4_op_flags {
@ -1565,7 +1564,8 @@ struct nfsd4_operation {
/* Try to get response size before operation */ /* Try to get response size before operation */
nfsd4op_rsize op_rsize_bop; nfsd4op_rsize op_rsize_bop;
stateid_getter op_get_currentstateid; stateid_getter op_get_currentstateid;
stateid_setter op_set_currentstateid; void (*op_set_currentstateid)(struct nfsd4_compound_state *,
union nfsd4_op_u *);
}; };
static struct nfsd4_operation nfsd4_ops[]; static struct nfsd4_operation nfsd4_ops[];
@ -2104,7 +2104,7 @@ static struct nfsd4_operation nfsd4_ops[] = {
.op_name = "OP_CLOSE", .op_name = "OP_CLOSE",
.op_rsize_bop = (nfsd4op_rsize)nfsd4_status_stateid_rsize, .op_rsize_bop = (nfsd4op_rsize)nfsd4_status_stateid_rsize,
.op_get_currentstateid = (stateid_getter)nfsd4_get_closestateid, .op_get_currentstateid = (stateid_getter)nfsd4_get_closestateid,
.op_set_currentstateid = (stateid_setter)nfsd4_set_closestateid, .op_set_currentstateid = nfsd4_set_closestateid,
}, },
[OP_COMMIT] = { [OP_COMMIT] = {
.op_func = (nfsd4op_func)nfsd4_commit, .op_func = (nfsd4op_func)nfsd4_commit,
@ -2148,7 +2148,7 @@ static struct nfsd4_operation nfsd4_ops[] = {
.op_flags = OP_MODIFIES_SOMETHING, .op_flags = OP_MODIFIES_SOMETHING,
.op_name = "OP_LOCK", .op_name = "OP_LOCK",
.op_rsize_bop = (nfsd4op_rsize)nfsd4_lock_rsize, .op_rsize_bop = (nfsd4op_rsize)nfsd4_lock_rsize,
.op_set_currentstateid = (stateid_setter)nfsd4_set_lockstateid, .op_set_currentstateid = nfsd4_set_lockstateid,
}, },
[OP_LOCKT] = { [OP_LOCKT] = {
.op_func = (nfsd4op_func)nfsd4_lockt, .op_func = (nfsd4op_func)nfsd4_lockt,
@ -2184,7 +2184,7 @@ static struct nfsd4_operation nfsd4_ops[] = {
.op_flags = OP_HANDLES_WRONGSEC | OP_MODIFIES_SOMETHING, .op_flags = OP_HANDLES_WRONGSEC | OP_MODIFIES_SOMETHING,
.op_name = "OP_OPEN", .op_name = "OP_OPEN",
.op_rsize_bop = (nfsd4op_rsize)nfsd4_open_rsize, .op_rsize_bop = (nfsd4op_rsize)nfsd4_open_rsize,
.op_set_currentstateid = (stateid_setter)nfsd4_set_openstateid, .op_set_currentstateid = nfsd4_set_openstateid,
}, },
[OP_OPEN_CONFIRM] = { [OP_OPEN_CONFIRM] = {
.op_func = (nfsd4op_func)nfsd4_open_confirm, .op_func = (nfsd4op_func)nfsd4_open_confirm,
@ -2198,7 +2198,7 @@ static struct nfsd4_operation nfsd4_ops[] = {
.op_name = "OP_OPEN_DOWNGRADE", .op_name = "OP_OPEN_DOWNGRADE",
.op_rsize_bop = (nfsd4op_rsize)nfsd4_status_stateid_rsize, .op_rsize_bop = (nfsd4op_rsize)nfsd4_status_stateid_rsize,
.op_get_currentstateid = (stateid_getter)nfsd4_get_opendowngradestateid, .op_get_currentstateid = (stateid_getter)nfsd4_get_opendowngradestateid,
.op_set_currentstateid = (stateid_setter)nfsd4_set_opendowngradestateid, .op_set_currentstateid = nfsd4_set_opendowngradestateid,
}, },
[OP_PUTFH] = { [OP_PUTFH] = {
.op_func = (nfsd4op_func)nfsd4_putfh, .op_func = (nfsd4op_func)nfsd4_putfh,

Просмотреть файл

@ -7103,27 +7103,31 @@ clear_current_stateid(struct nfsd4_compound_state *cstate)
* functions to set current state id * functions to set current state id
*/ */
void void
nfsd4_set_opendowngradestateid(struct nfsd4_compound_state *cstate, struct nfsd4_open_downgrade *odp) nfsd4_set_opendowngradestateid(struct nfsd4_compound_state *cstate,
union nfsd4_op_u *u)
{ {
put_stateid(cstate, &odp->od_stateid); put_stateid(cstate, &u->open_downgrade.od_stateid);
} }
void void
nfsd4_set_openstateid(struct nfsd4_compound_state *cstate, struct nfsd4_open *open) nfsd4_set_openstateid(struct nfsd4_compound_state *cstate,
union nfsd4_op_u *u)
{ {
put_stateid(cstate, &open->op_stateid); put_stateid(cstate, &u->open.op_stateid);
} }
void void
nfsd4_set_closestateid(struct nfsd4_compound_state *cstate, struct nfsd4_close *close) nfsd4_set_closestateid(struct nfsd4_compound_state *cstate,
union nfsd4_op_u *u)
{ {
put_stateid(cstate, &close->cl_stateid); put_stateid(cstate, &u->close.cl_stateid);
} }
void void
nfsd4_set_lockstateid(struct nfsd4_compound_state *cstate, struct nfsd4_lock *lock) nfsd4_set_lockstateid(struct nfsd4_compound_state *cstate,
union nfsd4_op_u *u)
{ {
put_stateid(cstate, &lock->lk_resp_stateid); put_stateid(cstate, &u->lock.lk_resp_stateid);
} }
/* /*

Просмотреть файл

@ -539,7 +539,7 @@ struct nfsd4_seek {
struct nfsd4_op { struct nfsd4_op {
int opnum; int opnum;
__be32 status; __be32 status;
union { union nfsd4_op_u {
struct nfsd4_access access; struct nfsd4_access access;
struct nfsd4_close close; struct nfsd4_close close;
struct nfsd4_commit commit; struct nfsd4_commit commit;