^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * (C) 2001 Clemson University and The University of Chicago
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * See COPYING in top-level directory.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * Linux VFS namei operations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include "protocol.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include "orangefs-kernel.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * Get a newly allocated inode to go with a negative dentry.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) static int orangefs_create(struct inode *dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) struct dentry *dentry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) umode_t mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) bool exclusive)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) struct orangefs_inode_s *parent = ORANGEFS_I(dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) struct orangefs_kernel_op_s *new_op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) struct orangefs_object_kref ref;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) struct inode *inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) struct iattr iattr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) gossip_debug(GOSSIP_NAME_DEBUG, "%s: %pd\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) new_op = op_alloc(ORANGEFS_VFS_OP_CREATE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) if (!new_op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) new_op->upcall.req.create.parent_refn = parent->refn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) fill_default_sys_attrs(new_op->upcall.req.create.attributes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) ORANGEFS_TYPE_METAFILE, mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) strncpy(new_op->upcall.req.create.d_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) dentry->d_name.name, ORANGEFS_NAME_MAX - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) ret = service_operation(new_op, __func__, get_interruptible_flag(dir));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) gossip_debug(GOSSIP_NAME_DEBUG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) "%s: %pd: handle:%pU: fsid:%d: new_op:%p: ret:%d:\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) dentry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) &new_op->downcall.resp.create.refn.khandle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) new_op->downcall.resp.create.refn.fs_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) new_op,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) ref = new_op->downcall.resp.create.refn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) inode = orangefs_new_inode(dir->i_sb, dir, S_IFREG | mode, 0, &ref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) if (IS_ERR(inode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) gossip_err("%s: Failed to allocate inode for file :%pd:\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) ret = PTR_ERR(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) gossip_debug(GOSSIP_NAME_DEBUG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) "%s: Assigned inode :%pU: for file :%pd:\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) get_khandle_from_ino(inode),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) d_instantiate_new(dentry, inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) orangefs_set_timeout(dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) gossip_debug(GOSSIP_NAME_DEBUG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) "%s: dentry instantiated for %pd\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) memset(&iattr, 0, sizeof iattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) iattr.ia_valid |= ATTR_MTIME | ATTR_CTIME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) iattr.ia_mtime = iattr.ia_ctime = current_time(dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) __orangefs_setattr(dir, &iattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) op_release(new_op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) gossip_debug(GOSSIP_NAME_DEBUG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) "%s: %pd: returning %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) dentry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) * Attempt to resolve an object name (dentry->d_name), parent handle, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) * fsid into a handle for the object.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) static struct dentry *orangefs_lookup(struct inode *dir, struct dentry *dentry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) unsigned int flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) struct orangefs_inode_s *parent = ORANGEFS_I(dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) struct orangefs_kernel_op_s *new_op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) struct inode *inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) int ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) * in theory we could skip a lookup here (if the intent is to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) * create) in order to avoid a potentially failed lookup, but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) * leaving it in can skip a valid lookup and try to create a file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) * that already exists (e.g. the vfs already handles checking for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) * -EEXIST on O_EXCL opens, which is broken if we skip this lookup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) * in the create path)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) gossip_debug(GOSSIP_NAME_DEBUG, "%s called on %pd\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) __func__, dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) if (dentry->d_name.len > (ORANGEFS_NAME_MAX - 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) return ERR_PTR(-ENAMETOOLONG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) new_op = op_alloc(ORANGEFS_VFS_OP_LOOKUP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) if (!new_op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) new_op->upcall.req.lookup.sym_follow = ORANGEFS_LOOKUP_LINK_NO_FOLLOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) gossip_debug(GOSSIP_NAME_DEBUG, "%s:%s:%d using parent %pU\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) __FILE__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) __LINE__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) &parent->refn.khandle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) new_op->upcall.req.lookup.parent_refn = parent->refn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) strncpy(new_op->upcall.req.lookup.d_name, dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) ORANGEFS_NAME_MAX - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) gossip_debug(GOSSIP_NAME_DEBUG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) "%s: doing lookup on %s under %pU,%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) new_op->upcall.req.lookup.d_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) &new_op->upcall.req.lookup.parent_refn.khandle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) new_op->upcall.req.lookup.parent_refn.fs_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) ret = service_operation(new_op, __func__, get_interruptible_flag(dir));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) gossip_debug(GOSSIP_NAME_DEBUG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) "Lookup Got %pU, fsid %d (ret=%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) &new_op->downcall.resp.lookup.refn.khandle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) new_op->downcall.resp.lookup.refn.fs_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) if (ret == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) orangefs_set_timeout(dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) inode = orangefs_iget(dir->i_sb, &new_op->downcall.resp.lookup.refn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) } else if (ret == -ENOENT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) inode = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) /* must be a non-recoverable error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) inode = ERR_PTR(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) op_release(new_op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) return d_splice_alias(inode, dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) /* return 0 on success; non-zero otherwise */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) static int orangefs_unlink(struct inode *dir, struct dentry *dentry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) struct inode *inode = dentry->d_inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) struct orangefs_inode_s *parent = ORANGEFS_I(dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) struct orangefs_kernel_op_s *new_op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) struct iattr iattr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) gossip_debug(GOSSIP_NAME_DEBUG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) "%s: called on %pd\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) " (inode %pU): Parent is %pU | fs_id %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) dentry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) get_khandle_from_ino(inode),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) &parent->refn.khandle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) parent->refn.fs_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) new_op = op_alloc(ORANGEFS_VFS_OP_REMOVE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) if (!new_op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) new_op->upcall.req.remove.parent_refn = parent->refn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) strncpy(new_op->upcall.req.remove.d_name, dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) ORANGEFS_NAME_MAX - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) ret = service_operation(new_op, "orangefs_unlink",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) get_interruptible_flag(inode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) gossip_debug(GOSSIP_NAME_DEBUG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) "%s: service_operation returned:%d:\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) op_release(new_op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) if (!ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) drop_nlink(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) memset(&iattr, 0, sizeof iattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) iattr.ia_valid |= ATTR_MTIME | ATTR_CTIME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) iattr.ia_mtime = iattr.ia_ctime = current_time(dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) __orangefs_setattr(dir, &iattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) static int orangefs_symlink(struct inode *dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) struct dentry *dentry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) const char *symname)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) struct orangefs_inode_s *parent = ORANGEFS_I(dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) struct orangefs_kernel_op_s *new_op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) struct orangefs_object_kref ref;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) struct inode *inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) struct iattr iattr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) int mode = 0755;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) gossip_debug(GOSSIP_NAME_DEBUG, "%s: called\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) if (!symname)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) if (strlen(symname)+1 > ORANGEFS_NAME_MAX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) return -ENAMETOOLONG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) new_op = op_alloc(ORANGEFS_VFS_OP_SYMLINK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) if (!new_op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) new_op->upcall.req.sym.parent_refn = parent->refn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) fill_default_sys_attrs(new_op->upcall.req.sym.attributes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) ORANGEFS_TYPE_SYMLINK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) strncpy(new_op->upcall.req.sym.entry_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) ORANGEFS_NAME_MAX - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) strncpy(new_op->upcall.req.sym.target, symname, ORANGEFS_NAME_MAX - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) ret = service_operation(new_op, __func__, get_interruptible_flag(dir));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) gossip_debug(GOSSIP_NAME_DEBUG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) "Symlink Got ORANGEFS handle %pU on fsid %d (ret=%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) &new_op->downcall.resp.sym.refn.khandle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) new_op->downcall.resp.sym.refn.fs_id, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) gossip_debug(GOSSIP_NAME_DEBUG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) "%s: failed with error code %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) __func__, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) ref = new_op->downcall.resp.sym.refn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) inode = orangefs_new_inode(dir->i_sb, dir, S_IFLNK | mode, 0, &ref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) if (IS_ERR(inode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) gossip_err
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) ("*** Failed to allocate orangefs symlink inode\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) ret = PTR_ERR(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) * This is necessary because orangefs_inode_getattr will not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) * re-read symlink size as it is impossible for it to change.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) * Invalidating the cache does not help. orangefs_new_inode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) * does not set the correct size (it does not know symname).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) inode->i_size = strlen(symname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) gossip_debug(GOSSIP_NAME_DEBUG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) "Assigned symlink inode new number of %pU\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) get_khandle_from_ino(inode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) d_instantiate_new(dentry, inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) orangefs_set_timeout(dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) gossip_debug(GOSSIP_NAME_DEBUG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) "Inode (Symlink) %pU -> %pd\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) get_khandle_from_ino(inode),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) memset(&iattr, 0, sizeof iattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) iattr.ia_valid |= ATTR_MTIME | ATTR_CTIME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) iattr.ia_mtime = iattr.ia_ctime = current_time(dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) __orangefs_setattr(dir, &iattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) op_release(new_op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) static int orangefs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) struct orangefs_inode_s *parent = ORANGEFS_I(dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) struct orangefs_kernel_op_s *new_op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) struct orangefs_object_kref ref;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) struct inode *inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) struct iattr iattr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) new_op = op_alloc(ORANGEFS_VFS_OP_MKDIR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) if (!new_op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) new_op->upcall.req.mkdir.parent_refn = parent->refn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) fill_default_sys_attrs(new_op->upcall.req.mkdir.attributes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) ORANGEFS_TYPE_DIRECTORY, mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) strncpy(new_op->upcall.req.mkdir.d_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) dentry->d_name.name, ORANGEFS_NAME_MAX - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) ret = service_operation(new_op, __func__, get_interruptible_flag(dir));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) gossip_debug(GOSSIP_NAME_DEBUG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) "Mkdir Got ORANGEFS handle %pU on fsid %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) &new_op->downcall.resp.mkdir.refn.khandle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) new_op->downcall.resp.mkdir.refn.fs_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) gossip_debug(GOSSIP_NAME_DEBUG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) "%s: failed with error code %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) __func__, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) ref = new_op->downcall.resp.mkdir.refn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) inode = orangefs_new_inode(dir->i_sb, dir, S_IFDIR | mode, 0, &ref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) if (IS_ERR(inode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) gossip_err("*** Failed to allocate orangefs dir inode\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) ret = PTR_ERR(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) gossip_debug(GOSSIP_NAME_DEBUG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) "Assigned dir inode new number of %pU\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) get_khandle_from_ino(inode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) d_instantiate_new(dentry, inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) orangefs_set_timeout(dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) gossip_debug(GOSSIP_NAME_DEBUG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) "Inode (Directory) %pU -> %pd\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) get_khandle_from_ino(inode),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) * NOTE: we have no good way to keep nlink consistent for directories
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) * across clients; keep constant at 1.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) memset(&iattr, 0, sizeof iattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) iattr.ia_valid |= ATTR_MTIME | ATTR_CTIME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) iattr.ia_mtime = iattr.ia_ctime = current_time(dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) __orangefs_setattr(dir, &iattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) op_release(new_op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) static int orangefs_rename(struct inode *old_dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) struct dentry *old_dentry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) struct inode *new_dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) struct dentry *new_dentry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) unsigned int flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) struct orangefs_kernel_op_s *new_op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) struct iattr iattr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) if (flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) gossip_debug(GOSSIP_NAME_DEBUG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) "orangefs_rename: called (%pd2 => %pd2) ct=%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) old_dentry, new_dentry, d_count(new_dentry));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) memset(&iattr, 0, sizeof iattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) iattr.ia_valid |= ATTR_MTIME | ATTR_CTIME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) iattr.ia_mtime = iattr.ia_ctime = current_time(new_dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) __orangefs_setattr(new_dir, &iattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) new_op = op_alloc(ORANGEFS_VFS_OP_RENAME);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) if (!new_op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) new_op->upcall.req.rename.old_parent_refn = ORANGEFS_I(old_dir)->refn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) new_op->upcall.req.rename.new_parent_refn = ORANGEFS_I(new_dir)->refn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) strncpy(new_op->upcall.req.rename.d_old_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) old_dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) ORANGEFS_NAME_MAX - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) strncpy(new_op->upcall.req.rename.d_new_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) new_dentry->d_name.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) ORANGEFS_NAME_MAX - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) ret = service_operation(new_op,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) "orangefs_rename",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) get_interruptible_flag(old_dentry->d_inode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) gossip_debug(GOSSIP_NAME_DEBUG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) "orangefs_rename: got downcall status %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) if (new_dentry->d_inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) new_dentry->d_inode->i_ctime = current_time(new_dentry->d_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) op_release(new_op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) /* ORANGEFS implementation of VFS inode operations for directories */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) const struct inode_operations orangefs_dir_inode_operations = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) .lookup = orangefs_lookup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) .get_acl = orangefs_get_acl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) .set_acl = orangefs_set_acl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) .create = orangefs_create,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) .unlink = orangefs_unlink,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) .symlink = orangefs_symlink,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) .mkdir = orangefs_mkdir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) .rmdir = orangefs_unlink,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) .rename = orangefs_rename,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) .setattr = orangefs_setattr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) .getattr = orangefs_getattr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) .listxattr = orangefs_listxattr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) .permission = orangefs_permission,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) .update_time = orangefs_update_time,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) };