nfsd: optimise recalculate_deny_mode() for a common case
[linux-2.6-block.git] / fs / nfsd / nfs4state.c
index 66f9a4f031a4d77344d1c1420ca09e95033c948d..a20c2c9d7d457fa22d3f2efd04ca59b083c25ae8 100644 (file)
@@ -1397,11 +1397,16 @@ static void
 recalculate_deny_mode(struct nfs4_file *fp)
 {
        struct nfs4_ol_stateid *stp;
+       u32 old_deny;
 
        spin_lock(&fp->fi_lock);
+       old_deny = fp->fi_share_deny;
        fp->fi_share_deny = 0;
-       list_for_each_entry(stp, &fp->fi_stateids, st_perfile)
+       list_for_each_entry(stp, &fp->fi_stateids, st_perfile) {
                fp->fi_share_deny |= bmap_to_share_mode(stp->st_deny_bmap);
+               if (fp->fi_share_deny == old_deny)
+                       break;
+       }
        spin_unlock(&fp->fi_lock);
 }