namei.c (e5451c8f8330e03ad3cfa16048b4daf961af434f) | namei.c (b6853f78e763d42c7a158d8de3549c9827c604ab) |
---|---|
1/* 2 * linux/fs/hpfs/namei.c 3 * 4 * Mikulas Patocka (mikulas@artax.karlin.mff.cuni.cz), 1998-1999 5 * 6 * adding & removing files & directories 7 */ 8#include <linux/sched.h> --- 362 unchanged lines hidden (view full) --- 371{ 372 const unsigned char *name = dentry->d_name.name; 373 unsigned len = dentry->d_name.len; 374 struct quad_buffer_head qbh; 375 struct hpfs_dirent *de; 376 struct inode *inode = d_inode(dentry); 377 dnode_secno dno; 378 int r; | 1/* 2 * linux/fs/hpfs/namei.c 3 * 4 * Mikulas Patocka (mikulas@artax.karlin.mff.cuni.cz), 1998-1999 5 * 6 * adding & removing files & directories 7 */ 8#include <linux/sched.h> --- 362 unchanged lines hidden (view full) --- 371{ 372 const unsigned char *name = dentry->d_name.name; 373 unsigned len = dentry->d_name.len; 374 struct quad_buffer_head qbh; 375 struct hpfs_dirent *de; 376 struct inode *inode = d_inode(dentry); 377 dnode_secno dno; 378 int r; |
379 int rep = 0; | |
380 int err; 381 382 hpfs_lock(dir->i_sb); 383 hpfs_adjust_length(name, &len); | 379 int err; 380 381 hpfs_lock(dir->i_sb); 382 hpfs_adjust_length(name, &len); |
384again: | 383 |
385 err = -ENOENT; 386 de = map_dirent(dir, hpfs_i(dir)->i_dno, name, len, &dno, &qbh); 387 if (!de) 388 goto out; 389 390 err = -EPERM; 391 if (de->first) 392 goto out1; 393 394 err = -EISDIR; 395 if (de->directory) 396 goto out1; 397 398 r = hpfs_remove_dirent(dir, dno, de, &qbh, 1); 399 switch (r) { 400 case 1: 401 hpfs_error(dir->i_sb, "there was error when removing dirent"); 402 err = -EFSERROR; 403 break; | 384 err = -ENOENT; 385 de = map_dirent(dir, hpfs_i(dir)->i_dno, name, len, &dno, &qbh); 386 if (!de) 387 goto out; 388 389 err = -EPERM; 390 if (de->first) 391 goto out1; 392 393 err = -EISDIR; 394 if (de->directory) 395 goto out1; 396 397 r = hpfs_remove_dirent(dir, dno, de, &qbh, 1); 398 switch (r) { 399 case 1: 400 hpfs_error(dir->i_sb, "there was error when removing dirent"); 401 err = -EFSERROR; 402 break; |
404 case 2: /* no space for deleting, try to truncate file */ 405 | 403 case 2: /* no space for deleting */ |
406 err = -ENOSPC; | 404 err = -ENOSPC; |
407 if (rep++) 408 break; 409 410 dentry_unhash(dentry); 411 if (!d_unhashed(dentry)) { 412 hpfs_unlock(dir->i_sb); 413 return -ENOSPC; 414 } 415 if (generic_permission(inode, MAY_WRITE) || 416 !S_ISREG(inode->i_mode) || 417 get_write_access(inode)) { 418 d_rehash(dentry); 419 } else { 420 struct iattr newattrs; 421 /*pr_info("truncating file before delete.\n");*/ 422 newattrs.ia_size = 0; 423 newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME; 424 err = notify_change(dentry, &newattrs, NULL); 425 put_write_access(inode); 426 if (!err) 427 goto again; 428 } 429 hpfs_unlock(dir->i_sb); 430 return -ENOSPC; | 405 break; |
431 default: 432 drop_nlink(inode); 433 err = 0; 434 } 435 goto out; 436 437out1: 438 hpfs_brelse4(&qbh); --- 210 unchanged lines hidden --- | 406 default: 407 drop_nlink(inode); 408 err = 0; 409 } 410 goto out; 411 412out1: 413 hpfs_brelse4(&qbh); --- 210 unchanged lines hidden --- |