blob: 5fe458628e00b4ccc9090cd56ca64de87494d88f [file] [log] [blame]
Mike Marshall274dcf52015-07-17 10:38:13 -04001/*
2 * (C) 2001 Clemson University and The University of Chicago
3 *
4 * See COPYING in top-level directory.
5 */
6
7/*
8 * Linux VFS namei operations.
9 */
10
11#include "protocol.h"
Mike Marshall575e9462015-12-04 12:56:14 -050012#include "orangefs-kernel.h"
Mike Marshall274dcf52015-07-17 10:38:13 -040013
14/*
15 * Get a newly allocated inode to go with a negative dentry.
16 */
Yi Liu8bb8aef2015-11-24 15:12:14 -050017static int orangefs_create(struct inode *dir,
Mike Marshall274dcf52015-07-17 10:38:13 -040018 struct dentry *dentry,
19 umode_t mode,
20 bool exclusive)
21{
Yi Liu8bb8aef2015-11-24 15:12:14 -050022 struct orangefs_inode_s *parent = ORANGEFS_I(dir);
23 struct orangefs_kernel_op_s *new_op;
Mike Marshall274dcf52015-07-17 10:38:13 -040024 struct inode *inode;
25 int ret;
26
Al Virof66debf2016-08-07 12:20:01 -040027 gossip_debug(GOSSIP_NAME_DEBUG, "%s: %pd\n",
Mike Marshall52534872016-02-16 17:09:09 -050028 __func__,
Al Virof66debf2016-08-07 12:20:01 -040029 dentry);
Mike Marshall274dcf52015-07-17 10:38:13 -040030
Yi Liu8bb8aef2015-11-24 15:12:14 -050031 new_op = op_alloc(ORANGEFS_VFS_OP_CREATE);
Mike Marshall274dcf52015-07-17 10:38:13 -040032 if (!new_op)
33 return -ENOMEM;
34
35 new_op->upcall.req.create.parent_refn = parent->refn;
36
37 fill_default_sys_attrs(new_op->upcall.req.create.attributes,
Yi Liu8bb8aef2015-11-24 15:12:14 -050038 ORANGEFS_TYPE_METAFILE, mode);
Mike Marshall274dcf52015-07-17 10:38:13 -040039
40 strncpy(new_op->upcall.req.create.d_name,
Martin Brandenburg47b49482016-02-20 14:22:40 -050041 dentry->d_name.name, ORANGEFS_NAME_MAX);
Mike Marshall274dcf52015-07-17 10:38:13 -040042
43 ret = service_operation(new_op, __func__, get_interruptible_flag(dir));
44
45 gossip_debug(GOSSIP_NAME_DEBUG,
Al Virof66debf2016-08-07 12:20:01 -040046 "%s: %pd: handle:%pU: fsid:%d: new_op:%p: ret:%d:\n",
Mike Marshall52534872016-02-16 17:09:09 -050047 __func__,
Al Virof66debf2016-08-07 12:20:01 -040048 dentry,
Mike Marshall274dcf52015-07-17 10:38:13 -040049 &new_op->downcall.resp.create.refn.khandle,
Mike Marshall52534872016-02-16 17:09:09 -050050 new_op->downcall.resp.create.refn.fs_id,
51 new_op,
52 ret);
Mike Marshall274dcf52015-07-17 10:38:13 -040053
Mike Marshall52534872016-02-16 17:09:09 -050054 if (ret < 0)
Mike Marshall274dcf52015-07-17 10:38:13 -040055 goto out;
Mike Marshall274dcf52015-07-17 10:38:13 -040056
Yi Liu8bb8aef2015-11-24 15:12:14 -050057 inode = orangefs_new_inode(dir->i_sb, dir, S_IFREG | mode, 0,
Mike Marshall274dcf52015-07-17 10:38:13 -040058 &new_op->downcall.resp.create.refn);
59 if (IS_ERR(inode)) {
Al Virof66debf2016-08-07 12:20:01 -040060 gossip_err("%s: Failed to allocate inode for file :%pd:\n",
Mike Marshall52534872016-02-16 17:09:09 -050061 __func__,
Al Virof66debf2016-08-07 12:20:01 -040062 dentry);
Mike Marshall274dcf52015-07-17 10:38:13 -040063 ret = PTR_ERR(inode);
64 goto out;
65 }
66
67 gossip_debug(GOSSIP_NAME_DEBUG,
Al Virof66debf2016-08-07 12:20:01 -040068 "%s: Assigned inode :%pU: for file :%pd:\n",
Mike Marshall52534872016-02-16 17:09:09 -050069 __func__,
70 get_khandle_from_ino(inode),
Al Virof66debf2016-08-07 12:20:01 -040071 dentry);
Mike Marshall274dcf52015-07-17 10:38:13 -040072
Al Viro2d2d3f12018-05-04 08:23:01 -040073 d_instantiate_new(dentry, inode);
Miklos Szeredi804b1732016-10-17 10:14:23 +020074 orangefs_set_timeout(dentry);
Martin Brandenburg8bbb20a2016-07-28 14:46:36 -040075 ORANGEFS_I(inode)->getattr_time = jiffies - 1;
Mike Marshall274dcf52015-07-17 10:38:13 -040076
77 gossip_debug(GOSSIP_NAME_DEBUG,
Al Virof66debf2016-08-07 12:20:01 -040078 "%s: dentry instantiated for %pd\n",
Mike Marshall52534872016-02-16 17:09:09 -050079 __func__,
Al Virof66debf2016-08-07 12:20:01 -040080 dentry);
Mike Marshall274dcf52015-07-17 10:38:13 -040081
82 SetMtimeFlag(parent);
Deepa Dinamanic2050a42016-09-14 07:48:06 -070083 dir->i_mtime = dir->i_ctime = current_time(dir);
Mike Marshall274dcf52015-07-17 10:38:13 -040084 mark_inode_dirty_sync(dir);
85 ret = 0;
86out:
87 op_release(new_op);
Mike Marshall52534872016-02-16 17:09:09 -050088 gossip_debug(GOSSIP_NAME_DEBUG,
Al Virof66debf2016-08-07 12:20:01 -040089 "%s: %pd: returning %d\n",
Mike Marshall52534872016-02-16 17:09:09 -050090 __func__,
Al Virof66debf2016-08-07 12:20:01 -040091 dentry,
Mike Marshall52534872016-02-16 17:09:09 -050092 ret);
Mike Marshall274dcf52015-07-17 10:38:13 -040093 return ret;
94}
95
96/*
97 * Attempt to resolve an object name (dentry->d_name), parent handle, and
98 * fsid into a handle for the object.
99 */
Yi Liu8bb8aef2015-11-24 15:12:14 -0500100static struct dentry *orangefs_lookup(struct inode *dir, struct dentry *dentry,
Mike Marshall274dcf52015-07-17 10:38:13 -0400101 unsigned int flags)
102{
Yi Liu8bb8aef2015-11-24 15:12:14 -0500103 struct orangefs_inode_s *parent = ORANGEFS_I(dir);
104 struct orangefs_kernel_op_s *new_op;
Mike Marshall274dcf52015-07-17 10:38:13 -0400105 struct inode *inode;
106 struct dentry *res;
107 int ret = -EINVAL;
108
109 /*
110 * in theory we could skip a lookup here (if the intent is to
111 * create) in order to avoid a potentially failed lookup, but
112 * leaving it in can skip a valid lookup and try to create a file
113 * that already exists (e.g. the vfs already handles checking for
114 * -EEXIST on O_EXCL opens, which is broken if we skip this lookup
115 * in the create path)
116 */
Al Virof66debf2016-08-07 12:20:01 -0400117 gossip_debug(GOSSIP_NAME_DEBUG, "%s called on %pd\n",
118 __func__, dentry);
Mike Marshall274dcf52015-07-17 10:38:13 -0400119
Martin Brandenburg47b49482016-02-20 14:22:40 -0500120 if (dentry->d_name.len > (ORANGEFS_NAME_MAX - 1))
Mike Marshall274dcf52015-07-17 10:38:13 -0400121 return ERR_PTR(-ENAMETOOLONG);
122
Yi Liu8bb8aef2015-11-24 15:12:14 -0500123 new_op = op_alloc(ORANGEFS_VFS_OP_LOOKUP);
Mike Marshall274dcf52015-07-17 10:38:13 -0400124 if (!new_op)
125 return ERR_PTR(-ENOMEM);
126
Mike Marshall7cec28e2015-12-11 10:46:22 -0500127 new_op->upcall.req.lookup.sym_follow = ORANGEFS_LOOKUP_LINK_NO_FOLLOW;
Mike Marshall274dcf52015-07-17 10:38:13 -0400128
129 gossip_debug(GOSSIP_NAME_DEBUG, "%s:%s:%d using parent %pU\n",
130 __FILE__,
131 __func__,
132 __LINE__,
133 &parent->refn.khandle);
134 new_op->upcall.req.lookup.parent_refn = parent->refn;
135
136 strncpy(new_op->upcall.req.lookup.d_name, dentry->d_name.name,
Martin Brandenburg47b49482016-02-20 14:22:40 -0500137 ORANGEFS_NAME_MAX);
Mike Marshall274dcf52015-07-17 10:38:13 -0400138
139 gossip_debug(GOSSIP_NAME_DEBUG,
Martin Brandenburg6ceaf782016-02-20 14:47:13 -0500140 "%s: doing lookup on %s under %pU,%d\n",
Mike Marshall274dcf52015-07-17 10:38:13 -0400141 __func__,
142 new_op->upcall.req.lookup.d_name,
143 &new_op->upcall.req.lookup.parent_refn.khandle,
Martin Brandenburg6ceaf782016-02-20 14:47:13 -0500144 new_op->upcall.req.lookup.parent_refn.fs_id);
Mike Marshall274dcf52015-07-17 10:38:13 -0400145
146 ret = service_operation(new_op, __func__, get_interruptible_flag(dir));
147
148 gossip_debug(GOSSIP_NAME_DEBUG,
149 "Lookup Got %pU, fsid %d (ret=%d)\n",
150 &new_op->downcall.resp.lookup.refn.khandle,
151 new_op->downcall.resp.lookup.refn.fs_id,
152 ret);
153
154 if (ret < 0) {
155 if (ret == -ENOENT) {
156 /*
157 * if no inode was found, add a negative dentry to
158 * dcache anyway; if we don't, we don't hold expected
159 * lookup semantics and we most noticeably break
160 * during directory renames.
161 *
162 * however, if the operation failed or exited, do not
163 * add the dentry (e.g. in the case that a touch is
164 * issued on a file that already exists that was
165 * interrupted during this lookup -- no need to add
166 * another negative dentry for an existing file)
167 */
168
169 gossip_debug(GOSSIP_NAME_DEBUG,
Yi Liu8bb8aef2015-11-24 15:12:14 -0500170 "orangefs_lookup: Adding *negative* dentry "
Al Virof66debf2016-08-07 12:20:01 -0400171 "%p for %pd\n",
Mike Marshall274dcf52015-07-17 10:38:13 -0400172 dentry,
Al Virof66debf2016-08-07 12:20:01 -0400173 dentry);
Mike Marshall274dcf52015-07-17 10:38:13 -0400174
175 d_add(dentry, NULL);
176 res = NULL;
177 goto out;
178 }
179
180 /* must be a non-recoverable error */
181 res = ERR_PTR(ret);
182 goto out;
183 }
184
Miklos Szeredi804b1732016-10-17 10:14:23 +0200185 orangefs_set_timeout(dentry);
Martin Brandenburg31b7c1a2016-02-08 17:01:29 -0500186
Yi Liu8bb8aef2015-11-24 15:12:14 -0500187 inode = orangefs_iget(dir->i_sb, &new_op->downcall.resp.lookup.refn);
Mike Marshall274dcf52015-07-17 10:38:13 -0400188 if (IS_ERR(inode)) {
189 gossip_debug(GOSSIP_NAME_DEBUG,
190 "error %ld from iget\n", PTR_ERR(inode));
191 res = ERR_CAST(inode);
192 goto out;
193 }
194
195 gossip_debug(GOSSIP_NAME_DEBUG,
196 "%s:%s:%d "
197 "Found good inode [%lu] with count [%d]\n",
198 __FILE__,
199 __func__,
200 __LINE__,
201 inode->i_ino,
202 (int)atomic_read(&inode->i_count));
203
204 /* update dentry/inode pair into dcache */
205 res = d_splice_alias(inode, dentry);
206
207 gossip_debug(GOSSIP_NAME_DEBUG,
208 "Lookup success (inode ct = %d)\n",
209 (int)atomic_read(&inode->i_count));
210out:
211 op_release(new_op);
212 return res;
213}
214
215/* return 0 on success; non-zero otherwise */
Yi Liu8bb8aef2015-11-24 15:12:14 -0500216static int orangefs_unlink(struct inode *dir, struct dentry *dentry)
Mike Marshall274dcf52015-07-17 10:38:13 -0400217{
218 struct inode *inode = dentry->d_inode;
Yi Liu8bb8aef2015-11-24 15:12:14 -0500219 struct orangefs_inode_s *parent = ORANGEFS_I(dir);
220 struct orangefs_kernel_op_s *new_op;
Mike Marshall274dcf52015-07-17 10:38:13 -0400221 int ret;
222
223 gossip_debug(GOSSIP_NAME_DEBUG,
Al Virof66debf2016-08-07 12:20:01 -0400224 "%s: called on %pd\n"
Mike Marshall274dcf52015-07-17 10:38:13 -0400225 " (inode %pU): Parent is %pU | fs_id %d\n",
226 __func__,
Al Virof66debf2016-08-07 12:20:01 -0400227 dentry,
Mike Marshall274dcf52015-07-17 10:38:13 -0400228 get_khandle_from_ino(inode),
229 &parent->refn.khandle,
230 parent->refn.fs_id);
231
Yi Liu8bb8aef2015-11-24 15:12:14 -0500232 new_op = op_alloc(ORANGEFS_VFS_OP_REMOVE);
Mike Marshall274dcf52015-07-17 10:38:13 -0400233 if (!new_op)
234 return -ENOMEM;
235
236 new_op->upcall.req.remove.parent_refn = parent->refn;
237 strncpy(new_op->upcall.req.remove.d_name, dentry->d_name.name,
Martin Brandenburg47b49482016-02-20 14:22:40 -0500238 ORANGEFS_NAME_MAX);
Mike Marshall274dcf52015-07-17 10:38:13 -0400239
Yi Liu8bb8aef2015-11-24 15:12:14 -0500240 ret = service_operation(new_op, "orangefs_unlink",
Mike Marshall274dcf52015-07-17 10:38:13 -0400241 get_interruptible_flag(inode));
242
Mike Marshall52534872016-02-16 17:09:09 -0500243 gossip_debug(GOSSIP_NAME_DEBUG,
244 "%s: service_operation returned:%d:\n",
245 __func__,
246 ret);
247
Mike Marshall274dcf52015-07-17 10:38:13 -0400248 op_release(new_op);
249
250 if (!ret) {
251 drop_nlink(inode);
252
253 SetMtimeFlag(parent);
Deepa Dinamanic2050a42016-09-14 07:48:06 -0700254 dir->i_mtime = dir->i_ctime = current_time(dir);
Mike Marshall274dcf52015-07-17 10:38:13 -0400255 mark_inode_dirty_sync(dir);
256 }
257 return ret;
258}
259
Yi Liu8bb8aef2015-11-24 15:12:14 -0500260static int orangefs_symlink(struct inode *dir,
Mike Marshall274dcf52015-07-17 10:38:13 -0400261 struct dentry *dentry,
262 const char *symname)
263{
Yi Liu8bb8aef2015-11-24 15:12:14 -0500264 struct orangefs_inode_s *parent = ORANGEFS_I(dir);
265 struct orangefs_kernel_op_s *new_op;
Mike Marshall274dcf52015-07-17 10:38:13 -0400266 struct inode *inode;
267 int mode = 755;
268 int ret;
269
270 gossip_debug(GOSSIP_NAME_DEBUG, "%s: called\n", __func__);
271
272 if (!symname)
273 return -EINVAL;
274
Martin Brandenburgc62da582016-02-29 16:07:35 -0500275 if (strlen(symname)+1 > ORANGEFS_NAME_MAX)
276 return -ENAMETOOLONG;
277
Yi Liu8bb8aef2015-11-24 15:12:14 -0500278 new_op = op_alloc(ORANGEFS_VFS_OP_SYMLINK);
Mike Marshall274dcf52015-07-17 10:38:13 -0400279 if (!new_op)
280 return -ENOMEM;
281
282 new_op->upcall.req.sym.parent_refn = parent->refn;
283
284 fill_default_sys_attrs(new_op->upcall.req.sym.attributes,
Yi Liu8bb8aef2015-11-24 15:12:14 -0500285 ORANGEFS_TYPE_SYMLINK,
Mike Marshall274dcf52015-07-17 10:38:13 -0400286 mode);
287
288 strncpy(new_op->upcall.req.sym.entry_name,
289 dentry->d_name.name,
Martin Brandenburg47b49482016-02-20 14:22:40 -0500290 ORANGEFS_NAME_MAX);
291 strncpy(new_op->upcall.req.sym.target, symname, ORANGEFS_NAME_MAX);
Mike Marshall274dcf52015-07-17 10:38:13 -0400292
293 ret = service_operation(new_op, __func__, get_interruptible_flag(dir));
294
295 gossip_debug(GOSSIP_NAME_DEBUG,
Yi Liu8bb8aef2015-11-24 15:12:14 -0500296 "Symlink Got ORANGEFS handle %pU on fsid %d (ret=%d)\n",
Mike Marshall274dcf52015-07-17 10:38:13 -0400297 &new_op->downcall.resp.sym.refn.khandle,
298 new_op->downcall.resp.sym.refn.fs_id, ret);
299
300 if (ret < 0) {
301 gossip_debug(GOSSIP_NAME_DEBUG,
302 "%s: failed with error code %d\n",
303 __func__, ret);
304 goto out;
305 }
306
Yi Liu8bb8aef2015-11-24 15:12:14 -0500307 inode = orangefs_new_inode(dir->i_sb, dir, S_IFLNK | mode, 0,
Mike Marshall274dcf52015-07-17 10:38:13 -0400308 &new_op->downcall.resp.sym.refn);
309 if (IS_ERR(inode)) {
310 gossip_err
Yi Liu8bb8aef2015-11-24 15:12:14 -0500311 ("*** Failed to allocate orangefs symlink inode\n");
Mike Marshall274dcf52015-07-17 10:38:13 -0400312 ret = PTR_ERR(inode);
313 goto out;
314 }
Martin Brandenburg88f36d12018-05-31 16:36:58 +0000315 /*
316 * This is necessary because orangefs_inode_getattr will not
317 * re-read symlink size as it is impossible for it to change.
318 * Invalidating the cache does not help. orangefs_new_inode
319 * does not set the correct size (it does not know symname).
320 */
321 inode->i_size = strlen(symname);
Mike Marshall274dcf52015-07-17 10:38:13 -0400322
323 gossip_debug(GOSSIP_NAME_DEBUG,
324 "Assigned symlink inode new number of %pU\n",
325 get_khandle_from_ino(inode));
326
Al Viro2d2d3f12018-05-04 08:23:01 -0400327 d_instantiate_new(dentry, inode);
Miklos Szeredi804b1732016-10-17 10:14:23 +0200328 orangefs_set_timeout(dentry);
Martin Brandenburg8bbb20a2016-07-28 14:46:36 -0400329 ORANGEFS_I(inode)->getattr_time = jiffies - 1;
Mike Marshall274dcf52015-07-17 10:38:13 -0400330
331 gossip_debug(GOSSIP_NAME_DEBUG,
Al Virof66debf2016-08-07 12:20:01 -0400332 "Inode (Symlink) %pU -> %pd\n",
Mike Marshall274dcf52015-07-17 10:38:13 -0400333 get_khandle_from_ino(inode),
Al Virof66debf2016-08-07 12:20:01 -0400334 dentry);
Mike Marshall274dcf52015-07-17 10:38:13 -0400335
336 SetMtimeFlag(parent);
Deepa Dinamanic2050a42016-09-14 07:48:06 -0700337 dir->i_mtime = dir->i_ctime = current_time(dir);
Mike Marshall274dcf52015-07-17 10:38:13 -0400338 mark_inode_dirty_sync(dir);
339 ret = 0;
340out:
341 op_release(new_op);
342 return ret;
343}
344
Yi Liu8bb8aef2015-11-24 15:12:14 -0500345static int orangefs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
Mike Marshall274dcf52015-07-17 10:38:13 -0400346{
Yi Liu8bb8aef2015-11-24 15:12:14 -0500347 struct orangefs_inode_s *parent = ORANGEFS_I(dir);
348 struct orangefs_kernel_op_s *new_op;
Mike Marshall274dcf52015-07-17 10:38:13 -0400349 struct inode *inode;
350 int ret;
351
Yi Liu8bb8aef2015-11-24 15:12:14 -0500352 new_op = op_alloc(ORANGEFS_VFS_OP_MKDIR);
Mike Marshall274dcf52015-07-17 10:38:13 -0400353 if (!new_op)
354 return -ENOMEM;
355
356 new_op->upcall.req.mkdir.parent_refn = parent->refn;
357
358 fill_default_sys_attrs(new_op->upcall.req.mkdir.attributes,
Yi Liu8bb8aef2015-11-24 15:12:14 -0500359 ORANGEFS_TYPE_DIRECTORY, mode);
Mike Marshall274dcf52015-07-17 10:38:13 -0400360
361 strncpy(new_op->upcall.req.mkdir.d_name,
Martin Brandenburg47b49482016-02-20 14:22:40 -0500362 dentry->d_name.name, ORANGEFS_NAME_MAX);
Mike Marshall274dcf52015-07-17 10:38:13 -0400363
364 ret = service_operation(new_op, __func__, get_interruptible_flag(dir));
365
366 gossip_debug(GOSSIP_NAME_DEBUG,
Yi Liu8bb8aef2015-11-24 15:12:14 -0500367 "Mkdir Got ORANGEFS handle %pU on fsid %d\n",
Mike Marshall274dcf52015-07-17 10:38:13 -0400368 &new_op->downcall.resp.mkdir.refn.khandle,
369 new_op->downcall.resp.mkdir.refn.fs_id);
370
371 if (ret < 0) {
372 gossip_debug(GOSSIP_NAME_DEBUG,
373 "%s: failed with error code %d\n",
374 __func__, ret);
375 goto out;
376 }
377
Yi Liu8bb8aef2015-11-24 15:12:14 -0500378 inode = orangefs_new_inode(dir->i_sb, dir, S_IFDIR | mode, 0,
Mike Marshall274dcf52015-07-17 10:38:13 -0400379 &new_op->downcall.resp.mkdir.refn);
380 if (IS_ERR(inode)) {
Yi Liu8bb8aef2015-11-24 15:12:14 -0500381 gossip_err("*** Failed to allocate orangefs dir inode\n");
Mike Marshall274dcf52015-07-17 10:38:13 -0400382 ret = PTR_ERR(inode);
383 goto out;
384 }
385
386 gossip_debug(GOSSIP_NAME_DEBUG,
387 "Assigned dir inode new number of %pU\n",
388 get_khandle_from_ino(inode));
389
Al Viro2d2d3f12018-05-04 08:23:01 -0400390 d_instantiate_new(dentry, inode);
Miklos Szeredi804b1732016-10-17 10:14:23 +0200391 orangefs_set_timeout(dentry);
Martin Brandenburg8bbb20a2016-07-28 14:46:36 -0400392 ORANGEFS_I(inode)->getattr_time = jiffies - 1;
Mike Marshall274dcf52015-07-17 10:38:13 -0400393
394 gossip_debug(GOSSIP_NAME_DEBUG,
Al Virof66debf2016-08-07 12:20:01 -0400395 "Inode (Directory) %pU -> %pd\n",
Mike Marshall274dcf52015-07-17 10:38:13 -0400396 get_khandle_from_ino(inode),
Al Virof66debf2016-08-07 12:20:01 -0400397 dentry);
Mike Marshall274dcf52015-07-17 10:38:13 -0400398
399 /*
400 * NOTE: we have no good way to keep nlink consistent for directories
401 * across clients; keep constant at 1.
402 */
403 SetMtimeFlag(parent);
Deepa Dinamanic2050a42016-09-14 07:48:06 -0700404 dir->i_mtime = dir->i_ctime = current_time(dir);
Mike Marshall274dcf52015-07-17 10:38:13 -0400405 mark_inode_dirty_sync(dir);
406out:
407 op_release(new_op);
408 return ret;
409}
410
Yi Liu8bb8aef2015-11-24 15:12:14 -0500411static int orangefs_rename(struct inode *old_dir,
Mike Marshall274dcf52015-07-17 10:38:13 -0400412 struct dentry *old_dentry,
413 struct inode *new_dir,
Miklos Szeredi1cd66c92016-09-27 11:03:58 +0200414 struct dentry *new_dentry,
415 unsigned int flags)
Mike Marshall274dcf52015-07-17 10:38:13 -0400416{
Yi Liu8bb8aef2015-11-24 15:12:14 -0500417 struct orangefs_kernel_op_s *new_op;
Mike Marshall274dcf52015-07-17 10:38:13 -0400418 int ret;
419
Miklos Szeredi1cd66c92016-09-27 11:03:58 +0200420 if (flags)
421 return -EINVAL;
422
Mike Marshall274dcf52015-07-17 10:38:13 -0400423 gossip_debug(GOSSIP_NAME_DEBUG,
Al Viro96b0cff2016-05-29 15:00:34 -0400424 "orangefs_rename: called (%pd2 => %pd2) ct=%d\n",
425 old_dentry, new_dentry, d_count(new_dentry));
Mike Marshall274dcf52015-07-17 10:38:13 -0400426
Martin Brandenburg8bbb20a2016-07-28 14:46:36 -0400427 ORANGEFS_I(new_dentry->d_parent->d_inode)->getattr_time = jiffies - 1;
Martin Brandenburg71680c12016-06-09 16:32:38 -0400428
Yi Liu8bb8aef2015-11-24 15:12:14 -0500429 new_op = op_alloc(ORANGEFS_VFS_OP_RENAME);
Mike Marshall274dcf52015-07-17 10:38:13 -0400430 if (!new_op)
431 return -EINVAL;
432
Yi Liu8bb8aef2015-11-24 15:12:14 -0500433 new_op->upcall.req.rename.old_parent_refn = ORANGEFS_I(old_dir)->refn;
434 new_op->upcall.req.rename.new_parent_refn = ORANGEFS_I(new_dir)->refn;
Mike Marshall274dcf52015-07-17 10:38:13 -0400435
436 strncpy(new_op->upcall.req.rename.d_old_name,
437 old_dentry->d_name.name,
Martin Brandenburg47b49482016-02-20 14:22:40 -0500438 ORANGEFS_NAME_MAX);
Mike Marshall274dcf52015-07-17 10:38:13 -0400439 strncpy(new_op->upcall.req.rename.d_new_name,
440 new_dentry->d_name.name,
Martin Brandenburg47b49482016-02-20 14:22:40 -0500441 ORANGEFS_NAME_MAX);
Mike Marshall274dcf52015-07-17 10:38:13 -0400442
443 ret = service_operation(new_op,
Yi Liu8bb8aef2015-11-24 15:12:14 -0500444 "orangefs_rename",
Mike Marshall274dcf52015-07-17 10:38:13 -0400445 get_interruptible_flag(old_dentry->d_inode));
446
447 gossip_debug(GOSSIP_NAME_DEBUG,
Yi Liu8bb8aef2015-11-24 15:12:14 -0500448 "orangefs_rename: got downcall status %d\n",
Mike Marshall274dcf52015-07-17 10:38:13 -0400449 ret);
450
451 if (new_dentry->d_inode)
Deepa Dinamanic2050a42016-09-14 07:48:06 -0700452 new_dentry->d_inode->i_ctime = current_time(new_dentry->d_inode);
Mike Marshall274dcf52015-07-17 10:38:13 -0400453
454 op_release(new_op);
455 return ret;
456}
457
Yi Liu8bb8aef2015-11-24 15:12:14 -0500458/* ORANGEFS implementation of VFS inode operations for directories */
Al Viro6f3fc102016-05-14 18:46:32 -0400459const struct inode_operations orangefs_dir_inode_operations = {
Yi Liu8bb8aef2015-11-24 15:12:14 -0500460 .lookup = orangefs_lookup,
461 .get_acl = orangefs_get_acl,
462 .set_acl = orangefs_set_acl,
463 .create = orangefs_create,
464 .unlink = orangefs_unlink,
465 .symlink = orangefs_symlink,
466 .mkdir = orangefs_mkdir,
467 .rmdir = orangefs_unlink,
468 .rename = orangefs_rename,
469 .setattr = orangefs_setattr,
470 .getattr = orangefs_getattr,
Yi Liu8bb8aef2015-11-24 15:12:14 -0500471 .listxattr = orangefs_listxattr,
Martin Brandenburg933287d2016-01-30 13:46:54 -0500472 .permission = orangefs_permission,
Mike Marshall274dcf52015-07-17 10:38:13 -0400473};