2 * linux/fs/nfs/callback_proc.c
4 * Copyright (C) 2004 Trond Myklebust
6 * NFSv4 callback procedures
8 #include <linux/nfs4.h>
9 #include <linux/nfs_fs.h>
12 #include "delegation.h"
16 #define NFSDBG_FACILITY NFSDBG_CALLBACK
19 __be32
nfs4_callback_getattr(struct cb_getattrargs
*args
, struct cb_getattrres
*res
)
21 struct nfs_client
*clp
;
22 struct nfs_delegation
*delegation
;
23 struct nfs_inode
*nfsi
;
26 res
->bitmap
[0] = res
->bitmap
[1] = 0;
27 res
->status
= htonl(NFS4ERR_BADHANDLE
);
28 clp
= nfs_find_client(args
->addr
, 4);
32 dprintk("NFS: GETATTR callback request from %s\n",
33 rpc_peeraddr2str(clp
->cl_rpcclient
, RPC_DISPLAY_ADDR
));
35 inode
= nfs_delegation_find_inode(clp
, &args
->fh
);
39 down_read(&nfsi
->rwsem
);
40 delegation
= nfsi
->delegation
;
41 if (delegation
== NULL
|| (delegation
->type
& FMODE_WRITE
) == 0)
43 res
->size
= i_size_read(inode
);
44 res
->change_attr
= delegation
->change_attr
;
45 if (nfsi
->npages
!= 0)
47 res
->ctime
= inode
->i_ctime
;
48 res
->mtime
= inode
->i_mtime
;
49 res
->bitmap
[0] = (FATTR4_WORD0_CHANGE
|FATTR4_WORD0_SIZE
) &
51 res
->bitmap
[1] = (FATTR4_WORD1_TIME_METADATA
|FATTR4_WORD1_TIME_MODIFY
) &
55 up_read(&nfsi
->rwsem
);
60 dprintk("%s: exit with status = %d\n", __func__
, ntohl(res
->status
));
64 __be32
nfs4_callback_recall(struct cb_recallargs
*args
, void *dummy
)
66 struct nfs_client
*clp
;
70 res
= htonl(NFS4ERR_BADHANDLE
);
71 clp
= nfs_find_client(args
->addr
, 4);
75 dprintk("NFS: RECALL callback request from %s\n",
76 rpc_peeraddr2str(clp
->cl_rpcclient
, RPC_DISPLAY_ADDR
));
79 struct nfs_client
*prev
= clp
;
81 inode
= nfs_delegation_find_inode(clp
, &args
->fh
);
83 /* Set up a helper thread to actually return the delegation */
84 switch(nfs_async_inode_return_delegation(inode
, &args
->stateid
)) {
90 res
= htonl(NFS4ERR_BAD_STATEID
);
93 res
= htonl(NFS4ERR_RESOURCE
);
97 clp
= nfs_find_client_next(prev
);
99 } while (clp
!= NULL
);
101 dprintk("%s: exit with status = %d\n", __func__
, ntohl(res
));