diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/dir.c | 1 | ||||
-rw-r--r-- | kernel/file.c | 1 | ||||
-rw-r--r-- | kernel/inode.c | 22 |
3 files changed, 17 insertions, 7 deletions
diff --git a/kernel/dir.c b/kernel/dir.c index 7903a66..be51309 100644 --- a/kernel/dir.c +++ b/kernel/dir.c @@ -1016,6 +1016,7 @@ static struct inode_operations fuse_dir_inode_operations = { }; static struct file_operations fuse_dir_operations = { + .llseek = generic_file_llseek, .read = generic_read_dir, .readdir = fuse_readdir, .open = fuse_dir_open, diff --git a/kernel/file.c b/kernel/file.c index 3adcb30..74921d6 100644 --- a/kernel/file.c +++ b/kernel/file.c @@ -641,6 +641,7 @@ static int fuse_set_page_dirty(struct page *page) #endif static struct file_operations fuse_file_operations = { + .llseek = generic_file_llseek, .read = fuse_file_read, .write = fuse_file_write, .mmap = fuse_file_mmap, diff --git a/kernel/inode.c b/kernel/inode.c index 67bc755..f702a4a 100644 --- a/kernel/inode.c +++ b/kernel/inode.c @@ -520,26 +520,34 @@ static struct inode *get_root_inode(struct super_block *sb, unsigned mode) #ifdef KERNEL_2_6 static struct dentry *fuse_get_dentry(struct super_block *sb, void *vobjp) { + int err; __u32 *objp = vobjp; unsigned long nodeid = objp[0]; __u32 generation = objp[1]; struct inode *inode; struct dentry *entry; + err = -ESTALE; if (nodeid == 0) - return ERR_PTR(-ESTALE); + goto error; inode = ilookup5(sb, nodeid, fuse_inode_eq, &nodeid); - if (!inode || inode->i_generation != generation) - return ERR_PTR(-ESTALE); + if (!inode) + goto error; + if (inode->i_generation != generation) + goto error_iput; + err = -ENOMEM; entry = d_alloc_anon(inode); - if (!entry) { - iput(inode); - return ERR_PTR(-ENOMEM); - } + if (!entry) + goto error_iput; return entry; + + error_iput: + iput(inode); + error: + return ERR_PTR(err); } static int fuse_encode_fh(struct dentry *dentry, __u32 *fh, int *max_len, |