diff --git a/lustre/ChangeLog b/lustre/ChangeLog
index 73ef20b57792d6c548272d930fcfbcf1c5f48366..96b469dcefaab99d93ff4679dbc487cd42c27461 100644
--- a/lustre/ChangeLog
+++ b/lustre/ChangeLog
@@ -478,6 +478,13 @@ Details    : On SLES10/PPC, fs.h includes idr.h which requires BITS_PER_LONG to
 	     be defined. Add a hack in mkfs_lustre.c to work around this compile
 	     issue.
 
+Severity   : normal
+Bugzilla   : 14257
+Description: LASSERT on MDS when client holding flock lock dies
+Details    : ldlm pool logic depends on number of granted locks equal to
+             number of released locks which is not true for flock locks, so
+	     just exclude such locks from consideration.
+
 --------------------------------------------------------------------------------
 
 2007-12-07         Cluster File Systems, Inc. <info@clusterfs.com>
diff --git a/lustre/ldlm/ldlm_pool.c b/lustre/ldlm/ldlm_pool.c
index 541afe19fc2f5081c547aa937ea1b7dfb0d60ce7..dcae25431d4861cae71dd511cd3d056c41917ebd 100644
--- a/lustre/ldlm/ldlm_pool.c
+++ b/lustre/ldlm/ldlm_pool.c
@@ -667,7 +667,15 @@ EXPORT_SYMBOL(ldlm_pool_fini);
 
 void ldlm_pool_add(struct ldlm_pool *pl, struct ldlm_lock *lock)
 {
+        /* FLOCK locks are special in a sense that they are almost never
+         * cancelled, instead special kind of lock is used to drop them.
+         * also there is no LRU for flock locks, so no point in tracking
+         * them anyway */
+        if (lock->l_resource->lr_type == LDLM_FLOCK)
+                return;
+
         ENTRY;
+                
         atomic_inc(&pl->pl_granted);
         atomic_inc(&pl->pl_grant_rate);
         atomic_inc(&pl->pl_grant_speed);
@@ -686,6 +694,8 @@ EXPORT_SYMBOL(ldlm_pool_add);
 
 void ldlm_pool_del(struct ldlm_pool *pl, struct ldlm_lock *lock)
 {
+        if (lock->l_resource->lr_type == LDLM_FLOCK)
+                return;
         ENTRY;
         LASSERT(atomic_read(&pl->pl_granted) > 0);
         atomic_dec(&pl->pl_granted);