#include <linux/pagemap.h>
#include <linux/mount.h>
#include <linux/vfs.h>
+#include <linux/mutex.h>
+
#include <asm/uaccess.h>
int simple_getattr(struct vfsmount *mnt, struct dentry *dentry,
char set_buf[24];
void *data;
const char *fmt; /* format for read operation */
- struct semaphore sem; /* protects access to these buffers */
+ struct mutex mutex; /* protects access to these buffers */
};
/* simple_attr_open is called by an actual attribute open file operation
attr->set = set;
attr->data = inode->u.generic_ip;
attr->fmt = fmt;
- init_MUTEX(&attr->sem);
+ mutex_init(&attr->mutex);
file->private_data = attr;
if (!attr->get)
return -EACCES;
- down(&attr->sem);
+ mutex_lock(&attr->mutex);
if (*ppos) /* continued read */
size = strlen(attr->get_buf);
else /* first read */
(unsigned long long)attr->get(attr->data));
ret = simple_read_from_buffer(buf, len, ppos, attr->get_buf, size);
- up(&attr->sem);
+ mutex_unlock(&attr->mutex);
return ret;
}
if (!attr->set)
return -EACCES;
- down(&attr->sem);
+ mutex_lock(&attr->mutex);
ret = -EFAULT;
size = min(sizeof(attr->set_buf) - 1, len);
if (copy_from_user(attr->set_buf, buf, size))
val = simple_strtol(attr->set_buf, NULL, 0);
attr->set(attr->data, val);
out:
- up(&attr->sem);
+ mutex_unlock(&attr->mutex);
return ret;
}