diff options
author | Paulo Alcantara <pc@cjr.nz> | 2022-12-17 03:41:31 +0300 |
---|---|---|
committer | Steve French <stfrench@microsoft.com> | 2022-12-19 17:03:12 +0300 |
commit | 1d04a6fe75eef16dd1816b112edb4406fd1fbffd (patch) | |
tree | bf4c1f225ee0c97e196f3c36f7ec0e32972ed7c1 /fs/cifs/dfs_cache.c | |
parent | 8332858569a096cff02e157555d839e0be921ec7 (diff) | |
download | linux-1d04a6fe75eef16dd1816b112edb4406fd1fbffd.tar.xz |
cifs: don't block in dfs_cache_noreq_update_tgthint()
Avoid blocking in dfs_cache_noreq_update_tgthint() while reconnecting
servers or tcons as the cache refresh worker or new mounts might
already be updating their targets.
Move some more dfs related code out of connect.c while at it.
Signed-off-by: Paulo Alcantara (SUSE) <pc@cjr.nz>
Signed-off-by: Steve French <stfrench@microsoft.com>
Diffstat (limited to 'fs/cifs/dfs_cache.c')
-rw-r--r-- | fs/cifs/dfs_cache.c | 18 |
1 files changed, 7 insertions, 11 deletions
diff --git a/fs/cifs/dfs_cache.c b/fs/cifs/dfs_cache.c index cb83b86eafe6..43ad1176dcb9 100644 --- a/fs/cifs/dfs_cache.c +++ b/fs/cifs/dfs_cache.c @@ -1082,26 +1082,23 @@ out_free_path: * * Return zero if the target hint was updated successfully, otherwise non-zero. */ -int dfs_cache_noreq_update_tgthint(const char *path, const struct dfs_cache_tgt_iterator *it) +void dfs_cache_noreq_update_tgthint(const char *path, const struct dfs_cache_tgt_iterator *it) { - int rc; - struct cache_entry *ce; struct cache_dfs_tgt *t; + struct cache_entry *ce; - if (!it) - return -EINVAL; + if (!path || !it) + return; cifs_dbg(FYI, "%s: path: %s\n", __func__, path); - down_write(&htable_rw_lock); + if (!down_write_trylock(&htable_rw_lock)) + return; ce = lookup_cache_entry(path); - if (IS_ERR(ce)) { - rc = PTR_ERR(ce); + if (IS_ERR(ce)) goto out_unlock; - } - rc = 0; t = ce->tgthint; if (unlikely(!strcasecmp(it->it_name, t->name))) @@ -1118,7 +1115,6 @@ int dfs_cache_noreq_update_tgthint(const char *path, const struct dfs_cache_tgt_ out_unlock: up_write(&htable_rw_lock); - return rc; } /** |