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"
14 #define NFSDBG_FACILITY NFSDBG_CALLBACK
16 unsigned nfs4_callback_getattr(struct cb_getattrargs
*args
, struct cb_getattrres
*res
)
18 struct nfs4_client
*clp
;
19 struct nfs_delegation
*delegation
;
20 struct nfs_inode
*nfsi
;
23 res
->bitmap
[0] = res
->bitmap
[1] = 0;
24 res
->status
= htonl(NFS4ERR_BADHANDLE
);
25 clp
= nfs4_find_client(&args
->addr
->sin_addr
);
28 inode
= nfs_delegation_find_inode(clp
, &args
->fh
);
32 down_read(&nfsi
->rwsem
);
33 delegation
= nfsi
->delegation
;
34 if (delegation
== NULL
|| (delegation
->type
& FMODE_WRITE
) == 0)
36 res
->size
= i_size_read(inode
);
37 res
->change_attr
= delegation
->change_attr
;
38 if (nfsi
->npages
!= 0)
40 res
->ctime
= inode
->i_ctime
;
41 res
->mtime
= inode
->i_mtime
;
42 res
->bitmap
[0] = (FATTR4_WORD0_CHANGE
|FATTR4_WORD0_SIZE
) &
44 res
->bitmap
[1] = (FATTR4_WORD1_TIME_METADATA
|FATTR4_WORD1_TIME_MODIFY
) &
48 up_read(&nfsi
->rwsem
);
53 dprintk("%s: exit with status = %d\n", __FUNCTION__
, ntohl(res
->status
));
57 unsigned nfs4_callback_recall(struct cb_recallargs
*args
, void *dummy
)
59 struct nfs4_client
*clp
;
63 res
= htonl(NFS4ERR_BADHANDLE
);
64 clp
= nfs4_find_client(&args
->addr
->sin_addr
);
67 inode
= nfs_delegation_find_inode(clp
, &args
->fh
);
70 /* Set up a helper thread to actually return the delegation */
71 switch(nfs_async_inode_return_delegation(inode
, &args
->stateid
)) {
76 res
= htonl(NFS4ERR_BAD_STATEID
);
79 res
= htonl(NFS4ERR_RESOURCE
);
85 dprintk("%s: exit with status = %d\n", __FUNCTION__
, ntohl(res
));