|
@@ -424,16 +424,22 @@ static int coda_readdir(struct file *coda_file, struct dir_context *ctx)
|
|
BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC);
|
|
BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC);
|
|
host_file = cfi->cfi_container;
|
|
host_file = cfi->cfi_container;
|
|
|
|
|
|
- if (host_file->f_op->iterate) {
|
|
|
|
|
|
+ if (host_file->f_op->iterate || host_file->f_op->iterate_shared) {
|
|
struct inode *host_inode = file_inode(host_file);
|
|
struct inode *host_inode = file_inode(host_file);
|
|
-
|
|
|
|
- inode_lock(host_inode);
|
|
|
|
ret = -ENOENT;
|
|
ret = -ENOENT;
|
|
if (!IS_DEADDIR(host_inode)) {
|
|
if (!IS_DEADDIR(host_inode)) {
|
|
- ret = host_file->f_op->iterate(host_file, ctx);
|
|
|
|
- file_accessed(host_file);
|
|
|
|
|
|
+ if (host_file->f_op->iterate_shared) {
|
|
|
|
+ inode_lock_shared(host_inode);
|
|
|
|
+ ret = host_file->f_op->iterate_shared(host_file, ctx);
|
|
|
|
+ file_accessed(host_file);
|
|
|
|
+ inode_unlock_shared(host_inode);
|
|
|
|
+ } else {
|
|
|
|
+ inode_lock(host_inode);
|
|
|
|
+ ret = host_file->f_op->iterate(host_file, ctx);
|
|
|
|
+ file_accessed(host_file);
|
|
|
|
+ inode_unlock(host_inode);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- inode_unlock(host_inode);
|
|
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
/* Venus: we must read Venus dirents from a file */
|
|
/* Venus: we must read Venus dirents from a file */
|