->llseek() locking has moved from llseek to the individual llseek
implementations. If your fs is not using generic_file_llseek, you
-need to acquire and release the BKL in your ->llseek().
+need to acquire and release the appropriate locks in your ->llseek().
+For many filesystems, it is probably safe to acquire the inode
+semaphore. Note some filesystems (i.e. remote ones) provide no
+protection for i_size so you will need to use the BKL.
->open() locking is in-transit: big lock partially moved into the methods.
The only exception is ->open() in the instances of file_operations that never
return ret;
}
-static loff_t hci_vhci_chr_lseek(struct file * file, loff_t offset, int origin)
-{
- return -ESPIPE;
-}
-
static int hci_vhci_chr_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
return -EINVAL;
static struct file_operations hci_vhci_fops = {
owner: THIS_MODULE,
- llseek: hci_vhci_chr_lseek,
+ llseek: no_lseek,
read: hci_vhci_chr_read,
write: hci_vhci_chr_write,
poll: hci_vhci_chr_poll,
/* --------------------------------------------------------------------- */
-static loff_t it8172_llseek(struct file *file, loff_t offset, int origin)
-{
- return -ESPIPE;
-}
-
-
static int it8172_open_mixdev(struct inode *inode, struct file *file)
{
int minor = MINOR(inode->i_rdev);
static /*const*/ struct file_operations it8172_mixer_fops = {
owner: THIS_MODULE,
- llseek: it8172_llseek,
+ llseek: no_llseek,
ioctl: it8172_ioctl_mixdev,
open: it8172_open_mixdev,
release: it8172_release_mixdev,
static /*const*/ struct file_operations it8172_audio_fops = {
owner: THIS_MODULE,
- llseek: it8172_llseek,
+ llseek: no_llseek,
read: it8172_read,
write: it8172_write,
poll: it8172_poll,
/* --------------------------------------------------------------------- */
-static loff_t vrc5477_ac97_llseek(struct file *file, loff_t offset, int origin)
-{
- return -ESPIPE;
-}
-
-
static int vrc5477_ac97_open_mixdev(struct inode *inode, struct file *file)
{
int minor = MINOR(inode->i_rdev);
static /*const*/ struct file_operations vrc5477_ac97_mixer_fops = {
owner: THIS_MODULE,
- llseek: vrc5477_ac97_llseek,
+ llseek: no_llseek,
ioctl: vrc5477_ac97_ioctl_mixdev,
open: vrc5477_ac97_open_mixdev,
release: vrc5477_ac97_release_mixdev,
static /*const*/ struct file_operations vrc5477_ac97_audio_fops = {
owner: THIS_MODULE,
- llseek: vrc5477_ac97_llseek,
+ llseek: no_llseek,
read: vrc5477_ac97_read,
write: vrc5477_ac97_write,
poll: vrc5477_ac97_poll,
return ret;
}
-
-/* Seek is not supported */
-static loff_t auerchar_llseek (struct file *file, loff_t offset, int origin)
-{
- dbg ("auerchar_seek");
- return -ESPIPE;
-}
-
-
/* Read data from the device */
static ssize_t auerchar_read (struct file *file, char *buf, size_t count, loff_t * ppos)
{
static struct file_operations auerswald_fops =
{
owner: THIS_MODULE,
- llseek: auerchar_llseek,
+ llseek: no_llseek,
read: auerchar_read,
write: auerchar_write,
ioctl: auerchar_ioctl,
#include <linux/hfs_fs_sb.h>
#include <linux/hfs_fs_i.h>
#include <linux/hfs_fs.h>
+#include <linux/smp_lock.h>
/*================ Forward declarations ================*/
static loff_t cap_info_llseek(struct file *, loff_t,
#include <linux/hfs_fs_sb.h>
#include <linux/hfs_fs_i.h>
#include <linux/hfs_fs.h>
+#include <linux/smp_lock.h>
/* prodos types */
#define PRODOSI_FTYPE_DIR 0x0F
#include <linux/locks.h>
#include <linux/slab.h>
#include <linux/vmalloc.h>
+#include <linux/smp_lock.h>
#include <linux/ncp_fs.h>
#include "ncplib_kernel.h"
return -EPIPE;
}
-static loff_t
-pipe_lseek(struct file *file, loff_t offset, int orig)
-{
- return -ESPIPE;
-}
-
static ssize_t
bad_pipe_r(struct file *filp, char *buf, size_t count, loff_t *ppos)
{
* are also used in linux/fs/fifo.c to do operations on FIFOs.
*/
struct file_operations read_fifo_fops = {
- llseek: pipe_lseek,
+ llseek: no_llseek,
read: pipe_read,
write: bad_pipe_w,
poll: fifo_poll,
};
struct file_operations write_fifo_fops = {
- llseek: pipe_lseek,
+ llseek: no_llseek,
read: bad_pipe_r,
write: pipe_write,
poll: fifo_poll,
};
struct file_operations rdwr_fifo_fops = {
- llseek: pipe_lseek,
+ llseek: no_llseek,
read: pipe_read,
write: pipe_write,
poll: fifo_poll,
};
struct file_operations read_pipe_fops = {
- llseek: pipe_lseek,
+ llseek: no_llseek,
read: pipe_read,
write: bad_pipe_w,
poll: pipe_poll,
};
struct file_operations write_pipe_fops = {
- llseek: pipe_lseek,
+ llseek: no_llseek,
read: bad_pipe_r,
write: pipe_write,
poll: pipe_poll,
};
struct file_operations rdwr_pipe_fops = {
- llseek: pipe_lseek,
+ llseek: no_llseek,
read: pipe_read,
write: pipe_write,
poll: pipe_poll,
#include <linux/pagemap.h>
#include <linux/smp_lock.h>
-/*
- * Make sure the offset never goes beyond the 32-bit mark..
- */
-static long long ufs_file_lseek(
- struct file *file,
- long long offset,
- int origin )
-{
- long long retval;
- struct inode *inode = file->f_dentry->d_inode;
-
- lock_kernel();
-
- switch (origin) {
- case 2:
- offset += inode->i_size;
- break;
- case 1:
- offset += file->f_pos;
- }
- retval = -EINVAL;
- /* make sure the offset fits in 32 bits */
- if (((unsigned long long) offset >> 32) == 0) {
- if (offset != file->f_pos) {
- file->f_pos = offset;
- file->f_reada = 0;
- file->f_version = ++event;
- }
- retval = offset;
- }
- unlock_kernel();
- return retval;
-}
-
/*
* We have mostly NULL's here: the current defaults are ok for
* the ufs filesystem.
*/
struct file_operations ufs_file_operations = {
- llseek: ufs_file_lseek,
+ llseek: generic_file_llseek,
read: generic_file_read,
write: generic_file_write,
mmap: generic_file_mmap,
return sock_recvmsg(sock, &msg, count, msg.msg_flags);
}
-static loff_t netlink_lseek(struct file * file, loff_t offset, int origin)
-{
- return -ESPIPE;
-}
-
static int netlink_open(struct inode * inode, struct file * file)
{
unsigned int minor = minor(inode->i_rdev);
static struct file_operations netlink_fops = {
owner: THIS_MODULE,
- llseek: netlink_lseek,
+ llseek: no_llseek,
read: netlink_read,
write: netlink_write,
poll: netlink_poll,
#include <linux/netfilter.h>
static int sock_no_open(struct inode *irrelevant, struct file *dontcare);
-static loff_t sock_lseek(struct file *file, loff_t offset, int whence);
static ssize_t sock_read(struct file *file, char *buf,
size_t size, loff_t *ppos);
static ssize_t sock_write(struct file *file, const char *buf,
*/
static struct file_operations socket_file_ops = {
- llseek: sock_lseek,
+ llseek: no_llseek,
read: sock_read,
write: sock_write,
poll: sock_poll,
}
-/*
- * Sockets are not seekable.
- */
-
-static loff_t sock_lseek(struct file *file, loff_t offset, int whence)
-{
- return -ESPIPE;
-}
-
/*
* Read data from a socket. ubuf is a user mode pointer. We make sure the user
* area ubuf...ubuf+size-1 is writable before asking the protocol.