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"
15 #define NFSDBG_FACILITY NFSDBG_CALLBACK
17 unsigned nfs4_callback_getattr(struct cb_getattrargs
*args
, struct cb_getattrres
*res
)
19 struct nfs_client
*clp
;
20 struct nfs_delegation
*delegation
;
21 struct nfs_inode
*nfsi
;
24 res
->bitmap
[0] = res
->bitmap
[1] = 0;
25 res
->status
= htonl(NFS4ERR_BADHANDLE
);
26 clp
= nfs_find_client(args
->addr
, 4);
29 inode
= nfs_delegation_find_inode(clp
, &args
->fh
);
33 down_read(&nfsi
->rwsem
);
34 delegation
= nfsi
->delegation
;
35 if (delegation
== NULL
|| (delegation
->type
& FMODE_WRITE
) == 0)
37 res
->size
= i_size_read(inode
);
38 res
->change_attr
= delegation
->change_attr
;
39 if (nfsi
->npages
!= 0)
41 res
->ctime
= inode
->i_ctime
;
42 res
->mtime
= inode
->i_mtime
;
43 res
->bitmap
[0] = (FATTR4_WORD0_CHANGE
|FATTR4_WORD0_SIZE
) &
45 res
->bitmap
[1] = (FATTR4_WORD1_TIME_METADATA
|FATTR4_WORD1_TIME_MODIFY
) &
49 up_read(&nfsi
->rwsem
);
54 dprintk("%s: exit with status = %d\n", __FUNCTION__
, ntohl(res
->status
));
58 unsigned nfs4_callback_recall(struct cb_recallargs
*args
, void *dummy
)
60 struct nfs_client
*clp
;
64 res
= htonl(NFS4ERR_BADHANDLE
);
65 clp
= nfs_find_client(args
->addr
, 4);
68 inode
= nfs_delegation_find_inode(clp
, &args
->fh
);
71 /* Set up a helper thread to actually return the delegation */
72 switch(nfs_async_inode_return_delegation(inode
, &args
->stateid
)) {
77 res
= htonl(NFS4ERR_BAD_STATEID
);
80 res
= htonl(NFS4ERR_RESOURCE
);
86 dprintk("%s: exit with status = %d\n", __FUNCTION__
, ntohl(res
));