diff options
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/ceph/dir.c | 28 | ||||
| -rw-r--r-- | fs/ceph/inode.c | 2 | ||||
| -rw-r--r-- | fs/ceph/super.h | 1 | ||||
| -rw-r--r-- | fs/exofs/namei.c | 8 | ||||
| -rw-r--r-- | fs/ext2/namei.c | 9 | ||||
| -rw-r--r-- | fs/hfs/dir.c | 50 | ||||
| -rw-r--r-- | fs/minix/namei.c | 8 | ||||
| -rw-r--r-- | fs/nfs/nfs4proc.c | 44 | ||||
| -rw-r--r-- | fs/nilfs2/namei.c | 8 | ||||
| -rw-r--r-- | fs/nilfs2/segment.c | 3 | ||||
| -rw-r--r-- | fs/proc/proc_devtree.c | 2 | ||||
| -rw-r--r-- | fs/reiserfs/namei.c | 2 | ||||
| -rw-r--r-- | fs/sysv/namei.c | 8 | ||||
| -rw-r--r-- | fs/udf/namei.c | 11 | ||||
| -rw-r--r-- | fs/ufs/namei.c | 9 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_ioctl.c | 11 |
16 files changed, 87 insertions, 117 deletions
diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c index f0aef787a102..099a58615b90 100644 --- a/fs/ceph/dir.c +++ b/fs/ceph/dir.c | |||
| @@ -60,7 +60,6 @@ int ceph_init_dentry(struct dentry *dentry) | |||
| 60 | } | 60 | } |
| 61 | di->dentry = dentry; | 61 | di->dentry = dentry; |
| 62 | di->lease_session = NULL; | 62 | di->lease_session = NULL; |
| 63 | di->parent_inode = igrab(dentry->d_parent->d_inode); | ||
| 64 | dentry->d_fsdata = di; | 63 | dentry->d_fsdata = di; |
| 65 | dentry->d_time = jiffies; | 64 | dentry->d_time = jiffies; |
| 66 | ceph_dentry_lru_add(dentry); | 65 | ceph_dentry_lru_add(dentry); |
| @@ -410,7 +409,7 @@ more: | |||
| 410 | spin_lock(&inode->i_lock); | 409 | spin_lock(&inode->i_lock); |
| 411 | if (ci->i_release_count == fi->dir_release_count) { | 410 | if (ci->i_release_count == fi->dir_release_count) { |
| 412 | dout(" marking %p complete\n", inode); | 411 | dout(" marking %p complete\n", inode); |
| 413 | ci->i_ceph_flags |= CEPH_I_COMPLETE; | 412 | /* ci->i_ceph_flags |= CEPH_I_COMPLETE; */ |
| 414 | ci->i_max_offset = filp->f_pos; | 413 | ci->i_max_offset = filp->f_pos; |
| 415 | } | 414 | } |
| 416 | spin_unlock(&inode->i_lock); | 415 | spin_unlock(&inode->i_lock); |
| @@ -497,6 +496,7 @@ struct dentry *ceph_finish_lookup(struct ceph_mds_request *req, | |||
| 497 | 496 | ||
| 498 | /* .snap dir? */ | 497 | /* .snap dir? */ |
| 499 | if (err == -ENOENT && | 498 | if (err == -ENOENT && |
| 499 | ceph_snap(parent) == CEPH_NOSNAP && | ||
| 500 | strcmp(dentry->d_name.name, | 500 | strcmp(dentry->d_name.name, |
| 501 | fsc->mount_options->snapdir_name) == 0) { | 501 | fsc->mount_options->snapdir_name) == 0) { |
| 502 | struct inode *inode = ceph_get_snapdir(parent); | 502 | struct inode *inode = ceph_get_snapdir(parent); |
| @@ -1030,28 +1030,8 @@ out_touch: | |||
| 1030 | static void ceph_dentry_release(struct dentry *dentry) | 1030 | static void ceph_dentry_release(struct dentry *dentry) |
| 1031 | { | 1031 | { |
| 1032 | struct ceph_dentry_info *di = ceph_dentry(dentry); | 1032 | struct ceph_dentry_info *di = ceph_dentry(dentry); |
| 1033 | struct inode *parent_inode = NULL; | ||
| 1034 | u64 snapid = CEPH_NOSNAP; | ||
| 1035 | 1033 | ||
| 1036 | if (!IS_ROOT(dentry)) { | 1034 | dout("dentry_release %p\n", dentry); |
| 1037 | parent_inode = di->parent_inode; | ||
| 1038 | if (parent_inode) | ||
| 1039 | snapid = ceph_snap(parent_inode); | ||
| 1040 | } | ||
| 1041 | dout("dentry_release %p parent %p\n", dentry, parent_inode); | ||
| 1042 | if (parent_inode && snapid != CEPH_SNAPDIR) { | ||
| 1043 | struct ceph_inode_info *ci = ceph_inode(parent_inode); | ||
| 1044 | |||
| 1045 | spin_lock(&parent_inode->i_lock); | ||
| 1046 | if (ci->i_shared_gen == di->lease_shared_gen || | ||
| 1047 | snapid <= CEPH_MAXSNAP) { | ||
| 1048 | dout(" clearing %p complete (d_release)\n", | ||
| 1049 | parent_inode); | ||
| 1050 | ci->i_ceph_flags &= ~CEPH_I_COMPLETE; | ||
| 1051 | ci->i_release_count++; | ||
| 1052 | } | ||
| 1053 | spin_unlock(&parent_inode->i_lock); | ||
| 1054 | } | ||
| 1055 | if (di) { | 1035 | if (di) { |
| 1056 | ceph_dentry_lru_del(dentry); | 1036 | ceph_dentry_lru_del(dentry); |
| 1057 | if (di->lease_session) | 1037 | if (di->lease_session) |
| @@ -1059,8 +1039,6 @@ static void ceph_dentry_release(struct dentry *dentry) | |||
| 1059 | kmem_cache_free(ceph_dentry_cachep, di); | 1039 | kmem_cache_free(ceph_dentry_cachep, di); |
| 1060 | dentry->d_fsdata = NULL; | 1040 | dentry->d_fsdata = NULL; |
| 1061 | } | 1041 | } |
| 1062 | if (parent_inode) | ||
| 1063 | iput(parent_inode); | ||
| 1064 | } | 1042 | } |
| 1065 | 1043 | ||
| 1066 | static int ceph_snapdir_d_revalidate(struct dentry *dentry, | 1044 | static int ceph_snapdir_d_revalidate(struct dentry *dentry, |
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index 5625463aa479..193bfa5e9cbd 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c | |||
| @@ -707,7 +707,7 @@ static int fill_inode(struct inode *inode, | |||
| 707 | (issued & CEPH_CAP_FILE_EXCL) == 0 && | 707 | (issued & CEPH_CAP_FILE_EXCL) == 0 && |
| 708 | (ci->i_ceph_flags & CEPH_I_COMPLETE) == 0) { | 708 | (ci->i_ceph_flags & CEPH_I_COMPLETE) == 0) { |
| 709 | dout(" marking %p complete (empty)\n", inode); | 709 | dout(" marking %p complete (empty)\n", inode); |
| 710 | ci->i_ceph_flags |= CEPH_I_COMPLETE; | 710 | /* ci->i_ceph_flags |= CEPH_I_COMPLETE; */ |
| 711 | ci->i_max_offset = 2; | 711 | ci->i_max_offset = 2; |
| 712 | } | 712 | } |
| 713 | break; | 713 | break; |
diff --git a/fs/ceph/super.h b/fs/ceph/super.h index 88fcaa21b801..20b907d76ae2 100644 --- a/fs/ceph/super.h +++ b/fs/ceph/super.h | |||
| @@ -207,7 +207,6 @@ struct ceph_dentry_info { | |||
| 207 | struct dentry *dentry; | 207 | struct dentry *dentry; |
| 208 | u64 time; | 208 | u64 time; |
| 209 | u64 offset; | 209 | u64 offset; |
| 210 | struct inode *parent_inode; | ||
| 211 | }; | 210 | }; |
| 212 | 211 | ||
| 213 | struct ceph_inode_xattrs_info { | 212 | struct ceph_inode_xattrs_info { |
diff --git a/fs/exofs/namei.c b/fs/exofs/namei.c index 264e95d02830..4d70db110cfc 100644 --- a/fs/exofs/namei.c +++ b/fs/exofs/namei.c | |||
| @@ -272,7 +272,6 @@ static int exofs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 272 | new_de = exofs_find_entry(new_dir, new_dentry, &new_page); | 272 | new_de = exofs_find_entry(new_dir, new_dentry, &new_page); |
| 273 | if (!new_de) | 273 | if (!new_de) |
| 274 | goto out_dir; | 274 | goto out_dir; |
| 275 | inode_inc_link_count(old_inode); | ||
| 276 | err = exofs_set_link(new_dir, new_de, new_page, old_inode); | 275 | err = exofs_set_link(new_dir, new_de, new_page, old_inode); |
| 277 | new_inode->i_ctime = CURRENT_TIME; | 276 | new_inode->i_ctime = CURRENT_TIME; |
| 278 | if (dir_de) | 277 | if (dir_de) |
| @@ -286,12 +285,9 @@ static int exofs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 286 | if (new_dir->i_nlink >= EXOFS_LINK_MAX) | 285 | if (new_dir->i_nlink >= EXOFS_LINK_MAX) |
| 287 | goto out_dir; | 286 | goto out_dir; |
| 288 | } | 287 | } |
| 289 | inode_inc_link_count(old_inode); | ||
| 290 | err = exofs_add_link(new_dentry, old_inode); | 288 | err = exofs_add_link(new_dentry, old_inode); |
| 291 | if (err) { | 289 | if (err) |
| 292 | inode_dec_link_count(old_inode); | ||
| 293 | goto out_dir; | 290 | goto out_dir; |
| 294 | } | ||
| 295 | if (dir_de) | 291 | if (dir_de) |
| 296 | inode_inc_link_count(new_dir); | 292 | inode_inc_link_count(new_dir); |
| 297 | } | 293 | } |
| @@ -299,7 +295,7 @@ static int exofs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 299 | old_inode->i_ctime = CURRENT_TIME; | 295 | old_inode->i_ctime = CURRENT_TIME; |
| 300 | 296 | ||
| 301 | exofs_delete_entry(old_de, old_page); | 297 | exofs_delete_entry(old_de, old_page); |
| 302 | inode_dec_link_count(old_inode); | 298 | mark_inode_dirty(old_inode); |
| 303 | 299 | ||
| 304 | if (dir_de) { | 300 | if (dir_de) { |
| 305 | err = exofs_set_link(old_inode, dir_de, dir_page, new_dir); | 301 | err = exofs_set_link(old_inode, dir_de, dir_page, new_dir); |
diff --git a/fs/ext2/namei.c b/fs/ext2/namei.c index 2e1d8341d827..adb91855ccd0 100644 --- a/fs/ext2/namei.c +++ b/fs/ext2/namei.c | |||
| @@ -344,7 +344,6 @@ static int ext2_rename (struct inode * old_dir, struct dentry * old_dentry, | |||
| 344 | new_de = ext2_find_entry (new_dir, &new_dentry->d_name, &new_page); | 344 | new_de = ext2_find_entry (new_dir, &new_dentry->d_name, &new_page); |
| 345 | if (!new_de) | 345 | if (!new_de) |
| 346 | goto out_dir; | 346 | goto out_dir; |
| 347 | inode_inc_link_count(old_inode); | ||
| 348 | ext2_set_link(new_dir, new_de, new_page, old_inode, 1); | 347 | ext2_set_link(new_dir, new_de, new_page, old_inode, 1); |
| 349 | new_inode->i_ctime = CURRENT_TIME_SEC; | 348 | new_inode->i_ctime = CURRENT_TIME_SEC; |
| 350 | if (dir_de) | 349 | if (dir_de) |
| @@ -356,12 +355,9 @@ static int ext2_rename (struct inode * old_dir, struct dentry * old_dentry, | |||
| 356 | if (new_dir->i_nlink >= EXT2_LINK_MAX) | 355 | if (new_dir->i_nlink >= EXT2_LINK_MAX) |
| 357 | goto out_dir; | 356 | goto out_dir; |
| 358 | } | 357 | } |
| 359 | inode_inc_link_count(old_inode); | ||
| 360 | err = ext2_add_link(new_dentry, old_inode); | 358 | err = ext2_add_link(new_dentry, old_inode); |
| 361 | if (err) { | 359 | if (err) |
| 362 | inode_dec_link_count(old_inode); | ||
| 363 | goto out_dir; | 360 | goto out_dir; |
| 364 | } | ||
| 365 | if (dir_de) | 361 | if (dir_de) |
| 366 | inode_inc_link_count(new_dir); | 362 | inode_inc_link_count(new_dir); |
| 367 | } | 363 | } |
| @@ -369,12 +365,11 @@ static int ext2_rename (struct inode * old_dir, struct dentry * old_dentry, | |||
| 369 | /* | 365 | /* |
| 370 | * Like most other Unix systems, set the ctime for inodes on a | 366 | * Like most other Unix systems, set the ctime for inodes on a |
| 371 | * rename. | 367 | * rename. |
| 372 | * inode_dec_link_count() will mark the inode dirty. | ||
| 373 | */ | 368 | */ |
| 374 | old_inode->i_ctime = CURRENT_TIME_SEC; | 369 | old_inode->i_ctime = CURRENT_TIME_SEC; |
| 370 | mark_inode_dirty(old_inode); | ||
| 375 | 371 | ||
| 376 | ext2_delete_entry (old_de, old_page); | 372 | ext2_delete_entry (old_de, old_page); |
| 377 | inode_dec_link_count(old_inode); | ||
| 378 | 373 | ||
| 379 | if (dir_de) { | 374 | if (dir_de) { |
| 380 | if (old_dir != new_dir) | 375 | if (old_dir != new_dir) |
diff --git a/fs/hfs/dir.c b/fs/hfs/dir.c index afa66aaa2237..b4d70b13be92 100644 --- a/fs/hfs/dir.c +++ b/fs/hfs/dir.c | |||
| @@ -238,46 +238,22 @@ static int hfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
| 238 | } | 238 | } |
| 239 | 239 | ||
| 240 | /* | 240 | /* |
| 241 | * hfs_unlink() | 241 | * hfs_remove() |
| 242 | * | 242 | * |
| 243 | * This is the unlink() entry in the inode_operations structure for | 243 | * This serves as both unlink() and rmdir() in the inode_operations |
| 244 | * regular HFS directories. The purpose is to delete an existing | 244 | * structure for regular HFS directories. The purpose is to delete |
| 245 | * file, given the inode for the parent directory and the name | 245 | * an existing child, given the inode for the parent directory and |
| 246 | * (and its length) of the existing file. | 246 | * the name (and its length) of the existing directory. |
| 247 | */ | ||
| 248 | static int hfs_unlink(struct inode *dir, struct dentry *dentry) | ||
| 249 | { | ||
| 250 | struct inode *inode; | ||
| 251 | int res; | ||
| 252 | |||
| 253 | inode = dentry->d_inode; | ||
| 254 | res = hfs_cat_delete(inode->i_ino, dir, &dentry->d_name); | ||
| 255 | if (res) | ||
| 256 | return res; | ||
| 257 | |||
| 258 | drop_nlink(inode); | ||
| 259 | hfs_delete_inode(inode); | ||
| 260 | inode->i_ctime = CURRENT_TIME_SEC; | ||
| 261 | mark_inode_dirty(inode); | ||
| 262 | |||
| 263 | return res; | ||
| 264 | } | ||
| 265 | |||
| 266 | /* | ||
| 267 | * hfs_rmdir() | ||
| 268 | * | 247 | * |
| 269 | * This is the rmdir() entry in the inode_operations structure for | 248 | * HFS does not have hardlinks, so both rmdir and unlink set the |
| 270 | * regular HFS directories. The purpose is to delete an existing | 249 | * link count to 0. The only difference is the emptiness check. |
| 271 | * directory, given the inode for the parent directory and the name | ||
| 272 | * (and its length) of the existing directory. | ||
| 273 | */ | 250 | */ |
| 274 | static int hfs_rmdir(struct inode *dir, struct dentry *dentry) | 251 | static int hfs_remove(struct inode *dir, struct dentry *dentry) |
| 275 | { | 252 | { |
| 276 | struct inode *inode; | 253 | struct inode *inode = dentry->d_inode; |
| 277 | int res; | 254 | int res; |
| 278 | 255 | ||
| 279 | inode = dentry->d_inode; | 256 | if (S_ISDIR(inode->i_mode) && inode->i_size != 2) |
| 280 | if (inode->i_size != 2) | ||
| 281 | return -ENOTEMPTY; | 257 | return -ENOTEMPTY; |
| 282 | res = hfs_cat_delete(inode->i_ino, dir, &dentry->d_name); | 258 | res = hfs_cat_delete(inode->i_ino, dir, &dentry->d_name); |
| 283 | if (res) | 259 | if (res) |
| @@ -307,7 +283,7 @@ static int hfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 307 | 283 | ||
| 308 | /* Unlink destination if it already exists */ | 284 | /* Unlink destination if it already exists */ |
| 309 | if (new_dentry->d_inode) { | 285 | if (new_dentry->d_inode) { |
| 310 | res = hfs_unlink(new_dir, new_dentry); | 286 | res = hfs_remove(new_dir, new_dentry); |
| 311 | if (res) | 287 | if (res) |
| 312 | return res; | 288 | return res; |
| 313 | } | 289 | } |
| @@ -332,9 +308,9 @@ const struct file_operations hfs_dir_operations = { | |||
| 332 | const struct inode_operations hfs_dir_inode_operations = { | 308 | const struct inode_operations hfs_dir_inode_operations = { |
| 333 | .create = hfs_create, | 309 | .create = hfs_create, |
| 334 | .lookup = hfs_lookup, | 310 | .lookup = hfs_lookup, |
| 335 | .unlink = hfs_unlink, | 311 | .unlink = hfs_remove, |
| 336 | .mkdir = hfs_mkdir, | 312 | .mkdir = hfs_mkdir, |
| 337 | .rmdir = hfs_rmdir, | 313 | .rmdir = hfs_remove, |
| 338 | .rename = hfs_rename, | 314 | .rename = hfs_rename, |
| 339 | .setattr = hfs_inode_setattr, | 315 | .setattr = hfs_inode_setattr, |
| 340 | }; | 316 | }; |
diff --git a/fs/minix/namei.c b/fs/minix/namei.c index ce7337ddfdbf..6e6777f1b4b2 100644 --- a/fs/minix/namei.c +++ b/fs/minix/namei.c | |||
| @@ -213,7 +213,6 @@ static int minix_rename(struct inode * old_dir, struct dentry *old_dentry, | |||
| 213 | new_de = minix_find_entry(new_dentry, &new_page); | 213 | new_de = minix_find_entry(new_dentry, &new_page); |
| 214 | if (!new_de) | 214 | if (!new_de) |
| 215 | goto out_dir; | 215 | goto out_dir; |
| 216 | inode_inc_link_count(old_inode); | ||
| 217 | minix_set_link(new_de, new_page, old_inode); | 216 | minix_set_link(new_de, new_page, old_inode); |
| 218 | new_inode->i_ctime = CURRENT_TIME_SEC; | 217 | new_inode->i_ctime = CURRENT_TIME_SEC; |
| 219 | if (dir_de) | 218 | if (dir_de) |
| @@ -225,18 +224,15 @@ static int minix_rename(struct inode * old_dir, struct dentry *old_dentry, | |||
| 225 | if (new_dir->i_nlink >= info->s_link_max) | 224 | if (new_dir->i_nlink >= info->s_link_max) |
| 226 | goto out_dir; | 225 | goto out_dir; |
| 227 | } | 226 | } |
| 228 | inode_inc_link_count(old_inode); | ||
| 229 | err = minix_add_link(new_dentry, old_inode); | 227 | err = minix_add_link(new_dentry, old_inode); |
| 230 | if (err) { | 228 | if (err) |
| 231 | inode_dec_link_count(old_inode); | ||
| 232 | goto out_dir; | 229 | goto out_dir; |
| 233 | } | ||
| 234 | if (dir_de) | 230 | if (dir_de) |
| 235 | inode_inc_link_count(new_dir); | 231 | inode_inc_link_count(new_dir); |
| 236 | } | 232 | } |
| 237 | 233 | ||
| 238 | minix_delete_entry(old_de, old_page); | 234 | minix_delete_entry(old_de, old_page); |
| 239 | inode_dec_link_count(old_inode); | 235 | mark_inode_dirty(old_inode); |
| 240 | 236 | ||
| 241 | if (dir_de) { | 237 | if (dir_de) { |
| 242 | minix_set_link(dir_de, dir_page, new_dir); | 238 | minix_set_link(dir_de, dir_page, new_dir); |
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 78936a8f40ab..1ff76acc7e98 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
| @@ -51,6 +51,7 @@ | |||
| 51 | #include <linux/sunrpc/bc_xprt.h> | 51 | #include <linux/sunrpc/bc_xprt.h> |
| 52 | #include <linux/xattr.h> | 52 | #include <linux/xattr.h> |
| 53 | #include <linux/utsname.h> | 53 | #include <linux/utsname.h> |
| 54 | #include <linux/mm.h> | ||
| 54 | 55 | ||
| 55 | #include "nfs4_fs.h" | 56 | #include "nfs4_fs.h" |
| 56 | #include "delegation.h" | 57 | #include "delegation.h" |
| @@ -3252,6 +3253,35 @@ static void buf_to_pages(const void *buf, size_t buflen, | |||
| 3252 | } | 3253 | } |
| 3253 | } | 3254 | } |
| 3254 | 3255 | ||
| 3256 | static int buf_to_pages_noslab(const void *buf, size_t buflen, | ||
| 3257 | struct page **pages, unsigned int *pgbase) | ||
| 3258 | { | ||
| 3259 | struct page *newpage, **spages; | ||
| 3260 | int rc = 0; | ||
| 3261 | size_t len; | ||
| 3262 | spages = pages; | ||
| 3263 | |||
| 3264 | do { | ||
| 3265 | len = min(PAGE_CACHE_SIZE, buflen); | ||
| 3266 | newpage = alloc_page(GFP_KERNEL); | ||
| 3267 | |||
| 3268 | if (newpage == NULL) | ||
| 3269 | goto unwind; | ||
| 3270 | memcpy(page_address(newpage), buf, len); | ||
| 3271 | buf += len; | ||
| 3272 | buflen -= len; | ||
| 3273 | *pages++ = newpage; | ||
| 3274 | rc++; | ||
| 3275 | } while (buflen != 0); | ||
| 3276 | |||
| 3277 | return rc; | ||
| 3278 | |||
| 3279 | unwind: | ||
| 3280 | for(; rc > 0; rc--) | ||
| 3281 | __free_page(spages[rc-1]); | ||
| 3282 | return -ENOMEM; | ||
| 3283 | } | ||
| 3284 | |||
| 3255 | struct nfs4_cached_acl { | 3285 | struct nfs4_cached_acl { |
| 3256 | int cached; | 3286 | int cached; |
| 3257 | size_t len; | 3287 | size_t len; |
| @@ -3420,13 +3450,23 @@ static int __nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t bufl | |||
| 3420 | .rpc_argp = &arg, | 3450 | .rpc_argp = &arg, |
| 3421 | .rpc_resp = &res, | 3451 | .rpc_resp = &res, |
| 3422 | }; | 3452 | }; |
| 3423 | int ret; | 3453 | int ret, i; |
| 3424 | 3454 | ||
| 3425 | if (!nfs4_server_supports_acls(server)) | 3455 | if (!nfs4_server_supports_acls(server)) |
| 3426 | return -EOPNOTSUPP; | 3456 | return -EOPNOTSUPP; |
| 3457 | i = buf_to_pages_noslab(buf, buflen, arg.acl_pages, &arg.acl_pgbase); | ||
| 3458 | if (i < 0) | ||
| 3459 | return i; | ||
| 3427 | nfs_inode_return_delegation(inode); | 3460 | nfs_inode_return_delegation(inode); |
| 3428 | buf_to_pages(buf, buflen, arg.acl_pages, &arg.acl_pgbase); | ||
| 3429 | ret = nfs4_call_sync(server, &msg, &arg, &res, 1); | 3461 | ret = nfs4_call_sync(server, &msg, &arg, &res, 1); |
| 3462 | |||
| 3463 | /* | ||
| 3464 | * Free each page after tx, so the only ref left is | ||
| 3465 | * held by the network stack | ||
| 3466 | */ | ||
| 3467 | for (; i > 0; i--) | ||
| 3468 | put_page(pages[i-1]); | ||
| 3469 | |||
| 3430 | /* | 3470 | /* |
| 3431 | * Acl update can result in inode attribute update. | 3471 | * Acl update can result in inode attribute update. |
| 3432 | * so mark the attribute cache invalid. | 3472 | * so mark the attribute cache invalid. |
diff --git a/fs/nilfs2/namei.c b/fs/nilfs2/namei.c index 98034271cd02..161791d26458 100644 --- a/fs/nilfs2/namei.c +++ b/fs/nilfs2/namei.c | |||
| @@ -397,7 +397,6 @@ static int nilfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 397 | new_de = nilfs_find_entry(new_dir, &new_dentry->d_name, &new_page); | 397 | new_de = nilfs_find_entry(new_dir, &new_dentry->d_name, &new_page); |
| 398 | if (!new_de) | 398 | if (!new_de) |
| 399 | goto out_dir; | 399 | goto out_dir; |
| 400 | inc_nlink(old_inode); | ||
| 401 | nilfs_set_link(new_dir, new_de, new_page, old_inode); | 400 | nilfs_set_link(new_dir, new_de, new_page, old_inode); |
| 402 | nilfs_mark_inode_dirty(new_dir); | 401 | nilfs_mark_inode_dirty(new_dir); |
| 403 | new_inode->i_ctime = CURRENT_TIME; | 402 | new_inode->i_ctime = CURRENT_TIME; |
| @@ -411,13 +410,9 @@ static int nilfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 411 | if (new_dir->i_nlink >= NILFS_LINK_MAX) | 410 | if (new_dir->i_nlink >= NILFS_LINK_MAX) |
| 412 | goto out_dir; | 411 | goto out_dir; |
| 413 | } | 412 | } |
| 414 | inc_nlink(old_inode); | ||
| 415 | err = nilfs_add_link(new_dentry, old_inode); | 413 | err = nilfs_add_link(new_dentry, old_inode); |
| 416 | if (err) { | 414 | if (err) |
| 417 | drop_nlink(old_inode); | ||
| 418 | nilfs_mark_inode_dirty(old_inode); | ||
| 419 | goto out_dir; | 415 | goto out_dir; |
| 420 | } | ||
| 421 | if (dir_de) { | 416 | if (dir_de) { |
| 422 | inc_nlink(new_dir); | 417 | inc_nlink(new_dir); |
| 423 | nilfs_mark_inode_dirty(new_dir); | 418 | nilfs_mark_inode_dirty(new_dir); |
| @@ -431,7 +426,6 @@ static int nilfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 431 | old_inode->i_ctime = CURRENT_TIME; | 426 | old_inode->i_ctime = CURRENT_TIME; |
| 432 | 427 | ||
| 433 | nilfs_delete_entry(old_de, old_page); | 428 | nilfs_delete_entry(old_de, old_page); |
| 434 | drop_nlink(old_inode); | ||
| 435 | 429 | ||
| 436 | if (dir_de) { | 430 | if (dir_de) { |
| 437 | nilfs_set_link(old_inode, dir_de, dir_page, new_dir); | 431 | nilfs_set_link(old_inode, dir_de, dir_page, new_dir); |
diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c index 55ebae5c7f39..2de9f636792a 100644 --- a/fs/nilfs2/segment.c +++ b/fs/nilfs2/segment.c | |||
| @@ -430,7 +430,8 @@ static void nilfs_segctor_begin_finfo(struct nilfs_sc_info *sci, | |||
| 430 | nilfs_segctor_map_segsum_entry( | 430 | nilfs_segctor_map_segsum_entry( |
| 431 | sci, &sci->sc_binfo_ptr, sizeof(struct nilfs_finfo)); | 431 | sci, &sci->sc_binfo_ptr, sizeof(struct nilfs_finfo)); |
| 432 | 432 | ||
| 433 | if (inode->i_sb && !test_bit(NILFS_SC_HAVE_DELTA, &sci->sc_flags)) | 433 | if (NILFS_I(inode)->i_root && |
| 434 | !test_bit(NILFS_SC_HAVE_DELTA, &sci->sc_flags)) | ||
| 434 | set_bit(NILFS_SC_HAVE_DELTA, &sci->sc_flags); | 435 | set_bit(NILFS_SC_HAVE_DELTA, &sci->sc_flags); |
| 435 | /* skip finfo */ | 436 | /* skip finfo */ |
| 436 | } | 437 | } |
diff --git a/fs/proc/proc_devtree.c b/fs/proc/proc_devtree.c index d9396a4fc7ff..927cbd115e53 100644 --- a/fs/proc/proc_devtree.c +++ b/fs/proc/proc_devtree.c | |||
| @@ -233,7 +233,7 @@ void __init proc_device_tree_init(void) | |||
| 233 | return; | 233 | return; |
| 234 | root = of_find_node_by_path("/"); | 234 | root = of_find_node_by_path("/"); |
| 235 | if (root == NULL) { | 235 | if (root == NULL) { |
| 236 | printk(KERN_ERR "/proc/device-tree: can't find root\n"); | 236 | pr_debug("/proc/device-tree: can't find root\n"); |
| 237 | return; | 237 | return; |
| 238 | } | 238 | } |
| 239 | proc_device_tree_add_node(root, proc_device_tree); | 239 | proc_device_tree_add_node(root, proc_device_tree); |
diff --git a/fs/reiserfs/namei.c b/fs/reiserfs/namei.c index ba5f51ec3458..68fdf45cc6c9 100644 --- a/fs/reiserfs/namei.c +++ b/fs/reiserfs/namei.c | |||
| @@ -771,7 +771,7 @@ static int reiserfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
| 771 | EMPTY_DIR_SIZE_V1 : EMPTY_DIR_SIZE, | 771 | EMPTY_DIR_SIZE_V1 : EMPTY_DIR_SIZE, |
| 772 | dentry, inode, &security); | 772 | dentry, inode, &security); |
| 773 | if (retval) { | 773 | if (retval) { |
| 774 | dir->i_nlink--; | 774 | DEC_DIR_INODE_NLINK(dir) |
| 775 | goto out_failed; | 775 | goto out_failed; |
| 776 | } | 776 | } |
| 777 | 777 | ||
diff --git a/fs/sysv/namei.c b/fs/sysv/namei.c index b427b1208c26..e474fbcf8bde 100644 --- a/fs/sysv/namei.c +++ b/fs/sysv/namei.c | |||
| @@ -245,7 +245,6 @@ static int sysv_rename(struct inode * old_dir, struct dentry * old_dentry, | |||
| 245 | new_de = sysv_find_entry(new_dentry, &new_page); | 245 | new_de = sysv_find_entry(new_dentry, &new_page); |
| 246 | if (!new_de) | 246 | if (!new_de) |
| 247 | goto out_dir; | 247 | goto out_dir; |
| 248 | inode_inc_link_count(old_inode); | ||
| 249 | sysv_set_link(new_de, new_page, old_inode); | 248 | sysv_set_link(new_de, new_page, old_inode); |
| 250 | new_inode->i_ctime = CURRENT_TIME_SEC; | 249 | new_inode->i_ctime = CURRENT_TIME_SEC; |
| 251 | if (dir_de) | 250 | if (dir_de) |
| @@ -257,18 +256,15 @@ static int sysv_rename(struct inode * old_dir, struct dentry * old_dentry, | |||
| 257 | if (new_dir->i_nlink >= SYSV_SB(new_dir->i_sb)->s_link_max) | 256 | if (new_dir->i_nlink >= SYSV_SB(new_dir->i_sb)->s_link_max) |
| 258 | goto out_dir; | 257 | goto out_dir; |
| 259 | } | 258 | } |
| 260 | inode_inc_link_count(old_inode); | ||
| 261 | err = sysv_add_link(new_dentry, old_inode); | 259 | err = sysv_add_link(new_dentry, old_inode); |
| 262 | if (err) { | 260 | if (err) |
| 263 | inode_dec_link_count(old_inode); | ||
| 264 | goto out_dir; | 261 | goto out_dir; |
| 265 | } | ||
| 266 | if (dir_de) | 262 | if (dir_de) |
| 267 | inode_inc_link_count(new_dir); | 263 | inode_inc_link_count(new_dir); |
| 268 | } | 264 | } |
| 269 | 265 | ||
| 270 | sysv_delete_entry(old_de, old_page); | 266 | sysv_delete_entry(old_de, old_page); |
| 271 | inode_dec_link_count(old_inode); | 267 | mark_inode_dirty(old_inode); |
| 272 | 268 | ||
| 273 | if (dir_de) { | 269 | if (dir_de) { |
| 274 | sysv_set_link(dir_de, dir_page, new_dir); | 270 | sysv_set_link(dir_de, dir_page, new_dir); |
diff --git a/fs/udf/namei.c b/fs/udf/namei.c index 2be0f9eb86d2..b7c338d5e9df 100644 --- a/fs/udf/namei.c +++ b/fs/udf/namei.c | |||
| @@ -32,6 +32,8 @@ | |||
| 32 | #include <linux/crc-itu-t.h> | 32 | #include <linux/crc-itu-t.h> |
| 33 | #include <linux/exportfs.h> | 33 | #include <linux/exportfs.h> |
| 34 | 34 | ||
| 35 | enum { UDF_MAX_LINKS = 0xffff }; | ||
| 36 | |||
| 35 | static inline int udf_match(int len1, const unsigned char *name1, int len2, | 37 | static inline int udf_match(int len1, const unsigned char *name1, int len2, |
| 36 | const unsigned char *name2) | 38 | const unsigned char *name2) |
| 37 | { | 39 | { |
| @@ -650,7 +652,7 @@ static int udf_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
| 650 | struct udf_inode_info *iinfo; | 652 | struct udf_inode_info *iinfo; |
| 651 | 653 | ||
| 652 | err = -EMLINK; | 654 | err = -EMLINK; |
| 653 | if (dir->i_nlink >= (256 << sizeof(dir->i_nlink)) - 1) | 655 | if (dir->i_nlink >= UDF_MAX_LINKS) |
| 654 | goto out; | 656 | goto out; |
| 655 | 657 | ||
| 656 | err = -EIO; | 658 | err = -EIO; |
| @@ -1034,9 +1036,8 @@ static int udf_link(struct dentry *old_dentry, struct inode *dir, | |||
| 1034 | struct fileIdentDesc cfi, *fi; | 1036 | struct fileIdentDesc cfi, *fi; |
| 1035 | int err; | 1037 | int err; |
| 1036 | 1038 | ||
| 1037 | if (inode->i_nlink >= (256 << sizeof(inode->i_nlink)) - 1) { | 1039 | if (inode->i_nlink >= UDF_MAX_LINKS) |
| 1038 | return -EMLINK; | 1040 | return -EMLINK; |
| 1039 | } | ||
| 1040 | 1041 | ||
| 1041 | fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err); | 1042 | fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err); |
| 1042 | if (!fi) { | 1043 | if (!fi) { |
| @@ -1131,9 +1132,7 @@ static int udf_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 1131 | goto end_rename; | 1132 | goto end_rename; |
| 1132 | 1133 | ||
| 1133 | retval = -EMLINK; | 1134 | retval = -EMLINK; |
| 1134 | if (!new_inode && | 1135 | if (!new_inode && new_dir->i_nlink >= UDF_MAX_LINKS) |
| 1135 | new_dir->i_nlink >= | ||
| 1136 | (256 << sizeof(new_dir->i_nlink)) - 1) | ||
| 1137 | goto end_rename; | 1136 | goto end_rename; |
| 1138 | } | 1137 | } |
| 1139 | if (!nfi) { | 1138 | if (!nfi) { |
diff --git a/fs/ufs/namei.c b/fs/ufs/namei.c index 12f39b9e4437..d6f681535eb8 100644 --- a/fs/ufs/namei.c +++ b/fs/ufs/namei.c | |||
| @@ -306,7 +306,6 @@ static int ufs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 306 | new_de = ufs_find_entry(new_dir, &new_dentry->d_name, &new_page); | 306 | new_de = ufs_find_entry(new_dir, &new_dentry->d_name, &new_page); |
| 307 | if (!new_de) | 307 | if (!new_de) |
| 308 | goto out_dir; | 308 | goto out_dir; |
| 309 | inode_inc_link_count(old_inode); | ||
| 310 | ufs_set_link(new_dir, new_de, new_page, old_inode); | 309 | ufs_set_link(new_dir, new_de, new_page, old_inode); |
| 311 | new_inode->i_ctime = CURRENT_TIME_SEC; | 310 | new_inode->i_ctime = CURRENT_TIME_SEC; |
| 312 | if (dir_de) | 311 | if (dir_de) |
| @@ -318,12 +317,9 @@ static int ufs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 318 | if (new_dir->i_nlink >= UFS_LINK_MAX) | 317 | if (new_dir->i_nlink >= UFS_LINK_MAX) |
| 319 | goto out_dir; | 318 | goto out_dir; |
| 320 | } | 319 | } |
| 321 | inode_inc_link_count(old_inode); | ||
| 322 | err = ufs_add_link(new_dentry, old_inode); | 320 | err = ufs_add_link(new_dentry, old_inode); |
| 323 | if (err) { | 321 | if (err) |
| 324 | inode_dec_link_count(old_inode); | ||
| 325 | goto out_dir; | 322 | goto out_dir; |
| 326 | } | ||
| 327 | if (dir_de) | 323 | if (dir_de) |
| 328 | inode_inc_link_count(new_dir); | 324 | inode_inc_link_count(new_dir); |
| 329 | } | 325 | } |
| @@ -331,12 +327,11 @@ static int ufs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 331 | /* | 327 | /* |
| 332 | * Like most other Unix systems, set the ctime for inodes on a | 328 | * Like most other Unix systems, set the ctime for inodes on a |
| 333 | * rename. | 329 | * rename. |
| 334 | * inode_dec_link_count() will mark the inode dirty. | ||
| 335 | */ | 330 | */ |
| 336 | old_inode->i_ctime = CURRENT_TIME_SEC; | 331 | old_inode->i_ctime = CURRENT_TIME_SEC; |
| 337 | 332 | ||
| 338 | ufs_delete_entry(old_dir, old_de, old_page); | 333 | ufs_delete_entry(old_dir, old_de, old_page); |
| 339 | inode_dec_link_count(old_inode); | 334 | mark_inode_dirty(old_inode); |
| 340 | 335 | ||
| 341 | if (dir_de) { | 336 | if (dir_de) { |
| 342 | ufs_set_link(old_inode, dir_de, dir_page, new_dir); | 337 | ufs_set_link(old_inode, dir_de, dir_page, new_dir); |
diff --git a/fs/xfs/linux-2.6/xfs_ioctl.c b/fs/xfs/linux-2.6/xfs_ioctl.c index f5e2a19e0f8e..0ca0e3c024d7 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl.c +++ b/fs/xfs/linux-2.6/xfs_ioctl.c | |||
| @@ -695,14 +695,19 @@ xfs_ioc_fsgeometry_v1( | |||
| 695 | xfs_mount_t *mp, | 695 | xfs_mount_t *mp, |
| 696 | void __user *arg) | 696 | void __user *arg) |
| 697 | { | 697 | { |
| 698 | xfs_fsop_geom_v1_t fsgeo; | 698 | xfs_fsop_geom_t fsgeo; |
| 699 | int error; | 699 | int error; |
| 700 | 700 | ||
| 701 | error = xfs_fs_geometry(mp, (xfs_fsop_geom_t *)&fsgeo, 3); | 701 | error = xfs_fs_geometry(mp, &fsgeo, 3); |
| 702 | if (error) | 702 | if (error) |
| 703 | return -error; | 703 | return -error; |
| 704 | 704 | ||
| 705 | if (copy_to_user(arg, &fsgeo, sizeof(fsgeo))) | 705 | /* |
| 706 | * Caller should have passed an argument of type | ||
| 707 | * xfs_fsop_geom_v1_t. This is a proper subset of the | ||
| 708 | * xfs_fsop_geom_t that xfs_fs_geometry() fills in. | ||
| 709 | */ | ||
| 710 | if (copy_to_user(arg, &fsgeo, sizeof(xfs_fsop_geom_v1_t))) | ||
| 706 | return -XFS_ERROR(EFAULT); | 711 | return -XFS_ERROR(EFAULT); |
| 707 | return 0; | 712 | return 0; |
| 708 | } | 713 | } |
