Commit dd90b50906db2c03e236e046f2fc7f7290efe4b4

Authored by Christoph Hellwig
Committed by Linus Torvalds
1 parent fb66a1989c

knfsd: exportfs: add find_disconnected_root helper

Break the loop that finds the root of a disconnected subtree into a helper of
its own to make reading easier and document the intent.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Neil Brown <neilb@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Showing 1 changed file with 23 additions and 16 deletions Side-by-side Diff

... ... @@ -70,6 +70,27 @@
70 70 return NULL;
71 71 }
72 72  
  73 +/*
  74 + * Find root of a disconnected subtree and return a reference to it.
  75 + */
  76 +static struct dentry *
  77 +find_disconnected_root(struct dentry *dentry)
  78 +{
  79 + dget(dentry);
  80 + spin_lock(&dentry->d_lock);
  81 + while (!IS_ROOT(dentry) &&
  82 + (dentry->d_parent->d_flags & DCACHE_DISCONNECTED)) {
  83 + struct dentry *parent = dentry->d_parent;
  84 + dget(parent);
  85 + spin_unlock(&dentry->d_lock);
  86 + dput(dentry);
  87 + dentry = parent;
  88 + spin_lock(&dentry->d_lock);
  89 + }
  90 + spin_unlock(&dentry->d_lock);
  91 + return dentry;
  92 +}
  93 +
73 94 /**
74 95 * find_exported_dentry - helper routine to implement export_operations->decode_fh
75 96 * @sb: The &super_block identifying the filesystem
76 97  
... ... @@ -164,23 +185,9 @@
164 185 * the noprogress counter. If we go through the loop 10 times (2 is
165 186 * probably enough) without getting anywhere, we just give up
166 187 */
167   - noprogress= 0;
  188 + noprogress = 0;
168 189 while (target_dir->d_flags & DCACHE_DISCONNECTED && noprogress++ < 10) {
169   - struct dentry *pd = target_dir;
170   -
171   - dget(pd);
172   - spin_lock(&pd->d_lock);
173   - while (!IS_ROOT(pd) &&
174   - (pd->d_parent->d_flags&DCACHE_DISCONNECTED)) {
175   - struct dentry *parent = pd->d_parent;
176   -
177   - dget(parent);
178   - spin_unlock(&pd->d_lock);
179   - dput(pd);
180   - pd = parent;
181   - spin_lock(&pd->d_lock);
182   - }
183   - spin_unlock(&pd->d_lock);
  190 + struct dentry *pd = find_disconnected_root(target_dir);
184 191  
185 192 if (!IS_ROOT(pd)) {
186 193 /* must have found a connected parent - great */