diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/char_dev.c | 22 | ||||
-rw-r--r-- | fs/jfs/jfs_txnmgr.c | 2 | ||||
-rw-r--r-- | fs/jfs/namei.c | 33 | ||||
-rw-r--r-- | fs/namei.c | 8 | ||||
-rw-r--r-- | fs/proc/array.c | 6 | ||||
-rw-r--r-- | fs/proc/base.c | 33 | ||||
-rw-r--r-- | fs/proc/inode.c | 2 | ||||
-rw-r--r-- | fs/reiserfs/procfs.c | 25 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_buf.h | 4 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_super.c | 7 | ||||
-rw-r--r-- | fs/xfs/quota/xfs_qm_bhv.c | 19 | ||||
-rw-r--r-- | fs/xfs/xfs_inode.c | 17 | ||||
-rw-r--r-- | fs/xfs/xfs_log.c | 12 | ||||
-rw-r--r-- | fs/xfs/xfs_vfsops.c | 2 |
14 files changed, 143 insertions, 49 deletions
diff --git a/fs/char_dev.c b/fs/char_dev.c index a4cbc6706ef0..3483d3cf8087 100644 --- a/fs/char_dev.c +++ b/fs/char_dev.c | |||
@@ -182,6 +182,28 @@ int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, | |||
182 | return 0; | 182 | return 0; |
183 | } | 183 | } |
184 | 184 | ||
185 | /** | ||
186 | * register_chrdev() - Register a major number for character devices. | ||
187 | * @major: major device number or 0 for dynamic allocation | ||
188 | * @name: name of this range of devices | ||
189 | * @fops: file operations associated with this devices | ||
190 | * | ||
191 | * If @major == 0 this functions will dynamically allocate a major and return | ||
192 | * its number. | ||
193 | * | ||
194 | * If @major > 0 this function will attempt to reserve a device with the given | ||
195 | * major number and will return zero on success. | ||
196 | * | ||
197 | * Returns a -ve errno on failure. | ||
198 | * | ||
199 | * The name of this device has nothing to do with the name of the device in | ||
200 | * /dev. It only helps to keep track of the different owners of devices. If | ||
201 | * your module name has only one type of devices it's ok to use e.g. the name | ||
202 | * of the module here. | ||
203 | * | ||
204 | * This function registers a range of 256 minor numbers. The first minor number | ||
205 | * is 0. | ||
206 | */ | ||
185 | int register_chrdev(unsigned int major, const char *name, | 207 | int register_chrdev(unsigned int major, const char *name, |
186 | const struct file_operations *fops) | 208 | const struct file_operations *fops) |
187 | { | 209 | { |
diff --git a/fs/jfs/jfs_txnmgr.c b/fs/jfs/jfs_txnmgr.c index 10c46231ce15..efbb586bed4b 100644 --- a/fs/jfs/jfs_txnmgr.c +++ b/fs/jfs/jfs_txnmgr.c | |||
@@ -2944,7 +2944,7 @@ int jfs_sync(void *arg) | |||
2944 | * Inode is being freed | 2944 | * Inode is being freed |
2945 | */ | 2945 | */ |
2946 | list_del_init(&jfs_ip->anon_inode_list); | 2946 | list_del_init(&jfs_ip->anon_inode_list); |
2947 | } else if (! !mutex_trylock(&jfs_ip->commit_mutex)) { | 2947 | } else if (mutex_trylock(&jfs_ip->commit_mutex)) { |
2948 | /* | 2948 | /* |
2949 | * inode will be removed from anonymous list | 2949 | * inode will be removed from anonymous list |
2950 | * when it is committed | 2950 | * when it is committed |
diff --git a/fs/jfs/namei.c b/fs/jfs/namei.c index 09ea03f62277..295268ad231b 100644 --- a/fs/jfs/namei.c +++ b/fs/jfs/namei.c | |||
@@ -165,8 +165,8 @@ static int jfs_create(struct inode *dip, struct dentry *dentry, int mode, | |||
165 | 165 | ||
166 | out3: | 166 | out3: |
167 | txEnd(tid); | 167 | txEnd(tid); |
168 | mutex_unlock(&JFS_IP(dip)->commit_mutex); | ||
169 | mutex_unlock(&JFS_IP(ip)->commit_mutex); | 168 | mutex_unlock(&JFS_IP(ip)->commit_mutex); |
169 | mutex_unlock(&JFS_IP(dip)->commit_mutex); | ||
170 | if (rc) { | 170 | if (rc) { |
171 | free_ea_wmap(ip); | 171 | free_ea_wmap(ip); |
172 | ip->i_nlink = 0; | 172 | ip->i_nlink = 0; |
@@ -300,8 +300,8 @@ static int jfs_mkdir(struct inode *dip, struct dentry *dentry, int mode) | |||
300 | 300 | ||
301 | out3: | 301 | out3: |
302 | txEnd(tid); | 302 | txEnd(tid); |
303 | mutex_unlock(&JFS_IP(dip)->commit_mutex); | ||
304 | mutex_unlock(&JFS_IP(ip)->commit_mutex); | 303 | mutex_unlock(&JFS_IP(ip)->commit_mutex); |
304 | mutex_unlock(&JFS_IP(dip)->commit_mutex); | ||
305 | if (rc) { | 305 | if (rc) { |
306 | free_ea_wmap(ip); | 306 | free_ea_wmap(ip); |
307 | ip->i_nlink = 0; | 307 | ip->i_nlink = 0; |
@@ -384,8 +384,8 @@ static int jfs_rmdir(struct inode *dip, struct dentry *dentry) | |||
384 | if (rc == -EIO) | 384 | if (rc == -EIO) |
385 | txAbort(tid, 1); | 385 | txAbort(tid, 1); |
386 | txEnd(tid); | 386 | txEnd(tid); |
387 | mutex_unlock(&JFS_IP(dip)->commit_mutex); | ||
388 | mutex_unlock(&JFS_IP(ip)->commit_mutex); | 387 | mutex_unlock(&JFS_IP(ip)->commit_mutex); |
388 | mutex_unlock(&JFS_IP(dip)->commit_mutex); | ||
389 | 389 | ||
390 | goto out2; | 390 | goto out2; |
391 | } | 391 | } |
@@ -422,8 +422,8 @@ static int jfs_rmdir(struct inode *dip, struct dentry *dentry) | |||
422 | 422 | ||
423 | txEnd(tid); | 423 | txEnd(tid); |
424 | 424 | ||
425 | mutex_unlock(&JFS_IP(dip)->commit_mutex); | ||
426 | mutex_unlock(&JFS_IP(ip)->commit_mutex); | 425 | mutex_unlock(&JFS_IP(ip)->commit_mutex); |
426 | mutex_unlock(&JFS_IP(dip)->commit_mutex); | ||
427 | 427 | ||
428 | /* | 428 | /* |
429 | * Truncating the directory index table is not guaranteed. It | 429 | * Truncating the directory index table is not guaranteed. It |
@@ -503,8 +503,8 @@ static int jfs_unlink(struct inode *dip, struct dentry *dentry) | |||
503 | if (rc == -EIO) | 503 | if (rc == -EIO) |
504 | txAbort(tid, 1); /* Marks FS Dirty */ | 504 | txAbort(tid, 1); /* Marks FS Dirty */ |
505 | txEnd(tid); | 505 | txEnd(tid); |
506 | mutex_unlock(&JFS_IP(dip)->commit_mutex); | ||
507 | mutex_unlock(&JFS_IP(ip)->commit_mutex); | 506 | mutex_unlock(&JFS_IP(ip)->commit_mutex); |
507 | mutex_unlock(&JFS_IP(dip)->commit_mutex); | ||
508 | IWRITE_UNLOCK(ip); | 508 | IWRITE_UNLOCK(ip); |
509 | goto out1; | 509 | goto out1; |
510 | } | 510 | } |
@@ -527,8 +527,8 @@ static int jfs_unlink(struct inode *dip, struct dentry *dentry) | |||
527 | if ((new_size = commitZeroLink(tid, ip)) < 0) { | 527 | if ((new_size = commitZeroLink(tid, ip)) < 0) { |
528 | txAbort(tid, 1); /* Marks FS Dirty */ | 528 | txAbort(tid, 1); /* Marks FS Dirty */ |
529 | txEnd(tid); | 529 | txEnd(tid); |
530 | mutex_unlock(&JFS_IP(dip)->commit_mutex); | ||
531 | mutex_unlock(&JFS_IP(ip)->commit_mutex); | 530 | mutex_unlock(&JFS_IP(ip)->commit_mutex); |
531 | mutex_unlock(&JFS_IP(dip)->commit_mutex); | ||
532 | IWRITE_UNLOCK(ip); | 532 | IWRITE_UNLOCK(ip); |
533 | rc = new_size; | 533 | rc = new_size; |
534 | goto out1; | 534 | goto out1; |
@@ -556,9 +556,8 @@ static int jfs_unlink(struct inode *dip, struct dentry *dentry) | |||
556 | 556 | ||
557 | txEnd(tid); | 557 | txEnd(tid); |
558 | 558 | ||
559 | mutex_unlock(&JFS_IP(dip)->commit_mutex); | ||
560 | mutex_unlock(&JFS_IP(ip)->commit_mutex); | 559 | mutex_unlock(&JFS_IP(ip)->commit_mutex); |
561 | 560 | mutex_unlock(&JFS_IP(dip)->commit_mutex); | |
562 | 561 | ||
563 | while (new_size && (rc == 0)) { | 562 | while (new_size && (rc == 0)) { |
564 | tid = txBegin(dip->i_sb, 0); | 563 | tid = txBegin(dip->i_sb, 0); |
@@ -847,8 +846,8 @@ static int jfs_link(struct dentry *old_dentry, | |||
847 | out: | 846 | out: |
848 | txEnd(tid); | 847 | txEnd(tid); |
849 | 848 | ||
850 | mutex_unlock(&JFS_IP(dir)->commit_mutex); | ||
851 | mutex_unlock(&JFS_IP(ip)->commit_mutex); | 849 | mutex_unlock(&JFS_IP(ip)->commit_mutex); |
850 | mutex_unlock(&JFS_IP(dir)->commit_mutex); | ||
852 | 851 | ||
853 | jfs_info("jfs_link: rc:%d", rc); | 852 | jfs_info("jfs_link: rc:%d", rc); |
854 | return rc; | 853 | return rc; |
@@ -1037,8 +1036,8 @@ static int jfs_symlink(struct inode *dip, struct dentry *dentry, | |||
1037 | 1036 | ||
1038 | out3: | 1037 | out3: |
1039 | txEnd(tid); | 1038 | txEnd(tid); |
1040 | mutex_unlock(&JFS_IP(dip)->commit_mutex); | ||
1041 | mutex_unlock(&JFS_IP(ip)->commit_mutex); | 1039 | mutex_unlock(&JFS_IP(ip)->commit_mutex); |
1040 | mutex_unlock(&JFS_IP(dip)->commit_mutex); | ||
1042 | if (rc) { | 1041 | if (rc) { |
1043 | free_ea_wmap(ip); | 1042 | free_ea_wmap(ip); |
1044 | ip->i_nlink = 0; | 1043 | ip->i_nlink = 0; |
@@ -1160,10 +1159,11 @@ static int jfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
1160 | if (S_ISDIR(new_ip->i_mode)) { | 1159 | if (S_ISDIR(new_ip->i_mode)) { |
1161 | new_ip->i_nlink--; | 1160 | new_ip->i_nlink--; |
1162 | if (new_ip->i_nlink) { | 1161 | if (new_ip->i_nlink) { |
1163 | mutex_unlock(&JFS_IP(new_dir)->commit_mutex); | 1162 | mutex_unlock(&JFS_IP(new_ip)->commit_mutex); |
1164 | mutex_unlock(&JFS_IP(old_ip)->commit_mutex); | ||
1165 | if (old_dir != new_dir) | 1163 | if (old_dir != new_dir) |
1166 | mutex_unlock(&JFS_IP(old_dir)->commit_mutex); | 1164 | mutex_unlock(&JFS_IP(old_dir)->commit_mutex); |
1165 | mutex_unlock(&JFS_IP(old_ip)->commit_mutex); | ||
1166 | mutex_unlock(&JFS_IP(new_dir)->commit_mutex); | ||
1167 | if (!S_ISDIR(old_ip->i_mode) && new_ip) | 1167 | if (!S_ISDIR(old_ip->i_mode) && new_ip) |
1168 | IWRITE_UNLOCK(new_ip); | 1168 | IWRITE_UNLOCK(new_ip); |
1169 | jfs_error(new_ip->i_sb, | 1169 | jfs_error(new_ip->i_sb, |
@@ -1281,13 +1281,12 @@ static int jfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
1281 | 1281 | ||
1282 | out4: | 1282 | out4: |
1283 | txEnd(tid); | 1283 | txEnd(tid); |
1284 | |||
1285 | mutex_unlock(&JFS_IP(new_dir)->commit_mutex); | ||
1286 | mutex_unlock(&JFS_IP(old_ip)->commit_mutex); | ||
1287 | if (old_dir != new_dir) | ||
1288 | mutex_unlock(&JFS_IP(old_dir)->commit_mutex); | ||
1289 | if (new_ip) | 1284 | if (new_ip) |
1290 | mutex_unlock(&JFS_IP(new_ip)->commit_mutex); | 1285 | mutex_unlock(&JFS_IP(new_ip)->commit_mutex); |
1286 | if (old_dir != new_dir) | ||
1287 | mutex_unlock(&JFS_IP(old_dir)->commit_mutex); | ||
1288 | mutex_unlock(&JFS_IP(old_ip)->commit_mutex); | ||
1289 | mutex_unlock(&JFS_IP(new_dir)->commit_mutex); | ||
1291 | 1290 | ||
1292 | while (new_size && (rc == 0)) { | 1291 | while (new_size && (rc == 0)) { |
1293 | tid = txBegin(new_ip->i_sb, 0); | 1292 | tid = txBegin(new_ip->i_sb, 0); |
diff --git a/fs/namei.c b/fs/namei.c index c9750d755aff..e01070d7bf58 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
@@ -1712,8 +1712,14 @@ do_link: | |||
1712 | if (error) | 1712 | if (error) |
1713 | goto exit_dput; | 1713 | goto exit_dput; |
1714 | error = __do_follow_link(&path, nd); | 1714 | error = __do_follow_link(&path, nd); |
1715 | if (error) | 1715 | if (error) { |
1716 | /* Does someone understand code flow here? Or it is only | ||
1717 | * me so stupid? Anathema to whoever designed this non-sense | ||
1718 | * with "intent.open". | ||
1719 | */ | ||
1720 | release_open_intent(nd); | ||
1716 | return error; | 1721 | return error; |
1722 | } | ||
1717 | nd->flags &= ~LOOKUP_PARENT; | 1723 | nd->flags &= ~LOOKUP_PARENT; |
1718 | if (nd->last_type == LAST_BIND) | 1724 | if (nd->last_type == LAST_BIND) |
1719 | goto ok; | 1725 | goto ok; |
diff --git a/fs/proc/array.c b/fs/proc/array.c index 7495d3e20775..0b615d62a159 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c | |||
@@ -74,6 +74,7 @@ | |||
74 | #include <linux/times.h> | 74 | #include <linux/times.h> |
75 | #include <linux/cpuset.h> | 75 | #include <linux/cpuset.h> |
76 | #include <linux/rcupdate.h> | 76 | #include <linux/rcupdate.h> |
77 | #include <linux/delayacct.h> | ||
77 | 78 | ||
78 | #include <asm/uaccess.h> | 79 | #include <asm/uaccess.h> |
79 | #include <asm/pgtable.h> | 80 | #include <asm/pgtable.h> |
@@ -411,7 +412,7 @@ static int do_task_stat(struct task_struct *task, char * buffer, int whole) | |||
411 | 412 | ||
412 | res = sprintf(buffer,"%d (%s) %c %d %d %d %d %d %lu %lu \ | 413 | res = sprintf(buffer,"%d (%s) %c %d %d %d %d %d %lu %lu \ |
413 | %lu %lu %lu %lu %lu %ld %ld %ld %ld %d 0 %llu %lu %ld %lu %lu %lu %lu %lu \ | 414 | %lu %lu %lu %lu %lu %ld %ld %ld %ld %d 0 %llu %lu %ld %lu %lu %lu %lu %lu \ |
414 | %lu %lu %lu %lu %lu %lu %lu %lu %d %d %lu %lu\n", | 415 | %lu %lu %lu %lu %lu %lu %lu %lu %d %d %lu %lu %llu\n", |
415 | task->pid, | 416 | task->pid, |
416 | tcomm, | 417 | tcomm, |
417 | state, | 418 | state, |
@@ -455,7 +456,8 @@ static int do_task_stat(struct task_struct *task, char * buffer, int whole) | |||
455 | task->exit_signal, | 456 | task->exit_signal, |
456 | task_cpu(task), | 457 | task_cpu(task), |
457 | task->rt_priority, | 458 | task->rt_priority, |
458 | task->policy); | 459 | task->policy, |
460 | (unsigned long long)delayacct_blkio_ticks(task)); | ||
459 | if(mm) | 461 | if(mm) |
460 | mmput(mm); | 462 | mmput(mm); |
461 | return res; | 463 | return res; |
diff --git a/fs/proc/base.c b/fs/proc/base.c index 243a94af0427..fe8d55fb17cc 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
@@ -551,6 +551,27 @@ static int proc_fd_access_allowed(struct inode *inode) | |||
551 | return allowed; | 551 | return allowed; |
552 | } | 552 | } |
553 | 553 | ||
554 | static int proc_setattr(struct dentry *dentry, struct iattr *attr) | ||
555 | { | ||
556 | int error; | ||
557 | struct inode *inode = dentry->d_inode; | ||
558 | |||
559 | if (attr->ia_valid & ATTR_MODE) | ||
560 | return -EPERM; | ||
561 | |||
562 | error = inode_change_ok(inode, attr); | ||
563 | if (!error) { | ||
564 | error = security_inode_setattr(dentry, attr); | ||
565 | if (!error) | ||
566 | error = inode_setattr(inode, attr); | ||
567 | } | ||
568 | return error; | ||
569 | } | ||
570 | |||
571 | static struct inode_operations proc_def_inode_operations = { | ||
572 | .setattr = proc_setattr, | ||
573 | }; | ||
574 | |||
554 | extern struct seq_operations mounts_op; | 575 | extern struct seq_operations mounts_op; |
555 | struct proc_mounts { | 576 | struct proc_mounts { |
556 | struct seq_file m; | 577 | struct seq_file m; |
@@ -1111,7 +1132,8 @@ out: | |||
1111 | 1132 | ||
1112 | static struct inode_operations proc_pid_link_inode_operations = { | 1133 | static struct inode_operations proc_pid_link_inode_operations = { |
1113 | .readlink = proc_pid_readlink, | 1134 | .readlink = proc_pid_readlink, |
1114 | .follow_link = proc_pid_follow_link | 1135 | .follow_link = proc_pid_follow_link, |
1136 | .setattr = proc_setattr, | ||
1115 | }; | 1137 | }; |
1116 | 1138 | ||
1117 | static int proc_readfd(struct file * filp, void * dirent, filldir_t filldir) | 1139 | static int proc_readfd(struct file * filp, void * dirent, filldir_t filldir) |
@@ -1285,6 +1307,7 @@ static struct inode *proc_pid_make_inode(struct super_block * sb, struct task_st | |||
1285 | ei = PROC_I(inode); | 1307 | ei = PROC_I(inode); |
1286 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; | 1308 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; |
1287 | inode->i_ino = fake_ino(task->pid, ino); | 1309 | inode->i_ino = fake_ino(task->pid, ino); |
1310 | inode->i_op = &proc_def_inode_operations; | ||
1288 | 1311 | ||
1289 | /* | 1312 | /* |
1290 | * grab the reference to task. | 1313 | * grab the reference to task. |
@@ -1339,6 +1362,7 @@ static int pid_revalidate(struct dentry *dentry, struct nameidata *nd) | |||
1339 | inode->i_uid = 0; | 1362 | inode->i_uid = 0; |
1340 | inode->i_gid = 0; | 1363 | inode->i_gid = 0; |
1341 | } | 1364 | } |
1365 | inode->i_mode &= ~(S_ISUID | S_ISGID); | ||
1342 | security_task_to_inode(task, inode); | 1366 | security_task_to_inode(task, inode); |
1343 | put_task_struct(task); | 1367 | put_task_struct(task); |
1344 | return 1; | 1368 | return 1; |
@@ -1389,6 +1413,7 @@ static int tid_fd_revalidate(struct dentry *dentry, struct nameidata *nd) | |||
1389 | inode->i_uid = 0; | 1413 | inode->i_uid = 0; |
1390 | inode->i_gid = 0; | 1414 | inode->i_gid = 0; |
1391 | } | 1415 | } |
1416 | inode->i_mode &= ~(S_ISUID | S_ISGID); | ||
1392 | security_task_to_inode(task, inode); | 1417 | security_task_to_inode(task, inode); |
1393 | put_task_struct(task); | 1418 | put_task_struct(task); |
1394 | return 1; | 1419 | return 1; |
@@ -1527,11 +1552,13 @@ static struct file_operations proc_task_operations = { | |||
1527 | */ | 1552 | */ |
1528 | static struct inode_operations proc_fd_inode_operations = { | 1553 | static struct inode_operations proc_fd_inode_operations = { |
1529 | .lookup = proc_lookupfd, | 1554 | .lookup = proc_lookupfd, |
1555 | .setattr = proc_setattr, | ||
1530 | }; | 1556 | }; |
1531 | 1557 | ||
1532 | static struct inode_operations proc_task_inode_operations = { | 1558 | static struct inode_operations proc_task_inode_operations = { |
1533 | .lookup = proc_task_lookup, | 1559 | .lookup = proc_task_lookup, |
1534 | .getattr = proc_task_getattr, | 1560 | .getattr = proc_task_getattr, |
1561 | .setattr = proc_setattr, | ||
1535 | }; | 1562 | }; |
1536 | 1563 | ||
1537 | #ifdef CONFIG_SECURITY | 1564 | #ifdef CONFIG_SECURITY |
@@ -1845,11 +1872,13 @@ static struct file_operations proc_tid_base_operations = { | |||
1845 | static struct inode_operations proc_tgid_base_inode_operations = { | 1872 | static struct inode_operations proc_tgid_base_inode_operations = { |
1846 | .lookup = proc_tgid_base_lookup, | 1873 | .lookup = proc_tgid_base_lookup, |
1847 | .getattr = pid_getattr, | 1874 | .getattr = pid_getattr, |
1875 | .setattr = proc_setattr, | ||
1848 | }; | 1876 | }; |
1849 | 1877 | ||
1850 | static struct inode_operations proc_tid_base_inode_operations = { | 1878 | static struct inode_operations proc_tid_base_inode_operations = { |
1851 | .lookup = proc_tid_base_lookup, | 1879 | .lookup = proc_tid_base_lookup, |
1852 | .getattr = pid_getattr, | 1880 | .getattr = pid_getattr, |
1881 | .setattr = proc_setattr, | ||
1853 | }; | 1882 | }; |
1854 | 1883 | ||
1855 | #ifdef CONFIG_SECURITY | 1884 | #ifdef CONFIG_SECURITY |
@@ -1892,11 +1921,13 @@ static struct dentry *proc_tid_attr_lookup(struct inode *dir, | |||
1892 | static struct inode_operations proc_tgid_attr_inode_operations = { | 1921 | static struct inode_operations proc_tgid_attr_inode_operations = { |
1893 | .lookup = proc_tgid_attr_lookup, | 1922 | .lookup = proc_tgid_attr_lookup, |
1894 | .getattr = pid_getattr, | 1923 | .getattr = pid_getattr, |
1924 | .setattr = proc_setattr, | ||
1895 | }; | 1925 | }; |
1896 | 1926 | ||
1897 | static struct inode_operations proc_tid_attr_inode_operations = { | 1927 | static struct inode_operations proc_tid_attr_inode_operations = { |
1898 | .lookup = proc_tid_attr_lookup, | 1928 | .lookup = proc_tid_attr_lookup, |
1899 | .getattr = pid_getattr, | 1929 | .getattr = pid_getattr, |
1930 | .setattr = proc_setattr, | ||
1900 | }; | 1931 | }; |
1901 | #endif | 1932 | #endif |
1902 | 1933 | ||
diff --git a/fs/proc/inode.c b/fs/proc/inode.c index 6dcef089e18e..49dfb2ab783e 100644 --- a/fs/proc/inode.c +++ b/fs/proc/inode.c | |||
@@ -192,7 +192,7 @@ int proc_fill_super(struct super_block *s, void *data, int silent) | |||
192 | { | 192 | { |
193 | struct inode * root_inode; | 193 | struct inode * root_inode; |
194 | 194 | ||
195 | s->s_flags |= MS_NODIRATIME; | 195 | s->s_flags |= MS_NODIRATIME | MS_NOSUID | MS_NOEXEC; |
196 | s->s_blocksize = 1024; | 196 | s->s_blocksize = 1024; |
197 | s->s_blocksize_bits = 10; | 197 | s->s_blocksize_bits = 10; |
198 | s->s_magic = PROC_SUPER_MAGIC; | 198 | s->s_magic = PROC_SUPER_MAGIC; |
diff --git a/fs/reiserfs/procfs.c b/fs/reiserfs/procfs.c index 5d8a8cfebc70..c533ec1bcaec 100644 --- a/fs/reiserfs/procfs.c +++ b/fs/reiserfs/procfs.c | |||
@@ -492,9 +492,17 @@ static void add_file(struct super_block *sb, char *name, | |||
492 | 492 | ||
493 | int reiserfs_proc_info_init(struct super_block *sb) | 493 | int reiserfs_proc_info_init(struct super_block *sb) |
494 | { | 494 | { |
495 | char b[BDEVNAME_SIZE]; | ||
496 | char *s; | ||
497 | |||
498 | /* Some block devices use /'s */ | ||
499 | strlcpy(b, reiserfs_bdevname(sb), BDEVNAME_SIZE); | ||
500 | s = strchr(b, '/'); | ||
501 | if (s) | ||
502 | *s = '!'; | ||
503 | |||
495 | spin_lock_init(&__PINFO(sb).lock); | 504 | spin_lock_init(&__PINFO(sb).lock); |
496 | REISERFS_SB(sb)->procdir = | 505 | REISERFS_SB(sb)->procdir = proc_mkdir(b, proc_info_root); |
497 | proc_mkdir(reiserfs_bdevname(sb), proc_info_root); | ||
498 | if (REISERFS_SB(sb)->procdir) { | 506 | if (REISERFS_SB(sb)->procdir) { |
499 | REISERFS_SB(sb)->procdir->owner = THIS_MODULE; | 507 | REISERFS_SB(sb)->procdir->owner = THIS_MODULE; |
500 | REISERFS_SB(sb)->procdir->data = sb; | 508 | REISERFS_SB(sb)->procdir->data = sb; |
@@ -508,13 +516,22 @@ int reiserfs_proc_info_init(struct super_block *sb) | |||
508 | return 0; | 516 | return 0; |
509 | } | 517 | } |
510 | reiserfs_warning(sb, "reiserfs: cannot create /proc/%s/%s", | 518 | reiserfs_warning(sb, "reiserfs: cannot create /proc/%s/%s", |
511 | proc_info_root_name, reiserfs_bdevname(sb)); | 519 | proc_info_root_name, b); |
512 | return 1; | 520 | return 1; |
513 | } | 521 | } |
514 | 522 | ||
515 | int reiserfs_proc_info_done(struct super_block *sb) | 523 | int reiserfs_proc_info_done(struct super_block *sb) |
516 | { | 524 | { |
517 | struct proc_dir_entry *de = REISERFS_SB(sb)->procdir; | 525 | struct proc_dir_entry *de = REISERFS_SB(sb)->procdir; |
526 | char b[BDEVNAME_SIZE]; | ||
527 | char *s; | ||
528 | |||
529 | /* Some block devices use /'s */ | ||
530 | strlcpy(b, reiserfs_bdevname(sb), BDEVNAME_SIZE); | ||
531 | s = strchr(b, '/'); | ||
532 | if (s) | ||
533 | *s = '!'; | ||
534 | |||
518 | if (de) { | 535 | if (de) { |
519 | remove_proc_entry("journal", de); | 536 | remove_proc_entry("journal", de); |
520 | remove_proc_entry("oidmap", de); | 537 | remove_proc_entry("oidmap", de); |
@@ -528,7 +545,7 @@ int reiserfs_proc_info_done(struct super_block *sb) | |||
528 | __PINFO(sb).exiting = 1; | 545 | __PINFO(sb).exiting = 1; |
529 | spin_unlock(&__PINFO(sb).lock); | 546 | spin_unlock(&__PINFO(sb).lock); |
530 | if (proc_info_root) { | 547 | if (proc_info_root) { |
531 | remove_proc_entry(reiserfs_bdevname(sb), proc_info_root); | 548 | remove_proc_entry(b, proc_info_root); |
532 | REISERFS_SB(sb)->procdir = NULL; | 549 | REISERFS_SB(sb)->procdir = NULL; |
533 | } | 550 | } |
534 | return 0; | 551 | return 0; |
diff --git a/fs/xfs/linux-2.6/xfs_buf.h b/fs/xfs/linux-2.6/xfs_buf.h index ceda3a2859d2..7858703ed84c 100644 --- a/fs/xfs/linux-2.6/xfs_buf.h +++ b/fs/xfs/linux-2.6/xfs_buf.h | |||
@@ -246,8 +246,8 @@ extern void xfs_buf_trace(xfs_buf_t *, char *, void *, void *); | |||
246 | #define BUF_BUSY XBF_DONT_BLOCK | 246 | #define BUF_BUSY XBF_DONT_BLOCK |
247 | 247 | ||
248 | #define XFS_BUF_BFLAGS(bp) ((bp)->b_flags) | 248 | #define XFS_BUF_BFLAGS(bp) ((bp)->b_flags) |
249 | #define XFS_BUF_ZEROFLAGS(bp) \ | 249 | #define XFS_BUF_ZEROFLAGS(bp) ((bp)->b_flags &= \ |
250 | ((bp)->b_flags &= ~(XBF_READ|XBF_WRITE|XBF_ASYNC|XBF_DELWRI)) | 250 | ~(XBF_READ|XBF_WRITE|XBF_ASYNC|XBF_DELWRI|XBF_ORDERED)) |
251 | 251 | ||
252 | #define XFS_BUF_STALE(bp) ((bp)->b_flags |= XFS_B_STALE) | 252 | #define XFS_BUF_STALE(bp) ((bp)->b_flags |= XFS_B_STALE) |
253 | #define XFS_BUF_UNSTALE(bp) ((bp)->b_flags &= ~XFS_B_STALE) | 253 | #define XFS_BUF_UNSTALE(bp) ((bp)->b_flags &= ~XFS_B_STALE) |
diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 9bdef9d51900..4754f342a5d3 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c | |||
@@ -314,6 +314,13 @@ xfs_mountfs_check_barriers(xfs_mount_t *mp) | |||
314 | return; | 314 | return; |
315 | } | 315 | } |
316 | 316 | ||
317 | if (xfs_readonly_buftarg(mp->m_ddev_targp)) { | ||
318 | xfs_fs_cmn_err(CE_NOTE, mp, | ||
319 | "Disabling barriers, underlying device is readonly"); | ||
320 | mp->m_flags &= ~XFS_MOUNT_BARRIER; | ||
321 | return; | ||
322 | } | ||
323 | |||
317 | error = xfs_barrier_test(mp); | 324 | error = xfs_barrier_test(mp); |
318 | if (error) { | 325 | if (error) { |
319 | xfs_fs_cmn_err(CE_NOTE, mp, | 326 | xfs_fs_cmn_err(CE_NOTE, mp, |
diff --git a/fs/xfs/quota/xfs_qm_bhv.c b/fs/xfs/quota/xfs_qm_bhv.c index e95e99f7168f..f137856c3261 100644 --- a/fs/xfs/quota/xfs_qm_bhv.c +++ b/fs/xfs/quota/xfs_qm_bhv.c | |||
@@ -217,17 +217,24 @@ xfs_qm_statvfs( | |||
217 | return 0; | 217 | return 0; |
218 | dp = &dqp->q_core; | 218 | dp = &dqp->q_core; |
219 | 219 | ||
220 | limit = dp->d_blk_softlimit ? dp->d_blk_softlimit : dp->d_blk_hardlimit; | 220 | limit = dp->d_blk_softlimit ? |
221 | be64_to_cpu(dp->d_blk_softlimit) : | ||
222 | be64_to_cpu(dp->d_blk_hardlimit); | ||
221 | if (limit && statp->f_blocks > limit) { | 223 | if (limit && statp->f_blocks > limit) { |
222 | statp->f_blocks = limit; | 224 | statp->f_blocks = limit; |
223 | statp->f_bfree = (statp->f_blocks > dp->d_bcount) ? | 225 | statp->f_bfree = |
224 | (statp->f_blocks - dp->d_bcount) : 0; | 226 | (statp->f_blocks > be64_to_cpu(dp->d_bcount)) ? |
227 | (statp->f_blocks - be64_to_cpu(dp->d_bcount)) : 0; | ||
225 | } | 228 | } |
226 | limit = dp->d_ino_softlimit ? dp->d_ino_softlimit : dp->d_ino_hardlimit; | 229 | |
230 | limit = dp->d_ino_softlimit ? | ||
231 | be64_to_cpu(dp->d_ino_softlimit) : | ||
232 | be64_to_cpu(dp->d_ino_hardlimit); | ||
227 | if (limit && statp->f_files > limit) { | 233 | if (limit && statp->f_files > limit) { |
228 | statp->f_files = limit; | 234 | statp->f_files = limit; |
229 | statp->f_ffree = (statp->f_files > dp->d_icount) ? | 235 | statp->f_ffree = |
230 | (statp->f_ffree - dp->d_icount) : 0; | 236 | (statp->f_files > be64_to_cpu(dp->d_icount)) ? |
237 | (statp->f_ffree - be64_to_cpu(dp->d_icount)) : 0; | ||
231 | } | 238 | } |
232 | 239 | ||
233 | xfs_qm_dqput(dqp); | 240 | xfs_qm_dqput(dqp); |
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 86c1bf0bba9e..1f8ecff8553a 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c | |||
@@ -334,10 +334,9 @@ xfs_itobp( | |||
334 | #if !defined(__KERNEL__) | 334 | #if !defined(__KERNEL__) |
335 | ni = 0; | 335 | ni = 0; |
336 | #elif defined(DEBUG) | 336 | #elif defined(DEBUG) |
337 | ni = (imap_flags & XFS_IMAP_BULKSTAT) ? 0 : | 337 | ni = BBTOB(imap.im_len) >> mp->m_sb.sb_inodelog; |
338 | (BBTOB(imap.im_len) >> mp->m_sb.sb_inodelog); | ||
339 | #else /* usual case */ | 338 | #else /* usual case */ |
340 | ni = (imap_flags & XFS_IMAP_BULKSTAT) ? 0 : 1; | 339 | ni = 1; |
341 | #endif | 340 | #endif |
342 | 341 | ||
343 | for (i = 0; i < ni; i++) { | 342 | for (i = 0; i < ni; i++) { |
@@ -348,11 +347,15 @@ xfs_itobp( | |||
348 | (i << mp->m_sb.sb_inodelog)); | 347 | (i << mp->m_sb.sb_inodelog)); |
349 | di_ok = INT_GET(dip->di_core.di_magic, ARCH_CONVERT) == XFS_DINODE_MAGIC && | 348 | di_ok = INT_GET(dip->di_core.di_magic, ARCH_CONVERT) == XFS_DINODE_MAGIC && |
350 | XFS_DINODE_GOOD_VERSION(INT_GET(dip->di_core.di_version, ARCH_CONVERT)); | 349 | XFS_DINODE_GOOD_VERSION(INT_GET(dip->di_core.di_version, ARCH_CONVERT)); |
351 | if (unlikely(XFS_TEST_ERROR(!di_ok, mp, XFS_ERRTAG_ITOBP_INOTOBP, | 350 | if (unlikely(XFS_TEST_ERROR(!di_ok, mp, |
352 | XFS_RANDOM_ITOBP_INOTOBP))) { | 351 | XFS_ERRTAG_ITOBP_INOTOBP, |
352 | XFS_RANDOM_ITOBP_INOTOBP))) { | ||
353 | if (imap_flags & XFS_IMAP_BULKSTAT) { | ||
354 | xfs_trans_brelse(tp, bp); | ||
355 | return XFS_ERROR(EINVAL); | ||
356 | } | ||
353 | #ifdef DEBUG | 357 | #ifdef DEBUG |
354 | if (!(imap_flags & XFS_IMAP_BULKSTAT)) | 358 | cmn_err(CE_ALERT, |
355 | cmn_err(CE_ALERT, | ||
356 | "Device %s - bad inode magic/vsn " | 359 | "Device %s - bad inode magic/vsn " |
357 | "daddr %lld #%d (magic=%x)", | 360 | "daddr %lld #%d (magic=%x)", |
358 | XFS_BUFTARG_NAME(mp->m_ddev_targp), | 361 | XFS_BUFTARG_NAME(mp->m_ddev_targp), |
diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index e730328636c3..21ac1a67e3e0 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c | |||
@@ -1413,7 +1413,7 @@ xlog_sync(xlog_t *log, | |||
1413 | ops = iclog->ic_header.h_num_logops; | 1413 | ops = iclog->ic_header.h_num_logops; |
1414 | INT_SET(iclog->ic_header.h_num_logops, ARCH_CONVERT, ops); | 1414 | INT_SET(iclog->ic_header.h_num_logops, ARCH_CONVERT, ops); |
1415 | 1415 | ||
1416 | bp = iclog->ic_bp; | 1416 | bp = iclog->ic_bp; |
1417 | ASSERT(XFS_BUF_FSPRIVATE2(bp, unsigned long) == (unsigned long)1); | 1417 | ASSERT(XFS_BUF_FSPRIVATE2(bp, unsigned long) == (unsigned long)1); |
1418 | XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)2); | 1418 | XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)2); |
1419 | XFS_BUF_SET_ADDR(bp, BLOCK_LSN(INT_GET(iclog->ic_header.h_lsn, ARCH_CONVERT))); | 1419 | XFS_BUF_SET_ADDR(bp, BLOCK_LSN(INT_GET(iclog->ic_header.h_lsn, ARCH_CONVERT))); |
@@ -1430,15 +1430,14 @@ xlog_sync(xlog_t *log, | |||
1430 | } | 1430 | } |
1431 | XFS_BUF_SET_PTR(bp, (xfs_caddr_t) &(iclog->ic_header), count); | 1431 | XFS_BUF_SET_PTR(bp, (xfs_caddr_t) &(iclog->ic_header), count); |
1432 | XFS_BUF_SET_FSPRIVATE(bp, iclog); /* save for later */ | 1432 | XFS_BUF_SET_FSPRIVATE(bp, iclog); /* save for later */ |
1433 | XFS_BUF_ZEROFLAGS(bp); | ||
1433 | XFS_BUF_BUSY(bp); | 1434 | XFS_BUF_BUSY(bp); |
1434 | XFS_BUF_ASYNC(bp); | 1435 | XFS_BUF_ASYNC(bp); |
1435 | /* | 1436 | /* |
1436 | * Do an ordered write for the log block. | 1437 | * Do an ordered write for the log block. |
1437 | * | 1438 | * Its unnecessary to flush the first split block in the log wrap case. |
1438 | * It may not be needed to flush the first split block in the log wrap | ||
1439 | * case, but do it anyways to be safe -AK | ||
1440 | */ | 1439 | */ |
1441 | if (log->l_mp->m_flags & XFS_MOUNT_BARRIER) | 1440 | if (!split && (log->l_mp->m_flags & XFS_MOUNT_BARRIER)) |
1442 | XFS_BUF_ORDERED(bp); | 1441 | XFS_BUF_ORDERED(bp); |
1443 | 1442 | ||
1444 | ASSERT(XFS_BUF_ADDR(bp) <= log->l_logBBsize-1); | 1443 | ASSERT(XFS_BUF_ADDR(bp) <= log->l_logBBsize-1); |
@@ -1460,7 +1459,7 @@ xlog_sync(xlog_t *log, | |||
1460 | return error; | 1459 | return error; |
1461 | } | 1460 | } |
1462 | if (split) { | 1461 | if (split) { |
1463 | bp = iclog->ic_log->l_xbuf; | 1462 | bp = iclog->ic_log->l_xbuf; |
1464 | ASSERT(XFS_BUF_FSPRIVATE2(bp, unsigned long) == | 1463 | ASSERT(XFS_BUF_FSPRIVATE2(bp, unsigned long) == |
1465 | (unsigned long)1); | 1464 | (unsigned long)1); |
1466 | XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)2); | 1465 | XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)2); |
@@ -1468,6 +1467,7 @@ xlog_sync(xlog_t *log, | |||
1468 | XFS_BUF_SET_PTR(bp, (xfs_caddr_t)((__psint_t)&(iclog->ic_header)+ | 1467 | XFS_BUF_SET_PTR(bp, (xfs_caddr_t)((__psint_t)&(iclog->ic_header)+ |
1469 | (__psint_t)count), split); | 1468 | (__psint_t)count), split); |
1470 | XFS_BUF_SET_FSPRIVATE(bp, iclog); | 1469 | XFS_BUF_SET_FSPRIVATE(bp, iclog); |
1470 | XFS_BUF_ZEROFLAGS(bp); | ||
1471 | XFS_BUF_BUSY(bp); | 1471 | XFS_BUF_BUSY(bp); |
1472 | XFS_BUF_ASYNC(bp); | 1472 | XFS_BUF_ASYNC(bp); |
1473 | if (log->l_mp->m_flags & XFS_MOUNT_BARRIER) | 1473 | if (log->l_mp->m_flags & XFS_MOUNT_BARRIER) |
diff --git a/fs/xfs/xfs_vfsops.c b/fs/xfs/xfs_vfsops.c index 6c96391f3f1a..b427d220a169 100644 --- a/fs/xfs/xfs_vfsops.c +++ b/fs/xfs/xfs_vfsops.c | |||
@@ -515,7 +515,7 @@ xfs_mount( | |||
515 | if (error) | 515 | if (error) |
516 | goto error2; | 516 | goto error2; |
517 | 517 | ||
518 | if ((mp->m_flags & XFS_MOUNT_BARRIER) && !(vfsp->vfs_flag & VFS_RDONLY)) | 518 | if (mp->m_flags & XFS_MOUNT_BARRIER) |
519 | xfs_mountfs_check_barriers(mp); | 519 | xfs_mountfs_check_barriers(mp); |
520 | 520 | ||
521 | error = XFS_IOINIT(vfsp, args, flags); | 521 | error = XFS_IOINIT(vfsp, args, flags); |