diff options
Diffstat (limited to 'net/sunrpc/cache.c')
| -rw-r--r-- | net/sunrpc/cache.c | 15 | 
1 files changed, 11 insertions, 4 deletions
diff --git a/net/sunrpc/cache.c b/net/sunrpc/cache.c index 6f1528f271ee..a349094f6fb7 100644 --- a/net/sunrpc/cache.c +++ b/net/sunrpc/cache.c @@ -373,7 +373,7 @@ void sunrpc_init_cache_detail(struct cache_detail *cd)  	spin_lock(&cache_list_lock);  	cd->nextcheck = 0;  	cd->entries = 0; -	atomic_set(&cd->readers, 0); +	atomic_set(&cd->writers, 0);  	cd->last_close = 0;  	cd->last_warn = -1;  	list_add(&cd->others, &cache_list); @@ -1029,11 +1029,13 @@ static int cache_open(struct inode *inode, struct file *filp,  		}  		rp->offset = 0;  		rp->q.reader = 1; -		atomic_inc(&cd->readers); +  		spin_lock(&queue_lock);  		list_add(&rp->q.list, &cd->queue);  		spin_unlock(&queue_lock);  	} +	if (filp->f_mode & FMODE_WRITE) +		atomic_inc(&cd->writers);  	filp->private_data = rp;  	return 0;  } @@ -1062,8 +1064,10 @@ static int cache_release(struct inode *inode, struct file *filp,  		filp->private_data = NULL;  		kfree(rp); +	} +	if (filp->f_mode & FMODE_WRITE) { +		atomic_dec(&cd->writers);  		cd->last_close = seconds_since_boot(); -		atomic_dec(&cd->readers);  	}  	module_put(cd->owner);  	return 0; @@ -1171,7 +1175,7 @@ static void warn_no_listener(struct cache_detail *detail)  static bool cache_listeners_exist(struct cache_detail *detail)  { -	if (atomic_read(&detail->readers)) +	if (atomic_read(&detail->writers))  		return true;  	if (detail->last_close == 0)  		/* This cache was never opened */ @@ -1520,6 +1524,9 @@ static ssize_t write_flush(struct file *file, const char __user *buf,  	cd->nextcheck = now;  	cache_flush(); +	if (cd->flush) +		cd->flush(); +  	*ppos += count;  	return count;  }  |