diff options
Diffstat (limited to 'fs/nfs/pnfs_dev.c')
-rw-r--r-- | fs/nfs/pnfs_dev.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/fs/nfs/pnfs_dev.c b/fs/nfs/pnfs_dev.c index 73f701f1f4d3..d35b62e83ea6 100644 --- a/fs/nfs/pnfs_dev.c +++ b/fs/nfs/pnfs_dev.c | |||
@@ -40,6 +40,8 @@ | |||
40 | #define NFS4_DEVICE_ID_HASH_SIZE (1 << NFS4_DEVICE_ID_HASH_BITS) | 40 | #define NFS4_DEVICE_ID_HASH_SIZE (1 << NFS4_DEVICE_ID_HASH_BITS) |
41 | #define NFS4_DEVICE_ID_HASH_MASK (NFS4_DEVICE_ID_HASH_SIZE - 1) | 41 | #define NFS4_DEVICE_ID_HASH_MASK (NFS4_DEVICE_ID_HASH_SIZE - 1) |
42 | 42 | ||
43 | #define PNFS_DEVICE_RETRY_TIMEOUT (120*HZ) | ||
44 | |||
43 | static struct hlist_head nfs4_deviceid_cache[NFS4_DEVICE_ID_HASH_SIZE]; | 45 | static struct hlist_head nfs4_deviceid_cache[NFS4_DEVICE_ID_HASH_SIZE]; |
44 | static DEFINE_SPINLOCK(nfs4_deviceid_lock); | 46 | static DEFINE_SPINLOCK(nfs4_deviceid_lock); |
45 | 47 | ||
@@ -218,6 +220,30 @@ nfs4_put_deviceid_node(struct nfs4_deviceid_node *d) | |||
218 | } | 220 | } |
219 | EXPORT_SYMBOL_GPL(nfs4_put_deviceid_node); | 221 | EXPORT_SYMBOL_GPL(nfs4_put_deviceid_node); |
220 | 222 | ||
223 | void | ||
224 | nfs4_mark_deviceid_unavailable(struct nfs4_deviceid_node *node) | ||
225 | { | ||
226 | node->timestamp_unavailable = jiffies; | ||
227 | set_bit(NFS_DEVICEID_UNAVAILABLE, &node->flags); | ||
228 | } | ||
229 | EXPORT_SYMBOL_GPL(nfs4_mark_deviceid_unavailable); | ||
230 | |||
231 | bool | ||
232 | nfs4_test_deviceid_unavailable(struct nfs4_deviceid_node *node) | ||
233 | { | ||
234 | if (test_bit(NFS_DEVICEID_UNAVAILABLE, &node->flags)) { | ||
235 | unsigned long start, end; | ||
236 | |||
237 | end = jiffies; | ||
238 | start = end - PNFS_DEVICE_RETRY_TIMEOUT; | ||
239 | if (time_in_range(node->timestamp_unavailable, start, end)) | ||
240 | return true; | ||
241 | clear_bit(NFS_DEVICEID_UNAVAILABLE, &node->flags); | ||
242 | } | ||
243 | return false; | ||
244 | } | ||
245 | EXPORT_SYMBOL_GPL(nfs4_test_deviceid_unavailable); | ||
246 | |||
221 | static void | 247 | static void |
222 | _deviceid_purge_client(const struct nfs_client *clp, long hash) | 248 | _deviceid_purge_client(const struct nfs_client *clp, long hash) |
223 | { | 249 | { |
@@ -276,3 +302,4 @@ nfs4_deviceid_mark_client_invalid(struct nfs_client *clp) | |||
276 | } | 302 | } |
277 | rcu_read_unlock(); | 303 | rcu_read_unlock(); |
278 | } | 304 | } |
305 | |||