1274dcf55SMike Marshall /* 2274dcf55SMike Marshall * (C) 2001 Clemson University and The University of Chicago 3274dcf55SMike Marshall * 4274dcf55SMike Marshall * See COPYING in top-level directory. 5274dcf55SMike Marshall */ 6274dcf55SMike Marshall 7274dcf55SMike Marshall /* 8274dcf55SMike Marshall * Linux VFS namei operations. 9274dcf55SMike Marshall */ 10274dcf55SMike Marshall 11274dcf55SMike Marshall #include "protocol.h" 12575e9461SMike Marshall #include "orangefs-kernel.h" 13274dcf55SMike Marshall 14274dcf55SMike Marshall /* 15274dcf55SMike Marshall * Get a newly allocated inode to go with a negative dentry. 16274dcf55SMike Marshall */ 178bb8aefdSYi Liu static int orangefs_create(struct inode *dir, 18274dcf55SMike Marshall struct dentry *dentry, 19274dcf55SMike Marshall umode_t mode, 20274dcf55SMike Marshall bool exclusive) 21274dcf55SMike Marshall { 228bb8aefdSYi Liu struct orangefs_inode_s *parent = ORANGEFS_I(dir); 238bb8aefdSYi Liu struct orangefs_kernel_op_s *new_op; 24274dcf55SMike Marshall struct inode *inode; 25274dcf55SMike Marshall int ret; 26274dcf55SMike Marshall 275253487eSMike Marshall gossip_debug(GOSSIP_NAME_DEBUG, "%s: %s\n", 285253487eSMike Marshall __func__, 295253487eSMike Marshall dentry->d_name.name); 30274dcf55SMike Marshall 318bb8aefdSYi Liu new_op = op_alloc(ORANGEFS_VFS_OP_CREATE); 32274dcf55SMike Marshall if (!new_op) 33274dcf55SMike Marshall return -ENOMEM; 34274dcf55SMike Marshall 35274dcf55SMike Marshall new_op->upcall.req.create.parent_refn = parent->refn; 36274dcf55SMike Marshall 37274dcf55SMike Marshall fill_default_sys_attrs(new_op->upcall.req.create.attributes, 388bb8aefdSYi Liu ORANGEFS_TYPE_METAFILE, mode); 39274dcf55SMike Marshall 40274dcf55SMike Marshall strncpy(new_op->upcall.req.create.d_name, 4147b4948fSMartin Brandenburg dentry->d_name.name, ORANGEFS_NAME_MAX); 42274dcf55SMike Marshall 43274dcf55SMike Marshall ret = service_operation(new_op, __func__, get_interruptible_flag(dir)); 44274dcf55SMike Marshall 45274dcf55SMike Marshall gossip_debug(GOSSIP_NAME_DEBUG, 465253487eSMike Marshall "%s: %s: handle:%pU: fsid:%d: new_op:%p: ret:%d:\n", 475253487eSMike Marshall __func__, 485253487eSMike Marshall dentry->d_name.name, 49274dcf55SMike Marshall &new_op->downcall.resp.create.refn.khandle, 505253487eSMike Marshall new_op->downcall.resp.create.refn.fs_id, 515253487eSMike Marshall new_op, 525253487eSMike Marshall ret); 53274dcf55SMike Marshall 545253487eSMike Marshall if (ret < 0) 55274dcf55SMike Marshall goto out; 56274dcf55SMike Marshall 578bb8aefdSYi Liu inode = orangefs_new_inode(dir->i_sb, dir, S_IFREG | mode, 0, 58274dcf55SMike Marshall &new_op->downcall.resp.create.refn); 59274dcf55SMike Marshall if (IS_ERR(inode)) { 605253487eSMike Marshall gossip_err("%s: Failed to allocate inode for file :%s:\n", 615253487eSMike Marshall __func__, 625253487eSMike Marshall dentry->d_name.name); 63274dcf55SMike Marshall ret = PTR_ERR(inode); 64274dcf55SMike Marshall goto out; 65274dcf55SMike Marshall } 66274dcf55SMike Marshall 67274dcf55SMike Marshall gossip_debug(GOSSIP_NAME_DEBUG, 685253487eSMike Marshall "%s: Assigned inode :%pU: for file :%s:\n", 695253487eSMike Marshall __func__, 705253487eSMike Marshall get_khandle_from_ino(inode), 715253487eSMike Marshall dentry->d_name.name); 72274dcf55SMike Marshall 73274dcf55SMike Marshall d_instantiate(dentry, inode); 74274dcf55SMike Marshall unlock_new_inode(inode); 75*31b7c1abSMartin Brandenburg dentry->d_time = jiffies + HZ; 76274dcf55SMike Marshall 77274dcf55SMike Marshall gossip_debug(GOSSIP_NAME_DEBUG, 785253487eSMike Marshall "%s: dentry instantiated for %s\n", 795253487eSMike Marshall __func__, 80274dcf55SMike Marshall dentry->d_name.name); 81274dcf55SMike Marshall 82274dcf55SMike Marshall SetMtimeFlag(parent); 83274dcf55SMike Marshall dir->i_mtime = dir->i_ctime = current_fs_time(dir->i_sb); 84274dcf55SMike Marshall mark_inode_dirty_sync(dir); 85274dcf55SMike Marshall ret = 0; 86274dcf55SMike Marshall out: 87274dcf55SMike Marshall op_release(new_op); 885253487eSMike Marshall gossip_debug(GOSSIP_NAME_DEBUG, 895253487eSMike Marshall "%s: %s: returning %d\n", 905253487eSMike Marshall __func__, 915253487eSMike Marshall dentry->d_name.name, 925253487eSMike Marshall ret); 93274dcf55SMike Marshall return ret; 94274dcf55SMike Marshall } 95274dcf55SMike Marshall 96274dcf55SMike Marshall /* 97274dcf55SMike Marshall * Attempt to resolve an object name (dentry->d_name), parent handle, and 98274dcf55SMike Marshall * fsid into a handle for the object. 99274dcf55SMike Marshall */ 1008bb8aefdSYi Liu static struct dentry *orangefs_lookup(struct inode *dir, struct dentry *dentry, 101274dcf55SMike Marshall unsigned int flags) 102274dcf55SMike Marshall { 1038bb8aefdSYi Liu struct orangefs_inode_s *parent = ORANGEFS_I(dir); 1048bb8aefdSYi Liu struct orangefs_kernel_op_s *new_op; 105274dcf55SMike Marshall struct inode *inode; 106274dcf55SMike Marshall struct dentry *res; 107274dcf55SMike Marshall int ret = -EINVAL; 108274dcf55SMike Marshall 109274dcf55SMike Marshall /* 110274dcf55SMike Marshall * in theory we could skip a lookup here (if the intent is to 111274dcf55SMike Marshall * create) in order to avoid a potentially failed lookup, but 112274dcf55SMike Marshall * leaving it in can skip a valid lookup and try to create a file 113274dcf55SMike Marshall * that already exists (e.g. the vfs already handles checking for 114274dcf55SMike Marshall * -EEXIST on O_EXCL opens, which is broken if we skip this lookup 115274dcf55SMike Marshall * in the create path) 116274dcf55SMike Marshall */ 117274dcf55SMike Marshall gossip_debug(GOSSIP_NAME_DEBUG, "%s called on %s\n", 118274dcf55SMike Marshall __func__, dentry->d_name.name); 119274dcf55SMike Marshall 12047b4948fSMartin Brandenburg if (dentry->d_name.len > (ORANGEFS_NAME_MAX - 1)) 121274dcf55SMike Marshall return ERR_PTR(-ENAMETOOLONG); 122274dcf55SMike Marshall 1238bb8aefdSYi Liu new_op = op_alloc(ORANGEFS_VFS_OP_LOOKUP); 124274dcf55SMike Marshall if (!new_op) 125274dcf55SMike Marshall return ERR_PTR(-ENOMEM); 126274dcf55SMike Marshall 1277cec28e9SMike Marshall new_op->upcall.req.lookup.sym_follow = ORANGEFS_LOOKUP_LINK_NO_FOLLOW; 128274dcf55SMike Marshall 129274dcf55SMike Marshall gossip_debug(GOSSIP_NAME_DEBUG, "%s:%s:%d using parent %pU\n", 130274dcf55SMike Marshall __FILE__, 131274dcf55SMike Marshall __func__, 132274dcf55SMike Marshall __LINE__, 133274dcf55SMike Marshall &parent->refn.khandle); 134274dcf55SMike Marshall new_op->upcall.req.lookup.parent_refn = parent->refn; 135274dcf55SMike Marshall 136274dcf55SMike Marshall strncpy(new_op->upcall.req.lookup.d_name, dentry->d_name.name, 13747b4948fSMartin Brandenburg ORANGEFS_NAME_MAX); 138274dcf55SMike Marshall 139274dcf55SMike Marshall gossip_debug(GOSSIP_NAME_DEBUG, 1406ceaf781SMartin Brandenburg "%s: doing lookup on %s under %pU,%d\n", 141274dcf55SMike Marshall __func__, 142274dcf55SMike Marshall new_op->upcall.req.lookup.d_name, 143274dcf55SMike Marshall &new_op->upcall.req.lookup.parent_refn.khandle, 1446ceaf781SMartin Brandenburg new_op->upcall.req.lookup.parent_refn.fs_id); 145274dcf55SMike Marshall 146274dcf55SMike Marshall ret = service_operation(new_op, __func__, get_interruptible_flag(dir)); 147274dcf55SMike Marshall 148274dcf55SMike Marshall gossip_debug(GOSSIP_NAME_DEBUG, 149274dcf55SMike Marshall "Lookup Got %pU, fsid %d (ret=%d)\n", 150274dcf55SMike Marshall &new_op->downcall.resp.lookup.refn.khandle, 151274dcf55SMike Marshall new_op->downcall.resp.lookup.refn.fs_id, 152274dcf55SMike Marshall ret); 153274dcf55SMike Marshall 154274dcf55SMike Marshall if (ret < 0) { 155274dcf55SMike Marshall if (ret == -ENOENT) { 156274dcf55SMike Marshall /* 157274dcf55SMike Marshall * if no inode was found, add a negative dentry to 158274dcf55SMike Marshall * dcache anyway; if we don't, we don't hold expected 159274dcf55SMike Marshall * lookup semantics and we most noticeably break 160274dcf55SMike Marshall * during directory renames. 161274dcf55SMike Marshall * 162274dcf55SMike Marshall * however, if the operation failed or exited, do not 163274dcf55SMike Marshall * add the dentry (e.g. in the case that a touch is 164274dcf55SMike Marshall * issued on a file that already exists that was 165274dcf55SMike Marshall * interrupted during this lookup -- no need to add 166274dcf55SMike Marshall * another negative dentry for an existing file) 167274dcf55SMike Marshall */ 168274dcf55SMike Marshall 169274dcf55SMike Marshall gossip_debug(GOSSIP_NAME_DEBUG, 1708bb8aefdSYi Liu "orangefs_lookup: Adding *negative* dentry " 171274dcf55SMike Marshall "%p for %s\n", 172274dcf55SMike Marshall dentry, 173274dcf55SMike Marshall dentry->d_name.name); 174274dcf55SMike Marshall 175274dcf55SMike Marshall d_add(dentry, NULL); 176274dcf55SMike Marshall res = NULL; 177274dcf55SMike Marshall goto out; 178274dcf55SMike Marshall } 179274dcf55SMike Marshall 180274dcf55SMike Marshall /* must be a non-recoverable error */ 181274dcf55SMike Marshall res = ERR_PTR(ret); 182274dcf55SMike Marshall goto out; 183274dcf55SMike Marshall } 184274dcf55SMike Marshall 185*31b7c1abSMartin Brandenburg dentry->d_time = jiffies + HZ; 186*31b7c1abSMartin Brandenburg 1878bb8aefdSYi Liu inode = orangefs_iget(dir->i_sb, &new_op->downcall.resp.lookup.refn); 188274dcf55SMike Marshall if (IS_ERR(inode)) { 189274dcf55SMike Marshall gossip_debug(GOSSIP_NAME_DEBUG, 190274dcf55SMike Marshall "error %ld from iget\n", PTR_ERR(inode)); 191274dcf55SMike Marshall res = ERR_CAST(inode); 192274dcf55SMike Marshall goto out; 193274dcf55SMike Marshall } 194274dcf55SMike Marshall 195274dcf55SMike Marshall gossip_debug(GOSSIP_NAME_DEBUG, 196274dcf55SMike Marshall "%s:%s:%d " 197274dcf55SMike Marshall "Found good inode [%lu] with count [%d]\n", 198274dcf55SMike Marshall __FILE__, 199274dcf55SMike Marshall __func__, 200274dcf55SMike Marshall __LINE__, 201274dcf55SMike Marshall inode->i_ino, 202274dcf55SMike Marshall (int)atomic_read(&inode->i_count)); 203274dcf55SMike Marshall 204274dcf55SMike Marshall /* update dentry/inode pair into dcache */ 205274dcf55SMike Marshall res = d_splice_alias(inode, dentry); 206274dcf55SMike Marshall 207274dcf55SMike Marshall gossip_debug(GOSSIP_NAME_DEBUG, 208274dcf55SMike Marshall "Lookup success (inode ct = %d)\n", 209274dcf55SMike Marshall (int)atomic_read(&inode->i_count)); 210274dcf55SMike Marshall out: 211274dcf55SMike Marshall op_release(new_op); 212274dcf55SMike Marshall return res; 213274dcf55SMike Marshall } 214274dcf55SMike Marshall 215274dcf55SMike Marshall /* return 0 on success; non-zero otherwise */ 2168bb8aefdSYi Liu static int orangefs_unlink(struct inode *dir, struct dentry *dentry) 217274dcf55SMike Marshall { 218274dcf55SMike Marshall struct inode *inode = dentry->d_inode; 2198bb8aefdSYi Liu struct orangefs_inode_s *parent = ORANGEFS_I(dir); 2208bb8aefdSYi Liu struct orangefs_kernel_op_s *new_op; 221274dcf55SMike Marshall int ret; 222274dcf55SMike Marshall 223274dcf55SMike Marshall gossip_debug(GOSSIP_NAME_DEBUG, 224274dcf55SMike Marshall "%s: called on %s\n" 225274dcf55SMike Marshall " (inode %pU): Parent is %pU | fs_id %d\n", 226274dcf55SMike Marshall __func__, 227274dcf55SMike Marshall dentry->d_name.name, 228274dcf55SMike Marshall get_khandle_from_ino(inode), 229274dcf55SMike Marshall &parent->refn.khandle, 230274dcf55SMike Marshall parent->refn.fs_id); 231274dcf55SMike Marshall 2328bb8aefdSYi Liu new_op = op_alloc(ORANGEFS_VFS_OP_REMOVE); 233274dcf55SMike Marshall if (!new_op) 234274dcf55SMike Marshall return -ENOMEM; 235274dcf55SMike Marshall 236274dcf55SMike Marshall new_op->upcall.req.remove.parent_refn = parent->refn; 237274dcf55SMike Marshall strncpy(new_op->upcall.req.remove.d_name, dentry->d_name.name, 23847b4948fSMartin Brandenburg ORANGEFS_NAME_MAX); 239274dcf55SMike Marshall 2408bb8aefdSYi Liu ret = service_operation(new_op, "orangefs_unlink", 241274dcf55SMike Marshall get_interruptible_flag(inode)); 242274dcf55SMike Marshall 2435253487eSMike Marshall gossip_debug(GOSSIP_NAME_DEBUG, 2445253487eSMike Marshall "%s: service_operation returned:%d:\n", 2455253487eSMike Marshall __func__, 2465253487eSMike Marshall ret); 2475253487eSMike Marshall 248274dcf55SMike Marshall op_release(new_op); 249274dcf55SMike Marshall 250274dcf55SMike Marshall if (!ret) { 251274dcf55SMike Marshall drop_nlink(inode); 252274dcf55SMike Marshall 253274dcf55SMike Marshall SetMtimeFlag(parent); 254274dcf55SMike Marshall dir->i_mtime = dir->i_ctime = current_fs_time(dir->i_sb); 255274dcf55SMike Marshall mark_inode_dirty_sync(dir); 256274dcf55SMike Marshall } 257274dcf55SMike Marshall return ret; 258274dcf55SMike Marshall } 259274dcf55SMike Marshall 2608bb8aefdSYi Liu static int orangefs_symlink(struct inode *dir, 261274dcf55SMike Marshall struct dentry *dentry, 262274dcf55SMike Marshall const char *symname) 263274dcf55SMike Marshall { 2648bb8aefdSYi Liu struct orangefs_inode_s *parent = ORANGEFS_I(dir); 2658bb8aefdSYi Liu struct orangefs_kernel_op_s *new_op; 266274dcf55SMike Marshall struct inode *inode; 267274dcf55SMike Marshall int mode = 755; 268274dcf55SMike Marshall int ret; 269274dcf55SMike Marshall 270274dcf55SMike Marshall gossip_debug(GOSSIP_NAME_DEBUG, "%s: called\n", __func__); 271274dcf55SMike Marshall 272274dcf55SMike Marshall if (!symname) 273274dcf55SMike Marshall return -EINVAL; 274274dcf55SMike Marshall 275c62da585SMartin Brandenburg if (strlen(symname)+1 > ORANGEFS_NAME_MAX) 276c62da585SMartin Brandenburg return -ENAMETOOLONG; 277c62da585SMartin Brandenburg 2788bb8aefdSYi Liu new_op = op_alloc(ORANGEFS_VFS_OP_SYMLINK); 279274dcf55SMike Marshall if (!new_op) 280274dcf55SMike Marshall return -ENOMEM; 281274dcf55SMike Marshall 282274dcf55SMike Marshall new_op->upcall.req.sym.parent_refn = parent->refn; 283274dcf55SMike Marshall 284274dcf55SMike Marshall fill_default_sys_attrs(new_op->upcall.req.sym.attributes, 2858bb8aefdSYi Liu ORANGEFS_TYPE_SYMLINK, 286274dcf55SMike Marshall mode); 287274dcf55SMike Marshall 288274dcf55SMike Marshall strncpy(new_op->upcall.req.sym.entry_name, 289274dcf55SMike Marshall dentry->d_name.name, 29047b4948fSMartin Brandenburg ORANGEFS_NAME_MAX); 29147b4948fSMartin Brandenburg strncpy(new_op->upcall.req.sym.target, symname, ORANGEFS_NAME_MAX); 292274dcf55SMike Marshall 293274dcf55SMike Marshall ret = service_operation(new_op, __func__, get_interruptible_flag(dir)); 294274dcf55SMike Marshall 295274dcf55SMike Marshall gossip_debug(GOSSIP_NAME_DEBUG, 2968bb8aefdSYi Liu "Symlink Got ORANGEFS handle %pU on fsid %d (ret=%d)\n", 297274dcf55SMike Marshall &new_op->downcall.resp.sym.refn.khandle, 298274dcf55SMike Marshall new_op->downcall.resp.sym.refn.fs_id, ret); 299274dcf55SMike Marshall 300274dcf55SMike Marshall if (ret < 0) { 301274dcf55SMike Marshall gossip_debug(GOSSIP_NAME_DEBUG, 302274dcf55SMike Marshall "%s: failed with error code %d\n", 303274dcf55SMike Marshall __func__, ret); 304274dcf55SMike Marshall goto out; 305274dcf55SMike Marshall } 306274dcf55SMike Marshall 3078bb8aefdSYi Liu inode = orangefs_new_inode(dir->i_sb, dir, S_IFLNK | mode, 0, 308274dcf55SMike Marshall &new_op->downcall.resp.sym.refn); 309274dcf55SMike Marshall if (IS_ERR(inode)) { 310274dcf55SMike Marshall gossip_err 3118bb8aefdSYi Liu ("*** Failed to allocate orangefs symlink inode\n"); 312274dcf55SMike Marshall ret = PTR_ERR(inode); 313274dcf55SMike Marshall goto out; 314274dcf55SMike Marshall } 315274dcf55SMike Marshall 316274dcf55SMike Marshall gossip_debug(GOSSIP_NAME_DEBUG, 317274dcf55SMike Marshall "Assigned symlink inode new number of %pU\n", 318274dcf55SMike Marshall get_khandle_from_ino(inode)); 319274dcf55SMike Marshall 320274dcf55SMike Marshall d_instantiate(dentry, inode); 321274dcf55SMike Marshall unlock_new_inode(inode); 322*31b7c1abSMartin Brandenburg dentry->d_time = jiffies + HZ; 323274dcf55SMike Marshall 324274dcf55SMike Marshall gossip_debug(GOSSIP_NAME_DEBUG, 325274dcf55SMike Marshall "Inode (Symlink) %pU -> %s\n", 326274dcf55SMike Marshall get_khandle_from_ino(inode), 327274dcf55SMike Marshall dentry->d_name.name); 328274dcf55SMike Marshall 329274dcf55SMike Marshall SetMtimeFlag(parent); 330274dcf55SMike Marshall dir->i_mtime = dir->i_ctime = current_fs_time(dir->i_sb); 331274dcf55SMike Marshall mark_inode_dirty_sync(dir); 332274dcf55SMike Marshall ret = 0; 333274dcf55SMike Marshall out: 334274dcf55SMike Marshall op_release(new_op); 335274dcf55SMike Marshall return ret; 336274dcf55SMike Marshall } 337274dcf55SMike Marshall 3388bb8aefdSYi Liu static int orangefs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) 339274dcf55SMike Marshall { 3408bb8aefdSYi Liu struct orangefs_inode_s *parent = ORANGEFS_I(dir); 3418bb8aefdSYi Liu struct orangefs_kernel_op_s *new_op; 342274dcf55SMike Marshall struct inode *inode; 343274dcf55SMike Marshall int ret; 344274dcf55SMike Marshall 3458bb8aefdSYi Liu new_op = op_alloc(ORANGEFS_VFS_OP_MKDIR); 346274dcf55SMike Marshall if (!new_op) 347274dcf55SMike Marshall return -ENOMEM; 348274dcf55SMike Marshall 349274dcf55SMike Marshall new_op->upcall.req.mkdir.parent_refn = parent->refn; 350274dcf55SMike Marshall 351274dcf55SMike Marshall fill_default_sys_attrs(new_op->upcall.req.mkdir.attributes, 3528bb8aefdSYi Liu ORANGEFS_TYPE_DIRECTORY, mode); 353274dcf55SMike Marshall 354274dcf55SMike Marshall strncpy(new_op->upcall.req.mkdir.d_name, 35547b4948fSMartin Brandenburg dentry->d_name.name, ORANGEFS_NAME_MAX); 356274dcf55SMike Marshall 357274dcf55SMike Marshall ret = service_operation(new_op, __func__, get_interruptible_flag(dir)); 358274dcf55SMike Marshall 359274dcf55SMike Marshall gossip_debug(GOSSIP_NAME_DEBUG, 3608bb8aefdSYi Liu "Mkdir Got ORANGEFS handle %pU on fsid %d\n", 361274dcf55SMike Marshall &new_op->downcall.resp.mkdir.refn.khandle, 362274dcf55SMike Marshall new_op->downcall.resp.mkdir.refn.fs_id); 363274dcf55SMike Marshall 364274dcf55SMike Marshall if (ret < 0) { 365274dcf55SMike Marshall gossip_debug(GOSSIP_NAME_DEBUG, 366274dcf55SMike Marshall "%s: failed with error code %d\n", 367274dcf55SMike Marshall __func__, ret); 368274dcf55SMike Marshall goto out; 369274dcf55SMike Marshall } 370274dcf55SMike Marshall 3718bb8aefdSYi Liu inode = orangefs_new_inode(dir->i_sb, dir, S_IFDIR | mode, 0, 372274dcf55SMike Marshall &new_op->downcall.resp.mkdir.refn); 373274dcf55SMike Marshall if (IS_ERR(inode)) { 3748bb8aefdSYi Liu gossip_err("*** Failed to allocate orangefs dir inode\n"); 375274dcf55SMike Marshall ret = PTR_ERR(inode); 376274dcf55SMike Marshall goto out; 377274dcf55SMike Marshall } 378274dcf55SMike Marshall 379274dcf55SMike Marshall gossip_debug(GOSSIP_NAME_DEBUG, 380274dcf55SMike Marshall "Assigned dir inode new number of %pU\n", 381274dcf55SMike Marshall get_khandle_from_ino(inode)); 382274dcf55SMike Marshall 383274dcf55SMike Marshall d_instantiate(dentry, inode); 384274dcf55SMike Marshall unlock_new_inode(inode); 385*31b7c1abSMartin Brandenburg dentry->d_time = jiffies + HZ; 386274dcf55SMike Marshall 387274dcf55SMike Marshall gossip_debug(GOSSIP_NAME_DEBUG, 388274dcf55SMike Marshall "Inode (Directory) %pU -> %s\n", 389274dcf55SMike Marshall get_khandle_from_ino(inode), 390274dcf55SMike Marshall dentry->d_name.name); 391274dcf55SMike Marshall 392274dcf55SMike Marshall /* 393274dcf55SMike Marshall * NOTE: we have no good way to keep nlink consistent for directories 394274dcf55SMike Marshall * across clients; keep constant at 1. 395274dcf55SMike Marshall */ 396274dcf55SMike Marshall SetMtimeFlag(parent); 397274dcf55SMike Marshall dir->i_mtime = dir->i_ctime = current_fs_time(dir->i_sb); 398274dcf55SMike Marshall mark_inode_dirty_sync(dir); 399274dcf55SMike Marshall out: 400274dcf55SMike Marshall op_release(new_op); 401274dcf55SMike Marshall return ret; 402274dcf55SMike Marshall } 403274dcf55SMike Marshall 4048bb8aefdSYi Liu static int orangefs_rename(struct inode *old_dir, 405274dcf55SMike Marshall struct dentry *old_dentry, 406274dcf55SMike Marshall struct inode *new_dir, 407274dcf55SMike Marshall struct dentry *new_dentry) 408274dcf55SMike Marshall { 4098bb8aefdSYi Liu struct orangefs_kernel_op_s *new_op; 410274dcf55SMike Marshall int ret; 411274dcf55SMike Marshall 412274dcf55SMike Marshall gossip_debug(GOSSIP_NAME_DEBUG, 41396b0cffbSAl Viro "orangefs_rename: called (%pd2 => %pd2) ct=%d\n", 41496b0cffbSAl Viro old_dentry, new_dentry, d_count(new_dentry)); 415274dcf55SMike Marshall 4168bb8aefdSYi Liu new_op = op_alloc(ORANGEFS_VFS_OP_RENAME); 417274dcf55SMike Marshall if (!new_op) 418274dcf55SMike Marshall return -EINVAL; 419274dcf55SMike Marshall 4208bb8aefdSYi Liu new_op->upcall.req.rename.old_parent_refn = ORANGEFS_I(old_dir)->refn; 4218bb8aefdSYi Liu new_op->upcall.req.rename.new_parent_refn = ORANGEFS_I(new_dir)->refn; 422274dcf55SMike Marshall 423274dcf55SMike Marshall strncpy(new_op->upcall.req.rename.d_old_name, 424274dcf55SMike Marshall old_dentry->d_name.name, 42547b4948fSMartin Brandenburg ORANGEFS_NAME_MAX); 426274dcf55SMike Marshall strncpy(new_op->upcall.req.rename.d_new_name, 427274dcf55SMike Marshall new_dentry->d_name.name, 42847b4948fSMartin Brandenburg ORANGEFS_NAME_MAX); 429274dcf55SMike Marshall 430274dcf55SMike Marshall ret = service_operation(new_op, 4318bb8aefdSYi Liu "orangefs_rename", 432274dcf55SMike Marshall get_interruptible_flag(old_dentry->d_inode)); 433274dcf55SMike Marshall 434274dcf55SMike Marshall gossip_debug(GOSSIP_NAME_DEBUG, 4358bb8aefdSYi Liu "orangefs_rename: got downcall status %d\n", 436274dcf55SMike Marshall ret); 437274dcf55SMike Marshall 438274dcf55SMike Marshall if (new_dentry->d_inode) 439274dcf55SMike Marshall new_dentry->d_inode->i_ctime = CURRENT_TIME; 440274dcf55SMike Marshall 441274dcf55SMike Marshall op_release(new_op); 442274dcf55SMike Marshall return ret; 443274dcf55SMike Marshall } 444274dcf55SMike Marshall 4458bb8aefdSYi Liu /* ORANGEFS implementation of VFS inode operations for directories */ 4466f3fc107SAl Viro const struct inode_operations orangefs_dir_inode_operations = { 4478bb8aefdSYi Liu .lookup = orangefs_lookup, 4488bb8aefdSYi Liu .get_acl = orangefs_get_acl, 4498bb8aefdSYi Liu .set_acl = orangefs_set_acl, 4508bb8aefdSYi Liu .create = orangefs_create, 4518bb8aefdSYi Liu .unlink = orangefs_unlink, 4528bb8aefdSYi Liu .symlink = orangefs_symlink, 4538bb8aefdSYi Liu .mkdir = orangefs_mkdir, 4548bb8aefdSYi Liu .rmdir = orangefs_unlink, 4558bb8aefdSYi Liu .rename = orangefs_rename, 4568bb8aefdSYi Liu .setattr = orangefs_setattr, 4578bb8aefdSYi Liu .getattr = orangefs_getattr, 458274dcf55SMike Marshall .setxattr = generic_setxattr, 459274dcf55SMike Marshall .getxattr = generic_getxattr, 460274dcf55SMike Marshall .removexattr = generic_removexattr, 4618bb8aefdSYi Liu .listxattr = orangefs_listxattr, 462933287daSMartin Brandenburg .permission = orangefs_permission, 463274dcf55SMike Marshall }; 464