Lines Matching +full:no +full:- +full:poll +full:- +full:on +full:- +full:init

1 // SPDX-License-Identifier: GPL-2.0-or-later
13 /* Simple VFS hooks based on: */
28 #include <linux/init.h>
30 #include <linux/backing-dev.h>
31 #include <linux/poll.h>
58 * via standard usage. For example, Linux's default poll always returns
59 * EPOLLIN, so there is no way for a caller of poll(2) to know when dlmfs
60 * added poll support. Instead, we provide this list of new capabilities.
62 * Capabilities is a read-only attribute. We do it as a module parameter
67 * distinct from the locking protocol, which is concerned with inter-node
71 * - bast : EPOLLIN against the file descriptor of a held lock
72 * signifies a bast fired on the lock.
78 printk(KERN_ERR "%s: readonly parameter\n", kp->name); in param_set_dlmfs_capabilities()
79 return -EINVAL; in param_set_dlmfs_capabilities()
95 * O_RDONLY -> PRMODE level
96 * O_WRONLY -> EXMODE level
98 * O_NONBLOCK -> NOQUEUE
123 if (S_ISDIR(inode->i_mode)) in dlmfs_file_open()
126 mlog(0, "open called on inode %lu, flags 0x%x\n", inode->i_ino, in dlmfs_file_open()
127 file->f_flags); in dlmfs_file_open()
129 status = dlmfs_decode_open_flags(file->f_flags, &level, &flags); in dlmfs_file_open()
135 file->f_flags &= ~O_APPEND; in dlmfs_file_open()
139 status = -ENOMEM; in dlmfs_file_open()
142 fp->fp_lock_level = level; in dlmfs_file_open()
146 status = user_dlm_cluster_lock(&ip->ip_lockres, level, flags); in dlmfs_file_open()
152 if (flags & DLM_LKF_NOQUEUE && status == -EAGAIN) in dlmfs_file_open()
153 status = -ETXTBSY; in dlmfs_file_open()
158 file->private_data = fp; in dlmfs_file_open()
168 struct dlmfs_filp_private *fp = file->private_data; in dlmfs_file_release()
170 if (S_ISDIR(inode->i_mode)) in dlmfs_file_release()
173 mlog(0, "close called on inode %lu\n", inode->i_ino); in dlmfs_file_release()
176 level = fp->fp_lock_level; in dlmfs_file_release()
178 user_dlm_cluster_unlock(&ip->ip_lockres, level); in dlmfs_file_release()
181 file->private_data = NULL; in dlmfs_file_release()
188 * We do ->setattr() just to override size changes. Our size is the size
197 attr->ia_valid &= ~ATTR_SIZE; in dlmfs_file_setattr()
213 poll_wait(file, &ip->ip_lockres.l_event, wait); in dlmfs_file_poll()
215 spin_lock(&ip->ip_lockres.l_lock); in dlmfs_file_poll()
216 if (ip->ip_lockres.l_flags & USER_LOCK_BLOCKED) in dlmfs_file_poll()
218 spin_unlock(&ip->ip_lockres.l_lock); in dlmfs_file_poll()
246 inode->i_ino, count, *ppos); in dlmfs_file_write()
249 return -ENOSPC; in dlmfs_file_write()
252 if (count > DLM_LVB_LEN - *ppos) in dlmfs_file_write()
253 count = DLM_LVB_LEN - *ppos; in dlmfs_file_write()
259 count -= bytes_left; in dlmfs_file_write()
273 ip->ip_conn = NULL; in dlmfs_init_once()
274 ip->ip_parent = NULL; in dlmfs_init_once()
276 inode_init_once(&ip->ip_vfs_inode); in dlmfs_init_once()
287 return &ip->ip_vfs_inode; in dlmfs_alloc_inode()
304 mlog(0, "inode %lu\n", inode->i_ino); in dlmfs_evict_inode()
307 lockres = &ip->ip_lockres; in dlmfs_evict_inode()
309 if (S_ISREG(inode->i_mode)) { in dlmfs_evict_inode()
310 spin_lock(&lockres->l_lock); in dlmfs_evict_inode()
311 teardown = !!(lockres->l_flags & USER_LOCK_IN_TEARDOWN); in dlmfs_evict_inode()
312 spin_unlock(&lockres->l_lock); in dlmfs_evict_inode()
318 iput(ip->ip_parent); in dlmfs_evict_inode()
322 mlog(0, "we're a directory, ip->ip_conn = 0x%p\n", ip->ip_conn); in dlmfs_evict_inode()
325 if (ip->ip_conn) in dlmfs_evict_inode()
326 user_dlm_unregister(ip->ip_conn); in dlmfs_evict_inode()
328 ip->ip_parent = NULL; in dlmfs_evict_inode()
329 ip->ip_conn = NULL; in dlmfs_evict_inode()
338 inode->i_ino = get_next_ino(); in dlmfs_get_root_inode()
343 inode->i_fop = &simple_dir_operations; in dlmfs_get_root_inode()
344 inode->i_op = &dlmfs_root_inode_operations; in dlmfs_get_root_inode()
354 struct super_block *sb = parent->i_sb; in dlmfs_get_inode()
361 inode->i_ino = get_next_ino(); in dlmfs_get_inode()
366 ip->ip_conn = DLMFS_I(parent)->ip_conn; in dlmfs_get_inode()
375 inode->i_op = &dlmfs_file_inode_operations; in dlmfs_get_inode()
376 inode->i_fop = &dlmfs_file_operations; in dlmfs_get_inode()
380 user_dlm_lock_res_init(&ip->ip_lockres, dentry); in dlmfs_get_inode()
383 * get to drop the dlm reference on each lock *before* in dlmfs_get_inode()
386 ip->ip_parent = igrab(parent); in dlmfs_get_inode()
387 BUG_ON(!ip->ip_parent); in dlmfs_get_inode()
390 inode->i_op = &dlmfs_dir_inode_operations; in dlmfs_get_inode()
391 inode->i_fop = &simple_dir_operations; in dlmfs_get_inode()
404 /* SMP-safe */
412 const struct qstr *domain = &dentry->d_name; in dlmfs_mkdir()
416 mlog(0, "mkdir %.*s\n", domain->len, domain->name); in dlmfs_mkdir()
419 if (domain->len >= GROUP_NAME_MAX) { in dlmfs_mkdir()
420 status = -EINVAL; in dlmfs_mkdir()
427 status = -ENOMEM; in dlmfs_mkdir()
438 status, domain->len, domain->name); in dlmfs_mkdir()
441 ip->ip_conn = conn; in dlmfs_mkdir()
445 dget(dentry); /* Extra count - pin the dentry in core */ in dlmfs_mkdir()
462 const struct qstr *name = &dentry->d_name; in dlmfs_create()
464 mlog(0, "create %.*s\n", name->len, name->name); in dlmfs_create()
468 if (name->len >= USER_DLM_LOCK_ID_MAX_LEN || in dlmfs_create()
469 name->name[0] == '$') { in dlmfs_create()
470 status = -EINVAL; in dlmfs_create()
471 mlog(ML_ERROR, "invalid lock name, %.*s\n", name->len, in dlmfs_create()
472 name->name); in dlmfs_create()
478 status = -ENOMEM; in dlmfs_create()
484 dget(dentry); /* Extra count - pin the dentry in core */ in dlmfs_create()
495 mlog(0, "unlink inode %lu\n", inode->i_ino); in dlmfs_unlink()
497 /* if there are no current holders, or none that are waiting in dlmfs_unlink()
499 status = user_dlm_destroy_lock(&DLMFS_I(inode)->ip_lockres); in dlmfs_unlink()
512 sb->s_maxbytes = MAX_LFS_FILESIZE; in dlmfs_fill_super()
513 sb->s_blocksize = PAGE_SIZE; in dlmfs_fill_super()
514 sb->s_blocksize_bits = PAGE_SHIFT; in dlmfs_fill_super()
515 sb->s_magic = DLMFS_MAGIC; in dlmfs_fill_super()
516 sb->s_op = &dlmfs_ops; in dlmfs_fill_super()
517 sb->s_root = d_make_root(dlmfs_get_root_inode(sb)); in dlmfs_fill_super()
518 if (!sb->s_root) in dlmfs_fill_super()
519 return -ENOMEM; in dlmfs_fill_super()
526 .poll = dlmfs_file_poll,
569 fc->ops = &dlmfs_context_ops; in dlmfs_init_fs_context()
593 status = -ENOMEM; in init_dlmfs_fs()
601 status = -ENOMEM; in init_dlmfs_fs()
636 MODULE_DESCRIPTION("OCFS2 DLM-Filesystem");