Lines Matching +full:wr +full:- +full:hold
1 // SPDX-License-Identifier: GPL-2.0
6 * See COPYING in top-level directory.
16 #include "orangefs-kernel.h"
17 #include "orangefs-bufmap.h"
22 struct inode *inode = page->mapping->host; in orangefs_writepage_locked()
23 struct orangefs_write_range *wr = NULL; in orangefs_writepage_locked() local
34 wr = (struct orangefs_write_range *)page_private(page); in orangefs_writepage_locked()
35 WARN_ON(wr->pos >= len); in orangefs_writepage_locked()
36 off = wr->pos; in orangefs_writepage_locked()
37 if (off + wr->len > len) in orangefs_writepage_locked()
38 wlen = len - off; in orangefs_writepage_locked()
40 wlen = wr->len; in orangefs_writepage_locked()
45 wlen = len - off; in orangefs_writepage_locked()
57 len, wr, NULL, NULL); in orangefs_writepage_locked()
59 mapping_set_error(page->mapping, ret); in orangefs_writepage_locked()
90 struct inode *inode = ow->pages[0]->mapping->host; in orangefs_writepages_work()
91 struct orangefs_write_range *wrp, wr; in orangefs_writepages_work() local
100 for (i = 0; i < ow->npages; i++) { in orangefs_writepages_work()
101 set_page_writeback(ow->pages[i]); in orangefs_writepages_work()
102 bvec_set_page(&ow->bv[i], ow->pages[i], in orangefs_writepages_work()
103 min(page_offset(ow->pages[i]) + PAGE_SIZE, in orangefs_writepages_work()
104 ow->off + ow->len) - in orangefs_writepages_work()
105 max(ow->off, page_offset(ow->pages[i])), in orangefs_writepages_work()
106 i == 0 ? ow->off - page_offset(ow->pages[i]) : 0); in orangefs_writepages_work()
108 iov_iter_bvec(&iter, ITER_SOURCE, ow->bv, ow->npages, ow->len); in orangefs_writepages_work()
110 WARN_ON(ow->off >= len); in orangefs_writepages_work()
111 if (ow->off + ow->len > len) in orangefs_writepages_work()
112 ow->len = len - ow->off; in orangefs_writepages_work()
114 off = ow->off; in orangefs_writepages_work()
115 wr.uid = ow->uid; in orangefs_writepages_work()
116 wr.gid = ow->gid; in orangefs_writepages_work()
117 ret = wait_for_direct_io(ORANGEFS_IO_WRITE, inode, &off, &iter, ow->len, in orangefs_writepages_work()
118 0, &wr, NULL, NULL); in orangefs_writepages_work()
120 for (i = 0; i < ow->npages; i++) { in orangefs_writepages_work()
121 mapping_set_error(ow->pages[i]->mapping, ret); in orangefs_writepages_work()
122 if (PagePrivate(ow->pages[i])) { in orangefs_writepages_work()
124 page_private(ow->pages[i]); in orangefs_writepages_work()
125 ClearPagePrivate(ow->pages[i]); in orangefs_writepages_work()
126 put_page(ow->pages[i]); in orangefs_writepages_work()
129 end_page_writeback(ow->pages[i]); in orangefs_writepages_work()
130 unlock_page(ow->pages[i]); in orangefs_writepages_work()
134 for (i = 0; i < ow->npages; i++) { in orangefs_writepages_work()
135 if (PagePrivate(ow->pages[i])) { in orangefs_writepages_work()
137 page_private(ow->pages[i]); in orangefs_writepages_work()
138 ClearPagePrivate(ow->pages[i]); in orangefs_writepages_work()
139 put_page(ow->pages[i]); in orangefs_writepages_work()
142 end_page_writeback(ow->pages[i]); in orangefs_writepages_work()
143 unlock_page(ow->pages[i]); in orangefs_writepages_work()
153 struct orangefs_write_range *wr = folio->private; in orangefs_writepages_callback() local
156 if (!wr) { in orangefs_writepages_callback()
164 ret = -1; in orangefs_writepages_callback()
165 if (ow->npages == 0) { in orangefs_writepages_callback()
166 ow->off = wr->pos; in orangefs_writepages_callback()
167 ow->len = wr->len; in orangefs_writepages_callback()
168 ow->uid = wr->uid; in orangefs_writepages_callback()
169 ow->gid = wr->gid; in orangefs_writepages_callback()
170 ow->pages[ow->npages++] = &folio->page; in orangefs_writepages_callback()
174 if (!uid_eq(ow->uid, wr->uid) || !gid_eq(ow->gid, wr->gid)) { in orangefs_writepages_callback()
176 ow->npages = 0; in orangefs_writepages_callback()
177 ret = -1; in orangefs_writepages_callback()
180 if (ow->off + ow->len == wr->pos) { in orangefs_writepages_callback()
181 ow->len += wr->len; in orangefs_writepages_callback()
182 ow->pages[ow->npages++] = &folio->page; in orangefs_writepages_callback()
187 if (ret == -1) { in orangefs_writepages_callback()
188 if (ow->npages) { in orangefs_writepages_callback()
190 ow->npages = 0; in orangefs_writepages_callback()
192 ret = orangefs_writepage_locked(&folio->page, wbc); in orangefs_writepages_callback()
193 mapping_set_error(folio->mapping, ret); in orangefs_writepages_callback()
197 if (ow->npages == ow->maxpages) { in orangefs_writepages_callback()
199 ow->npages = 0; in orangefs_writepages_callback()
213 return -ENOMEM; in orangefs_writepages()
214 ow->maxpages = orangefs_bufmap_size_query()/PAGE_SIZE; in orangefs_writepages()
215 ow->pages = kcalloc(ow->maxpages, sizeof(struct page *), GFP_KERNEL); in orangefs_writepages()
216 if (!ow->pages) { in orangefs_writepages()
218 return -ENOMEM; in orangefs_writepages()
220 ow->bv = kcalloc(ow->maxpages, sizeof(struct bio_vec), GFP_KERNEL); in orangefs_writepages()
221 if (!ow->bv) { in orangefs_writepages()
222 kfree(ow->pages); in orangefs_writepages()
224 return -ENOMEM; in orangefs_writepages()
228 if (ow->npages) in orangefs_writepages()
231 kfree(ow->pages); in orangefs_writepages()
232 kfree(ow->bv); in orangefs_writepages()
243 struct inode *inode = rac->mapping->host; in orangefs_readahead()
250 loff_t bytes_remaining = inode->i_size - readahead_pos(rac); in orangefs_readahead()
262 i_pages = &rac->mapping->i_pages; in orangefs_readahead()
269 inode->i_size, NULL, NULL, rac->file)) < 0) in orangefs_readahead()
285 struct inode *inode = folio->mapping->host; in orangefs_read_folio()
299 folio_size(folio), inode->i_size, NULL, NULL, file); in orangefs_read_folio()
314 struct orangefs_write_range *wr; in orangefs_write_begin() local
336 struct orangefs_write_range *wr; in orangefs_write_begin() local
337 wr = folio_get_private(folio); in orangefs_write_begin()
338 if (wr->pos + wr->len == pos && in orangefs_write_begin()
339 uid_eq(wr->uid, current_fsuid()) && in orangefs_write_begin()
340 gid_eq(wr->gid, current_fsgid())) { in orangefs_write_begin()
341 wr->len += len; in orangefs_write_begin()
350 wr = kmalloc(sizeof *wr, GFP_KERNEL); in orangefs_write_begin()
351 if (!wr) in orangefs_write_begin()
352 return -ENOMEM; in orangefs_write_begin()
354 wr->pos = pos; in orangefs_write_begin()
355 wr->len = len; in orangefs_write_begin()
356 wr->uid = current_fsuid(); in orangefs_write_begin()
357 wr->gid = current_fsgid(); in orangefs_write_begin()
358 folio_attach_private(folio, wr); in orangefs_write_begin()
367 struct inode *inode = folio->mapping->host; in orangefs_write_end()
372 * cannot change under us because we hold the i_mutex. in orangefs_write_end()
374 if (last_pos > inode->i_size) in orangefs_write_end()
379 unsigned from = pos & (PAGE_SIZE - 1); in orangefs_write_end()
381 folio_zero_range(folio, from + copied, len - copied); in orangefs_write_end()
385 (len == PAGE_SIZE || pos + len == inode->i_size)) { in orangefs_write_end()
402 struct orangefs_write_range *wr = folio_get_private(folio); in orangefs_invalidate_folio() local
408 } else if (folio_pos(folio) + offset <= wr->pos && in orangefs_invalidate_folio()
409 wr->pos + wr->len <= folio_pos(folio) + offset + length) { in orangefs_invalidate_folio()
415 } else if (wr->pos < folio_pos(folio) + offset && in orangefs_invalidate_folio()
416 wr->pos + wr->len <= folio_pos(folio) + offset + length && in orangefs_invalidate_folio()
417 folio_pos(folio) + offset < wr->pos + wr->len) { in orangefs_invalidate_folio()
419 x = wr->pos + wr->len - (folio_pos(folio) + offset); in orangefs_invalidate_folio()
420 WARN_ON(x > wr->len); in orangefs_invalidate_folio()
421 wr->len -= x; in orangefs_invalidate_folio()
422 wr->uid = current_fsuid(); in orangefs_invalidate_folio()
423 wr->gid = current_fsgid(); in orangefs_invalidate_folio()
425 } else if (folio_pos(folio) + offset <= wr->pos && in orangefs_invalidate_folio()
426 folio_pos(folio) + offset + length < wr->pos + wr->len && in orangefs_invalidate_folio()
427 wr->pos < folio_pos(folio) + offset + length) { in orangefs_invalidate_folio()
429 x = folio_pos(folio) + offset + length - wr->pos; in orangefs_invalidate_folio()
430 WARN_ON(x > wr->len); in orangefs_invalidate_folio()
431 wr->pos += x; in orangefs_invalidate_folio()
432 wr->len -= x; in orangefs_invalidate_folio()
433 wr->uid = current_fsuid(); in orangefs_invalidate_folio()
434 wr->gid = current_fsgid(); in orangefs_invalidate_folio()
436 } else if (wr->pos < folio_pos(folio) + offset && in orangefs_invalidate_folio()
437 folio_pos(folio) + offset + length < wr->pos + wr->len) { in orangefs_invalidate_folio()
446 /* non-overlapping ranges */ in orangefs_invalidate_folio()
449 if (!((folio_pos(folio) + offset + length <= wr->pos) ^ in orangefs_invalidate_folio()
450 (wr->pos + wr->len <= folio_pos(folio) + offset))) { in orangefs_invalidate_folio()
455 wr->pos, wr->len); in orangefs_invalidate_folio()
461 * Above there are returns where wr is freed or where we WARN. in orangefs_invalidate_folio()
462 * Thus the following runs if wr was modified above. in orangefs_invalidate_folio()
487 r = orangefs_writepage_locked(&folio->page, &wbc); in orangefs_launder_folio()
504 struct file *file = iocb->ki_filp; in orangefs_direct_IO()
505 loff_t pos = iocb->ki_pos; in orangefs_direct_IO()
509 struct inode *inode = file->f_mapping->host; in orangefs_direct_IO()
511 struct orangefs_khandle *handle = &orangefs_inode->refn.khandle; in orangefs_direct_IO()
514 ssize_t ret = -EINVAL; in orangefs_direct_IO()
517 "%s-BEGIN(%pU): count(%d) after estimate_max_iovecs.\n", in orangefs_direct_IO()
625 struct folio *folio = page_folio(vmf->page); in orangefs_page_mkwrite()
626 struct inode *inode = file_inode(vmf->vma->vm_file); in orangefs_page_mkwrite()
628 unsigned long *bitlock = &orangefs_inode->bitlock; in orangefs_page_mkwrite()
630 struct orangefs_write_range *wr; in orangefs_page_mkwrite() local
632 sb_start_pagefault(inode->i_sb); in orangefs_page_mkwrite()
652 wr = folio_get_private(folio); in orangefs_page_mkwrite()
653 if (uid_eq(wr->uid, current_fsuid()) && in orangefs_page_mkwrite()
654 gid_eq(wr->gid, current_fsgid())) { in orangefs_page_mkwrite()
655 wr->pos = page_offset(vmf->page); in orangefs_page_mkwrite()
656 wr->len = PAGE_SIZE; in orangefs_page_mkwrite()
665 wr = kmalloc(sizeof *wr, GFP_KERNEL); in orangefs_page_mkwrite()
666 if (!wr) { in orangefs_page_mkwrite()
670 wr->pos = page_offset(vmf->page); in orangefs_page_mkwrite()
671 wr->len = PAGE_SIZE; in orangefs_page_mkwrite()
672 wr->uid = current_fsuid(); in orangefs_page_mkwrite()
673 wr->gid = current_fsgid(); in orangefs_page_mkwrite()
674 folio_attach_private(folio, wr); in orangefs_page_mkwrite()
677 file_update_time(vmf->vma->vm_file); in orangefs_page_mkwrite()
678 if (folio->mapping != inode->i_mapping) { in orangefs_page_mkwrite()
693 sb_end_pagefault(inode->i_sb); in orangefs_page_mkwrite()
702 int ret = -EINVAL; in orangefs_setattr_size()
708 &orangefs_inode->refn.khandle, in orangefs_setattr_size()
709 orangefs_inode->refn.fs_id, in orangefs_setattr_size()
710 iattr->ia_size); in orangefs_setattr_size()
714 if (ret == -ESTALE) in orangefs_setattr_size()
715 ret = -EIO; in orangefs_setattr_size()
724 truncate_pagecache(inode, iattr->ia_size); in orangefs_setattr_size()
725 i_size_write(inode, iattr->ia_size); in orangefs_setattr_size()
726 if (iattr->ia_size > orig_size) in orangefs_setattr_size()
727 pagecache_isize_extended(inode, orig_size, iattr->ia_size); in orangefs_setattr_size()
731 return -ENOMEM; in orangefs_setattr_size()
733 new_op->upcall.req.truncate.refn = orangefs_inode->refn; in orangefs_setattr_size()
734 new_op->upcall.req.truncate.size = (__s64) iattr->ia_size; in orangefs_setattr_size()
752 iattr->ia_valid |= ATTR_CTIME | ATTR_MTIME; in orangefs_setattr_size()
761 if (iattr->ia_valid & ATTR_MODE) { in __orangefs_setattr()
762 if (iattr->ia_mode & (S_ISVTX)) { in __orangefs_setattr()
769 iattr->ia_mode -= S_ISVTX; in __orangefs_setattr()
772 "User attempted to set sticky bit on non-root directory; returning EINVAL.\n"); in __orangefs_setattr()
773 ret = -EINVAL; in __orangefs_setattr()
777 if (iattr->ia_mode & (S_ISUID)) { in __orangefs_setattr()
780 ret = -EINVAL; in __orangefs_setattr()
785 if (iattr->ia_valid & ATTR_SIZE) { in __orangefs_setattr()
792 spin_lock(&inode->i_lock); in __orangefs_setattr()
793 if (ORANGEFS_I(inode)->attr_valid) { in __orangefs_setattr()
794 if (uid_eq(ORANGEFS_I(inode)->attr_uid, current_fsuid()) && in __orangefs_setattr()
795 gid_eq(ORANGEFS_I(inode)->attr_gid, current_fsgid())) { in __orangefs_setattr()
796 ORANGEFS_I(inode)->attr_valid = iattr->ia_valid; in __orangefs_setattr()
798 spin_unlock(&inode->i_lock); in __orangefs_setattr()
803 ORANGEFS_I(inode)->attr_valid = iattr->ia_valid; in __orangefs_setattr()
804 ORANGEFS_I(inode)->attr_uid = current_fsuid(); in __orangefs_setattr()
805 ORANGEFS_I(inode)->attr_gid = current_fsgid(); in __orangefs_setattr()
808 spin_unlock(&inode->i_lock); in __orangefs_setattr()
823 if (!ret && (iattr->ia_valid & ATTR_MODE)) in __orangefs_setattr_mode()
824 ret = posix_acl_chmod(&nop_mnt_idmap, dentry, inode->i_mode); in __orangefs_setattr_mode()
855 struct inode *inode = path->dentry->d_inode; in orangefs_getattr()
859 path->dentry, request_mask); in orangefs_getattr()
868 stat->result_mask &= ~STATX_SIZE; in orangefs_getattr()
881 return -ECHILD; in orangefs_permission()
921 if (ret < 0 && ret != -ENODATA) in orangefs_fileattr_get()
945 (fa->flags & ~(FS_IMMUTABLE_FL | FS_APPEND_FL | FS_NOATIME_FL | ORANGEFS_MIRROR_FL))) { in orangefs_fileattr_set()
948 return -EOPNOTSUPP; in orangefs_fileattr_set()
950 val = fa->flags; in orangefs_fileattr_set()
972 inode->i_mapping->a_ops = &orangefs_address_operations; in orangefs_init_iops()
974 switch (inode->i_mode & S_IFMT) { in orangefs_init_iops()
976 inode->i_op = &orangefs_file_inode_operations; in orangefs_init_iops()
977 inode->i_fop = &orangefs_file_operations; in orangefs_init_iops()
980 inode->i_op = &orangefs_symlink_inode_operations; in orangefs_init_iops()
983 inode->i_op = &orangefs_dir_inode_operations; in orangefs_init_iops()
984 inode->i_fop = &orangefs_dir_operations; in orangefs_init_iops()
990 return -EINVAL; in orangefs_init_iops()
998 * a ino_t type that will be used as a hash-index from where the handle will
1005 return orangefs_khandle_to_ino(&(ref->khandle)); in orangefs_handle_hash()
1014 ORANGEFS_I(inode)->refn.fs_id = ref->fs_id; in orangefs_set_inode()
1015 ORANGEFS_I(inode)->refn.khandle = ref->khandle; in orangefs_set_inode()
1016 ORANGEFS_I(inode)->attr_valid = 0; in orangefs_set_inode()
1017 hash_init(ORANGEFS_I(inode)->xattr_cache); in orangefs_set_inode()
1018 ORANGEFS_I(inode)->mapping_time = jiffies - 1; in orangefs_set_inode()
1019 ORANGEFS_I(inode)->bitlock = 0; in orangefs_set_inode()
1033 return (!ORANGEFS_khandle_cmp(&(orangefs_inode->refn.khandle), in orangefs_test_inode()
1034 &(ref->khandle)) && in orangefs_test_inode()
1035 orangefs_inode->refn.fs_id == ref->fs_id); in orangefs_test_inode()
1039 * Front-end to lookup the inode-cache maintained by the VFS using the ORANGEFS
1060 return ERR_PTR(-ENOMEM); in orangefs_iget()
1062 if (!(inode->i_state & I_NEW)) in orangefs_iget()
1071 inode->i_ino = hash; /* needed for stat etc */ in orangefs_iget()
1077 &ref->khandle, in orangefs_iget()
1078 ref->fs_id, in orangefs_iget()
1080 inode->i_ino); in orangefs_iget()
1106 return ERR_PTR(-ENOMEM); in orangefs_new_inode()
1113 inode->i_ino = hash; /* needed for stat etc */ in orangefs_new_inode()
1120 inode->i_rdev = dev; in orangefs_new_inode()
1142 if (mode != inode->i_mode) { in orangefs_new_inode()
1147 inode->i_mode = mode; in orangefs_new_inode()
1149 __posix_acl_chmod(&acl, GFP_KERNEL, inode->i_mode); in orangefs_new_inode()